diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/.cvsignore | 2 | ||||
-rwxr-xr-x | lib/apatch.in | 2 | ||||
-rwxr-xr-x | lib/parse-patch.in | 129 | ||||
-rw-r--r-- | lib/patchfns.in | 2 | ||||
-rwxr-xr-x | lib/rpatch.in | 2 | ||||
-rwxr-xr-x | lib/spec2series.in | 223 |
6 files changed, 356 insertions, 4 deletions
diff --git a/lib/.cvsignore b/lib/.cvsignore index 43b00a3..d672ac5 100644 --- a/lib/.cvsignore +++ b/lib/.cvsignore @@ -1 +1 @@ -apatch backup-files rpatch patchfns +apatch backup-files rpatch patchfns parse-patch spec2series diff --git a/lib/apatch.in b/lib/apatch.in index 3a13238..593b32f 100755 --- a/lib/apatch.in +++ b/lib/apatch.in @@ -1,4 +1,4 @@ -#!/bin/bash +#!@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 diff --git a/lib/parse-patch.in b/lib/parse-patch.in new file mode 100755 index 0000000..56c3c55 --- /dev/null +++ b/lib/parse-patch.in @@ -0,0 +1,129 @@ +#!@PERL@ -w + +# 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. + +# Extract or update a section from a combined patch + documentation + +# meta information file. + +use FileHandle; +use Getopt::Long; +use File::Temp qw(tempfile); +use strict; + +my $select; +my $update; + +if (!GetOptions("s|select=s" => \$select, + "u|update=s" => \$update) || + (!defined $select && !defined $update)) { + print STDERR "USAGE: $0 {-s|-u} section file [< replacement]\n"; + exit 1; +} + +foreach my $arg (@ARGV) { + my $fh; + + if (! -e $arg) { + $fh = new FileHandle("/dev/null"); + } elsif ($arg =~ /\.gz$/) { + $fh = new FileHandle("gzip -cd $arg |"); + } elsif ($arg =~ /\.bz2$/) { + $fh = new FileHandle("bzip2 -cd $arg |"); + } else { + $fh = new FileHandle("< $arg"); + } + + unless ($fh) { + print STDERR "$arg: $!\n"; + next; + } + + if (defined $select) { + my $section = "head"; + my $newline = ""; + while (<$fh>) { + if (/^%(.*)/) { + last if $section eq $select; + $section = $1; + next; + } + if ($section eq $select) { + print $newline; + if ($_ eq "\n") { + $newline = $_; + } else { + $newline=""; + print; + } + } + } + } elsif (defined $update) { + my ($fh2, $tempname) = tempfile("$arg.XXXXXX"); + if ($arg =~ /\.gz$/) { + $fh2->close(); + if (! -e $tempname) { + die "File $tempname disappeared!\n"; + } + $fh2 = new FileHandle("| gzip -c > $tempname"); + } elsif ($arg =~ /\.bz2$/) { + $fh2->close(); + if (! -e $tempname) { + die "File $tempname disappeared!\n"; + } + $fh2 = new FileHandle("| bzip2 -c > $tempname"); + } + unless ($fh2) { + die "$tempname: $!\n"; + } + + # Copy things before updated section + my $last_was_newline=1; # start first section in first line + while (<$fh>) { + if (/^%(.*)/ && $1 eq $update) { + last; + } + $last_was_newline = ($_ eq "\n"); + print $fh2 $_; + } + print $fh2 "\n" + unless ($last_was_newline); + + # Create/replace updated section + print $fh2 "%$update\n"; + while (<STDIN>) { + print $fh2 $_; + } + print $fh2 "\n"; + + # Skip obsolete section + while (<$fh>) { + if (/^%(.*)/) { + print $fh2 $_; + last; + } + } + # Copy things after updated section + while (<$fh>) { + print $fh2 $_; + } + unless (close $fh2) { + die "$arg.patch: $!\n"; + } + + if (-e $arg) { + unlink "$arg~"; + unless (rename $arg, "$arg~") { + die "Failed to rename $arg to $arg~: $!\n"; + } + } + unless (rename $tempname, $arg) { + rename("$arg~", $arg); + die "Failed to rename $arg.parse to $arg: $!\n"; + } + } + close $fh; +} diff --git a/lib/patchfns.in b/lib/patchfns.in index de8e715..b4123c9 100644 --- a/lib/patchfns.in +++ b/lib/patchfns.in @@ -1,4 +1,4 @@ -#!/bin/bash +#!@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 diff --git a/lib/rpatch.in b/lib/rpatch.in index 85e8408..2d39bf1 100755 --- a/lib/rpatch.in +++ b/lib/rpatch.in @@ -1,4 +1,4 @@ -#!/bin/bash +#!@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 diff --git a/lib/spec2series.in b/lib/spec2series.in new file mode 100755 index 0000000..6f6b636 --- /dev/null +++ b/lib/spec2series.in @@ -0,0 +1,223 @@ +#!@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 +) |