wip wtk/submodule.name.branch-v3.5
authorW. Trevor King <wking@tremily.us>
Fri, 23 Nov 2012 18:11:18 +0000 (13:11 -0500)
committerW. Trevor King <wking@tremily.us>
Fri, 23 Nov 2012 18:11:18 +0000 (13:11 -0500)
Documentation/git-submodule.txt
git-submodule.sh
t/t7406-submodule-update.sh

index 02ea87b4aca4e44b98174af418c5f9d3aa58cd74..afa12697c9f86b3a000f547955e3e3583eb44bbd 100644 (file)
@@ -14,7 +14,8 @@ SYNOPSIS
 'git submodule' [--quiet] status [--cached] [--recursive] [--] [<path>...]
 'git submodule' [--quiet] init [--] [<path>...]
 'git submodule' [--quiet] update [--init] [-N|--no-fetch] [--rebase]
-             [--reference <repository>] [--merge] [--recursive] [--] [<path>...]
+             [--reference <repository>] [--merge] [--pull] [--recursive] [--]
+             [<path>...]
 'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>]
              [commit] [--] [<path>...]
 'git submodule' [--quiet] foreach [--recursive] <command>
@@ -136,11 +137,11 @@ init::
 
 update::
        Update the registered submodules, i.e. clone missing submodules and
-       checkout the commit specified in the index of the containing repository.
-       This will make the submodules HEAD be detached unless `--rebase` or
-       `--merge` is specified or the key `submodule.$name.update` is set to
-       `rebase`, `merge` or `none`. `none` can be overridden by specifying
-       `--checkout`.
+       checkout the commit specified in the index of the containing
+       repository.  This will make the submodules HEAD be detached unless
+       `--rebase`, `--merge`, or `--pull` is specified or the key
+       `submodule.$name.update` is set to `rebase`, `merge`, `pull`, or
+       `none`. `none` can be overridden by specifying `--checkout`.
 +
 If the submodule is not yet initialized, and you just want to use the
 setting as stored in .gitmodules, you can automatically initialize the
@@ -259,6 +260,16 @@ OPTIONS
        If the key `submodule.$name.update` is set to `merge`, this option is
        implicit.
 
+--pull::
+       This option is only valid for the update command.
+       Merge the commit recorded in the superproject into the current branch
+       of the submodule. If this option is given, the submodule's HEAD will
+       not be detached. If a merge failure prevents this process, you will
+       have to resolve the resulting conflicts within the submodule with the
+       usual conflict resolution tools.
+       If the key `submodule.$name.update` is set to `pull`, this option is
+       implicit.
+
 --rebase::
        This option is only valid for the update command.
        Rebase the current branch onto the commit recorded in the
index 3c3bb3f0e7e5bf6e0e5e033fe07878e036d173e7..c5d335325a001dc17b57030ab608fbbc7d85adde 100755 (executable)
@@ -8,7 +8,7 @@ dashless=$(basename "$0" | sed -e 's/-/ /')
 USAGE="[--quiet] add [-b branch] [--follow-branch[=<branch>]] [-f|--force] [--reference <repository>] [--] <repository> [<path>]
    or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...]
    or: $dashless [--quiet] init [--] [<path>...]
-   or: $dashless [--quiet] update [--init] [-N|--no-fetch] [-f|--force] [--rebase] [--reference <repository>] [--merge] [--recursive] [--] [<path>...]
+   or: $dashless [--quiet] update [--init] [-N|--no-fetch] [-f|--force] [--rebase] [--reference <repository>] [--merge] [--pull] [--recursive] [--] [<path>...]
    or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
    or: $dashless [--quiet] foreach [--recursive] <command>
    or: $dashless [--quiet] sync [--] [<path>...]"
@@ -554,6 +554,9 @@ cmd_update()
                -m|--merge)
                        update="merge"
                        ;;
+               -p|--pull)
+                       update="pull"
+                       ;;
                --recursive)
                        recursive=1
                        ;;
@@ -593,6 +596,7 @@ cmd_update()
                fi
                name=$(module_name "$sm_path") || exit
                url=$(git config submodule."$name".url)
+               branch=$(git config submodule."$name".branch)
                if ! test -z "$update"
                then
                        update_module=$update
@@ -653,6 +657,7 @@ Maybe you want to use 'update --init'?")"
                                update_module= ;;
                        esac
 
+                       res=
                        must_die_on_failure=
                        case "$update_module" in
                        rebase)
@@ -667,6 +672,13 @@ Maybe you want to use 'update --init'?")"
                                say_msg="$(eval_gettext "Submodule path '\$sm_path': merged in '\$sha1'")"
                                must_die_on_failure=yes
                                ;;
+                       pull)
+                               die_msg="$(eval_gettext "Unable to merge '\$sha1' in submodule path '\$sm_path'")"
+                               say_msg="$(eval_gettext "Submodule path '\$sm_path': merged in '\$sha1'")"
+                               must_die_on_failure=yes
+                               (clear_local_git_env; cd "$sm_path" && git checkout "$branch" && git pull --ff-only)
+                               res=$?
+                               ;;
                        *)
                                command="git checkout $subforce -q"
                                die_msg="$(eval_gettext "Unable to checkout '\$sha1' in submodule path '\$sm_path'")"
@@ -674,7 +686,12 @@ Maybe you want to use 'update --init'?")"
                                ;;
                        esac
 
-                       if (clear_local_git_env; cd "$sm_path" && $command "$sha1")
+                       if test -z "$res"
+                       then
+                               (clear_local_git_env; cd "$sm_path" && $command "$sha1")
+                               res=$?
+                       fi
+                       if test $res -eq 0
                        then
                                say "$say_msg"
                        elif test -n "$must_die_on_failure"
index 15426530e49ef2e42cda2528f4a72a784eb40cd9..460fc4cdb76a64ac05284ee6ed0604ad61dcd6e1 100755 (executable)
@@ -5,8 +5,9 @@
 
 test_description='Test updating submodules
 
-This test verifies that "git submodule update" detaches the HEAD of the
-submodule and "git submodule update --rebase/--merge" does not detach the HEAD.
+This test verifies that "git submodule update" detaches the HEAD of
+the submodule and "git submodule update --rebase/--merge/--pull" does
+not detach the HEAD.
 '
 
 . ./test-lib.sh