diff options
author | Gurusamy Sarathy <gsar@cpan.org> | 1998-07-14 06:32:58 +0000 |
---|---|---|
committer | Gurusamy Sarathy <gsar@cpan.org> | 1998-07-14 06:32:58 +0000 |
commit | 384f7be5bc08c545c16bd631c7ca9f54fc7d23dc (patch) | |
tree | 1218bf8325312f790744520d596578844300790a /Porting | |
parent | d3ebb66bfe2af46e05e5492400a346b2358cbbb2 (diff) | |
download | perl-384f7be5bc08c545c16bd631c7ca9f54fc7d23dc.tar.gz |
add Porting/p4d2p
p4raw-id: //depot/perl@1485
Diffstat (limited to 'Porting')
-rwxr-xr-x | Porting/p4d2p | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/Porting/p4d2p b/Porting/p4d2p new file mode 100755 index 0000000000..67780a9393 --- /dev/null +++ b/Porting/p4d2p @@ -0,0 +1,84 @@ +#!/l/local/bin/perl -wspi.bak + +# +# reads a perforce style diff on stdin and outputs appropriate headers +# so the diff can be applied with the patch program +# +# Gurusamy Sarathy <gsar@umich.edu> +# + +BEGIN { + $0 =~ s|.*/||; + if ($h or $help) { + print STDERR <<USAGE; +Usage: $0 [-v] [-h] files + + -h print this help + -v output progress messages + +Does inplace edit of diff files output by the perforce commands +"p4 describe", "p4 diff", and "p4 diff2". The result is suitable +for feeding to the "patch" program. + +If no files are specified, reads from stdin and writes to stdout. + +WARNING: It only handles context or unified diffs. + +Example: p4 describe -du 123 | $0 > change-123.patch + +USAGE + exit(0); + } + unless (@ARGV) { @ARGV = '-'; undef $^I; } + use vars qw($thisfile $time $file $fnum $v $h $help); + $thisfile = ""; + $time = localtime(time); +} + +my ($cur, $match); +$cur = m<^==== //depot/(.+?)\#\d+.* ====$> ... m<^(\@\@.+\@\@|\*+)$>; + +$match = $1; + +if ($ARGV ne $thisfile) { + warn "processing patchfile [$ARGV]\n" unless $ARGV eq '-'; + $thisfile = $ARGV; +} + +# while we are within range +if ($cur) { + # set the file name after first line + if ($cur == 1) { + $file = $match; + $fnum++; + } + # emit the diff header when we hit last line + elsif ($cur =~ /E0$/) { + my $f = $file; + + # special hack for perl so we can always use "patch -p1" + $f =~ s<^.*?(perl.*?/)><$1>; + + # unified diff + if ($match =~ /^\@/) { + warn "emitting udiff header\n" if $v; + $_ = "Index: $f\n--- $f.~1~\t$time\n+++ $f\t$time\n$_"; + } + # context diff + elsif ($match =~ /^\*/) { + warn "emitting cdiff header\n" if $v; + $_ = "Index: $f\n*** $f.~1~\t$time\n--- $f\t$time\n$_"; + } + } + # see if we hit another patch (i.e. previous patch was empty) + elsif (m<^==== //depot/(.+?)\#\d+.* ====$>) { + $file = $match = $1; + } + # suppress all other lines in the header + else { + $_ = ""; + } + warn "file [$file] line [$cur] file# [$fnum]\n" if $v; +} + +$_ .= "End of Patch.\n" if eof; |