Skip to content

Commit 53039ab

Browse files
bdwaltongitster
authored andcommitted
Avoid difference in tr semantics between System V and BSD
Solaris' tr (both /usr/bin/ and /usr/xpg4/bin) uses the System V semantics for tr whereby string1's length is truncated to the length of string2 if string2 is shorter. The BSD semantics, as used by GNU tr see string2 padded to the length of string1 using the final character in string2. POSIX explicitly doesn't specify the correct behavior here, making both equally valid. This difference means that Solaris' native tr implementations produce different results for tr ":\t\n" "\0" than GNU tr. This breaks a few tests in t0008-ignores.sh. Possible fixes for this are to make string2 be "\0\0\0" or "[\0*]". Instead, use perl to perform these transliterations which means we don't need to worry about the difference at all. Since we're replacing tr with perl, we also use perl to replace the sed invocations used to transform the files. Replace four identical transforms with a function named broken_c_unquote. Replace the other two identical transforms with a fuction named broken_c_unquote_verbose. Signed-off-by: Ben Walton <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 90a9530 commit 53039ab

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

t/t0008-ignores.sh

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@ test_stderr () {
3737
test_cmp "$HOME/expected-stderr" "$HOME/stderr"
3838
}
3939

40+
broken_c_unquote () {
41+
"$PERL_PATH" -pe 's/^"//; s/\\//; s/"$//; tr/\n/\0/' "$@"
42+
}
43+
44+
broken_c_unquote_verbose () {
45+
"$PERL_PATH" -pe 's/ "/ /; s/\\//; s/"$//; tr/:\t\n/\0/' "$@"
46+
}
47+
4048
stderr_contains () {
4149
regexp="$1"
4250
if grep "$regexp" "$HOME/stderr"
@@ -606,12 +614,11 @@ cat <<-EOF >expected-verbose
606614
$global_excludes:2:!globaltwo b/globaltwo
607615
EOF
608616

609-
sed -e 's/^"//' -e 's/\\//' -e 's/"$//' stdin | \
610-
tr "\n" "\0" >stdin0
611-
sed -e 's/^"//' -e 's/\\//' -e 's/"$//' expected-default | \
612-
tr "\n" "\0" >expected-default0
613-
sed -e 's/ "/ /' -e 's/\\//' -e 's/"$//' expected-verbose | \
614-
tr ":\t\n" "\0" >expected-verbose0
617+
broken_c_unquote stdin >stdin0
618+
619+
broken_c_unquote expected-default >expected-default0
620+
621+
broken_c_unquote_verbose expected-verbose >expected-verbose0
615622

616623
test_expect_success '--stdin' '
617624
expect_from_stdin <expected-default &&
@@ -692,12 +699,11 @@ EOF
692699
grep -v '^:: ' expected-all >expected-verbose
693700
sed -e 's/.* //' expected-verbose >expected-default
694701

695-
sed -e 's/^"//' -e 's/\\//' -e 's/"$//' stdin | \
696-
tr "\n" "\0" >stdin0
697-
sed -e 's/^"//' -e 's/\\//' -e 's/"$//' expected-default | \
698-
tr "\n" "\0" >expected-default0
699-
sed -e 's/ "/ /' -e 's/\\//' -e 's/"$//' expected-verbose | \
700-
tr ":\t\n" "\0" >expected-verbose0
702+
broken_c_unquote stdin >stdin0
703+
704+
broken_c_unquote expected-default >expected-default0
705+
706+
broken_c_unquote_verbose expected-verbose >expected-verbose0
701707

702708
test_expect_success '--stdin from subdirectory' '
703709
expect_from_stdin <expected-default &&

0 commit comments

Comments
 (0)