On Mon, Jan 22 2018, Junio C. Hamano jotted: > Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> writes: > >> If the $cmdline variable contains multiple arguments they won't be >> interpolated correctly since the body of the test is single quoted. I >> don't know what part of test-lib.sh is expanding variables within >> single-quoted strings,... > > dothis='echo whatever $IFS separated strings' > test_expect_success label ' > $dothis > ' > > works because test_expect_success ends up beint a glorified 'eval' > and it sees the value of $dothis. > >> but interpolating this inline is the desired >> behavior here. > > I am not sure what you meant by this, though. Looking into this again: myvar="a b 'c' \"d\" \"\\\"e\\\"\"" test_expect_success 'blah' ' /usr/bin/perl -MData::Dumper -wE say\ Dumper\ \\@ARGV -- $myvar && /usr/bin/perl -MData::Dumper -wE say\ Dumper\ \\@ARGV -- '"$myvar"' && echo $myvar && false ' Produces: Initialized empty Git repository in /home/avar/g/git/t/trash directory.t5510-fetch/.git/ expecting success: /usr/bin/perl -MData::Dumper -wE say\ Dumper\ \\@ARGV -- $myvar && /usr/bin/perl -MData::Dumper -wE say\ Dumper\ \\@ARGV -- a b 'c' "d" "\"e\"" && echo $myvar && false + /usr/bin/perl -MData::Dumper -wE say Dumper \@ARGV -- a b 'c' "d" "\"e\"" $VAR1 = [ 'a', 'b', '\'c\'', '"d"', '"\\"e\\""' ]; + /usr/bin/perl -MData::Dumper -wE say Dumper \@ARGV -- a b c d "e" $VAR1 = [ 'a', 'b', 'c', 'd', '"e"' ]; + echo a b 'c' "d" "\"e\"" a b 'c' "d" "\"e\"" + false error: last command exited with $?=1 not ok 1 - blah # # /usr/bin/perl -MData::Dumper -wE say\ Dumper\ \\@ARGV -- $myvar && # /usr/bin/perl -MData::Dumper -wE say\ Dumper\ \\@ARGV -- a b 'c' "d" "\"e\"" && # echo $myvar && # false # I.e. the desired effect is to get variables like the refspec like/this not 'like/this'. I could also just apply this on top, which gives the same end result, but now I wonder if starting some args with e.g. unescaped + and with : and * in the string is portable: diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh index 48f49b613a..2d311059e9 100755 --- a/t/t5510-fetch.sh +++ b/t/t5510-fetch.sh @@ -587 +587 @@ test_configured_prune () { - git fetch '"$cmdline"' && + git fetch $cmdline && @@ -621 +621 @@ test_configured_prune unset unset unset unset kept pruned \ - "--prune origin 'refs/tags/*:refs/tags/*'" + "--prune origin refs/tags/*:refs/tags/*" @@ -623 +623 @@ test_configured_prune unset unset unset unset pruned pruned \ - "--prune origin 'refs/tags/*:refs/tags/*' '+refs/heads/*:refs/remotes/origin/*'" + "--prune origin refs/tags/*:refs/tags/* +refs/heads/*:refs/remotes/origin/*" @@ -641 +641 @@ test_configured_prune false false unset unset kept pruned \ - "--prune origin 'refs/tags/*:refs/tags/*'" + "--prune origin refs/tags/*:refs/tags/*" @@ -643 +643 @@ test_configured_prune false false unset unset pruned pruned \ - "--prune origin 'refs/tags/*:refs/tags/*' '+refs/heads/*:refs/remotes/origin/*'" + "--prune origin refs/tags/*:refs/tags/* +refs/heads/*:refs/remotes/origin/*" @@ -661 +661 @@ test_configured_prune true true unset unset kept pruned \ - "--prune origin 'refs/tags/*:refs/tags/*'" + "--prune origin refs/tags/*:refs/tags/*" @@ -663 +663 @@ test_configured_prune true true unset unset pruned pruned \ - "--prune origin 'refs/tags/*:refs/tags/*' '+refs/heads/*:refs/remotes/origin/*'" + "--prune origin refs/tags/*:refs/tags/* +refs/heads/*:refs/remotes/origin/*" @@ -684 +684 @@ test_configured_prune true false true false kept kept "" -# When --prune-tags is supplied it's ignored if an explict refspec is +# When --prune-tags is supplied its ignored if an explict refspec is @@ -687 +687 @@ test_configured_prune unset unset unset unset pruned kept \ - "--prune --prune-tags origin '+refs/heads/*:refs/remotes/origin/*'" + "--prune --prune-tags origin +refs/heads/*:refs/remotes/origin/*" @@ -689 +689 @@ test_configured_prune unset unset true unset pruned kept \ - "--prune --prune-tags origin '+refs/heads/*:refs/remotes/origin/*'" + "--prune --prune-tags origin +refs/heads/*:refs/remotes/origin/*" @@ -691 +691 @@ test_configured_prune unset unset unset true pruned kept \ - "--prune --prune-tags origin '+refs/heads/*:refs/remotes/origin/*'" + "--prune --prune-tags origin +refs/heads/*:refs/remotes/origin/*" >> - git fetch $cmdline && >> + git fetch '"$cmdline"' && > > Would this work with cmdline that needs to be quoted for the > resulting shell script to be syntactically correct (e.g. cmdline > with a single dq in it)? By stepping out of sq pair, you are > allowing/asking the shell that forms test_expect_success command > line arguments to interpolate cmdline, instead of asking the shell > that evals test_expect_success with its command line argument > strings. > > In other words, I suspect that the caller of test_configured_prune > now must sq_quote the cmdline arguments it passes to this helper, > i.e. > > cmdline="$(git rev-parse --sq-quote arg1 'arg"2' arg3)" > test_configured_prune ... "$cmdline" ... > > for this patch to be correct. Sorry at this point I'm confused about this whole thing. This doesn't work and overquotes: @@ -559,2 +569,3 @@ test_configured_prune () { + cmdline_q="$(git rev-parse --sq-quote $cmdline)" test_expect_success "prune fetch.prune=$1 remote.origin.prune=$2 fetch.pruneTags=$3 remote.origin.pruneTags=$4${7:+ $7}; branch:$5 tag:$6" ' @@ -586,3 +597,4 @@ test_configured_prune () { - git fetch '"$cmdline"' && + /usr/bin/perl -MData::Dumper -wE say\ Dumper\ \\@ARGV -- '"$cmdline_q"' && + git fetch '"$cmdline_q"' && case "$expected_branch" in So does just using $cmdline_q without making the calling shell interpolate it. Is there an idiom I should be following that I'm missing here?