threads / discuss / 25628

git stash syntax error under AIX 5.3

Subject: git stash syntax error under AIX 5.3

## tl;dr

3 messages between Nov 3, 2010 and Nov 3, 2010.

replies: 2people: 2as markdown or json

Brian Riehman· Nov 3, 2010, 14:05 UTC · lore

The stash command relies on bash-specific shell scripting techniques when the shebang line lists Bourne shell.  This was introduced in b0f0ecd97924ee775e7f3b29366133448f4f8e15.  The error was noticed when running under AIX 5.3:

$ /bin/sh -n git-stash.sh git-stash.sh[63]: syntax error at line 498 : `"' unmatched $ /bin/sh -n git-stash-modified.sh $ diff git-stash.sh git-stash-modified.sh 314,321c314,321 <       if test "${REV}" != "${REV%{*\}}" <       then <               # maintainers: it would be better if git rev-parse indicated <               # this condition with a non-zero status code but as of 1.7.2.1 it <               # it did not. So, we use non-empty stderr output as a proxy for the <               # condition of interest. <               test -z "$(git rev-parse "$REV" 2>&1 >/dev/null)" || die "$REV does not exist in the stash log" <       fi ---

Show 8 quoted lines
> #     if test "${REV}" != "${REV%{*\}}"
> #     then
> #             # maintainers: it would be better if git rev-parse indicated
> #             # this condition with a non-zero status code but as of 1.7.2.1 it
> #             # it did not. So, we use non-empty stderr output as a proxy for the
> #             # condition of interest.
> #             test -z "$(git rev-parse "$REV" 2>&1 >/dev/null)" || die "$REV does not exist in the stash log"
> #     fi

$ head -1 git-stash.sh #!/bin/sh

Removing the code from that commit causes the stash command to work properly.  I am not sure if other systems have /bin/sh symbolically linked to /bin/bash, but in AIX the /bin/sh fails to properly parse the default git-stash.sh.

I am not sure how to correct this logic since Bourne shell does not have an equally powerful search and replace variable substitution operator nor do I know exactly what this is meant to filter out of the variable.  For now, I have simply patched the source to comment out those lines.

Brian Riehman
Jonathan Nieder· Nov 3, 2010, 15:07 UTC · re: Brian Riehman · lore

Re: git stash syntax error under AIX 5.3

Hi Brian,
Brian Riehman wrote:
> The stash command relies on bash-specific shell scripting techniques

Git actually uses the ${var%glob} syntax pretty widely, and it is fairly portable (see http://unix.org/2008edition/ and search for "sh -" for details). I suspect the problem is rather the seemingly-unbalanced braces:

> <       if test "${REV}" != "${REV%{*\}}"
How about this patch?
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
diff --git a/git-stash.sh b/git-stash.sh
index 5fb1245..0a41226 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -311,7 +311,7 @@ parse_flags_and_rev()
 	test "$ref_stash" = "$(git rev-parse --symbolic-full-name "${REV%@*}")" &&
 	IS_STASH_REF=t
 
-	if test "${REV}" != "${REV%{*\}}"
+	if test "${REV}" != "${REV%\{*\}}"
 	then
 		# maintainers: it would be better if git rev-parse indicated
 		# this condition with a non-zero status code but as of 1.7.2.1 it
Brian Riehman· Nov 3, 2010, 15:29 UTC · re: Jonathan Nieder · lore

Re: git stash syntax error under AIX 5.3

Thanks, Jonathan. That did indeed fix it. Thanks for your help and clarification that it does indeed work in my shell when escaped properly.

On Wed, Nov 3, 2010 at 10:07 AM, Jonathan Nieder <jrnieder@gmail.com> wrote:
Show 31 quoted lines
> Hi Brian,
>
> Brian Riehman wrote:
>
>> The stash command relies on bash-specific shell scripting techniques
>
> Git actually uses the ${var%glob} syntax pretty widely, and it is
> fairly portable (see http://unix.org/2008edition/ and search for "sh -"
> for details).  I suspect the problem is rather the seemingly-unbalanced
> braces:
>
>> <       if test "${REV}" != "${REV%{*\}}"
>
> How about this patch?
>
> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
> ---
> diff --git a/git-stash.sh b/git-stash.sh
> index 5fb1245..0a41226 100755
> --- a/git-stash.sh
> +++ b/git-stash.sh
> @@ -311,7 +311,7 @@ parse_flags_and_rev()
>        test "$ref_stash" = "$(git rev-parse --symbolic-full-name "${REV%@*}")" &&
>        IS_STASH_REF=t
>
> -       if test "${REV}" != "${REV%{*\}}"
> +       if test "${REV}" != "${REV%\{*\}}"
>        then
>                # maintainers: it would be better if git rev-parse indicated
>                # this condition with a non-zero status code but as of 1.7.2.1 it
>

← back to recent threads