Add revert.sh #3
1 changed files with 74 additions and 0 deletions
74
revert.sh
Executable file
74
revert.sh
Executable 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'
|
||||
Loading…
Add table
Add a link
Reference in a new issue