65816-llvm-mos/scripts/updateLlvmMos.sh
Scott Duensing 873eab4922 Checkpoint.
2026-04-25 17:07:28 -05:00

56 lines
2.1 KiB
Bash
Executable file

#!/usr/bin/env bash
# Refresh the ephemeral llvm-mos checkout to the latest upstream main,
# then re-apply our backend (symlinks + patches).
#
# This is the ONLY script that is allowed to destructively reset the
# clone. installLlvmMos.sh intentionally refuses to do so because a
# reset would destroy any applied patches.
set -euo pipefail
source "$(dirname "$0")/common.sh"
LLVM_SRC="$TOOLS_DIR/llvm-mos"
[ -d "$LLVM_SRC/.git" ] || die "llvm-mos checkout not found; run setup.sh first"
currentBranch="$(git -C "$LLVM_SRC" rev-parse --abbrev-ref HEAD)"
if [ "$currentBranch" != "main" ]; then
die "llvm-mos is on branch '$currentBranch', expected main. Refusing to reset."
fi
# First un-apply our patches so the reset only discards upstream drift,
# not our work. Symlinks are unaffected by git reset since untracked
# directories are left alone (our symlinks live inside tracked dirs but
# are untracked files themselves).
log "reverting any applied patches"
for patch in "$PROJECT_ROOT"/patches/*.patch; do
[ -f "$patch" ] || continue
if git -C "$LLVM_SRC" apply --reverse --check "$patch" >/dev/null 2>&1; then
git -C "$LLVM_SRC" apply --reverse "$patch"
log " reverted: $(basename "$patch")"
fi
done
# Symlinks from applyBackend.sh are untracked files inside tracked
# directories. git reset --hard leaves them in place, but we clean
# them proactively so the fast-forward sees a truly clean tree.
log "removing symlinks under $LLVM_SRC pointing into $PROJECT_ROOT/src"
find "$LLVM_SRC" -type l | while read -r link; do
target="$(readlink -f "$link" || true)"
case "$target" in
"$PROJECT_ROOT"/src/*) rm "$link" ;;
esac
done
if ! git -C "$LLVM_SRC" diff --quiet || ! git -C "$LLVM_SRC" diff --cached --quiet; then
die "llvm-mos checkout still has local changes after cleanup. Inspect with: git -C $LLVM_SRC status"
fi
log "fetching and resetting to origin/main"
git -C "$LLVM_SRC" fetch --depth=1 origin main
git -C "$LLVM_SRC" reset --hard FETCH_HEAD
log "re-applying backend"
"$PROJECT_ROOT/scripts/applyBackend.sh"
log "update complete"