summaryrefslogtreecommitdiff
path: root/Porting
diff options
context:
space:
mode:
authorGurusamy Sarathy <gsar@cpan.org>1998-11-29 16:23:30 +0000
committerGurusamy Sarathy <gsar@cpan.org>1998-11-29 16:23:30 +0000
commit1f8488031ad013b6fc4a66ab2503ebf23dbf32aa (patch)
treee34af2b433e9cf23dad50131392bc3891922fc9c /Porting
parent2d8e6c8d50eaf50f663a5fd184404c73944226e0 (diff)
downloadperl-1f8488031ad013b6fc4a66ab2503ebf23dbf32aa.tar.gz
add p4desc (augments 'p4 describe' output with diffs for new files)
p4raw-id: //depot/perl@2388
Diffstat (limited to 'Porting')
-rwxr-xr-xPorting/p4desc106
1 files changed, 106 insertions, 0 deletions
diff --git a/Porting/p4desc b/Porting/p4desc
new file mode 100755
index 0000000000..062a6f122b
--- /dev/null
+++ b/Porting/p4desc
@@ -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;
+}