2005-10-15 23:15:49 +00:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2005 Junio C Hamano
|
|
|
|
#
|
|
|
|
|
|
|
|
test_description='Pathnames with funny characters.
|
|
|
|
|
|
|
|
This test tries pathnames with funny characters in the working
|
|
|
|
tree, index, and tree objects.
|
|
|
|
'
|
|
|
|
|
2021-10-12 13:56:44 +00:00
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
2005-10-15 23:15:49 +00:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
t3300-*.sh: Fix a TAP parse error
At present, running the t3300-*.sh test on cygwin looks like:
$ cd t
$ ./t3300-funny-names.sh
ok 1 - setup
# passed all 1 test(s)
1..1 # SKIP Your filesystem does not allow tabs in filenames
$
Unfortunately, this is not valid TAP output, which prove notes
as follows:
$ prove --exec sh t3300-funny-names.sh
t3300-funny-names.sh .. All 1 subtests passed
Test Summary Report
-------------------
t3300-funny-names.sh (Wstat: 0 Tests: 1 Failed: 0)
Parse errors: No plan found in TAP output
Files=1, Tests=1, 2 wallclock secs ( 0.05 usr 0.00 sys + \
0.90 cusr 0.49 csys = 1.43 CPU)
Result: FAIL
$
This is due to the 'trailing_plan' having a 'skip_directive'
attached to it. This is not allowed by the TAP grammar, which
only allows a 'leading_plan' to be followed by an optional
'skip_directive'. (see perldoc TAP::Parser::Grammar).
A trailing_plan is one that appears in the TAP output after one or
more test status lines (that start 'not '? 'ok ' ...), whereas a
leading_plan must appear before all test status lines (if any).
In practice, this means that the test script cannot contain a use
of the 'skip all' facility:
skip_all='Some reason to skip *all* tests in this file'
test_done
after having already executed one or more tests with (for example)
'test_expect_success'. Unfortunately, this is exactly what this
test script is doing. The first 'setup' test is actually used to
determine if the test prerequisite is satisfied by the filesystem
(ie does it allow tabs in filenames?).
In order to fix the parse errors, place the code to determine the
test prerequisite at the top level of the script, prior to the
first test, rather than as a parameter to test_expect_success.
This allows us to correctly use 'skip_all', thus:
$ ./t3300-funny-names.sh
# passed all 0 test(s)
1..0 # SKIP Your filesystem does not allow tabs in filenames
$
$ prove --exec sh t3300-funny-names.sh
t3300-funny-names.sh .. skipped: Your filesystem does not \
allow tabs in filenames
Files=1, Tests=0, 2 wallclock secs ( 0.02 usr 0.03 sys + \
0.84 cusr 0.41 csys = 1.29 CPU)
Result: NOTESTS
$
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-09-01 18:08:42 +00:00
|
|
|
HT=' '
|
|
|
|
|
mingw: do not bother to test funny file names
MSYS2 actually allows to create files or directories whose names contain
tabs, newlines or colors, even if plain Win32 API cannot access them.
As we are using an MSYS2 bash to run the tests, such files or
directories are created successfully, but Git itself has no chance to
work with them because it is a regular Windows program, hence limited by
the Win32 API.
With this change, on Windows otherwise failing tests in
t3300-funny-names.sh, t3600-rm.sh, t3703-add-magic-pathspec.sh,
t3902-quoted.sh, t4016-diff-quote.sh, t4135-apply-weird-filenames.sh,
t9200-git-cvsexportcommit.sh, and t9903-bash-prompt.sh are skipped.
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2016-01-27 16:20:26 +00:00
|
|
|
test_have_prereq MINGW ||
|
t3300-*.sh: Fix a TAP parse error
At present, running the t3300-*.sh test on cygwin looks like:
$ cd t
$ ./t3300-funny-names.sh
ok 1 - setup
# passed all 1 test(s)
1..1 # SKIP Your filesystem does not allow tabs in filenames
$
Unfortunately, this is not valid TAP output, which prove notes
as follows:
$ prove --exec sh t3300-funny-names.sh
t3300-funny-names.sh .. All 1 subtests passed
Test Summary Report
-------------------
t3300-funny-names.sh (Wstat: 0 Tests: 1 Failed: 0)
Parse errors: No plan found in TAP output
Files=1, Tests=1, 2 wallclock secs ( 0.05 usr 0.00 sys + \
0.90 cusr 0.49 csys = 1.43 CPU)
Result: FAIL
$
This is due to the 'trailing_plan' having a 'skip_directive'
attached to it. This is not allowed by the TAP grammar, which
only allows a 'leading_plan' to be followed by an optional
'skip_directive'. (see perldoc TAP::Parser::Grammar).
A trailing_plan is one that appears in the TAP output after one or
more test status lines (that start 'not '? 'ok ' ...), whereas a
leading_plan must appear before all test status lines (if any).
In practice, this means that the test script cannot contain a use
of the 'skip all' facility:
skip_all='Some reason to skip *all* tests in this file'
test_done
after having already executed one or more tests with (for example)
'test_expect_success'. Unfortunately, this is exactly what this
test script is doing. The first 'setup' test is actually used to
determine if the test prerequisite is satisfied by the filesystem
(ie does it allow tabs in filenames?).
In order to fix the parse errors, place the code to determine the
test prerequisite at the top level of the script, prior to the
first test, rather than as a parameter to test_expect_success.
This allows us to correctly use 'skip_all', thus:
$ ./t3300-funny-names.sh
# passed all 0 test(s)
1..0 # SKIP Your filesystem does not allow tabs in filenames
$
$ prove --exec sh t3300-funny-names.sh
t3300-funny-names.sh .. skipped: Your filesystem does not \
allow tabs in filenames
Files=1, Tests=0, 2 wallclock secs ( 0.02 usr 0.03 sys + \
0.84 cusr 0.41 csys = 1.29 CPU)
Result: NOTESTS
$
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-09-01 18:08:42 +00:00
|
|
|
echo 2>/dev/null > "Name with an${HT}HT"
|
|
|
|
if ! test -f "Name with an${HT}HT"
|
|
|
|
then
|
|
|
|
# since FAT/NTFS does not allow tabs in filenames, skip this test
|
|
|
|
skip_all='Your filesystem does not allow tabs in filenames'
|
|
|
|
test_done
|
|
|
|
fi
|
|
|
|
|
2005-10-15 23:15:49 +00:00
|
|
|
p0='no-funny'
|
2005-12-11 02:36:15 +00:00
|
|
|
p1='tabs ," (dq) and spaces'
|
2005-10-17 20:32:14 +00:00
|
|
|
p2='just space'
|
2005-10-15 23:15:49 +00:00
|
|
|
|
2012-03-13 04:59:52 +00:00
|
|
|
test_expect_success 'setup' '
|
|
|
|
cat >"$p0" <<-\EOF &&
|
|
|
|
1. A quick brown fox jumps over the lazy cat, oops dog.
|
|
|
|
2. A quick brown fox jumps over the lazy cat, oops dog.
|
|
|
|
3. A quick brown fox jumps over the lazy cat, oops dog.
|
|
|
|
EOF
|
|
|
|
|
|
|
|
{ cat "$p0" >"$p1" || :; } &&
|
t3300-*.sh: Fix a TAP parse error
At present, running the t3300-*.sh test on cygwin looks like:
$ cd t
$ ./t3300-funny-names.sh
ok 1 - setup
# passed all 1 test(s)
1..1 # SKIP Your filesystem does not allow tabs in filenames
$
Unfortunately, this is not valid TAP output, which prove notes
as follows:
$ prove --exec sh t3300-funny-names.sh
t3300-funny-names.sh .. All 1 subtests passed
Test Summary Report
-------------------
t3300-funny-names.sh (Wstat: 0 Tests: 1 Failed: 0)
Parse errors: No plan found in TAP output
Files=1, Tests=1, 2 wallclock secs ( 0.05 usr 0.00 sys + \
0.90 cusr 0.49 csys = 1.43 CPU)
Result: FAIL
$
This is due to the 'trailing_plan' having a 'skip_directive'
attached to it. This is not allowed by the TAP grammar, which
only allows a 'leading_plan' to be followed by an optional
'skip_directive'. (see perldoc TAP::Parser::Grammar).
A trailing_plan is one that appears in the TAP output after one or
more test status lines (that start 'not '? 'ok ' ...), whereas a
leading_plan must appear before all test status lines (if any).
In practice, this means that the test script cannot contain a use
of the 'skip all' facility:
skip_all='Some reason to skip *all* tests in this file'
test_done
after having already executed one or more tests with (for example)
'test_expect_success'. Unfortunately, this is exactly what this
test script is doing. The first 'setup' test is actually used to
determine if the test prerequisite is satisfied by the filesystem
(ie does it allow tabs in filenames?).
In order to fix the parse errors, place the code to determine the
test prerequisite at the top level of the script, prior to the
first test, rather than as a parameter to test_expect_success.
This allows us to correctly use 'skip_all', thus:
$ ./t3300-funny-names.sh
# passed all 0 test(s)
1..0 # SKIP Your filesystem does not allow tabs in filenames
$
$ prove --exec sh t3300-funny-names.sh
t3300-funny-names.sh .. skipped: Your filesystem does not \
allow tabs in filenames
Files=1, Tests=0, 2 wallclock secs ( 0.02 usr 0.03 sys + \
0.84 cusr 0.41 csys = 1.29 CPU)
Result: NOTESTS
$
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-09-01 18:08:42 +00:00
|
|
|
{ echo "Foo Bar Baz" >"$p2" || :; }
|
2012-03-13 04:59:52 +00:00
|
|
|
'
|
2005-10-15 23:15:49 +00:00
|
|
|
|
2012-03-13 04:59:52 +00:00
|
|
|
test_expect_success 'setup: populate index and tree' '
|
|
|
|
git update-index --add "$p0" "$p2" &&
|
|
|
|
t0=$(git write-tree)
|
|
|
|
'
|
2010-08-11 19:04:10 +00:00
|
|
|
|
2012-03-13 04:59:52 +00:00
|
|
|
test_expect_success 'ls-files prints space in filename verbatim' '
|
|
|
|
printf "%s\n" "just space" no-funny >expected &&
|
2007-07-03 05:52:14 +00:00
|
|
|
git ls-files >current &&
|
2012-03-13 04:59:52 +00:00
|
|
|
test_cmp expected current
|
|
|
|
'
|
2005-10-15 23:15:49 +00:00
|
|
|
|
2012-03-13 04:59:52 +00:00
|
|
|
test_expect_success 'setup: add funny filename' '
|
|
|
|
git update-index --add "$p1" &&
|
|
|
|
t1=$(git write-tree)
|
2010-08-11 19:04:10 +00:00
|
|
|
'
|
|
|
|
|
2012-03-13 04:59:52 +00:00
|
|
|
test_expect_success 'ls-files quotes funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
just space
|
|
|
|
no-funny
|
|
|
|
"tabs\t,\" (dq) and spaces"
|
|
|
|
EOF
|
2007-07-03 05:52:14 +00:00
|
|
|
git ls-files >current &&
|
2012-03-13 04:59:52 +00:00
|
|
|
test_cmp expected current
|
|
|
|
'
|
2005-10-15 23:15:49 +00:00
|
|
|
|
2012-03-13 04:59:52 +00:00
|
|
|
test_expect_success 'ls-files -z does not quote funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
just space
|
|
|
|
no-funny
|
|
|
|
tabs ," (dq) and spaces
|
|
|
|
EOF
|
|
|
|
git ls-files -z >ls-files.z &&
|
2013-10-29 01:23:03 +00:00
|
|
|
perl -pe "y/\000/\012/" <ls-files.z >current &&
|
2012-03-13 04:59:52 +00:00
|
|
|
test_cmp expected current
|
|
|
|
'
|
2005-10-15 23:15:49 +00:00
|
|
|
|
2012-03-13 04:59:52 +00:00
|
|
|
test_expect_success 'ls-tree quotes funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
just space
|
|
|
|
no-funny
|
|
|
|
"tabs\t,\" (dq) and spaces"
|
2012-03-13 04:58:59 +00:00
|
|
|
EOF
|
2012-03-13 04:59:52 +00:00
|
|
|
git ls-tree -r $t1 >ls-tree &&
|
|
|
|
sed -e "s/^[^ ]* //" <ls-tree >current &&
|
|
|
|
test_cmp expected current
|
|
|
|
'
|
2012-03-13 04:58:59 +00:00
|
|
|
|
2012-03-13 04:59:52 +00:00
|
|
|
test_expect_success 'diff-index --name-status quotes funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
A "tabs\t,\" (dq) and spaces"
|
|
|
|
EOF
|
|
|
|
git diff-index --name-status $t0 >current &&
|
|
|
|
test_cmp expected current
|
2010-08-11 19:04:10 +00:00
|
|
|
'
|
|
|
|
|
2012-03-13 04:59:52 +00:00
|
|
|
test_expect_success 'diff-tree --name-status quotes funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
A "tabs\t,\" (dq) and spaces"
|
|
|
|
EOF
|
|
|
|
git diff-tree --name-status $t0 $t1 >current &&
|
|
|
|
test_cmp expected current
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'diff-index -z does not quote funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
A
|
|
|
|
tabs ," (dq) and spaces
|
|
|
|
EOF
|
|
|
|
git diff-index -z --name-status $t0 >diff-index.z &&
|
2013-10-29 01:23:03 +00:00
|
|
|
perl -pe "y/\000/\012/" <diff-index.z >current &&
|
2012-03-13 04:59:52 +00:00
|
|
|
test_cmp expected current
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'diff-tree -z does not quote funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
A
|
|
|
|
tabs ," (dq) and spaces
|
|
|
|
EOF
|
|
|
|
git diff-tree -z --name-status $t0 $t1 >diff-tree.z &&
|
2013-10-29 01:23:03 +00:00
|
|
|
perl -pe y/\\000/\\012/ <diff-tree.z >current &&
|
2012-03-13 04:59:52 +00:00
|
|
|
test_cmp expected current
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'diff-tree --find-copies-harder quotes funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
CNUM no-funny "tabs\t,\" (dq) and spaces"
|
|
|
|
EOF
|
|
|
|
git diff-tree -C --find-copies-harder --name-status $t0 $t1 >out &&
|
|
|
|
sed -e "s/^C[0-9]*/CNUM/" <out >current &&
|
|
|
|
test_cmp expected current
|
|
|
|
'
|
2005-10-15 23:15:49 +00:00
|
|
|
|
2012-03-13 04:59:52 +00:00
|
|
|
test_expect_success 'setup: remove unfunny index entry' '
|
|
|
|
git update-index --force-remove "$p0"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'diff-tree -M quotes funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
RNUM no-funny "tabs\t,\" (dq) and spaces"
|
|
|
|
EOF
|
|
|
|
git diff-index -M --name-status $t0 >out &&
|
|
|
|
sed -e "s/^R[0-9]*/RNUM/" <out >current &&
|
|
|
|
test_cmp expected current
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'diff-index -M -p quotes funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
diff --git a/no-funny "b/tabs\t,\" (dq) and spaces"
|
|
|
|
similarity index NUM%
|
|
|
|
rename from no-funny
|
|
|
|
rename to "tabs\t,\" (dq) and spaces"
|
|
|
|
EOF
|
|
|
|
git diff-index -M -p $t0 >diff &&
|
|
|
|
sed -e "s/index [0-9]*%/index NUM%/" <diff >current &&
|
|
|
|
test_cmp expected current
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'setup: mode change' '
|
|
|
|
chmod +x "$p1"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'diff-index -M -p with mode change quotes funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
diff --git a/no-funny "b/tabs\t,\" (dq) and spaces"
|
|
|
|
old mode 100644
|
|
|
|
new mode 100755
|
|
|
|
similarity index NUM%
|
|
|
|
rename from no-funny
|
|
|
|
rename to "tabs\t,\" (dq) and spaces"
|
|
|
|
EOF
|
|
|
|
git diff-index -M -p $t0 >diff &&
|
|
|
|
sed -e "s/index [0-9]*%/index NUM%/" <diff >current &&
|
|
|
|
test_cmp expected current
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'diffstat for rename quotes funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
"tabs\t,\" (dq) and spaces"
|
|
|
|
1 file changed, 0 insertions(+), 0 deletions(-)
|
|
|
|
EOF
|
|
|
|
git diff-index -M -p $t0 >diff &&
|
|
|
|
git apply --stat <diff >diffstat &&
|
|
|
|
sed -e "s/|.*//" -e "s/ *\$//" <diffstat >current &&
|
2021-02-11 01:53:53 +00:00
|
|
|
test_cmp expected current
|
2012-03-13 04:59:52 +00:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'numstat for rename quotes funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
0 0 "tabs\t,\" (dq) and spaces"
|
|
|
|
EOF
|
|
|
|
git diff-index -M -p $t0 >diff &&
|
|
|
|
git apply --numstat <diff >current &&
|
|
|
|
test_cmp expected current
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'numstat without -M quotes funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
0 3 no-funny
|
|
|
|
3 0 "tabs\t,\" (dq) and spaces"
|
|
|
|
EOF
|
|
|
|
git diff-index -p $t0 >diff &&
|
|
|
|
git apply --numstat <diff >current &&
|
|
|
|
test_cmp expected current
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'numstat for non-git rename diff quotes funny filename' '
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
0 3 no-funny
|
|
|
|
3 0 "tabs\t,\" (dq) and spaces"
|
|
|
|
EOF
|
|
|
|
git diff-index -p $t0 >git-diff &&
|
|
|
|
sed -ne "/^[-+@]/p" <git-diff >diff &&
|
|
|
|
git apply --numstat <diff >current &&
|
|
|
|
test_cmp expected current
|
|
|
|
'
|
2005-10-15 23:15:49 +00:00
|
|
|
|
|
|
|
test_done
|