Merge branch 'ak/submodule-foreach-quoting'
authorJunio C Hamano <gitster@pobox.com>
Thu, 5 Dec 2013 20:53:17 +0000 (12:53 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 5 Dec 2013 20:53:17 +0000 (12:53 -0800)
A behavior change, but a worthwhile one: "git submodule foreach"
was treating its arguments as part of a single command to be
concatenated and passed to a shell, making writing buggy
scripts too easy.

This patch preserves the old "just pass it to the shell" behavior
when a single argument is passed to 'git submodule foreach' and
moves to a new "skip the shell and use the arguments passed
unmolested" behavior when more than one argument is passed.

The old behavior (always concatenating and passing to the shell)
was similar to the 'ssh' command, while the new behavior (switching
on the number of arguments) is what 'xterm -e' does.

May need more thought to make sure this change is advertised well
so that scripts that used multiple arguments but added their own
extra layer of quoting are not broken.

* ak/submodule-foreach-quoting:
submodule foreach: skip eval for more than one argument

git-submodule.sh
t/t7407-submodule-foreach.sh
index 66f5f752c5fb6745ab409199deb775c4704ab3e6..c878d9579d5cdd66759ab14867f9e47ee75baf00 100755 (executable)
@@ -545,7 +545,12 @@ cmd_foreach()
                                sm_path=$(relative_path "$sm_path") &&
                                # we make $path available to scripts ...
                                path=$sm_path &&
-                               eval "$@" &&
+                               if test $# -eq 1
+                               then
+                                       eval "$1"
+                               else
+                                       "$@"
+                               fi &&
                                if test -n "$recursive"
                                then
                                        cmd_foreach "--recursive" "$@"
index b64c9ed8e73644b52aff38c7b4dca248ab690c73..7ca10b8606372051ff1a4093e320722f7784fa6b 100755 (executable)
@@ -325,4 +325,13 @@ test_expect_success 'command passed to foreach --recursive retains notion of std
        test_cmp expected actual
 '
 
+test_expect_success 'multi-argument command passed to foreach is not shell-evaluated twice' '
+       (
+               cd super &&
+               git submodule foreach "echo \\\"quoted\\\"" > ../expected &&
+               git submodule foreach echo \"quoted\" > ../actual
+       ) &&
+       test_cmp expected actual
+'
+
 test_done