Commit | Line | Data |
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 |
9 | use vars qw($thisfile $change $file $fnum $h $v $p4port @addfiles |
10 | $branches $skip); |
1f848803 |
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 | } |
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; |
40 | Usage: $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 | |
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 | |
9058bc9b |
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. |
1f848803 |
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) { |
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 |
94 | if (m|^==== //depot/|) { |
95 | $skip = !m|$branches|; |
96 | } |
97 | |
98 | $_ = "# $_" if $skip; |
99 | |
1f848803 |
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) { |
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 | } |