add Porting/p4d2p
Gurusamy Sarathy [Tue, 14 Jul 1998 06:32:58 +0000 (06:32 +0000)]
p4raw-id: //depot/perl@1485

MANIFEST
Porting/p4d2p [new file with mode: 0755]

index ee50413..ecdaf99 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -20,6 +20,7 @@ Porting/config.sh     Sample config.sh
 Porting/config_H       Sample config.h
 Porting/genlog         Generate formatted changelogs by querying p4d
 Porting/makerel                Release making utility
+Porting/p4d2p          Generate standard patches from p4 diffs
 Porting/patching.pod   How to report changes made to Perl
 Porting/patchls                Flexible patch file listing utility
 Porting/pumpkin.pod    Guidelines and hints for Perl maintainers
diff --git a/Porting/p4d2p b/Porting/p4d2p
new file mode 100755 (executable)
index 0000000..67780a9
--- /dev/null
@@ -0,0 +1,84 @@
+#!/l/local/bin/perl -wspi.bak
+
+#
+# reads a perforce style diff on stdin and outputs appropriate headers
+# so the diff can be applied with the patch program
+#
+# Gurusamy Sarathy <gsar@umich.edu>
+#
+
+BEGIN {
+    $0 =~ s|.*/||;
+    if ($h or $help) {
+       print STDERR <<USAGE;
+Usage: $0 [-v] [-h] files
+
+       -h      print this help
+       -v      output progress messages
+
+Does inplace edit of diff files output by the perforce commands
+"p4 describe", "p4 diff", and "p4 diff2". The result is suitable
+for feeding to the "patch" program.
+
+If no files are specified, reads from stdin and writes to stdout.
+
+WARNING: It only handles context or unified diffs.
+
+Example: p4 describe -du 123 | $0 > change-123.patch
+
+USAGE
+       exit(0);
+    }
+    unless (@ARGV) { @ARGV = '-'; undef $^I; }
+    use vars qw($thisfile $time $file $fnum $v $h $help);
+    $thisfile = "";
+    $time = localtime(time);
+}
+
+my ($cur, $match);
+$cur = m<^==== //depot/(.+?)\#\d+.* ====$> ... m<^(\@\@.+\@\@|\*+)$>;
+
+$match = $1;
+
+if ($ARGV ne $thisfile) {
+    warn "processing patchfile [$ARGV]\n" unless $ARGV eq '-';
+    $thisfile = $ARGV;
+}
+
+# while we are within range
+if ($cur) {
+    # set the file name after first line
+    if ($cur == 1) {
+       $file = $match;
+       $fnum++;
+    }
+    # emit the diff header when we hit last line
+    elsif ($cur =~ /E0$/) {
+       my $f = $file;
+
+       # special hack for perl so we can always use "patch -p1"
+       $f =~ s<^.*?(perl.*?/)><$1>;
+
+       # unified diff
+       if ($match =~ /^\@/) {
+           warn "emitting udiff header\n" if $v;
+           $_ = "Index: $f\n--- $f.~1~\t$time\n+++ $f\t$time\n$_";
+       }
+       # context diff
+       elsif ($match =~ /^\*/) {
+           warn "emitting cdiff header\n" if $v;
+           $_ = "Index: $f\n*** $f.~1~\t$time\n--- $f\t$time\n$_";
+       }
+    }
+    # see if we hit another patch (i.e. previous patch was empty)
+    elsif (m<^==== //depot/(.+?)\#\d+.* ====$>) {
+       $file = $match = $1;
+    }
+    # suppress all other lines in the header
+    else {
+       $_ = "";
+    }
+    warn "file [$file] line [$cur] file# [$fnum]\n" if $v;
+}
+
+$_ .= "End of Patch.\n" if eof;