315 lines
7.3 KiB
Bash
315 lines
7.3 KiB
Bash
#!/bin/bash
|
|
|
|
|
|
|
|
: ${QUILT_DIR=/usr/share/quilt}
|
|
|
|
|
|
if ! [ -r $QUILT_DIR/scripts/patchfns ]
|
|
then
|
|
echo "Cannot read library $QUILT_DIR/scripts/patchfns" >&2
|
|
exit 1
|
|
fi
|
|
. $QUILT_DIR/scripts/patchfns
|
|
cd ${SUBDIR:-.}
|
|
|
|
usage() {
|
|
echo "Usage: ${0##*/} [--fuzz=N] specfile"
|
|
exit 1
|
|
}
|
|
|
|
options=$(getopt -o v --long sourcedir:,fuzz: -n "${0##*/}" -- "$@") || exit
|
|
|
|
eval set -- "$options"
|
|
|
|
sourcedir=
|
|
|
|
while true
|
|
do
|
|
case "$1" in
|
|
-v)
|
|
verbose=1
|
|
shift ;;
|
|
--sourcedir)
|
|
sourcedir=${2%/}/
|
|
shift 2 ;;
|
|
--fuzz)
|
|
# Only works with rpm 4.6 and later
|
|
DEFINE_FUZZ="%define _default_patch_fuzz $2"
|
|
shift 2 ;;
|
|
--)
|
|
shift
|
|
break ;;
|
|
esac
|
|
done
|
|
|
|
[ "${sourcedir:0:1}" = / ] || sourcedir=$PWD/$sourcedir
|
|
|
|
specfile=$1
|
|
if [ $# -ne 1 -o ! -f "$specfile" ]
|
|
then
|
|
|
|
usage
|
|
fi
|
|
if [ "${specfile:0:1}" = / ]
|
|
then
|
|
specdir=$(dirname "$specfile")
|
|
specfile=${specfile##*/}
|
|
else
|
|
specdir=$PWD
|
|
fi
|
|
|
|
tmpdir="$(gen_tempfile -d ${VARTMPDIR:-/var/tmp}/${0##*/})"
|
|
mkdir -p $tmpdir || exit 1
|
|
add_exit_handler "rm -rf $tmpdir"
|
|
mkdir -p $tmpdir/build
|
|
mkdir -p $tmpdir/bin
|
|
|
|
# Older versions of Suse packages have a symbolic release number, and rpmbuild
|
|
# won't like that, so change it to something compliant.
|
|
if grep -q '^Release:.*[<>]' "$specdir/$specfile"
|
|
then
|
|
sed -e '/^Release:/s/[<>]//g' < "$specdir/$specfile" > $tmpdir/"$specfile"
|
|
specdir=$tmpdir
|
|
fi
|
|
|
|
# Redirect file descriptors
|
|
# 5 is used in verbose mode, 4 in non-verbose mode, and 2 for both (real errors)
|
|
if [ -n "$verbose" ]
|
|
then
|
|
exec 3>&1 5>&2 4>/dev/null
|
|
else
|
|
exec 3>&1 4>&2 5>/dev/null
|
|
fi
|
|
|
|
|
|
|
|
# wrapper script for patch and tar
|
|
cat <<-'EOF' > $tmpdir/bin/wrapper
|
|
#! /bin/bash
|
|
|
|
# find original data file by md5sum
|
|
original_file() {
|
|
local file=$1 md5sum
|
|
|
|
set -- $(md5sum < $file)
|
|
md5sum=$1
|
|
while read md5sum_ file_
|
|
do
|
|
if [ "$md5sum" = "$md5sum_" ]
|
|
then
|
|
echo ${file_#\*}
|
|
return 0
|
|
fi
|
|
done < $tmpdir/md5sums
|
|
|
|
# Try harder
|
|
if ! [ -e $tmpdir/more-md5sums ]
|
|
then
|
|
( cd $RPM_BUILD_DIR
|
|
find . -type f \
|
|
| sed -e 's:^.\/::' \
|
|
| xargs md5sum \
|
|
) > $tmpdir/more-md5sums
|
|
fi
|
|
|
|
while read md5sum_ file_
|
|
do
|
|
if [ "$md5sum" = "$md5sum_" ]
|
|
then
|
|
echo ${file_#\*}
|
|
return 0
|
|
fi
|
|
done < $tmpdir/more-md5sums
|
|
return 1
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Extract a command line option with or without argument
|
|
cmdline_option() {
|
|
local letter=$1 no_arg=$2
|
|
shift
|
|
|
|
while [ $# -ne 0 ]
|
|
do
|
|
if [ "${1:0:2}" = -$letter ]
|
|
then
|
|
if [ -z "$no_arg" ]
|
|
then
|
|
[ "$1" = -$letter ] && set -- "$1$2"
|
|
fi
|
|
echo $1
|
|
break
|
|
fi
|
|
shift
|
|
done
|
|
}
|
|
|
|
|
|
strip_option() {
|
|
set -- $(cmdline_option p "$@")
|
|
[ "$1" != -p1 ] && echo $1
|
|
}
|
|
|
|
# Extract the -p option from the command line
|
|
strip_option() {
|
|
set -- $(cmdline_option p "$@")
|
|
[ "$1" != -p1 ] && echo $1
|
|
}
|
|
|
|
# Extract the -R option from the command line
|
|
reverse_option() {
|
|
set -- $(cmdline_option R no_arg "$@")
|
|
echo $1
|
|
}
|
|
|
|
patch_opt_d() {
|
|
local subdir=$(cmdline_option d "$@")
|
|
[ -z "$subdir" ] || echo "${subdir:2}"
|
|
}
|
|
|
|
|
|
|
|
patch_input_file() {
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
-i|--input)
|
|
if [ $# -ge 2 ]; then
|
|
echo "$2"
|
|
return
|
|
fi
|
|
;;
|
|
-i*)
|
|
echo "${1#-i}"
|
|
return
|
|
;;
|
|
--input=*)
|
|
echo "${1#--input=}"
|
|
return
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
return
|
|
}
|
|
|
|
tar_input_file() {
|
|
case "$1" in
|
|
*C*f*)
|
|
echo "$3"
|
|
;;
|
|
*f*)
|
|
echo "$2"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
|
|
tar_opt_C() {
|
|
case "$1" in
|
|
*C*f*)
|
|
echo "$2"
|
|
return ;;
|
|
esac
|
|
}
|
|
|
|
tmpdir=${RPM_BUILD_DIR%/*}
|
|
rm -f $tmpdir/data
|
|
case "${0##*/}" in
|
|
patch)
|
|
inputfile=$(patch_input_file "$@")
|
|
;;
|
|
tar)
|
|
inputfile=$(tar_input_file "$@")
|
|
# For tar, file - means read from stdin
|
|
[ "$inputfile" = "-" ] && inputfile=
|
|
;;
|
|
esac
|
|
if [ -z "$inputfile" ]; then
|
|
# put data from stdin into tmpfile
|
|
cat > $tmpdir/data
|
|
fi
|
|
|
|
unpackfile="$(original_file ${inputfile:-$tmpdir/data})"
|
|
if [ -n "$unpackfile" ]
|
|
then
|
|
case "${0##*/}" in
|
|
patch)
|
|
echo -n p >&4
|
|
subdir=$(patch_opt_d "$@")
|
|
if [ -n "$subdir" ]
|
|
then
|
|
dir=$(cd "$subdir" && echo $PWD)
|
|
else
|
|
dir=$PWD
|
|
fi
|
|
dir=${dir/$RPM_BUILD_DIR}
|
|
dir=${dir##/}
|
|
dir=${dir// /\\ }
|
|
echo "${0##*/} ${dir:-.} $unpackfile" \
|
|
$(strip_option "$@") $(reverse_option "$@") >&3
|
|
;;
|
|
tar)
|
|
echo -n t >&4
|
|
subdir=$(tar_opt_C "$@")
|
|
if [ -n "$subdir" ]
|
|
then
|
|
dir=$(cd "$subdir" && echo $PWD)
|
|
else
|
|
dir=$PWD
|
|
fi
|
|
dir=${dir/$RPM_BUILD_DIR}
|
|
dir=${dir##/}
|
|
dir=${dir// /\\ }
|
|
echo "${0##*/} ${dir:-.} $unpackfile" >&3
|
|
;;
|
|
esac
|
|
fi
|
|
|
|
PATH=${PATH#*:}
|
|
if [ -n "$inputfile" ]; then
|
|
${0##*/} "$@"
|
|
else
|
|
${0##*/} "$@" < $tmpdir/data
|
|
fi
|
|
|
|
EOF
|
|
|
|
chmod 755 $tmpdir/bin/wrapper
|
|
# If $TMPDIR is mounted with noexec, rpmbuild won't be able to execute
|
|
# our wrapper script
|
|
if [ ! -x $tmpdir/bin/wrapper ]
|
|
then
|
|
printf "Cannot execute %s; filesystem mounted with noexec?\n" \
|
|
$tmpdir/bin/wrapper >&2
|
|
printf "Setting %s in ~/.quiltrc may help\n" "VARTMPDIR" >&2
|
|
exit 1
|
|
fi
|
|
|
|
ln -s wrapper $tmpdir/bin/patch
|
|
ln -s wrapper $tmpdir/bin/tar
|
|
|
|
# let rpm do all the dirty specfile stuff ...
|
|
echo -n "### rpmbuild: " >&4
|
|
|
|
export PATH="$tmpdir/bin:$PATH"
|
|
rpmbuild --eval "%define _sourcedir $sourcedir" \
|
|
--eval "%define _specdir $specdir" \
|
|
--eval "%define _builddir $tmpdir/build" \
|
|
--eval "%define __patch $tmpdir/bin/patch" \
|
|
--eval "%define __tar $tmpdir/bin/tar" \
|
|
--eval "$DEFINE_FUZZ" \
|
|
--nodeps \
|
|
-bp "$specdir/$specfile" < /dev/null >&5 2>&5
|
|
status=$?
|
|
echo >&4
|
|
exit $status
|
|
### Local Variables:
|
|
### mode: shell-script
|
|
### End:
|
|
# vim:filetype=sh
|
|
|