grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] bootstrap: When a commit hash is specified, do a shallow fetch i


From: Glenn Washburn
Subject: [PATCH] bootstrap: When a commit hash is specified, do a shallow fetch if possible
Date: Thu, 21 Oct 2021 12:49:19 -0500

The gnulib sources are large but more importantly have lots of changes. So
initial checkout of the repository can take a long time when network or
cpu resources are limited. The later is especially acute in a non-KVM QEMU
virtual machine (which can take 40+ minutes compared to <30 seconds with
this change[1]). The problem is specific to how GRUB uses gnulib, which is
by pegging the desired checkout to a specific git revision. In this case,
git can not do a shallow clone by using the --depth option because git does
not know ahead of time how deep the revision is from the tip. So git must
clone the whole repository.

However, there is an alternate method that requires support from the git
server[2], namely by asking for a specific commit on fetch. Refactor to use
fetch and fallback to fetching the entire repository if fetching by commit
hash fails.

Currently the git server hosting the official gnulib git repository does not
support fetch by commit hash[3]. However, there are mirrors which do support
this[4], and can be specified by setting the $GNULIB_URL.

[1] https://savannah.nongnu.org/support/index.php?110553#comment1
[2] https://stackoverflow.com/a/3489576/2108011
[3] https://savannah.nongnu.org/support/index.php?110553
[4] https://github.com/coreutils/gnulib

Signed-off-by: Glenn Washburn <development@efficientek.com>
---
 bootstrap | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/bootstrap b/bootstrap
index 5b08e7e2d..914f911f8 100755
--- a/bootstrap
+++ b/bootstrap
@@ -665,9 +665,21 @@ if $use_gnulib; then
       shallow=
       if test -z "$GNULIB_REVISION"; then
         git clone -h 2>&1 | grep -- --depth > /dev/null && shallow='--depth 2'
+        git clone $shallow ${GNULIB_URL:-$default_gnulib_url} "$gnulib_path" \
+          || cleanup_gnulib
+      else
+        git fetch -h 2>&1 | grep -- --depth > /dev/null && shallow='--depth 2'
+        mkdir -p "$gnulib_path"
+        git -C "$gnulib_path" init
+        git -C "$gnulib_path" remote add origin 
${GNULIB_URL:-$default_gnulib_url}
+        # Can not do a shallow fetch if fetch by commit hash fails because we
+        # do not know how the to go to get to $GNULIB_REVISION, so we must get
+        # all commits.
+        git -C "$gnulib_path" fetch $shallow origin "$GNULIB_REVISION" \
+          || git -C "$gnulib_path" fetch origin \
+          || cleanup_gnulib
+        git -C "$gnulib_path" reset --hard FETCH_HEAD
       fi
-      git clone $shallow ${GNULIB_URL:-$default_gnulib_url} "$gnulib_path" \
-        || cleanup_gnulib
 
       trap - 1 2 13 15
     fi
-- 
2.27.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]