git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Need help debugging issue in git

From
Johannes Sixt <j6t@kdbg.org>
Date
Apr 2, 2018, 06:53 UTC
Message-ID
<3152c739-5c80-99b3-ac16-31fe348b7657@kdbg.org>
In-Reply-To
<CAHd499C39sBTJy_AoCJxE2ZS4ECJju2jroY6_0E1MssCBtmC=A@mail.gmail.com>
Am 02.04.2018 um 02:36 schrieb Robert Dailey:
Show 9 quoted lines
> I'm struggling with a bug that I found introduced in git v2.13.2. The
> bug was not reproducible in v2.13.1. The issue is that using arguments
> like "@{-1}" to aliases causes those curly braces to be removed, so
> once the command is executed after alias processing the argument looks
> like "@-1". This breaks any aliases you have that wrap `git log` and
> such. I originally opened the bug on the Git for Windows project
> (since I use Git mostly on Windows):
> 
> https://github.com/git-for-windows/git/issues/1220
...
Show 27 quoted lines
> Here is the alias being used for a test:
> 
> [alias]
>      lgtest = !git log --oneline \"$@\"
> 
> And here is the command I invoke for the test:
> 
> $ git lgtest @{-1}
> 
> I should get logs for the previously-checked-out branch.
> 
> When `prepare_shell_cmd()` is called in run-command.c, it gets expanded like so:
> 
> + [0] "sh" const char *
> + [1] "-c" const char *
> + [2] "git log --oneline \"$@\" \"$@\"" const char *
> + [3] "git log --oneline \"$@\"" const char *
> + [4] "@{-1}" const char *
> 
> With my modifications (again, patch inline below) I get this:
> 
> + [0] "sh" const char *
> + [1] "-c" const char *
> + [2] "git log --oneline \"$@\"" const char *
> + [3] "@{-1}" const char *
> 
> The second version looks much better.
But this is wrong. Try this on the command line:
   sh -c 'echo "$@"' a b c

Notice how this prints only 'b c', not 'a b c'. The reason is that the argument 'a' is treated like a "script" name, i.e. what you get for "$0", and 'b' and 'c' as the actual arguments to the "script".

That is, you must fill in some dummy "script" name at slot [3], and run_command chooses to put the alias text there.

> I think the constant nesting of
> commands inside each other that the first version does is somehow
> causing curly braces to be removed. I don't understand enough about
> shell processing to know why it would do this.

Some shells expand the curly braces. They must get lost somewhere by one of the two shell invocations that happen on the way.

BTW, you don't happen to have a file named '@-1' in your directory, most likely by accident?

-- Hannes
Previous: Robert DaileyNext: Robert Dailey
Message 2 of 3 in “Need help debugging issue in git”
  1. Robert DaileyApr 2, 2018
  2. Johannes SixtApr 2, 2018
  3. Robert DaileyApr 14, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.