summaryrefslogblamecommitdiffstats
path: root/scripts/spec2series.in
blob: 8d1c0aa7d3a682da8f27a135307f46a5d67b07f6 (plain) (tree)
1
         

































































































                                                                              
                 




                                                         
                                                         






















































                                                                        
                                                                        




























                                                                            
                 














                                                           
                                                          














                                                                    



                      
#! @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 <<EOF
Usage: quilt spec2series [ options ] specfile

-h	print this text
-d	debug mode (prints lots additional info
	as comments into the output file)
-o <file>
	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="rpm --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 "### rpm: " >&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