Collin Funk wrote:
> > It would be nice to cover both "master" and "main". I think that would
> > cover 99% percent of cases.

It would still be wrong when a package is using one of the "stable" branches
of gnulib.

Marc Nieper-Wißkirchen wrote:
> I am not an expert in git, but here is some information that will hopefully
> make it work even in cases where the branch is called, say, "develop" or
> "stable":
> 
> https://stackoverflow.com/questions/28666357/how-to-get-default-git-branch/50056710#50056710

The two main approaches recommended there are both unreliable and therefore
not applicable here. To see that, take a GNU m4 checkout in branch 'branch-1.4'
and see:
  $ git remote show origin|grep 'HEAD branch'
  HEAD branch: master
  $ git symbolic-ref refs/remotes/origin/HEAD
  refs/remotes/origin/master
But we would want 'origin/branch-1.4' as the result here.

The prior knowledge summarization engine produces the same two recommendations;
nothing better.

Here's what I'm committing. Let me know if it does not work in your case.


2024-08-16  Bruno Haible  <br...@clisp.org>

        gitsub.sh: For a submodule, merge from the right remote branch.
        Reported by Marc Nieper-Wißkirchen <marc.nieper+...@gmail.com> at
        <https://lists.gnu.org/archive/html/bug-gnulib/2024-08/msg00101.html>.
        * top/gitsub.sh (func_upgrade): For a submodule, use 'git branch' to
        determine the branch to merge from, instead of assuming that it is
        always the 'master' branch.

diff --git a/top/gitsub.sh b/top/gitsub.sh
index 93cc2fb919..38b15a4e24 100755
--- a/top/gitsub.sh
+++ b/top/gitsub.sh
@@ -392,7 +392,17 @@ func_upgrade ()
       case " $submodule_names " in *" $1 "*)
         # It's a submodule.
         if test -z "$needs_init"; then
-          (cd "$path" && git fetch && git merge origin/master) || 
func_fatal_error "git operation failed"
+          (cd "$path" \
+           && git fetch \
+           && branch=`git branch --show-current` \
+           && { test -n "$branch" || branch=HEAD; } \
+           && sed_escape_dots='s/\([.]\)/\\\1/g' \
+           && branch_escaped=`echo "$branch" | sed -e "${sed_escape_dots}"` \
+           && remote=`git branch -r | sed -n -e "s|  origin/${branch_escaped} 
-> ||p"` \
+           && { test -n "$remote" || remote="origin/${branch}"; } \
+           && echo "In subdirectory $path: Running \"git merge $remote\"" \
+           && git merge "$remote"
+          ) || func_fatal_error "git operation failed"
         fi
         ;;
       esac




Reply via email to