t0020: fix ignored exit code inside loops
authorJeff King <peff@peff.net>
Wed, 25 Mar 2015 05:28:44 +0000 (01:28 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Mar 2015 17:22:35 +0000 (10:22 -0700)
A loop like:

for f in one two; do
something $f ||
break
done

will correctly break out of the loop when we see a failure
of one item, but the resulting exit code will always be
zero. We can fix that by putting the loop into a function or
subshell, but in this case it is simpler still to just
unroll the loop. We do add a helper function, which
hopefully makes the end result even more readable (in
addition to being shorter).

Reported-by: SZEDER Gábor <szeder@ira.uka.de>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t0020-crlf.sh
index 9fa26df729fe45ad81d4c80d791da0fd7eb1bc02..144fdcde7bd5c66467142f18713d4ec6bfccb071 100755 (executable)
@@ -8,6 +8,13 @@ has_cr() {
        tr '\015' Q <"$1" | grep Q >/dev/null
 }
 
+# add or remove CRs to disk file in-place
+# usage: munge_cr <append|remove> <file>
+munge_cr () {
+       "${1}_cr" <"$2" >tmp &&
+       mv tmp "$2"
+}
+
 test_expect_success setup '
 
        git config core.autocrlf false &&
@@ -100,14 +107,9 @@ test_expect_success 'update with autocrlf=input' '
        rm -f tmp one dir/two three &&
        git read-tree --reset -u HEAD &&
        git config core.autocrlf input &&
-
-       for f in one dir/two
-       do
-               append_cr <$f >tmp && mv -f tmp $f &&
-               git update-index -- $f ||
-               break
-       done &&
-
+       munge_cr append one &&
+       munge_cr append dir/two &&
+       git update-index -- one dir/two &&
        differs=$(git diff-index --cached HEAD) &&
        verbose test -z "$differs"
 
@@ -118,14 +120,9 @@ test_expect_success 'update with autocrlf=true' '
        rm -f tmp one dir/two three &&
        git read-tree --reset -u HEAD &&
        git config core.autocrlf true &&
-
-       for f in one dir/two
-       do
-               append_cr <$f >tmp && mv -f tmp $f &&
-               git update-index -- $f ||
-               break
-       done &&
-
+       munge_cr append one &&
+       munge_cr append dir/two &&
+       git update-index -- one dir/two &&
        differs=$(git diff-index --cached HEAD) &&
        verbose test -z "$differs"
 
@@ -136,13 +133,9 @@ test_expect_success 'checkout with autocrlf=true' '
        rm -f tmp one dir/two three &&
        git config core.autocrlf true &&
        git read-tree --reset -u HEAD &&
-
-       for f in one dir/two
-       do
-               remove_cr <"$f" >tmp && mv -f tmp $f &&
-               verbose git update-index -- $f ||
-               break
-       done &&
+       munge_cr remove one &&
+       munge_cr remove dir/two &&
+       git update-index -- one dir/two &&
        test "$one" = $(git hash-object --stdin <one) &&
        test "$two" = $(git hash-object --stdin <dir/two) &&
        differs=$(git diff-index --cached HEAD) &&
@@ -154,18 +147,9 @@ test_expect_success 'checkout with autocrlf=input' '
        rm -f tmp one dir/two three &&
        git config core.autocrlf input &&
        git read-tree --reset -u HEAD &&
-
-       for f in one dir/two
-       do
-               if has_cr "$f"
-               then
-                       echo "Eh? $f"
-                       false
-                       break
-               else
-                       git update-index -- $f
-               fi
-       done &&
+       test_must_fail has_cr one &&
+       test_must_fail has_cr two &&
+       git update-index -- one dir/two &&
        test "$one" = $(git hash-object --stdin <one) &&
        test "$two" = $(git hash-object --stdin <dir/two) &&
        differs=$(git diff-index --cached HEAD) &&