blob: bbe988f256c3a239c4d411b63aea34125c4fcd11 (
plain) (
tree)
|
|
#! @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()
{
echo $"Usage: $0 [-fRq] patchname"
exit 1
}
files_may_have_changed()
{
local patch=$1 file
local patch_file=$(patch_file_name $patch)
if [ $? -ne 0 -o ! -e "$patch_file" \
-o ! -e "$QUILT_PC/$patch/.timestamp" \
-o "$QUILT_PC/$patch/.timestamp" -ot "$patch_file" ]
then
return 0
fi
local apply_ts=$(date -r "$QUILT_PC/$patch/.timestamp" '+%s') ts
for file in $(files_in_patch $patch)
do
ts=$(date -r $file '+%s' 2> /dev/null)
[ -z "$ts" ] && return 0
[ "$ts" -gt $apply_ts ] && return 0
done
return 1
}
# Check if all changes have been folded back into the patch (quilt refresh),
# and report any pending changes.
check_for_pending_changes()
{
local patch=$1
local patch_file=$(patch_file_name $patch)
local patch_args=$(patch_args $patch)
local workdir=$(gen_tempfile -d quilt) status=0
if [ -d $QUILT_PC/$patch ]
then
if ! rmdir $workdir || # note that this is racey...
! cp -rl $QUILT_PC/$patch $workdir/
then
echo $"Failed to copy files to temporary directory"
rm -rf $workdir
return 1
fi
# Now we may have some zero-size files that have no
# permissions (which represent files that the patch
# creates). Those may have been created in the meantime,
# but patch would refuse to touch them: We must remove
# them here.
find $workdir -type f -size 0 -exec rm -f '{}' ';'
fi
if [ -s $patch_file ]
then
if ! cat_file $patch_file \
| @PATCH@ -d $workdir $patch_args \
--no-backup-if-mismatch -E \
>/dev/null 2>/dev/null
then
if ! [ -e $QUILT_PC/$patch ]
then
echo $"Failed to patch temporary files" >&2
rm -rf $workdir
return 1
fi
fi
fi
local remains=$(gen_tempfile)
for file in $(files_in_patch $patch)
do
diff_file $file $workdir/$file $file >> $remains
done
if [ -s $remains ]
then
echo $"Patch $patch does not remove cleanly (enforce with -f)."
status=1
fi
rm -f $remains
rm -rf $workdir
return $status
}
rpatch()
{
local patch=$1 status=0
trap "" SIGINT
if [ -z "$opt_force" ] && \
( [ -n "$opt_remove" ] || files_may_have_changed $patch )
then
check_for_pending_changes $patch || status=1
fi
if [ $status -eq 0 ]
then
echo $"Removing $patch"
rm -f "$QUILT_PC/$patch/.timestamp"
@LIB@/backup-files $silent -r -B $QUILT_PC/$patch/ -
status=$?
remove_from_db $patch
rm -f $QUILT_PC/$patch~refresh
fi
trap - SIGINT
return $status
}
options=`getopt -o fRqvh -- "$@"`
if [ $? -ne 0 ]
then
usage
fi
eval set -- "$options"
while true
do
case "$1" in
-f)
opt_force=1
shift ;;
-R)
opt_remove=1 # remove properly with patch -R; no tricks
unset opt_force
shift ;;
-q)
opt_quiet=1
shift ;;
-v)
opt_verbose=1
shift ;;
-h)
usage -h ;;
--)
shift
break ;;
esac
done
if [ $# -ne 1 ]
then
usage
fi
patch=$1
[ -n "$opt_quiet" ] && silent=-s
[ -z "$opt_verbose" ] && silent_unless_verbose=-s
top=$(top_patch)
if [ -n "$top" -a -e $QUILT_PC/$top~refresh -a -z "$opt_force" ]
then
echo $"The topmost patch $top needs to be refreshed first."
exit 1
fi
rpatch "$patch" || exit 1
### Local Variables:
### mode: shell-script
### End:
# vim:filetype=sh
|