summaryrefslogtreecommitdiffstats
path: root/pushpatch.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 /pushpatch.in
parent4d11e99bfc25e0261111d202a3a2afdf97daea5c (diff)
downloadquilt-02dc4a5f8c1979e9a23f7b6851f693d29b640c4d.tar.gz
Version 0.11, from Andreas Gruenbacher
Diffstat (limited to 'pushpatch.in')
-rwxr-xr-xpushpatch.in163
1 files changed, 163 insertions, 0 deletions
diff --git a/pushpatch.in b/pushpatch.in
new file mode 100755
index 0000000..10b5ba8
--- /dev/null
+++ b/pushpatch.in
@@ -0,0 +1,163 @@
+#!/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: pushpatch [-afq] [npatches|patchname]"
+ if [ x$1 = x-h ]
+ then
+ cat <<EOF
+
+Apply patch(es) from the series file. A number of patches
+to apply, or a patch name can be specified. If a patch
+name is given, apply all patches up to and including the
+named patch. If neither a number nor a patch name is
+specified, apply the next patch.
+
+-a Apply all patches in the series file.
+
+-f Force apply, even if the patch has rejects.
+
+-q Quiet operation.
+
+EOF
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+list_patches()
+{
+ local top=$(top_patch) n=0 patch
+ if [ -n "$top" ]
+ then
+ patches_after $top
+ else
+ cat_series
+ fi \
+ | 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 fqah -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -f)
+ opt_force=1
+ 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
+ [ -z "$opt_all" ] && number=1
+fi
+
+[ -n "$opt_force" ] &&
+ apatch_options="$apatch_options -f"
+[ -n "$opt_quiet" ] &&
+ apatch_options="$apatch_options -q"
+
+if [ -n "$stop_at_patch" ]
+then
+ if is_applied $stop_at_patch
+ then
+ echo "Patch $stop_at_patch is already applied."
+ exit 1
+ fi
+fi
+
+if ! patches=$(list_patches) 2>&1
+then
+ exit 1
+elif [ -z "$patches" ]
+then
+ top=$(top_patch)
+ if [ -z "$top" ]
+ then
+ echo "No patches applied"
+ else
+ echo "File series fully applied, ends at patch $top"
+ fi
+ exit 0
+fi
+
+trap "interrupted=1" SIGINT
+
+for patch in $patches
+do
+ if ! @LIB@/apatch $apatch_options $patch
+ then
+ exit 1
+ fi
+ if [ -n "$interrupted" ]
+ then
+ echo "pushpatch interrupted by user"
+ exit 1
+ fi
+ [ -z "$opt_quiet" ] && echo
+done