Recursive invocations of submodule update/status preserve all arguments in the recursive invocation. This tends to cause undesired behavior when those arguments include the name of a submodule, as it tries to recurse into a nested submodule with the same name rather than recursing into all child submodules of the named submodule. This commit changes the argument preservation to only preserve flags. When specifying a submodule name on the command-line, all child submodules of that named submodule will be recursed into correctly, and it will not attempt to recurse into a phantom nested submodule with the same name as its parent. Signed-off-by: Kevin Ballard <kevin@xxxxxx> --- I'm tempted to make this commit also omit the --reference flag in recursive calls to cmd_update, as I don't believe it makes sense to use --reference in conjunction with --recursive, but it may be a better idea to simply produce an error if both flags are used together. git-submodule.sh | 19 ++++++++----------- t/t7407-submodule-foreach.sh | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/git-submodule.sh b/git-submodule.sh index 543554b..4fd8982 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -374,41 +374,35 @@ cmd_init() cmd_update() { # parse $args after "submodule ... update". - orig_args="$(git rev-parse --sq-quote "$@")" + orig_flags= while test $# -ne 0 do case "$1" in -q|--quiet) - shift GIT_QUIET=1 ;; -i|--init) init=1 - shift ;; -N|--no-fetch) - shift nofetch=1 ;; -r|--rebase) - shift update="rebase" ;; --reference) case "$2" in '') usage ;; esac reference="--reference=$2" - shift 2 + orig_flags="$orig_flags $(git rev-parse --sq-quote "$1")" + shift ;; --reference=*) reference="$1" - shift ;; -m|--merge) - shift update="merge" ;; --recursive) - shift recursive=1 ;; --) @@ -422,6 +416,8 @@ cmd_update() break ;; esac + orig_flags="$orig_flags $(git rev-parse --sq-quote "$1")" + shift done if test -n "$init" @@ -500,7 +496,7 @@ cmd_update() if test -n "$recursive" then - (clear_local_git_env; cd "$path" && eval cmd_update "$orig_args") || + (clear_local_git_env; cd "$path" && eval cmd_update "$orig_flags") || die "Failed to recurse into submodule path '$path'" fi done @@ -733,7 +729,7 @@ cmd_summary() { cmd_status() { # parse $args after "submodule ... status". - orig_args="$(git rev-parse --sq-quote "$@")" + orig_flags= while test $# -ne 0 do case "$1" in @@ -757,6 +753,7 @@ cmd_status() break ;; esac + orig_flags="$orig_flags $(git rev-parse --sq-quote "$1")" shift done diff --git a/t/t7407-submodule-foreach.sh b/t/t7407-submodule-foreach.sh index 905a8ba..2d5a855 100755 --- a/t/t7407-submodule-foreach.sh +++ b/t/t7407-submodule-foreach.sh @@ -238,4 +238,23 @@ test_expect_success 'use "git clone --recursive" to checkout all submodules' ' test -d clone4/nested1/nested2/nested3/submodule/.git ' +test_expect_success 'use "update --recursive nested1" to checkout all submodules rooted in nested1' ' + git clone super clone5 && + ( + cd clone5 && + test ! -d sub1/.git && + test ! -d sub2/.git && + test ! -d sub3/.git && + test ! -d nested1/.git && + git submodule update --init --recursive -- nested1 && + test ! -d sub1/.git && + test ! -d sub2/.git && + test ! -d sub3/.git && + test -d nested1/.git && + test -d nested1/nested2/.git && + test -d nested1/nested2/nested3/.git && + test -d nested1/nested2/nested3/submodule/.git + ) +' + test_done -- 1.7.3.2.200.g479de -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html