summaryrefslogtreecommitdiffstats
path: root/scripts/parse-patch.in
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruen@suse.de>2003-01-31 12:45:37 +0000
committerAndreas Gruenbacher <agruen@suse.de>2003-01-31 12:45:37 +0000
commit21a15e55a81ea4bd2bc21729ceebe6be6a9ccd9b (patch)
tree150f25f9add7ecb5ae144ab63a62c3b43d25f378 /scripts/parse-patch.in
parentf07f43d191fe23209876061b7a31b5cb1e9a219d (diff)
downloadquilt-21a15e55a81ea4bd2bc21729ceebe6be6a9ccd9b.tar.gz
Install binary backup-files into /usr/lib/quilt and the remaining scripts under /usr/share/quilt/scripts.
Diffstat (limited to 'scripts/parse-patch.in')
-rw-r--r--scripts/parse-patch.in129
1 files changed, 129 insertions, 0 deletions
diff --git a/scripts/parse-patch.in b/scripts/parse-patch.in
new file mode 100644
index 0000000..56c3c55
--- /dev/null
+++ b/scripts/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;
+}