Make p4desc to skip non-mainperl branches by default.
[p5sagit/p5-mst-13.2.git] / Porting / p4desc
1 #!/usr/bin/perl -wpi.bak
2
3 #
4 # Munge "p4 describe ..." output to include new files.
5 #
6 # Gurusamy Sarathy <gsar@activestate.com>
7 #
8
9 use vars qw($thisfile $change $file $fnum $h $v $p4port @addfiles
10             $branches $skip);
11
12 BEGIN {
13     $0 =~ s|^.*/||;
14     $p4port = $ENV{P4PORT} || 'localhost:1666';
15     for (@ARGV) {
16         if ($p4port =~ /^\s+$/) {
17            $p4port = $_;
18         }
19         elsif (/^-p(.*)$/) {
20             $p4port = $1 || ' ';
21         }
22         elsif (/^-b(.*)$/) {
23             $branches = $1;
24         }
25         elsif (/^-v$/) {
26             $v++;
27         }
28         elsif (/^-h/) {
29             $h++;
30         }
31         else {
32             push @files, $_;
33         }
34     }
35     unless (@files) { @files = '-'; undef $^I; }
36     @ARGV = @files;
37     $branches = '//depot/perl/' unless defined $branches;
38     if ($h) {
39         print STDERR <<USAGE;
40 Usage: $0 [-p \$P4PORT] [-v] [-h] [files]
41
42         -phost:port     p4 port (e.g. myhost:1666)
43         -h              print this help
44         -v              output progress messages
45         -bbranch(es)    which branches to include (regex)
46                         (default: //depot/perl/)
47         -h              show this help
48
49 A smart 'cat'.  When fed the spew from "p4 describe ..." on STDIN,
50 spits it right out on STDOUT, followed by patches for any new files
51 detected in the spew.  Can also be used to edit insitu a bunch of
52 files containing said spew.
53
54 WARNING 1: Currently only emits unified diffs (diff -u).
55
56 WARNING 2: By default only the changes in the //depot/perl branch
57 are shown.  To include all the branches, supply "-b." arguments
58 to $0.
59
60 Examples:
61         p4 describe -du 123 | $0 > change-123.desc
62         p4 describe -du 123 | $0 | p4d2p > change-123.patch
63
64 USAGE
65         exit(0);
66     }
67     $thisfile = "";
68 }
69
70
71 if ($ARGV ne $thisfile) {
72     warn "processing patchfile [$ARGV]\n" unless $ARGV eq '-';
73     $thisfile = $ARGV;
74 }
75
76 my $cur = m|^Affected files| ... m|^Differences|;
77
78 # while we are within range
79 if ($cur) {
80     if (m|^\.\.\. |) {
81         if (m|$branches|) {
82             if (m{^\.\.\. (//depot/.+?\#\d+) (add|branch)$}) {
83                 my $newfile = $1;
84                 push @addfiles, $newfile;
85                 warn "$newfile add, revision != 1!\n" unless $newfile =~ /#1$/;
86             }
87         } else {
88             $_ = "# Skipped: $_";
89         }
90     }
91     warn "file [$file] line [$cur] file# [$fnum]\n" if $v;
92 }
93
94 if (m|^==== //depot/|) { 
95     $skip = !m|$branches|;
96 }
97
98 $_ = "# $_" if $skip; 
99
100 if (/^Change (\d+) by/) {
101     $_ = "\n\n" . $_ if $change;        # start of a new change list
102     $change = $1;
103     my $new = newfiles();
104     if ($new) {
105         $_ = $new . $_;
106     }
107 }
108
109 if (eof) {
110     $_ .= newfiles();
111 }
112
113 sub newfiles {
114     my $addfile;
115     my $ret = "";
116     for $addfile (@addfiles) {
117         my $type = `p4 -p $p4port files '$addfile'`;
118         if ($?) {
119             warn "$0: `p4 -p $p4port print '$addfile'` failed, status[$?]\n";
120             next;
121         }
122         $type =~ m|^//.*\((.+)\)$| or next;
123         $type = $1;
124         unless ($type =~ /text/) {
125             $ret .= "\n==== $addfile ($type) ====\n\n";
126             next;
127         }
128         my @new = `p4 -p $p4port print '$addfile'`;
129         if ($?) {
130             die "$0: `p4 -p $p4port print '$addfile'` failed, status[$?]\n";
131         }
132         my $desc = shift @new;          # discard initial description
133         $ret .= "\n==== $addfile ($type) ====\n\n";
134         my $lines = "," . @new;
135         $lines = "" if @new < 2;
136         $ret .= "\@\@ -0,0 +1$lines \@\@\n";
137         $ret .= join("+","",@new);
138         $ret .= "\n\\ No newline at end of file\n" if $ret !~ /\n$/;
139     }
140     @addfiles = ();
141     return $ret;
142 }