Merge branch 'ph/submodule-rebase'
authorJunio C Hamano <gitster@pobox.com>
Sun, 21 Jun 2009 04:51:13 +0000 (21:51 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 21 Jun 2009 04:51:13 +0000 (21:51 -0700)
* ph/submodule-rebase:
  git-submodule: add support for --merge.

Conflicts:
Documentation/git-submodule.txt
git-submodule.sh

Documentation/git-submodule.txt
Documentation/gitmodules.txt
git-submodule.sh
t/t7406-submodule-update.sh

index cd8e861..470bd75 100644 (file)
@@ -115,8 +115,9 @@ 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' is
-       specified or the key `submodule.$name.update` is set to `rebase`.
+       This will make the submodules HEAD be detached unless '--rebase' or
+       '--merge' is specified or the key `submodule.$name.update` is set to
+       `rebase` or `merge`.
 +
 If the submodule is not yet initialized, and you just want to use the
 setting as stored in .gitmodules, you can automatically initialize the
@@ -180,6 +181,16 @@ OPTIONS
        This option is only valid for the update command.
        Don't fetch new objects from the remote site.
 
+--merge::
+       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 `merge`, 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 1b67f0a..5daf750 100644 (file)
@@ -35,9 +35,11 @@ submodule.<name>.update::
        If 'checkout' (the default), the new commit specified in the
        superproject will be checked out in the submodule on a detached HEAD.
        If 'rebase', the current branch of the submodule will be rebased onto
-       the commit specified in the superproject.
+       the commit specified in the superproject. If 'merge', the commit
+       specified in the superproject will be merged into the current branch
+       in the submodule.
        This config option is overridden if 'git submodule update' is given
-       the '--rebase' option.
+       the '--merge' or '--rebase' options.
 
 
 EXAMPLES
index 19a3a84..f4f3562 100755 (executable)
@@ -5,7 +5,7 @@
 # Copyright (c) 2007 Lars Hjemli
 
 USAGE="[--quiet] [--cached] \
-[add [-b branch] <repo> <path>]|[status|init|update [-i|--init] [-N|--no-fetch]|summary [-n|--summary-limit <n>] [<commit>]] \
+[add [-b branch] <repo> <path>]|[status|init|update [-i|--init] [-N|--no-fetch] [--rebase|--merge]|summary [-n|--summary-limit <n>] [<commit>]] \
 [--] [<path>...]|[foreach <command>]|[sync [--] [<path>...]]"
 OPTIONS_SPEC=
 . git-sh-setup
@@ -356,6 +356,10 @@ cmd_update()
                        reference="$1"
                        shift
                        ;;
+               -m|--merge)
+                       shift
+                       update="merge"
+                       ;;
                --)
                        shift
                        break
@@ -426,6 +430,11 @@ cmd_update()
                                action="rebase"
                                msg="rebased onto"
                                ;;
+                       merge)
+                               command="git merge"
+                               action="merge"
+                               msg="merged in"
+                               ;;
                        *)
                                command="git checkout $force -q"
                                action="checkout"
index 0773fe4..2d33d9e 100755 (executable)
@@ -6,7 +6,7 @@
 test_description='Test updating submodules
 
 This test verifies that "git submodule update" detaches the HEAD of the
-submodule and "git submodule update --rebase" does not detach the HEAD.
+submodule and "git submodule update --rebase/--merge" does not detach the HEAD.
 '
 
 . ./test-lib.sh
@@ -76,6 +76,20 @@ test_expect_success 'submodule update --rebase staying on master' '
        )
 '
 
+test_expect_success 'submodule update --merge staying on master' '
+       (cd super/submodule &&
+         git reset --hard HEAD~1
+       ) &&
+       (cd super &&
+        (cd submodule &&
+         compare_head
+        ) &&
+        git submodule update --merge submodule &&
+        cd submodule &&
+        compare_head
+       )
+'
+
 test_expect_success 'submodule update - rebase in .git/config' '
        (cd super &&
         git config submodule.submodule.update rebase
@@ -110,6 +124,40 @@ test_expect_success 'submodule update - checkout in .git/config but --rebase giv
        )
 '
 
+test_expect_success 'submodule update - merge in .git/config' '
+       (cd super &&
+        git config submodule.submodule.update merge
+       ) &&
+       (cd super/submodule &&
+         git reset --hard HEAD~1
+       ) &&
+       (cd super &&
+        (cd submodule &&
+         compare_head
+        ) &&
+        git submodule update submodule &&
+        cd submodule &&
+        compare_head
+       )
+'
+
+test_expect_success 'submodule update - checkout in .git/config but --merge given' '
+       (cd super &&
+        git config submodule.submodule.update checkout
+       ) &&
+       (cd super/submodule &&
+         git reset --hard HEAD~1
+       ) &&
+       (cd super &&
+        (cd submodule &&
+         compare_head
+        ) &&
+        git submodule update --merge submodule &&
+        cd submodule &&
+        compare_head
+       )
+'
+
 test_expect_success 'submodule update - checkout in .git/config' '
        (cd super &&
         git config submodule.submodule.update checkout
@@ -137,4 +185,14 @@ test_expect_success 'submodule init picks up rebase' '
        )
 '
 
+test_expect_success 'submodule init picks up merge' '
+       (cd super &&
+        git config submodule.merging.url git://non-existing/git &&
+        git config submodule.merging.path does-not-matter &&
+        git config submodule.merging.update merge &&
+        git submodule init merging &&
+        test "merge" = $(git config submodule.merging.update)
+       )
+'
+
 test_done