diff options
Diffstat (limited to 'poppatch.in')
-rwxr-xr-x | poppatch.in | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/poppatch.in b/poppatch.in new file mode 100755 index 0000000..19b27f9 --- /dev/null +++ b/poppatch.in @@ -0,0 +1,170 @@ +#!/bin/sh + +# Read in library functions +if ! [ -r @LIB@/patchfns ] +then + echo "Cannot read library @LIB@/patchfns" >&2 + exit 1 +fi +. @LIB@/patchfns + +usage() +{ + echo "Usage: poppatch [-afRq] [npatches|patchname]" + if [ x$1 = x-h ] + then + cat <<EOF + +Remove patch(es) from the current stack. A number of +patches to remove, or a patch name can be specified. If a +patch name is given, remove all patches up to and +including the named patch. If neither a number nor a patch +name is specified, remove the next patch. + +-a Remove all patches in the series file. + +-f Force remove. The state before the patch(es) were + applied will be restored from backup files. + +-R Remove the patch with \`patch -R' and check if the + patch reverts all changes properly. + +-q Quiet operation. + +EOF + exit 0 + else + exit 1 + fi +} + +list_patches() +{ + local top=$(top_patch) n=0 patch + if [ -z "$top" ] + then + return 0 + fi + ( patches_before $top + echo $top ) \ + | tac \ + | if [ -n "$opt_all" ] + then + cat + else + while read patch + do + if [ -n "$number" ] + then + if [ $n -eq $number ] + then + break + fi + n=$[$n+1] + fi + echo $patch + if [ $patch = "$stop_at_patch" ] + then + break + fi + done + if [ -n "$stop_at_patch" -a "$patch" != "$stop_at_patch" ] + then + echo "Patch $stop_at_patch not found in file series" >&2 + return 1 + fi + fi +} + +options=`getopt -o fRqah -- "$@"` + +if [ $? -ne 0 ] +then + usage +fi + +eval set -- "$options" + +while true +do + case "$1" in + -f) + opt_force=1 + unset opt_remove + shift ;; + -R) + opt_remove=1 # remove with patch -R; no tricks + unset opt_force + shift ;; + -q) + opt_quiet=1 + shift ;; + -a) + opt_all=1 + shift ;; + -h) + usage -h ;; + --) + shift + break ;; + esac +done + +if [ $# -gt 1 ] +then + usage +fi + +if [ $# -eq 1 ] +then + if is_numeric $1 + then + number=$1 + else + stop_at_patch=$(stripit $1) + fi +else + [ -n "$opt_all" ] || number=1 +fi + +[ -n "$opt_force" ] && + rpatch_options="$rpatch_options -f" +[ -n "$opt_remove" ] && + rpatch_options="$rpatch_options -R" +[ -n "$opt_quiet" ] && + rpatch_options="$rpatch_options -q" + +if [ -n "$stop_at_patch" ] +then + if ! is_applied $stop_at_patch + then + echo "Patch $stop_at_patch is not applied." + exit 1 + fi +fi + +if ! patches=$(list_patches) 2>&1 +then + exit 1 +elif [ -z "$patches" ] +then + echo "No patches removed" + exit 0 +fi + +trap "interrupted=1" SIGINT + +for patch in $patches +do + if ! @LIB@/rpatch $rpatch_options $patch + then + echo Still at patch $patch + exit 1 + fi + if [ -n "$interrupted" ] + then + echo "poppatch interrupted by user" + exit 1 + fi + [ -z "$opt_quiet" ] && echo +done |