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
--- /dev/null
+#!/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;