#! @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. # defaults debug=0 specfile="" outfile="" function usage() { cat < specify output file, stdout if unspecified EOF } # parse args while test "$1" != ""; do case "$1" in -h | --help) usage; exit 0 ;; -d | --debug) debug=1; shift ;; -o | --outfile) outfile="$2"; shift; shift ;; *) specfile="$1" break; ;; esac done if test ! -f "$specfile"; then usage exit 1 fi # get absolute patch for specfile location specdir=`dirname $specfile` specfile=`basename $specfile` case "$specdir" in .) specdir="`pwd`" ;; /*) # nothing ;; *) specdir="`pwd`/$specdir" ;; esac # create tmp work dir WORK="${TMPDIR-/tmp}/rpmlog-$$" mkdir -p "$WORK" || exit 1 trap 'rm -rf "$WORK"' EXIT mkdir -p "$WORK/build" mkdir -p "$WORK/bin" # create md5 sums, also for uncompressed files echo -n "### md5: " >&2 (cd $specdir; for file in /dev/null *; do case "$file" in ready | bigpack | MD5SUMS | MD5SUMS.meta | *.spec | *.changes) continue ;; esac type="`file -b $file | cut -d" " -f1`" case "$type" in compress*) echo -n "z" >&2 set -- `zcat $file | md5sum` echo "$1 zcat ${file}" ;; gzip) echo -n "g" >&2 set -- `zcat $file | md5sum` echo "$1 zcat ${file}" ;; bzip2) echo -n "b" >&2 set -- `bzcat $file | md5sum` echo "$1 bzcat ${file}" ;; esac echo -n "." >&2 set -- `md5sum < $file` echo "$1 cat ${file}" done) > $WORK/md5sum echo $" done" >&2 # prepare rpm dir fixups and hooks RPM="@RPMBUILD@ --rcfile=/usr/lib/rpm/rpmrc:$WORK/rpmrc" PATH="$WORK/bin:$PATH" grep ^macrofiles /usr/lib/rpm/rpmrc \ | @SED@ -e "/macrofiles/s|$|:$WORK/rpmmacros|" \ > $WORK/rpmrc cat <<-EOF > "$WORK/rpmmacros" %_sourcedir $specdir %_specdir $specdir %_builddir $WORK/build EOF # wrapper script for patch and tar cat <<-'EOF' > "$WORK/bin/patch" #!/bin/sh # save stuff for log unpackcmd=`basename $0` unpackdir=`pwd` unpackargs="$*" uncompress="false" unpackfile="[oops]" # sort of progress bar case $unpackcmd in tar) echo -n "t" >&2;; patch) echo -n "p" >&2;; *) echo -n "?" >&2;; esac # find real binary realcmd="" test -x "/bin/$unpackcmd" && realcmd="/bin/$unpackcmd" test -x "/usr/bin/$unpackcmd" && realcmd="/usr/bin/$unpackcmd" test "$realcmd" = "" && exit 1 # put data into tmpfile, exec real cmd, return on failure WORK=`dirname $RPM_BUILD_DIR` cat > "$WORK/data" if test -x /bin/$unpackcmd; then cmddir="/bin" fi $realcmd $* < "$WORK/data" retval="$?" test "$retval" != "0" && exit $retval # find original data file by md5sum set -- `md5sum < "$WORK/data"` unpackfile="[$1]" set -- `cat "$WORK/md5sum"` while test "$1" != ""; do if test "[$1]" = "$unpackfile"; then uncompress="$2" unpackfile="$3" break fi shift done # print results unpackdir=`echo $unpackdir | @SED@ -e "s|$RPM_BUILD_DIR|BUILD|"` echo -n "# log: [$unpackdir] $uncompress $unpackfile" >>$WORK/cmdlog echo " | $unpackcmd $unpackargs" >>$WORK/cmdlog if test "$unpackcmd" = "patch" -a \ -f "$RPM_SOURCE_DIR/$unpackfile"; then patchdir="${unpackdir#BUILD/}" if test ! -f "$WORK/patchdir"; then echo -n $patchdir > $WORK/patchdir fi if test "`cat $WORK/patchdir`" = "$patchdir"; then level=`echo $unpackargs | tr " " "\n" | grep ^-p` echo "$unpackfile $level" >> $WORK/patchlog fi fi if test "$unpackcmd" = "tar" -a \ -f "$RPM_SOURCE_DIR/$unpackfile"; then echo -n "# Source: $unpackfile" >>$WORK/tarlog if test "$unpackdir" != "BUILD"; then echo -n " -C ${unpackdir#BUILD/}" >>$WORK/tarlog fi echo "" >>$WORK/tarlog fi EOF chmod 755 "$WORK/bin/patch" ln -s patch "$WORK/bin/tar" # let rpm do all the dirty specfile stuff ... echo -n "### $(basename @RPMBUILD@): " >&2 touch $WORK/patchlog $RPM --nodeps --quiet -bp "$specdir/$specfile" /dev/null echo $" done" >&2 # print results saved by the wrapper script ( # header echo "# Patch series file for quilt, created by $0" echo "#" echo "# Sourcedir: $specdir" echo "# Specfile: $specfile" if test -f $WORK/patchdir; then echo "# Patchdir: `cat $WORK/patchdir`" fi echo "#" # additional info for trouble shooting if test "$debug" = "1"; then cat $WORK/md5sum | @SED@ -e 's/^/# md5: /' echo "#" test -f $WORK/cmdlog && cat $WORK/cmdlog && echo "#" fi # list tarballs + patches test -f $WORK/tarlog && cat $WORK/tarlog && echo "#" test -f $WORK/patchlog && cat $WORK/patchlog )|( if test "$outfile" != ""; then cat > "$outfile" else cat fi ) ### Local Variables: ### mode: shell-script ### End: # vim:filetype=sh