summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Johannes Schindelin <Johannes.Schindelin@gmx.de>2007-07-01 22:51:58 +0100
committerLibravatar Junio C Hamano <gitster@pobox.com>2007-07-02 01:33:44 -0700
commita2f8028d3d661b314d5a784764f2f5f9e4c2dde0 (patch)
tree670a4fe52001e3c03cc236facf5f2cc461f409c7
parentgetenv/setenv: use constants if available (diff)
downloadtgif-a2f8028d3d661b314d5a784764f2f5f9e4c2dde0.tar.xz
Make '!' aliases more useful
When an alias starts with an exclamation mark, the rest is interpreted as a shell command. However, all arguments passed to git used to be ignored. Now you can have an alias like $ git config alias.e '!echo' and $ git e Hello World does what you expect it to do. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--git.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/git.c b/git.c
index 696a97edca..727aabcbbe 100644
--- a/git.c
+++ b/git.c
@@ -181,6 +181,21 @@ static int handle_alias(int *argcp, const char ***argv)
git_config(git_alias_config);
if (alias_string) {
if (alias_string[0] == '!') {
+ if (*argcp > 1) {
+ int i, sz = PATH_MAX;
+ char *s = xmalloc(sz), *new_alias = s;
+
+ add_to_string(&s, &sz, alias_string, 0);
+ free(alias_string);
+ alias_string = new_alias;
+ for (i = 1; i < *argcp &&
+ !add_to_string(&s, &sz, " ", 0) &&
+ !add_to_string(&s, &sz, (*argv)[i], 1)
+ ; i++)
+ ; /* do nothing */
+ if (!sz)
+ die("Too many or long arguments");
+ }
trace_printf("trace: alias to shell cmd: %s => %s\n",
alias_command, alias_string + 1);
ret = system(alias_string + 1);