diff options
-rwxr-xr-x | bin/guards | 246 | ||||
-rwxr-xr-x | lib/parse-patch | 129 | ||||
-rwxr-xr-x | lib/spec2series | 223 |
3 files changed, 0 insertions, 598 deletions
diff --git a/bin/guards b/bin/guards deleted file mode 100755 index 9681186..0000000 --- a/bin/guards +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/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. - -use FileHandle; -use Getopt::Long; -use strict; - -# Prototypes -sub files_in($$); -sub parse($$); -sub help(); - -sub slashme($) { - my ($dir) = @_; - $dir =~ s#([^/])$#$&/#; # append a slash if necessary - if ($dir eq './') { - return ''; - } else { - return $dir; - } -} - -# Generate a list of files in a directory -# -sub files_in($$) { - my ($dir, $path) = @_; - my $dh = new FileHandle; - my (@files, $file); - - - opendir $dh, length("$dir$path") ? "$dir$path" : '.' - or die "$dir$path: $!\n"; - while ($file = readdir($dh)) { - next if $file =~ /^(\.|\.\.|\.#.*|CVS)$/; - if (-d "$dir$path$file") { - @files = (@files, files_in($dir, "$path$file/")); - } else { - #print "[$path$file]\n"; - push @files, "$path$file"; - } - } - closedir $dh; - return @files; -} - -# Parse a configuration file -# Callback called with ($patch, @guards) arguments -# -sub parse($$) { - my ($fh, $callback) = @_; - - my $mode = 0; - - while (<$fh>) { - my @guards = (); - s/(^|\s+)#.*//; - foreach my $token (split) { - if ($token =~ /^[-+]/) { - if ($mode == 1) { - @guards = (); - $mode = 0; - } - push @guards, $token; - } else { - $mode = 1; - #print "[" . join(",", @guards) . "] $patch\n"; - &$callback($token, @guards); - } - } - } -} - -# Command line options -# -my ($dir, $config, $default, $check) = ('', '-', 1, 0); -my @path; - -# Help text -# -sub help() { - print "$0 - select from a list of files guarded by conditions\n"; - print "SYNOPSIS: $0 [--prefix=dir] [--path=dir1:dir2:...]\n" . - " [--default=0|1] [--check] [--config=file] symbol ...\n\n" . - " (Default values: --path='" . join(':', @path) . "', " . - "--default=$default)\n"; - exit 0; -} - -# Parse command line options -# -Getopt::Long::Configure ("bundling"); -eval { - unless (GetOptions ( - 'd|prefix=s' => \$dir, - 'c|config=s' => \$config, - 'C|check' => \$check, - 'p|path=s' => \@path, - 'D|default=i' => \$default, - 'h|help' => sub { help(); exit 0; })) { - help(); - exit 1; - } -}; -if ($@) { - print "$@"; - help(); - exit 1; -} - -@path = ('.') - unless (@path); -@path = split(/:/, join(':', @path)); - -my $fh = ($config eq '-') ? \*STDIN : new FileHandle($config) - or die "$config: $!\n"; - -$dir = slashme($dir); - -if ($check) { - # Check for duplicate files, or for files that are not referenced by - # the specification. - - my $problems = 0; - my @files; - - foreach (@path) { - @files = (@files, files_in($dir, slashme($_))); - } - my %files = map { $_ => 0 } @files; - - parse($fh, sub { - my ($patch, @guards) = @_; - if (exists $files{$patch}) { - $files{$patch}++; - } else { - print "Not found: $dir$patch\n"; - $problems++; - }}); - - $fh->close(); - - my ($file, $ref); - while (($file, $ref) = each %files) { - next if $ref == 1; - - print "Unused: $file\n" if $ref == 0; - print "Multiple uses: $file\n" if $ref > 1; - $problems++; - } - exit $problems ? 1 : 0; - -} else { - # Generate a list of patches to apply. - - my %symbols = map { $_ => 1 } @ARGV; - - parse($fh, sub { - my ($patch, @guards) = @_; - - my $selected; - if (@guards) { - # If the first guard is -xxx, the patch is included by default; - # if it is -xxx, the patch is excluded by default. - $selected = ($guards[0] =~ /^-/); - - foreach (@guards) { - /^([-+])(!?)(.*)?/ - or die "Bad guard '$_'\n"; - - # Check if the guard matches - if (($2 eq '!' && !exists $symbols{$3}) || - ($2 eq '' && ( $3 eq '' || exists $symbols{$3}))) { - # Include or exclude - $selected = ($1 eq '+'); - } - } - } else { - # If there are no guards, use the specified default result. - $selected = $default; - } - - print "$dir$patch\n" - if $selected; - }); - - $fh->close(); - - exit 0; -} - -__END__ - -=head1 NAME - -guards - select from a list of files guarded by conditions - -=head1 SYNOPSIS - -F<guards> [--prefix=F<dir>] [--path=F<dir2:dir2:...>] - [--default=I<0>|I<1>] [--check] [--config=F<file>] - I<symbol> ... - -=head1 DESCRIPTION - -The script reads a configuration file that may contain so-called guards, file -names, and comments, and writes those file names that satisfy all guards to -standard output. The script takes a list of symbols as its arguments. Each line -in the ocnfiguration file is processed separately. Lines may start with a -number of guards. The following guards are defined: - -=over - -+I<xxx> Include the file(s) on this line if the symbol I<xxx> is defined. - --I<xxx> Exclude the file(s) on this line if the symbol I<xxx> is defined. - -+!I<xxx> Include the file(s) on this line if the symbol I<xxx> is not defined. - --!I<xxx> Exclude the file(s) on this line if the symbol I<xxx> is not defined. - -- Exclude this file. Used to avoid spurious I<--check> messages. - -=back - -The guards are processed left to right. The last guard that matches determines -if the file is included. If no guard is specified, the I<--default> -setting determines if the file is included. - -If no configuration file is specified, the script reads from standard input. - -The I<--check> option is used to compare the specification file against the -file system. If files are referenced in the specification that do not exist, or -if files are not enlisted in the specification file warnings are printed. The -I<--path> option can be used to specify which directory or directories to scan. -Multiple directories are eparated by a colon (C<:>) character. The -I<--prefix> option specifies the location of the files. - -=head1 AUTHOR - -Andreas Gruenbacher <agruen@suse.de> (SuSE Linux AG) - diff --git a/lib/parse-patch b/lib/parse-patch deleted file mode 100755 index 9d38e36..0000000 --- a/lib/parse-patch +++ /dev/null @@ -1,129 +0,0 @@ -#!/usr/bin/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/spec2series b/lib/spec2series deleted file mode 100755 index 685f8e0..0000000 --- a/lib/spec2series +++ /dev/null @@ -1,223 +0,0 @@ -#!/bin/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 -) |