#! @BASH@ # This script is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # See the COPYING and AUTHORS files for more details. # Read in library functions if [ "$(type -t patch_file_name)" != function ] then if ! [ -r @SCRIPTS@/patchfns ] then echo "Cannot read library @SCRIPTS@/patchfns" >&2 exit 1 fi . @SCRIPTS@/patchfns fi usage() { printf $"Usage: $0 [-fqv] patchname\n" exit 1 } interrupt() { rollback_patch $1 printf $"Interrupted by user; patch %s was not applied.\n" \ "$(print_patch $patch)" >&2 exit 1 } apply_patch() { local patch=$1 local patch_file=$(patch_file_name $patch) output if ! [ -s $patch_file ] then printf $"Patch %s appears to be empty\n" "$patch_file" return 0 fi if [ "x${patch_file:(-3)}" = "x.gz" ] then gzip -cd $patch_file \ | @PATCH@ $QUILT_PATCH_OPTS $(patch_args $patch) \ --backup --prefix="$QUILT_PC/$patch/" \ -E $silent $force_apply 2>&1 elif [ "x${patch_file:(-4)}" = "x.bz2" ] then bzip2 -cd $patch_file \ | @PATCH@ $QUILT_PATCH_OPTS $(patch_args $patch) \ --backup --prefix="$QUILT_PC/$patch/" \ -E $silent $force_apply 2>&1 else @PATCH@ $QUILT_PATCH_OPTS $(patch_args $patch) \ --backup --prefix="$QUILT_PC/$patch/" \ -E $silent $force_apply -i $patch_file 2>&1 fi } rollback_patch() { local patch=$1 if [ -z "$opt_leave_rejects" ] then files_in_patch | @SED@ -e 's/$/\.rej/' | xargs rm -f fi @LIB@/backup-files $silent_unless_verbose -r -B $QUILT_PC/$patch/ - } apatch() { local patch=$1 local file status printf $"Applying patch %s\n" "$(print_patch $patch)" trap "interrupt $patch" SIGINT output="$(apply_patch $patch)" status=${PIPESTATUS[0]} trap "" SIGINT if [ $status -ne 0 -a -z "$opt_leave_rejects" ] then # The reject files are removed in rollback_patch. echo "$output" \ | sed -e \ 's/-- saving rejects to file \(.\+\)\.rej/-- rejects in file \1/' elif [ -n "$output" ] then echo "$output" fi if [ $status -eq 0 -o -n "$opt_force" ] then add_to_db $patch if [ $status -eq 0 ] then rm -f $QUILT_PC/$patch~refresh else touch $QUILT_PC/$patch~refresh fi if [ -e "$QUILT_PC/$patch" ] then touch $QUILT_PC/$patch/.timestamp fi if [ "$(shopt -s nullglob ; echo $QUILT_PC/$patch/*)" = "" ] then printf $"Patch %s appears to be empty, applied\n" \ "$(print_patch $patch)" elif [ $status -ne 0 ] then printf $"Applied patch %s (forced; needs refresh)\n" \ "$(print_patch $patch)" fi else rollback_patch $patch printf $"Patch %s does not apply (enforce with -f)\n" \ "$(print_patch $patch)" status=1 fi trap - SIGINT return $status } options=`getopt -o fqvh --long leave-rejects,interactive -- "$@"` 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 ;; -v) opt_verbose=1 shift ;; --leave-rejects) opt_leave_rejects=1 shift ;; --interactive) opt_interactive=1 shift ;; -h) usage -h ;; --) shift break ;; esac done if [ $# -ne 1 ] then usage fi [ -n "$opt_quiet" ] && silent=-s [ -z "$opt_verbose" ] && silent_unless_verbose=-s [ -z "$opt_interactive" ] && force_apply=-f [ -n "$opt_force" ] && opt_leave_rejects=1 patch=$1 top=$(top_patch) if [ -n "$top" -a -e $QUILT_PC/$top~refresh ] then printf $"The topmost patch %s needs to be refreshed first.\n" \ "$(print_patch $top)" exit 1 fi apatch $patch ### Local Variables: ### mode: shell-script ### End: # vim:filetype=sh