Include p4d2p in Porting again, because p4genpatch doesn't work
Chip Salzenberg [Mon, 24 Feb 2003 21:42:57 +0000 (21:42 +0000)]
until a change has been submitted.

p4raw-id: //depot/perl@18768

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

index 7df7152..4695eb3 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -2300,7 +2300,8 @@ Porting/fixvars           Find undeclared variables with C compiler and fix em
 Porting/genlog         Generate formatted changelogs by querying p4d
 Porting/Glossary       Glossary of config.sh variables
 Porting/makerel                Release making utility
-Porting/p4genpatch     Obsoletes both p4desc and p4d2p
+Porting/p4d2p          Generate patch from p4 diff
+Porting/p4genpatch     Generate patch from p4 change in repository (obsoletes p4desc)
 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..83b0021
--- /dev/null
@@ -0,0 +1,84 @@
+#!/usr/bin/perl -wspi~
+
+#
+# reads a perforce style diff on stdin and outputs appropriate headers
+# so the diff can be applied with the patch program
+#
+# Gurusamy Sarathy <gsar@activestate.com>
+#
+
+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;