Skip to content

Commit 2041b0e

Browse files
sunshinecogitster
authored andcommitted
t9107: use shell parameter expansion to avoid breaking &&-chain
This test intentionally breaks the &&-chain when using `expr` to parse "[<path>]:<ref>" since the pattern matching operation will return 1 (failure) when <path> is empty even though an empty <path> is legitimate in this test and should not cause the test to fail. However, it is possible to parse the input without breaking the &&-chain by using shell parameter expansion (i.e. `${i%%...}`). Other ways to avoid the problem would be `{ expr $i : ... ||:; }` or test_might_fail(), however, parameter expansion seems simplest. IMPLEMENTATION NOTE The rewritten `if` expression: if test "$ref" = "${ref#refs/remotes/}"`; then continue; fi is perhaps a bit subtle. At first glance, it looks like it will `continue` the loop if $ref starts with "refs/remotes/", but in fact it's the opposite: the loop will `continue` if $ref does not start with "refs/remotes/". In the original, `expr` would only match if the ref started with "refs/remotes/", and $ref would end up empty if it didn't, so `test -z` would `continue` the loop if the ref did not start with "refs/remotes/". With parameter expansion, ${ref#refs/remotes/} attempts to strip "refs/remotes/" from $ref. If it fails, meaning that $ref does not start with "refs/remotes/", then the expansion will just be $ref unchanged, and it will `continue` the loop. On the other hand, if stripping succeeds, meaning that $ref begins with "refs/remotes/", then the expansion will be the value of $ref with "refs/remotes/" removed, hence `continue` will not be taken. Signed-off-by: Eric Sunshine <[email protected]> Reviewed-by: Elijah Newren <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent efe47c8 commit 2041b0e

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

t/t9107-git-svn-migrate.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,10 @@ test_expect_success 'migrate --minimize on old inited layout' '
9898
rm -rf "$GIT_DIR"/svn &&
9999
for i in $(cat fetch.out)
100100
do
101-
path=$(expr $i : "\([^:]*\):.*$")
102-
ref=$(expr $i : "[^:]*:\(refs/remotes/.*\)$")
103-
if test -z "$ref"; then continue; fi
104-
if test -n "$path"; then path="/$path"; fi
101+
path=${i%%:*} &&
102+
ref=${i#*:} &&
103+
if test "$ref" = "${ref#refs/remotes/}"; then continue; fi &&
104+
if test -n "$path"; then path="/$path"; fi &&
105105
mkdir -p "$GIT_DIR"/svn/$ref/info/ &&
106106
echo "$svnrepo"$path >"$GIT_DIR"/svn/$ref/info/url ||
107107
return 1

0 commit comments

Comments
 (0)