summaryrefslogtreecommitdiffstats
path: root/poppatch.in
diff options
context:
space:
mode:
authorMartin Quinson <mquinson@debian.org>2003-01-21 09:49:29 +0000
committerMartin Quinson <mquinson@debian.org>2003-01-21 09:49:29 +0000
commit02dc4a5f8c1979e9a23f7b6851f693d29b640c4d (patch)
tree2f397f5df89f4529b89fd0e7a021238d0f290007 /poppatch.in
parent4d11e99bfc25e0261111d202a3a2afdf97daea5c (diff)
downloadquilt-02dc4a5f8c1979e9a23f7b6851f693d29b640c4d.tar.gz
Version 0.11, from Andreas Gruenbacher
Diffstat (limited to 'poppatch.in')
-rwxr-xr-xpoppatch.in170
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