add p4desc (augments 'p4 describe' output with diffs for new files)
Gurusamy Sarathy [Sun, 29 Nov 1998 16:23:30 +0000 (16:23 +0000)]
p4raw-id: //depot/perl@2388

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

index 6ac2168..3552d94 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -25,6 +25,7 @@ Porting/fixvars               Find undeclared variables with C compiler and fix em
 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
diff --git a/Porting/p4desc b/Porting/p4desc
new file mode 100755 (executable)
index 0000000..062a6f1
--- /dev/null
@@ -0,0 +1,106 @@
+#!/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;
+}