Add revert.sh #3

Merged
PeterCxy merged 1 commit from iovxw/patches:add-revert-sh into aosp16 2026-04-01 02:07:30 +02:00

74
revert.sh Executable file
View file

@ -0,0 +1,74 @@
#!/bin/bash
# Revert all applied patches by resetting each sub-project to the manifest baseline
# Usage: revert.sh [--force] [--fast] [--dry]
# --force: also reset projects on a development branch or with uncommitted changes (use with caution)
# --fast: faster check, but may miss branch/dirty changes on unchanged git HEAD (still enough for revert patches applied by apply.sh)
# --dry: print what would be reverted without actually resetting any project
# Always execute in the script's directory
pushd "$(dirname "$(realpath "$0")")"
FORCE=0
FAST=0
DRY=0
for arg in "$@"; do
case "$arg" in
--force) FORCE=1 ;;
--fast) FAST=1 ;;
--dry) DRY=1 ;;
esac
done
export FORCE FAST DRY
revert_one() {
check_baseline() {
current=$(git rev-parse HEAD)
baseline=$REPO_LREV
if [ -z "$baseline" ] || [ "$current" = "$baseline" ]; then
return 1
fi
return 0
}
check_safety() {
branch=$(git symbolic-ref --short HEAD 2>/dev/null)
if [ -n "$branch" ]; then
if [ "$FORCE" != "1" ]; then
echo "Skip $REPO_PATH (activated development branch: $branch)"
return 1
fi
git checkout --detach HEAD 2>/dev/null
fi
dirty=$(git status --porcelain)
if [ -n "$dirty" ]; then
if [ "$FORCE" != "1" ]; then
echo "Skip $REPO_PATH has uncommitted changes, skipping reset:"
echo "$dirty" | sed "s/^/ /"
return 1
fi
fi
return 0
}
if [ "$FAST" = "1" ]; then
check_baseline || return 0
check_safety || return 0
else
check_safety || return 0
check_baseline || return 0
fi
if [ "$DRY" != "1" ]; then
rm -rf .git/rebase-apply # clean up any in-progress(failed) am
git reset --hard "$baseline" >/dev/null
fi
reverted=$(git log --oneline "$baseline".."$current" 2>/dev/null)
if [ -n "$reverted" ]; then
echo "Reset $REPO_PATH, reverted commits:"
echo "$reverted" | sed "s/^/ /"
else
echo "Reset $REPO_PATH (could not list reverted commits)"
fi
}
export -f revert_one
repo forall -c 'bash -c revert_one'