Re: [PATCH v2 04/12] fetch tests: double quote a variable for interpolation
- From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- Date
- Jan 22, 2018, 23:04 UTC
- Message-ID
- <87wp09h4w3.fsf@evledraar.gmail.com>
- In-Reply-To
- <xmqqbmhln01n.fsf@gitster.mtv.corp.google.com>
On Mon, Jan 22 2018, Junio C. Hamano jotted:
Show 19 quoted lines
> Ævar Arnfjörð Bjarmason <avarab@gmail.com> 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/*"Show 19 quoted lines
>> - 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" inSo 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?