summaryrefslogtreecommitdiffstats
path: root/contrib/perl5/Porting/p4desc
blob: 2d1c9d8219fdf1ec9f791a3f87b0058c32ee4cb2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/usr/bin/perl -wpi.bak

#
# Munge "p4 describe ..." output to include new files.
#
# Gurusamy Sarathy <gsar@activestate.com>
#

use vars qw($thisfile $change $file $fnum $h $v $p4port @addfiles
	    $branches $skip);

BEGIN {
    $0 =~ s|^.*/||;
    $p4port = $ENV{P4PORT} || 'localhost:1666';
    for (@ARGV) {
        if ($p4port =~ /^\s+$/) {
	   $p4port = $_;
	}
        elsif (/^-p(.*)$/) {
	    $p4port = $1 || ' ';
	}
        elsif (/^-b(.*)$/) {
	    $branches = $1;
	}
	elsif (/^-v$/) {
	    $v++;
	}
	elsif (/^-h/) {
	    $h++;
	}
	else {
	    push @files, $_;
	}
    }
    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]

	-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 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
	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|^\.\.\. |) {
	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;
    my $new = newfiles();
    if ($new) {
	$_ = $new . $_;
    }
}

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'`;
	if ($?) {
	    warn "$0: `p4 -p $p4port print '$addfile'` failed, status[$?]\n";
	    next;
	}
	$type =~ m|^//.*\((.+)\)$| or next;
	$type = $1;
	unless ($type =~ /text/) {
	    $ret .= "\n==== $addfile ($type) ====\n\n";
	    next;
	}
	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 ($type) ====\n\n";
	my $lines = "," . @new;
	$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;
}
OpenPOWER on IntegriCloud