$files2[0]\#$revs2[0]" ;
}
}
else {
$title = "Diffs for change $change" ;
}
print
"",
&P4CGI::start_page($title,"") ;
# Constants for the file diff display
my $MAXCONTEXT = 30;
my $NCONTEXT = 10;
while(@files>0) {
my $f1start= "" ;
my $f1end="" ;
my $f2start = "" ;
my $f2end = "" ;
my $file = shift @files ;
my $file2 = shift @files2 ;
my $rev = shift @revs ;
my $rev2 = shift @revs2 ;
my $mode = shift @modes ;
if($file eq $file2) {
if($rev < $rev2) {
my $r = $rev2 ;
$rev2 = $rev ;
$rev = $r ;
}
}
else {
$f2start = "" ;
$f2end = "" ;
}
print
&P4CGI::start_table("width=100% align=center bgcolor=white"),
&P4CGI::table_row({-align=>"center",
-text =>"$f1start$file\#$rev$f1end
$f2start$file2\#$rev2$f2end"}),
&P4CGI::end_table(),
"" ;
local *P4 ;
my $f1 = "$file#$rev";
my $f2 = "$file2#$rev2";
my $nchunk = 0;
my @start ;
my @dels ;
my @adds ;
my @lines ;
if ($mode ne 'add' && $mode ne 'delete' && $mode ne 'branch') {
&P4CGI::p4call(*P4, "diff2 $f2 $f1");
$_ = ;
while () {
my ( $dels, $adds );
/(\d+),?(\d*)([acd])(\d+),?(\d*)/;
my ( $la, $lb, $op, $ra, $rb ) = ($1,$2,$3,$4,$5) ;
next unless $ra;
if( !$lb ) { $lb = $op ne 'a' ? $la : $la - 1; }
if( !$rb ) { $rb = $op ne 'd' ? $ra : $ra - 1; }
$start[ $nchunk ] = $op ne 'd' ? $ra : $ra + 1;
$dels[ $nchunk ] = $dels = $lb - $la + 1;
$adds[ $nchunk ] = $adds = $rb - $ra + 1;
$lines[ $nchunk ] = "";
# deletes
while( $dels-- ) {
$_ = ;
s/^. //;
$_ = &P4CGI::fixSpecChar($_) ;
$lines[ $nchunk ] .= $_;
}
# separator
if ($op eq 'c') {
$_ = ;
}
# adds
while( $adds-- ) {
$_ = ;
}
$nchunk++;
}
close P4;
}
# Now walk through the diff chunks, reading the current rev and
# displaying it as necessary.
my $curlin = 1;
&P4CGI::p4call(*P4, "print -q $f1");
my $n ;
for( $n = 0; $n < $nchunk; $n++ )
{
# print up to this chunk.
&catchup( *P4, $start[ $n ] - $curlin );
# display deleted lines -- we saved these from the diff
if( $dels[ $n ] )
{
print "$f2start";
print $lines[ $n ];
print "$f2end";
}
# display added lines -- these are in the file stream.
if( $adds[ $n ] )
{
print "$f1start";
&display( *P4, $adds[ $n ] );
print "$f1end";
}
$curlin = $start[ $n ] + $adds[ $n ];
}
&catchup( *P4, 999999999 );
close P4;
print "
" ;
}
print &P4CGI::end_page() ;
# Support for processing diff chunks.
#
# skip: skip lines in source file
# display: display lines in source file, handling funny chars
# catchup: display & skip as necessary
#
sub skip {
my ( $handle, $to ) = @_;
while( $to > 0 && ( $_ = <$handle> ) ) {
$to--;
}
return $to;
}
sub display {
my ( $handle, $to ) = @_;
while( $to-- > 0 && ( $_ = <$handle> ) ) {
$_ = &P4CGI::fixSpecChar($_) ;
print $_;
}
}
sub catchup {
my ( $handle, $to ) = @_;
if( $to > $MAXCONTEXT )
{
my $skipped = $to - $NCONTEXT * 2;
&display( $handle, $NCONTEXT );
$skipped -= &skip( $handle, $skipped );
print
"
",
"$skipped lines skipped",
"
\n" if( $skipped );
&display( $handle, $NCONTEXT );
}
else
{
&display;
}
}
#
# That's it folks
#