freebsd-nq/contrib/perl5/Porting/p4desc

119 lines
2.6 KiB
Plaintext
Raw Normal View History

2000-06-25 11:04:01 +00:00
#!/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);
BEGIN {
$0 =~ s|^.*/||;
$p4port = $ENV{P4PORT} || 'localhost:1666';
for (@ARGV) {
if ($p4port =~ /^\s+$/) {
$p4port = $_;
}
elsif (/^-p(.*)$/) {
$p4port = $1 || ' ';
}
elsif (/^-v$/) {
$v++;
}
elsif (/^-h/) {
$h++;
}
else {
push @files, $_;
}
}
unless (@files) { @files = '-'; undef $^I; }
@ARGV = @files;
if ($h) {
print STDERR <<USAGE;
Usage: $0 [-p \$P4PORT] [-v] [-h] [files]
-p host:port p4 port (e.g. myhost:1666)
-h print this help
-v output progress messages
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.
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{^\.\.\. (//depot/.+?#\d+) (add|branch)$}) {
my $newfile = $1;
push @addfiles, $newfile;
warn "$newfile add, revision != 1!\n" unless $newfile =~ /#1$/;
}
warn "file [$file] line [$cur] file# [$fnum]\n" if $v;
}
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();
}
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;
}