build-llvm: Avoid unnecessary repeated git fetches if SYNC=1 is set

If the SYNC variable is set when running build-all.sh, all the
individual scripts will try to check out the intended version
before building. All scripts that build projects from llvm-project
(build-libcxx.sh, build-compiler-rt.sh, build-openmp.sh) call
build-llvm.sh with CHECKOUT_ONLY=1 to make sure the right version
is checked out (as one can call the scripts individually too).

If the llvm-project directory was a full (non-shallow) checkout,
the repeated fetch was quick as git knew that it had the fetched
reference already. But in a shallow clone, a new shallow fetch
would refetch the whole object tree for the targeted reference.

Using "git cat-file -e" we can check whether a specific object
exists in the local checkout, avoiding needlessly refetching
everything.

However, when fetching a tag using shallow fetch (git fetch
--depth 1 origin "$LLVM_VERSION"), it would only fetch the
commit object for that tag, not the tag itself. By specifying
'tag "$LLVM_VERSION"' in this case, we get the tag object itself,
so that we later can check whether "$LLVM_VERSION" exists in the
local checkout. But this requires guessing whether a specific
"$LLVM_VERSION" is a tag or a commit.
This commit is contained in:
Martin Storsjö committed 2022-03-23 13:07:39 +02:00
1 parent 58cfd46b25
commit 0cffa112e0
1 file changed
+23 -6
+23 -6
View File
@@ -79,18 +79,35 @@ if [ ! -d llvm-project ]; then
cd llvm-project
git init
git remote add origin https://github.com/llvm/llvm-project.git
git fetch --depth 1 origin "$LLVM_VERSION"
git checkout FETCH_HEAD
cd ..
CHECKOUT=1
unset SYNC
fi
if [ -n "$SYNC" ] || [ -n "$CHECKOUT" ]; then
cd llvm-project
if [ -n "$SYNC" ]; then
git fetch --depth 1 origin "$LLVM_VERSION"
git checkout FETCH_HEAD
# Check if the intended commit or tag exists in the local repo. If it
# exists, just check it out instead of trying to fetch it.
# (Redoing a shallow fetch will refetch the data even if the commit
# already exists locally, unless fetching a tag with the "tag"
# argument.)
if git cat-file -e "$LLVM_VERSION" 2> /dev/null; then
# Exists; just check it out
git checkout "$LLVM_VERSION"
else
case "$LLVM_VERSION" in
llvmorg-*)
# If $LLVM_VERSION looks like a tag, fetch it with the
# "tag" keyword. This makes sure that the local repo
# gets the tag too, not only the commit itself. This allows
# later fetches to realize that the tag already exists locally.
git fetch --depth 1 origin tag "$LLVM_VERSION"
git checkout "$LLVM_VERSION"
;;
*)
git fetch --depth 1 origin "$LLVM_VERSION"
git checkout FETCH_HEAD
;;
esac
fi
cd ..
fi