| #!/bin/bash
export PATH=/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/sbin:/usr/sbin
set -e
echo "git_helper_sh: starting"
OPERATION=$1
shift
if [ "$OPERATION" == "mirror" ]; then
REMOTE_URL=$1
REF=$2
HASH=$3
MIRROR_PATH="$HOME/git-mirror/$4"
for i in $(seq 1 60); do
if [ -d "$MIRROR_PATH/.git" ]; then
if git -C "$MIRROR_PATH" rev-parse -q --verify "ref-$HASH" > /dev/null; then
exit 0
fi
fi
if mkdir "$MIRROR_PATH.lock" 2>/dev/null; then
trap 'rm -rf "$MIRROR_PATH.lock"' EXIT
if [ -d "$MIRROR_PATH/.git" ]; then
if git -C "$MIRROR_PATH" rev-parse -q --verify "ref-$HASH" > /dev/null; then
exit 0
fi
fi
mkdir -p "$MIRROR_PATH"
if [ ! -d "$MIRROR_PATH/.git" ]; then
git init --bare "$MIRROR_PATH"
fi
REFSPEC="$REF:ref-$HASH"
git -C "$MIRROR_PATH" fetch "$REMOTE_URL" "+$REFSPEC"
exit 0
fi
echo "git mirror locked, waiting..."
sleep 1
done
exit 1
elif [ "$OPERATION" == "checkout" ]; then
MIRROR_PATH="$HOME/git-mirror/$1"
BUILD_DIR=$2
HASH=$3
if [ ! -d "$BUILD_DIR/.git" ]; then
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR"
git -C "$BUILD_DIR" init
fi
if ! git -C "$BUILD_DIR" fetch "$MIRROR_PATH" "ref-$HASH"; then
exit 2
fi
git -C "$BUILD_DIR" checkout -f "$HASH"
git -C "$BUILD_DIR" clean -fdx
else
exit 1
fi
echo ">>> Git helper script finished."
exit 0
|