summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rwxr-xr-xscripts/diffsplit148
1 files changed, 148 insertions, 0 deletions
diff --git a/scripts/diffsplit b/scripts/diffsplit
new file mode 100755
index 0000000..cff44b6
--- a/dev/null
+++ b/scripts/diffsplit
@@ -0,0 +1,148 @@
+#!/usr/bin/perl -w
+
+# diffsplit - split up unified diffs
+#
+# Copyright (C) 2001-2002 Transmeta Corporation
+#
+# written by Daniel Quinlan <quinlan@transmeta.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+$prog = $0;
+$prog =~ s@.*/@@;
+
+use Getopt::Std;
+use vars qw($opt_d $opt_h $opt_q $opt_t);
+
+if (defined($ENV{DIFFSPLIT})) {
+ unshift(@ARGV, $ENV{DIFFSPLIT});
+}
+
+getopts("b:cdho:p:qs:t");
+
+if ($#ARGV < 0) {
+ push(@ARGV, "-");
+}
+
+if ($opt_h) {
+ usage(0);
+}
+if ($opt_c) {
+ $regexp = '^Index:\s+(.*)';
+}
+else {
+ $regexp = '^diff\s+.*\s+(\S+)';
+}
+
+foreach $file (@ARGV) {
+ if (!open(IN, $file)) {
+ warn("$prog: $file: $!\n");
+ next;
+ }
+ $out = '';
+ $name = 'header';
+ $in_header = 0;
+ while(<IN>) {
+ if (/^@@/) {
+ $in_header = 0;
+ }
+ if ($opt_c) {
+ s/^([-+][-+][-+]) (\S+)/$1 $name/;
+ }
+ if (/$regexp/ ||
+ (! $in_header && /^(\-\-\-) (\S+)/ && ($no_name = 1)))
+ {
+ # save last file
+ $last = $name;
+ &close_file($last);
+
+ $in_header = 1;
+
+ $name = $1;
+
+ if ($no_name) {
+ $no_name = 0;
+ $out .= $_;
+ $_ = <IN>;
+ if (/^\+\+\+ (\S+)/) {
+ $name = $1;
+ }
+ }
+ }
+ $out .= $_;
+ }
+ &close_file($name);
+ close(IN);
+}
+
+sub close_file {
+ my ($name) = @_;
+ my $orig;
+
+ if ($opt_p) {
+ $name =~ s/^$opt_p//;
+ }
+ if ($opt_b) {
+ $name =~ s/^/$opt_b/;
+ }
+ $orig = $name;
+ if ($out ne '') {
+ if ($opt_d) {
+ $name =~ s@/[^/]+$@@;
+ }
+ if ($opt_o) {
+ $name = $opt_o;
+ }
+ if ($opt_s && $name ne "header") {
+ $name .= $opt_s;
+ }
+ $name =~ s@/@_@g;
+ if (-e $name && ! $seen{$name}) {
+ die "$prog: \"$name\" already exists, stopping\n";
+ }
+ if (! $opt_q) {
+ print STDERR "file: $orig -> $name\n";
+ }
+ if (! $opt_t) {
+ open(OUT, ">> $name");
+ print OUT $out;
+ close(OUT);
+ }
+ $seen{$name}++;
+ $out = '';
+ }
+}
+
+sub usage {
+ $status = shift;
+
+ $out = $status ? STDERR : STDOUT;
+ print $out <<EOF;
+usage: $prog [options] [file ...]
+
+Split up unified diffs. If no files are supplied, operates on standard input.
+
+ -b begin add begin to the front of each filename
+ -c input is a CVS diff (splits correctly and fixes diff filenames)
+ -d split by directory name instead of filename
+ -h print this help
+ -o file create a single output file, "-" outputs to stdout (useful with -c)
+ -p prefix strip prefix from the front of each filename (use / characters)
+ -q run quietly
+ -s .suf use suffix .suf on created files (default is no suffix)
+ -t test run (no writes)
+EOF
+ exit($status);
+}