Gerrit has a "superproject subscription" feature[1], that triggers a
commit in a superproject that is subscribed to its submodules.
Conceptually this Gerrit feature can be done on the client side with
Git via:

    git -C <superproject> submodule update --remote --force
    git -C <superproject> commit -a -m "Update submodules"
    git -C <superproject> push

for each branch in the superproject. To ease the configuration in Gerrit
a special value of "." has been introduced for the submodule.<name>.branch
to mean the same branch as the superproject[2], such that you can create a
new branch on both superproject and the submodule and this feature
continues to work on that new branch.

Now we have find projects in the wild with such a .gitmodules file.
To have Git working well with these, we imitate the behavior and
look up the superprojects branch name if the submodules branch is
configured to ".". In projects that do not use Gerrit, this value
whould be never configured as "." is not a valid branch name.

[1] introduced around 2012-01, e.g.
    https://gerrit-review.googlesource.com/#/c/30810/
[2] excerpt from [1]:
 > The branch value could be '.' if the submodule project branch
 > has the same name as the destination branch of the commit having
 > gitlinks/.gitmodules file.

CC: Avery Pennarun <apenw...@gmail.com>
Signed-off-by: Stefan Beller <sbel...@google.com>
---
 git-submodule.sh            |  7 +++++++
 t/t7406-submodule-update.sh | 32 +++++++++++++++++++++++++++++++-
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/git-submodule.sh b/git-submodule.sh
index 4ec7546..12bb9e8 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -591,6 +591,13 @@ cmd_update()
                name=$(git submodule--helper name "$sm_path") || exit
                url=$(git config submodule."$name".url)
                branch=$(get_submodule_config "$name" branch master)
+               if test "$branch" = "."
+               then
+                       if ! branch=$(git symbolic-ref --short -q HEAD)
+                       then
+                               die "$(eval_gettext "submodule branch 
configured to inherit branch from superproject, but it's not on any branch")"
+                       fi
+               fi
                if ! test -z "$update"
                then
                        update_module=$update
diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
index bd261ac..41d69e4 100755
--- a/t/t7406-submodule-update.sh
+++ b/t/t7406-submodule-update.sh
@@ -209,9 +209,39 @@ test_expect_success 'submodule update --remote should 
fetch upstream changes' '
        )
 '
 
-test_expect_success 'local config should override .gitmodules branch' '
+test_expect_success 'submodule update --remote should fetch upstream changes 
with .' '
+       (cd super &&
+        git config -f .gitmodules submodule."submodule".branch "." &&
+        git add .gitmodules &&
+        git commit -m "submodules: update from the respective superproject 
branch"
+       ) &&
        (cd submodule &&
+        echo line4a >> file &&
+        git add file &&
+        test_tick &&
+        git commit -m "upstream line4a" &&
         git checkout -b test-branch &&
+        test_commit on-test-branch
+       ) &&
+       (cd super &&
+        git submodule update --remote --force submodule &&
+        (cd submodule &&
+         test "$(git log -1 --oneline)" = "$(GIT_DIR=../../submodule/.git git 
log -1 --oneline master)"
+        ) &&
+        git checkout -b test-branch &&
+        git submodule update --remote --force submodule &&
+        (cd submodule &&
+         test "$(git log -1 --oneline)" = "$(GIT_DIR=../../submodule/.git git 
log -1 --oneline test-branch)"
+        ) &&
+        git checkout master &&
+        git branch -d test-branch &&
+        git revert HEAD
+       )
+'
+
+test_expect_success 'local config should override .gitmodules branch' '
+       (cd submodule &&
+        git checkout test-branch &&
         echo line5 >> file &&
         git add file &&
         test_tick &&
-- 
2.9.2.466.g8c6d1f9.dirty

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to