* Two problems on alias of git
@ 2009-05-05 12:42 Kana Natsuno
2009-05-05 14:03 ` Jakub Narebski
2009-05-08 9:06 ` Jeff King
0 siblings, 2 replies; 7+ messages in thread
From: Kana Natsuno @ 2009-05-05 12:42 UTC (permalink / raw)
To: git
Hello. I found 2 problems on alias of git.
The first one is that git crashes with the following situation.
Without GIT_TRACE, everthing works well. But with GIT_TRACE=1,
git crashes every time.
---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ----
$ git remote show origin
* remote origin
URL: git://repo.or.cz/git.git
Remote branch merged with 'git pull' while on branch master
master
Tracked remote branches
html
maint
man
master
next
pu
todo
$ git --version
git version 1.6.2.rc0.90.g0753
$ git show HEAD | grep commit
commit 3536ae331014c68a25c80b3fb530a19c8dee0f11
$ uname -a
Darwin foobarbaz 9.6.1 Darwin Kernel Version 9.6.1: Sun Dec 21 19:45:33 PST 2008; root:xnu-1228.9.75~4/RELEASE_I386 i386 i386 MacBook5,2 Darwin
$ git config --get alias.l1
log --pretty=oneline
$ GIT_TRACE=1 git l1
trace: exec: 'git-l1'
trace: run_command: 'git-l1'
trace: exec 'git-l1' failed: No such file or directory
[1] 41772 segmentation fault GIT_TRACE=1 git l1
---- >8 ---- >8 ---- >8 ---- >8 ---- >8 ----
The second one is that git doesn't expand a kind of aliases
properly, especially with double quotation marks ("). I used the
following alias recently to list the last 10 commits on HEAD:
[alias]
lr = !git l1 | head | tac
Then I want to extend this alias to list the last N commits on
a branch with "git lr 20", "git lr master", "git lr master 20",
etc. So that I wrote the following definition (note that the
actual definition is written in a single line, though the quoted
definition is folded in multiple lines for readability):
[alias]
lr = !$SHELL -c '
n=10;
1="${1:-$n}";
if ! [ "${1##[0-9]*}" = "" ]; then
t="$1";
1="${2:-$n}";
2="$t";
fi;
git --no-pager l1 --reverse -"$1" "${2:-HEAD}"
' __dummy__
But it doesn't work because git expands as follows:
$ git config --get alias.lr
!$SHELL -c '1=${1:-10}
Double quotation marks (") are removed and the aliased string is
cut at a random position. I expect that the aliased string is
passed to system() as-is, but git doesn't so. Why does git behave
so? Is it a bug or an intentional behavior?
--
To Vim, or not to Vim.
http://whileimautomaton.net/
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Two problems on alias of git
2009-05-05 12:42 Two problems on alias of git Kana Natsuno
@ 2009-05-05 14:03 ` Jakub Narebski
2009-05-05 15:11 ` Kana Natsuno
2009-05-08 9:06 ` Jeff King
1 sibling, 1 reply; 7+ messages in thread
From: Jakub Narebski @ 2009-05-05 14:03 UTC (permalink / raw)
To: Kana Natsuno; +Cc: git
"Kana Natsuno" <kana@whileimautomaton.net> writes:
> Hello. I found 2 problems on alias of git.
[...]
> The second one is that git doesn't expand a kind of aliases
> properly, especially with double quotation marks ("). I used the
> following alias recently to list the last 10 commits on HEAD:
>
> [alias]
> lr = !git l1 | head | tac
>
> Then I want to extend this alias to list the last N commits on
> a branch with "git lr 20", "git lr master", "git lr master 20",
> etc. So that I wrote the following definition (note that the
> actual definition is written in a single line, though the quoted
> definition is folded in multiple lines for readability):
>
> [alias]
> lr = !$SHELL -c '
> n=10;
> 1="${1:-$n}";
> if ! [ "${1##[0-9]*}" = "" ]; then
> t="$1";
> 1="${2:-$n}";
> 2="$t";
> fi;
> git --no-pager l1 --reverse -"$1" "${2:-HEAD}"
> ' __dummy__
>
> But it doesn't work because git expands as follows:
>
> $ git config --get alias.lr
> !$SHELL -c '1=${1:-10}
>
> Double quotation marks (") are removed and the aliased string is
> cut at a random position. I expect that the aliased string is
> passed to system() as-is, but git doesn't so. Why does git behave
> so? Is it a bug or an intentional behavior?
I don't know if it is a bug or a feature, but git-config supports
quoted strings (required if you want to have value which has trailing
or leading whitespace, or which contains '#' which is beginning of
comment character). Inside quoted string you need to escape '"':
[string]
quotes = "quoted \" string ' with # character"
expands as intended. Perhaps stripping of double quotes
inside string are artifact of that feature. Try escaping or
double escaping quotes: \" or \\\".
--
Jakub Narebski
Poland
ShadeHawk on #git
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Two problems on alias of git
2009-05-05 14:03 ` Jakub Narebski
@ 2009-05-05 15:11 ` Kana Natsuno
2009-05-05 15:42 ` Jakub Narebski
0 siblings, 1 reply; 7+ messages in thread
From: Kana Natsuno @ 2009-05-05 15:11 UTC (permalink / raw)
To: Jakub Narebski; +Cc: git
On Tue, 05 May 2009 23:03:49 +0900, Jakub Narebski <jnareb@gmail.com> wrote:
> I don't know if it is a bug or a feature, but git-config supports
> quoted strings (required if you want to have value which has trailing
> or leading whitespace, or which contains '#' which is beginning of
> comment character). Inside quoted string you need to escape '"':
>
> [string]
> quotes = "quoted \" string ' with # character"
>
> expands as intended. Perhaps stripping of double quotes
> inside string are artifact of that feature. Try escaping or
> double escaping quotes: \" or \\\".
Thank you for the information. I've read the source code of git
and I confirmed that this stripping is caused by parse_value() in
config.c.
And as I changed the old definition
lr = !$SHELL -c 'n=10; 1="${1:-$n}"; ...' __dummy__
by enclosing all text in double quotes and substituting '"' with
'\"' as follows,
lr = "!$SHELL -c 'n=10; 1=\"${1:-$n}\"; ...' __dummy__"
it works well now.
$ git config --get alias.lr
!$SHELL -c 'n=10; 1="${1:-$n}"; if ! [ "${1##[0-9]*}" ...
--
To Vim, or not to Vim.
http://whileimautomaton.net/
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Two problems on alias of git
2009-05-05 15:11 ` Kana Natsuno
@ 2009-05-05 15:42 ` Jakub Narebski
2009-05-05 16:25 ` Kana Natsuno
0 siblings, 1 reply; 7+ messages in thread
From: Jakub Narebski @ 2009-05-05 15:42 UTC (permalink / raw)
To: Kana Natsuno; +Cc: git
On Tue, 5 May 2009, Kana Natsuno wrote:
> On Tue, 05 May 2009 23:03:49 +0900, Jakub Narebski <jnareb@gmail.com> wrote:
> > I don't know if it is a bug or a feature, but git-config supports
> > quoted strings (required if you want to have value which has trailing
> > or leading whitespace, or which contains '#' which is beginning of
> > comment character). Inside quoted string you need to escape '"':
Errr... what I meant here is that I don't know whether stripping
quotes inside value which is not quoted (does not begin and end in '"')
is intended or unintended consequence of git-config behaviour.
> >
> > [string]
> > quotes = "quoted \" string ' with # character"
> >
> > expands as intended. Perhaps stripping of double quotes
> > inside string are artifact of that feature. Try escaping or
> > double escaping quotes: \" or \\\".
>
> Thank you for the information. I've read the source code of git
> and I confirmed that this stripping is caused by parse_value() in
> config.c.
>
>
> And as I changed the old definition
>
> lr = !$SHELL -c 'n=10; 1="${1:-$n}"; ...' __dummy__
>
> by enclosing all text in double quotes and substituting '"' with
> '\"' as follows,
>
> lr = "!$SHELL -c 'n=10; 1=\"${1:-$n}\"; ...' __dummy__"
>
> it works well now.
>
> $ git config --get alias.lr
> !$SHELL -c 'n=10; 1="${1:-$n}"; if ! [ "${1##[0-9]*}" ...
By the way, you can use continuation-of-line character (end line
with '\') and/or can embed newlines using C escape sequence, i.e. "\n".
So your code can look like this (although I am not sure it is worth it):
[alias]
lr = "!$SHELL -c ' \n\
n=10; \n\
1=\"${1:-$n}\"; \n\
if ! [ \"${1##[0-9]*}\" = \"\" ]; then \n\
t=\"$1\"; \n\
1=\"${2:-$n}\"; \n\
2=\"$t\"; \n\
fi; \n\
git --no-pager l1 --reverse -\"$1\" \"${2:-HEAD}\" \n\
' __dummy__"
BTW. you need to quote value because it contains comment character '#'
in 4th line of script.
--
Jakub Narebski
Poland
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Two problems on alias of git
2009-05-05 15:42 ` Jakub Narebski
@ 2009-05-05 16:25 ` Kana Natsuno
2009-05-05 17:01 ` Jakub Narebski
0 siblings, 1 reply; 7+ messages in thread
From: Kana Natsuno @ 2009-05-05 16:25 UTC (permalink / raw)
To: Jakub Narebski; +Cc: git
On Wed, 06 May 2009 00:42:49 +0900, Jakub Narebski <jnareb@gmail.com> wrote:
> By the way, you can use continuation-of-line character (end line
> with '\') and/or can embed newlines using C escape sequence, i.e. "\n".
>
> So your code can look like this (although I am not sure it is worth it):
>
> [alias]
> lr = "!$SHELL -c ' \n\
> n=10; \n\
> 1=\"${1:-$n}\"; \n\
> if ! [ \"${1##[0-9]*}\" = \"\" ]; then \n\
> t=\"$1\"; \n\
> 1=\"${2:-$n}\"; \n\
> 2=\"$t\"; \n\
> fi; \n\
> git --no-pager l1 --reverse -\"$1\" \"${2:-HEAD}\" \n\
> ' __dummy__"
Thank you again, I didn't know that. It is better than what I wrote.
> BTW. you need to quote value because it contains comment character '#'
> in 4th line of script.
Really? As far as I read the code of git, especially parse_value() in config.c,
it is not necessary to escape '#'s because they are inside of the outermost
doublequotes and they should not be escaped, because \# is an unknown escape
sequence and git rejects them. If #s are escaped, it causes an error as follows:
$ git config --get alias.lr
fatal: bad config file line 29 in /Users/kana/.gitconfig
--
To Vim, or not to Vim.
http://whileimautomaton.net/
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Two problems on alias of git
2009-05-05 16:25 ` Kana Natsuno
@ 2009-05-05 17:01 ` Jakub Narebski
0 siblings, 0 replies; 7+ messages in thread
From: Jakub Narebski @ 2009-05-05 17:01 UTC (permalink / raw)
To: Kana Natsuno; +Cc: git
On Wed, 5 May 2009 (yes, different timezones), Kana Natsuno wrote:
> On Wed, 06 May 2009 00:42:49 +0900, Jakub Narebski <jnareb@gmail.com> wrote:
> > By the way, you can use continuation-of-line character (end line
> > with '\') and/or can embed newlines using C escape sequence, i.e. "\n".
> >
> > So your code can look like this (although I am not sure it is worth it):
> >
> > [alias]
> > lr = "!$SHELL -c ' \n\
> > n=10; \n\
> > 1=\"${1:-$n}\"; \n\
> > if ! [ \"${1##[0-9]*}\" = \"\" ]; then \n\
> > t=\"$1\"; \n\
> > 1=\"${2:-$n}\"; \n\
> > 2=\"$t\"; \n\
> > fi; \n\
> > git --no-pager l1 --reverse -\"$1\" \"${2:-HEAD}\" \n\
> > ' __dummy__"
>
> Thank you again, I didn't know that. It is better than what I wrote.
By the way, "\n" is there only for nice looking output of git-config
for this variable. For config file you need only to escape end of line.
> > BTW. you need to quote value because it contains comment character '#'
> > in 4th line of script.
>
> Really? As far as I read the code of git, especially parse_value() in config.c,
> it is not necessary to escape '#'s because they are inside of the outermost
> doublequotes and they should not be escaped, because \# is an unknown escape
> sequence and git rejects them. If #s are escaped, it causes an error as follows:
>
> $ git config --get alias.lr
> fatal: bad config file line 29 in /Users/kana/.gitconfig
Errrr... what I meant is that you have to _quote_ value if it contains
comment character, compare
[string]
unquoted = a # b
quoted = "a # b"
not that you have to escape comment character '#'. But I forgot about
the fact that ## in your example is inside quotes anyway.
--
Jakub Narebski
Poland
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Two problems on alias of git
2009-05-05 12:42 Two problems on alias of git Kana Natsuno
2009-05-05 14:03 ` Jakub Narebski
@ 2009-05-08 9:06 ` Jeff King
1 sibling, 0 replies; 7+ messages in thread
From: Jeff King @ 2009-05-08 9:06 UTC (permalink / raw)
To: Kana Natsuno; +Cc: Junio C Hamano, git
On Tue, May 05, 2009 at 09:42:04PM +0900, Kana Natsuno wrote:
> The first one is that git crashes with the following situation.
> Without GIT_TRACE, everthing works well. But with GIT_TRACE=1,
> git crashes every time.
I wasn't able to reproduce on Linux, but valgrind found it. The patch
below should fix it.
-- >8 --
Subject: [PATCH] fix GIT_TRACE segfault with shell-quoted aliases
The alias argv comes from the split_cmdline function, which
splits the config text for the alias into an array of
strings. It returns the number of elements in the array, but
does not actually put a NULL at the end of the array.
Later, the trace function tries to print this argv and
assumes that it has the trailing NULL.
The split_cmdline function is probably at fault, since argv
lists almost always end with a NULL signal. This patch adds
one, in addition to the returned count; this doesn't hurt
the other callers at all, since they were presumably using
the count already (and will never look at the NULL).
While we're there and using ALLOC_GROW, let's clean up the
other manual grow.
Signed-off-by: Jeff King <peff@peff.net>
---
alias.c | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/alias.c b/alias.c
index e687fe5..372b7d8 100644
--- a/alias.c
+++ b/alias.c
@@ -38,10 +38,7 @@ int split_cmdline(char *cmdline, const char ***argv)
while (cmdline[++src]
&& isspace(cmdline[src]))
; /* skip */
- if (count >= size) {
- size += 16;
- *argv = xrealloc(*argv, sizeof(char *) * size);
- }
+ ALLOC_GROW(*argv, count+1, size);
(*argv)[count++] = cmdline + dst;
} else if (!quoted && (c == '\'' || c == '"')) {
quoted = c;
@@ -72,6 +69,9 @@ int split_cmdline(char *cmdline, const char ***argv)
return error("unclosed quote");
}
+ ALLOC_GROW(*argv, count+1, size);
+ (*argv)[count] = NULL;
+
return count;
}
--
1.6.3.203.g7c7de.dirty
^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2009-05-08 9:06 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-05-05 12:42 Two problems on alias of git Kana Natsuno
2009-05-05 14:03 ` Jakub Narebski
2009-05-05 15:11 ` Kana Natsuno
2009-05-05 15:42 ` Jakub Narebski
2009-05-05 16:25 ` Kana Natsuno
2009-05-05 17:01 ` Jakub Narebski
2009-05-08 9:06 ` Jeff King
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).