diff options
Diffstat (limited to 'pushpatch.in')
-rwxr-xr-x | pushpatch.in | 163 |
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 |