Paul Eggert wrote:
> I installed the attach patches, which use "git remote set-url"; good enough?

Thanks. Yes, this performs nicely. The 'git remote set-url origin' command
"unties" the clone from the specified refdir.

But in the case that GNULIB_REVISION is not set, there is still a difference
in semantics: Without GNULIB_REFDIR, the command
  git clone $shallow "$gnulib_url" "$gnulib_path"
checks out the master branch, whereas with GNULIB_REFDIR the commands
  git clone "$GNULIB_REFDIR" "$gnulib_path"
  git -C "$gnulib_path" remote set-url origin "$gnulib_url"
  git -C "$gnulib_path" pull origin
check out the branch that happens to be the current branch in GNULIB_REFDIR.

The patch below fixes that.

> > 2) It needs to be documented in the --help option.
> 
> Also done in the attached patches.

There are two documentation functions: one for 'autopull' and one for
'bootstrap'. The patch below updates the second one as well.


2024-11-12  Bruno Haible  <br...@clisp.org>

        bootstrap: Tweak GNULIB_REFDIR related changes.
        * top/bootstrap-funclib.sh (prepare_GNULIB_SRCDIR): Improve if/else
        structure and comments. When cloning GNULIB_REFDIR and no submodule
        'gnulib' is configured, switch to the default branch.
        * top/bootstrap (usage):  Update documentation.
        * build-aux/bootstrap: Regenerated.

git diff -w:

diff --git a/ChangeLog b/ChangeLog
index 9473f36f22..6840768b00 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,6 +21,7 @@
        set the origin’s URL to $gnulib_url and fetch from remote,
        so that GNULIB_REFDIR is merely an accelerant rather than
        having different semantics.
+       (autopull_usage): Update documentation.
        * build-aux/bootstrap: Regenerate.
 
 2024-11-12  Bruno Haible  <br...@clisp.org>
diff --git a/top/bootstrap b/top/bootstrap
index 2136d119e3..6acad165a3 100755
--- a/top/bootstrap
+++ b/top/bootstrap
@@ -117,7 +117,8 @@ Gnulib sources can be fetched in various ways:
 
  * Otherwise, if the 'gnulib' directory does not exist, Gnulib sources
    are cloned into that directory using git from \$GNULIB_URL, defaulting
-   to $default_gnulib_url.
+   to $default_gnulib_url; if GNULIB_REFDIR is set and is a git repository
+   its contents may be used to accelerate the process.
    If the configuration variable GNULIB_REVISION is set in bootstrap.conf,
    then that revision is checked out.
 
diff --git a/top/bootstrap-funclib.sh b/top/bootstrap-funclib.sh
index 569ab728d0..7c125533e0 100644
--- a/top/bootstrap-funclib.sh
+++ b/top/bootstrap-funclib.sh
@@ -509,19 +509,38 @@ prepare_GNULIB_SRCDIR ()
         echo "$0: getting gnulib files..."
         trap cleanup_gnulib HUP INT PIPE TERM
         gnulib_url=${GNULIB_URL:-$default_gnulib_url}
-        shallow=
         if test -n "$GNULIB_REFDIR" && test -d "$GNULIB_REFDIR"/.git; then
           # Use GNULIB_REFDIR as a reference.
           git clone "$GNULIB_REFDIR" "$gnulib_path" \
           && git -C "$gnulib_path" remote set-url origin "$gnulib_url" \
           && if test -z "$GNULIB_REVISION"; then
-               git -C "$gnulib_path" pull origin
+               git -C "$gnulib_path" pull origin \
+               && {
+                 # We want the default branch of "$gnulib_url" (since that's
+                 # the behaviour if GNULIB_REFDIR is not specified), not the
+                 # current branch of "$GNULIB_REFDIR".
+                 default_branch=`LC_ALL=C git -C "$gnulib_path" \
+                                              remote show origin \
+                                 | sed -n -e 's/^ *HEAD branch: //p'`
+                 test -n "$default_branch" || default_branch='master'
+                 git -C "$gnulib_path" checkout "$default_branch"
+               }
              else
