This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Use UTF8SKIP(), from Simon Cozens.
[perl5.git] / Porting / p4desc
index b6b412d..2d1c9d8 100755 (executable)
@@ -6,7 +6,8 @@
 # Gurusamy Sarathy <gsar@activestate.com>
 #
 
-use vars qw($thisfile $change $file $fnum $h $v $p4port @addfiles);
+use vars qw($thisfile $change $file $fnum $h $v $p4port @addfiles
+           $branches $skip);
 
 BEGIN {
     $0 =~ s|^.*/||;
@@ -18,6 +19,9 @@ BEGIN {
         elsif (/^-p(.*)$/) {
            $p4port = $1 || ' ';
        }
+        elsif (/^-b(.*)$/) {
+           $branches = $1;
+       }
        elsif (/^-v$/) {
            $v++;
        }
@@ -30,20 +34,28 @@ BEGIN {
     }
     unless (@files) { @files = '-'; undef $^I; }
     @ARGV = @files;
+    $branches = '//depot/perl/' unless defined $branches;
     if ($h) {
        print STDERR <<USAGE;
 Usage: $0 [-p \$P4PORT] [-v] [-h] [files]
 
-       -p host:port    p4 port (e.g. myhost:1666)
+       -phost:port     p4 port (e.g. myhost:1666)
        -h              print this help
        -v              output progress messages
+       -bbranch(es)    which branches to include (regex)
+                       (default: //depot/perl/)
+       -h              show this help
 
 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.
+WARNING 1: Currently only emits unified diffs (diff -u).
+
+WARNING 2: By default only the changes in the //depot/perl branch
+are shown.  To include all the branches, supply "-b." arguments
+to $0.
 
 Examples:
        p4 describe -du 123 | $0 > change-123.desc
@@ -65,14 +77,28 @@ 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$/;
+    if (m|^\.\.\. |) {
+       if (m|$branches|) {
+           if (m{^\.\.\. (//depot/.+?\#\d+) (add|branch)$}) {
+               my $newfile = $1;
+               push @addfiles, $newfile;
+               warn "$newfile add, revision != 1!\n" unless $newfile =~ /#1$/;
+           }
+        } else {
+           push @skipped, "# $_";
+           $_ = '';
+       }
     }
     warn "file [$file] line [$cur] file# [$fnum]\n" if $v;
 }
 
+if (m|^==== //depot/|) { 
+    $skip = !m|$branches|;
+    print "# Skipped because not under branches: $branches\n" if $skip;
+}
+
+$_ = "# $_" if $skip; 
+
 if (/^Change (\d+) by/) {
     $_ = "\n\n" . $_ if $change;       # start of a new change list
     $change = $1;
@@ -84,15 +110,18 @@ if (/^Change (\d+) by/) {
 
 if (eof) {
     $_ .= newfiles();
+    $_ .= join('', "\n",
+               "# Skipped because not under branches: $branches\n",
+               @skipped, "\n") if @skipped; 
 }
 
 sub newfiles {
     my $addfile;
     my $ret = "";
     for $addfile (@addfiles) {
-       my $type = `p4 -p $p4port files $addfile`;
+       my $type = `p4 -p $p4port files '$addfile'`;
        if ($?) {
-           warn "$0: `p4 -p $p4port print $addfile` failed, status[$?]\n";
+           warn "$0: `p4 -p $p4port print '$addfile'` failed, status[$?]\n";
            next;
        }
        $type =~ m|^//.*\((.+)\)$| or next;
@@ -101,9 +130,9 @@ sub newfiles {
            $ret .= "\n==== $addfile ($type) ====\n\n";
            next;
        }
-       my @new = `p4 -p $p4port print $addfile`;
+       my @new = `p4 -p $p4port print '$addfile'`;
        if ($?) {
-           die "$0: `p4 -p $p4port print $addfile` failed, status[$?]\n";
+           die "$0: `p4 -p $p4port print '$addfile'` failed, status[$?]\n";
        }
        my $desc = shift @new;          # discard initial description
        $ret .= "\n==== $addfile ($type) ====\n\n";
@@ -111,6 +140,7 @@ sub newfiles {
        $lines = "" if @new < 2;
        $ret .= "\@\@ -0,0 +1$lines \@\@\n";
        $ret .= join("+","",@new);
+       $ret .= "\n\\ No newline at end of file\n" if $ret !~ /\n$/;
     }
     @addfiles = ();
     return $ret;