# git stash syntax error under AIX 5.3

3 messages from 2010-11-03 to 2010-11-03. Participants: Brian Riehman, Jonathan Nieder.
Thread: https://gitlist.dev/t/25628

## Brian Riehman, 2010-11-03 14:05

Subject: git stash syntax error under AIX 5.3
Message-ID: <AANLkTimSpPLfqv07+Tmcj-iM0W+p86V2-HRrq71Umdtr@mail.gmail.com>
URL: https://gitlist.dev/e/AANLkTimSpPLfqv07%2BTmcj-iM0W%2Bp86V2-HRrq71Umdtr%40mail.gmail.com

```
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
---
> #     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, 2010-11-03 15:07

Subject: Re: git stash syntax error under AIX 5.3
Message-ID: <20101103150718.GA12733@burratino>
URL: https://gitlist.dev/e/20101103150718.GA12733%40burratino
In-Reply-To: <AANLkTimSpPLfqv07+Tmcj-iM0W+p86V2-HRrq71Umdtr@mail.gmail.com>

```
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, 2010-11-03 15:29

Subject: Re: git stash syntax error under AIX 5.3
Message-ID: <AANLkTi=V7nu98xHVrVJuZqt_3hajMPvkk=AKB0HnOD-_@mail.gmail.com>
URL: https://gitlist.dev/e/AANLkTi%3DV7nu98xHVrVJuZqt_3hajMPvkk%3DAKB0HnOD-_%40mail.gmail.com
In-Reply-To: <20101103150718.GA12733@burratino>

```
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:
> 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
>

```
