Make p4desc to skip non-mainperl branches by default.
[p5sagit/p5-mst-13.2.git] / Porting / p4desc
CommitLineData
95470547 1#!/usr/bin/perl -wpi.bak
1f848803 2
3#
4# Munge "p4 describe ..." output to include new files.
5#
6e238990 6# Gurusamy Sarathy <gsar@activestate.com>
1f848803 7#
8
9058bc9b 9use vars qw($thisfile $change $file $fnum $h $v $p4port @addfiles
10 $branches $skip);
1f848803 11
12BEGIN {
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 }
9058bc9b 22 elsif (/^-b(.*)$/) {
23 $branches = $1;
24 }
1f848803 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;
9058bc9b 37 $branches = '//depot/perl/' unless defined $branches;
1f848803 38 if ($h) {
39 print STDERR <<USAGE;
40Usage: $0 [-p \$P4PORT] [-v] [-h] [files]
41
9058bc9b 42 -phost:port p4 port (e.g. myhost:1666)
1f848803 43 -h print this help
44 -v output progress messages
9058bc9b 45 -bbranch(es) which branches to include (regex)
46 (default: //depot/perl/)
47 -h show this help
1f848803 48
49A smart 'cat'. When fed the spew from "p4 describe ..." on STDIN,
50spits it right out on STDOUT, followed by patches for any new files
51detected in the spew. Can also be used to edit insitu a bunch of
52files containing said spew.
53
9058bc9b 54WARNING 1: Currently only emits unified diffs (diff -u).
55
56WARNING 2: By default only the changes in the //depot/perl branch
57are shown. To include all the branches, supply "-b." arguments
58to $0.
1f848803 59
60Examples:
61 p4 describe -du 123 | $0 > change-123.desc
62 p4 describe -du 123 | $0 | p4d2p > change-123.patch
63
64USAGE
65 exit(0);
66 }
67 $thisfile = "";
68}
69
70
71if ($ARGV ne $thisfile) {
72 warn "processing patchfile [$ARGV]\n" unless $ARGV eq '-';
73 $thisfile = $ARGV;
74}
75
76my $cur = m|^Affected files| ... m|^Differences|;
77
78# while we are within range
79if ($cur) {
9058bc9b 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 }
1f848803 90 }
91 warn "file [$file] line [$cur] file# [$fnum]\n" if $v;
92}
93
9058bc9b 94if (m|^==== //depot/|) {
95 $skip = !m|$branches|;
96}
97
98$_ = "# $_" if $skip;
99
1f848803 100if (/^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
109if (eof) {
110 $_ .= newfiles();
111}
112
113sub newfiles {
114 my $addfile;
115 my $ret = "";
116 for $addfile (@addfiles) {
c3e95679 117 my $type = `p4 -p $p4port files '$addfile'`;
95470547 118 if ($?) {
c3e95679 119 warn "$0: `p4 -p $p4port print '$addfile'` failed, status[$?]\n";
95470547 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 }
c3e95679 128 my @new = `p4 -p $p4port print '$addfile'`;
1f848803 129 if ($?) {
c3e95679 130 die "$0: `p4 -p $p4port print '$addfile'` failed, status[$?]\n";
1f848803 131 }
132 my $desc = shift @new; # discard initial description
95470547 133 $ret .= "\n==== $addfile ($type) ====\n\n";
1f848803 134 my $lines = "," . @new;
135 $lines = "" if @new < 2;
136 $ret .= "\@\@ -0,0 +1$lines \@\@\n";
137 $ret .= join("+","",@new);
c3e95679 138 $ret .= "\n\\ No newline at end of file\n" if $ret !~ /\n$/;
1f848803 139 }
140 @addfiles = ();
141 return $ret;
142}