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"; } \