+               # The 'git checkout "$GNULIB_REVISION"' command succeeds if the
+               # GNULIB_REVISION is a commit hash that exists locally, or if it
+               # is a branch name that can be fetched from origin. It fails,
+               # however, if the GNULIB_REVISION is a commit hash that only
+               # exists in origin. In this case, we need a 'git fetch' and then
+               # retry 'git checkout "$GNULIB_REVISION"'.
                git -C "$gnulib_path" checkout "$GNULIB_REVISION" 2>/dev/null \
                || { git -C "$gnulib_path" fetch origin \
                     && git -C "$gnulib_path" checkout "$GNULIB_REVISION"; }
-             fi || cleanup_gnulib
-        elif test -z "$GNULIB_REVISION"; then
+             fi \
+          || cleanup_gnulib
+        else
+          # GNULIB_REFDIR is not set or not usable. Ignore it.
+          shallow=
+          if test -z "$GNULIB_REVISION"; then
             if git clone -h 2>&1 | grep -- --depth > /dev/null; then
               shallow='--depth 2'
             fi
@@ -533,13 +552,13 @@ prepare_GNULIB_SRCDIR ()
             fi
             mkdir -p "$gnulib_path"
             # Only want a shallow checkout of $GNULIB_REVISION, but git does 
not
-          # support cloning by commit hash. So attempt a shallow fetch by 
commit
-          # hash to minimize the amount of data downloaded and changes needed 
to
-          # be processed, which can drastically reduce download and processing
-          # time for checkout. If the fetch by commit fails, a shallow fetch 
can
-          # not be performed because we do not know what the depth of the 
commit
-          # is without fetching all commits. So fall back to fetching all
-          # commits.
+            # support cloning by commit hash. So attempt a shallow fetch by
+            # commit hash to minimize the amount of data downloaded and changes
+            # needed to be processed, which can drastically reduce download and
+            # processing time for checkout. If the fetch by commit fails, a
+            # shallow fetch can not be performed because we do not know what 
the
+            # depth of the commit is without fetching all commits. So fall back
+            # to fetching all commits.
             git -C "$gnulib_path" init
             git -C "$gnulib_path" remote add origin "$gnulib_url"
             git -C "$gnulib_path" fetch $shallow origin "$GNULIB_REVISION" \
@@ -548,17 +567,18 @@ prepare_GNULIB_SRCDIR ()
             git -C "$gnulib_path" reset --hard FETCH_HEAD
             git -C "$gnulib_path" checkout "$GNULIB_REVISION" || cleanup_gnulib
           fi
+        fi
         trap - HUP INT PIPE TERM
       else
         # The subdirectory 'gnulib' already exists.
         if test -n "$GNULIB_REVISION"; then
           if test -d "$gnulib_path/.git"; then
             # The 'git checkout "$GNULIB_REVISION"' command succeeds if the
-            # GNULIB_REVISION is a commit hash that exists locally, or if it is
-            # branch name that can be fetched from origin. It fails, however,
-            # if the GNULIB_REVISION is a commit hash that only exists in
-            # origin. In this case, we need a 'git fetch' and then retry
-            # 'git checkout "$GNULIB_REVISION"'.
+            # GNULIB_REVISION is a commit hash that exists locally, or if it
+            # is a branch name that can be fetched from origin. It fails,
+            # however, if the GNULIB_REVISION is a commit hash that only
+            # exists in origin. In this case, we need a 'git fetch' and then
+            # retry 'git checkout "$GNULIB_REVISION"'.
             git -C "$gnulib_path" checkout "$GNULIB_REVISION" 2>/dev/null \
             || { git -C "$gnulib_path" fetch origin \
                  && git -C "$gnulib_path" checkout "$GNULIB_REVISION"; } \




Reply via email to