From 15ffb7cde48b73b3d5ce259443db7d2e0ba13750 Mon Sep 17 00:00:00 2001 From: Fredrik Gustafsson Date: Mon, 13 Jun 2011 19:15:26 +0200 Subject: submodule update: continue when a checkout fails "git submodule update" stops at the first error and gives control back to the user. Only after the user fixes the problematic submodule and runs "git submodule update" again, the second error is found. And the user needs to repeat until all the problems are found and fixed one by one. This is tedious. Instead, the command can remember which submodules it had trouble with, continue updating the ones it can, and report which ones had errors at the end. The user can run "git submodule update", find all the ones that need minor fixing (e.g. working tree was dirty) to fix them in a single pass. Then another "git submodule update" can be run to update all. Note that the problematic submodules are skipped only when they are to be integrated with a safer value of submodule..update option, namely "checkout". Fixing a failure in a submodule that uses "rebase" or "merge" may need an involved conflict resolution by the user, and leaving too many submodules in states that need resolution would not reduce the mental burden on the user. Signed-off-by: Fredrik Gustafsson Mentored-by: Jens Lehmann Mentored-by: Heiko Voigt Signed-off-by: Junio C Hamano --- git-submodule.sh | 50 ++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 6 deletions(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index d189a24c71..eb5eebcd96 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -444,7 +444,8 @@ cmd_update() fi cloned_modules= - module_list "$@" | + module_list "$@" | { + err= while read mode sha1 stage path do if test "$stage" = U @@ -525,17 +526,54 @@ cmd_update() ;; esac - (clear_local_git_env; cd "$path" && $command "$sha1") || - die "Unable to $action '$sha1' in submodule path '$path'" - say "Submodule path '$path': $msg '$sha1'" + if (clear_local_git_env; cd "$path" && $command "$sha1") + then + say "Submodule path '$path': $msg '$sha1'" + else + case $action in + rebase|merge) + die_with_status 2 "Unable to $action '$sha1' in submodule path '$path'" + ;; + *) + err="${err};Failed to $action in submodule path '$path'" + continue + ;; + esac + fi fi if test -n "$recursive" then - (clear_local_git_env; cd "$path" && eval cmd_update "$orig_flags") || - die "Failed to recurse into submodule path '$path'" + (clear_local_git_env; cd "$path" && eval cmd_update "$orig_flags") + res=$? + if test $res -gt 0 + then + if test $res -eq 1 + then + err="${err};Failed to recurse into submodule path '$path'" + continue + else + die_with_status $res "Failed to recurse into submodule path '$path'" + fi + fi fi done + + if test -n "$err" + then + OIFS=$IFS + IFS=';' + for e in $err + do + if test -n "$e" + then + echo >&2 "$e" + fi + done + IFS=$OIFS + exit 1 + fi + } } set_name_rev () { -- cgit v1.3 From 877449c136539cf8b9b4ed9cfe33a796b7b93f93 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 13 Jun 2011 12:17:52 -0700 Subject: git-submodule.sh: clarify the "should we die now" logic Earlier the decision to stop or continue was made on the $action variable that was set by inspecting $update_module variable. The former is a redundant variable and will be removed in another topic. Decide upon inspecting $update_module if a failure should cascade up to cause us immediately stop, and use a variable that means just that, to clarify the logic. Incidentally this also makes the merge with the other topic slightly easier and cleaner to understand. Signed-off-by: Junio C Hamano --- git-submodule.sh | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) (limited to 'git-submodule.sh') diff --git a/git-submodule.sh b/git-submodule.sh index eb5eebcd96..066d6b5716 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -508,16 +508,19 @@ cmd_update() update_module= ;; esac + must_die_on_failure= case "$update_module" in rebase) command="git rebase" action="rebase" msg="rebased onto" + must_die_on_failure=yes ;; merge) command="git merge" action="merge" msg="merged in" + must_die_on_failure=yes ;; *) command="git checkout $subforce -q" @@ -529,16 +532,12 @@ cmd_update() if (clear_local_git_env; cd "$path" && $command "$sha1") then say "Submodule path '$path': $msg '$sha1'" + elif test -n "$must_die_on_failure" + then + die_with_status 2 "Unable to $action '$sha1' in submodule path '$path'" else - case $action in - rebase|merge) - die_with_status 2 "Unable to $action '$sha1' in submodule path '$path'" - ;; - *) - err="${err};Failed to $action in submodule path '$path'" - continue - ;; - esac + err="${err};Failed to $action in submodule path '$path'" + continue fi fi -- cgit v1.3