Porting/genlog Generate formatted changelogs by querying p4d
Porting/makerel Release making utility
Porting/p4d2p Generate standard patches from p4 diffs
+Porting/p4desc Smarter 'p4 describe', outputs diffs for new files
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
+#!/l/local/bin/perl -wpi.bak
+
+#
+# Munge "p4 describe ..." output to include new files.
+#
+# Gurusamy Sarathy <gsar@umich.edu>
+#
+
+use vars qw($thisfile $change $file $fnum $h $v $p4port @addfiles);
+
+BEGIN {
+ $0 =~ s|^.*/||;
+ $p4port = $ENV{P4PORT} || 'localhost:1666';
+ for (@ARGV) {
+ if ($p4port =~ /^\s+$/) {
+ $p4port = $_;
+ }
+ elsif (/^-p(.*)$/) {
+ $p4port = $1 || ' ';
+ }
+ elsif (/^-v$/) {
+ $v++;
+ }
+ elsif (/^-h/) {
+ $h++;
+ }
+ else {
+ push @files, $_;
+ }
+ }
+ unless (@files) { @files = '-'; undef $^I; }
+ @ARGV = @files;
+ if ($h) {
+ print STDERR <<USAGE;
+Usage: $0 [-p \$P4PORT] [-v] [-h] [files]
+
+ -p host:port p4 port (e.g. myhost:1666)
+ -h print this help
+ -v output progress messages
+
+A smart 'cat'. When fed the spew from "p4 describe ..." on STDIN,
+spits it right out on STDOUT, followed by patches for any new files
+detected in the spew. Can also be used to edit insitu a bunch of
+files containing said spew.
+
+WARNING: Currently only emits unified diffs.
+
+Examples:
+ p4 describe -du 123 | $0 > change-123.desc
+ p4 describe -du 123 | $0 | p4d2p > change-123.patch
+
+USAGE
+ exit(0);
+ }
+ $thisfile = "";
+}
+
+
+if ($ARGV ne $thisfile) {
+ warn "processing patchfile [$ARGV]\n" unless $ARGV eq '-';
+ $thisfile = $ARGV;
+}
+
+my $cur = m|^Affected files| ... m|^Differences|;
+
+# while we are within range
+if ($cur) {
+ if (m|^\.\.\. (//depot/.+?#\d+) add$|) {
+ my $newfile = $1;
+ push @addfiles, $newfile;
+ warn "$newfile add, revision != 1!\n" unless $newfile =~ /#1$/;
+ }
+ warn "file [$file] line [$cur] file# [$fnum]\n" if $v;
+}
+
+if (/^Change (\d+) by/) {
+ $_ = "\n\n" . $_ if $change; # start of a new change list
+ $change = $1;
+ my $new = newfiles();
+ if ($new) {
+ $_ = $new . $_;
+ }
+}
+
+if (eof) {
+ $_ .= newfiles();
+}
+
+sub newfiles {
+ my $addfile;
+ my $ret = "";
+ for $addfile (@addfiles) {
+ my @new = `p4 -p $p4port print $addfile`;
+ if ($?) {
+ die "$0: `p4 -p $p4port print $addfile` failed, status[$?]\n";
+ }
+ my $desc = shift @new; # discard initial description
+ $ret .= "\n==== $addfile (text) ====\n\n";
+ my $lines = "," . @new;
+ $lines = "" if @new < 2;
+ $ret .= "\@\@ -0,0 +1$lines \@\@\n";
+ $ret .= join("+","",@new);
+ }
+ @addfiles = ();
+ return $ret;
+}