#! @BASH@
# This is a wrapper to GNU patch that recognizes the most common
# options and mimics GNU patch's behavior and output, and creates the
# quilt metadata as if quilt push was used to apply the patches. When
# options are used that this wrapper does not recognize, GNU patch is
# used directly, and no quilt metadata will get created.
PATCH=@PATCH@
original_options=("$@")
# GNU patch recognizes these environment variables
if [ -n "$SIMPLE_BACKUP_SUFFIX" ]
then
set -- --suffix "$SIMPLE_BACKUP_SUFFIX" "$@"
fi
if [ -n "$PATCH_VERSION_CONTROL" ]
then
set -- --version-control "$PATCH_VERSION_CONTROL" "$@"
elif [ -n "$VERSION_CONTROL" ]
then
set -- --version-control "$VERSION_CONTROL" "$@"
fi
if [ -n "$POSIXLY_CORRECT" ]
then
set -- --posix "$@"
fi
backup_files()
{
declare dir=${QUILT_PC:-.pc}/$name
if [ "$backup_mode" = --backup-if-mismatch ]
then
awk '
/^patching file / \
{ file=$0
sub(/^patching file /, "", file)
}
/^Hunk #[0-9]* / \
{ if (!(file in backup)) {
backup[file] = 1
#print "ln -f "dir"/"file" "prefix file suffix > "/dev/stderr"
system("ln -f "dir"/"file" "prefix file suffix)
}
}
{ if (!silent)
print
}
' dir="${dir//\\/\\\\}" \
prefix="${opt_prefix//\\/\\\\}" \
suffix="${opt_suffix//\\/\\\\}" \
silent="${opt_silent:+1}"
elif [ -n "$opt_silent" ]; then
cat > /dev/null
fi
if [ "$backup_mode" = --backup -a -d "$dir" ]
then
for file in $(find "$dir" -type f -a ! -path "$path/.timestamp")
do
dest=$opt_prefix${file#$dir/}$opt_suffix
mkdir -p $(dirname "$dest")
ln -f $file $dest
done
fi
}
find_pipe_patch()
{
declare patch=$1
patch=${patch//\[/\\[}
patch=${patch//\]/\\]}
set -- $(stat -c $'%a %N\n' /proc/*/fd/* 2>/dev/null \
| sed -nre "s,^300 \`(/proc/.*/fd)/.*' -> \`$patch'$,\\1,p")
set -- $(stat -c $'%a %N\n' $1/* 2>/dev/null \
| sed -nre "s,^500 \`.*' -> \`(.*)',\\1,p")
[ $# -eq 1 ] || set -- "$patch"
echo "$1"
}
options=`getopt -q -o bsB:z:i:p:d: \
--long quiet,silent,backup,backup-if-mismatch \
--long no-backup-if-mismatch,prefix: \
--long suffix:,posix,input:,strip:,directory: -- "$@"`
if [ $? -ne 0 ]
then
cannot_handle=1
else
case "${LC_ALL:-${LC_MESSAGES:-${LANG}}}" in
''|C|POSIX|en*)
;;
*) cannot_handle=1
;;
esac
fi
if [ -z "$cannot_handle" ]; then
eval set -- "$options"
backup_mode=--backup-if-mismatch
opt_prefix=
opt_suffix=
opt_silent=
opt_input=
opt_strip=
opt_directory=$PWD
while :
do
case "$1" in
-b|--backup)
backup_mode=--backup
;;
--backup-if-mismatch)
backup_mode=--backup-if-mismatch
;;
-d|--directory)
cd "$2" || exit 1
shift
;;
-i|--input)
opt_input=$2
new_options[${#new_options[@]}]=$1
new_options[${#new_options[@]}]=$2
shift
;;
--no-backup-if-mismatch)
backup_mode=--no-backup-if-mismatch
;;
-B|--prefix)
opt_prefix=$2
new_options[${#new_options[@]}]=$1
new_options[${#new_options[@]}]=$2
shift
;;
-s|--silent|--quiet)
opt_silent=--silent
;;
-p|--strip)
opt_strip=-p$2
new_options[${#new_options[@]}]=-p$2
shift
;;
-z|--suffix)
opt_suffix=$2
new_options[${#new_options[@]}]=$1
new_options[${#new_options[@]}]=$2
shift
;;
--posix)
backup_mode=--no-backup-if-mismatch
new_options[${#new_options[@]}]=$1
;;
--)
shift
break
;;
*)
new_options[${#new_options[@]}]=$1
;;
esac
shift
done
[ -n "$opt_prefix$opt_suffix" ] || opt_suffix=.orig
if [ -z "$opt_strip" -o $# -ne 0 ]
then
cannot_handle=1
fi
fi
if [ -z "$cannot_handle" ]
then
if [ -n "$opt_input" ]
then
patch=$opt_input
elif [ ! -e /proc/self ]
then
echo "patch-wrapper: /proc not mounted!" >&2
exit 1
elif [ -e /proc/self/fd/0 ]
then
patch=$(readlink /proc/self/fd/0)
case "$patch" in
pipe:*)
patch=$(find_pipe_patch "$patch")
;;
esac
fi
patch=${patch#$PWD/}
if [ ! -e "$patch" ]
then
cannot_handle=1
fi
fi
if [ -n "$cannot_handle" ]
then
$PATCH "${original_options[@]}"
exit
fi
quilt_patches=${QUILT_PATCHES:-patches}
if [ "${patch#$RPM_SOURCE_DIR}" != "$patch" ]
then
name=SOURCES/${patch#$RPM_SOURCE_DIR/}
if [ ! -e "$quilt_patches/SOURCES" ]
then
mkdir -p "$quilt_patches"
ln -s $RPM_SOURCE_DIR "$quilt_patches/SOURCES"
fi
elif [ "${patch#$RPM_BUILD_DIR}" != "$patch" ]
then
name=BUILD/${patch#$RPM_BUILD_DIR/}
if [ ! -e "$quilt_patches/BUILD" ]
then
mkdir -p "$quilt_patches"
ln -s $RPM_BUILD_DIR "$quilt_patches/BUILD"
fi
else
name=${patch#/}
dir=$(dirname "$quilt_patches/$name")
mkdir -p "$dir"
if [ "${patch:0:1}" = / ]
then
ln -s "$patch" "$quilt_patches/${name#/}"
else
while ! [ "$dir/$updir$name" -ef "$patch" ]
do
updir=$updir../
[ ${#updir} -gt 96 ] && break
done
if [ "$dir/$updir$name" -ef "$patch" ]
then
ln -s "$updir$patch" "$quilt_patches/$name"
fi
fi
fi
if [ "$opt_strip" = -p1 ]; then
echo "$name"
else
echo "$name $opt_strip"
fi >> $quilt_patches/series
$PATCH "${new_options[@]}" --backup --prefix "${QUILT_PC:-.pc}/$name/" \
| backup_files
status=${PIPESTATUS[0]}
if [ $status -eq 0 ]
then
dir=${QUILT_PC:-.pc}/$name
if [ ! -e "$dir" ]
then
mkdir -p "$dir"
fi
echo -n "" > $dir/.timestamp
if [ ! -e ${QUILT_PC:-.pc}/.version ]
then
echo 2 > ${QUILT_PC:-.pc}/.version
fi
echo "$name" >> "${QUILT_PC:-.pc}/applied-patches"
fi
exit $status