#!/usr/bin/perl -w # -*- Mode: perl; indent-tabs-mode: nil -*- # # The contents of this file are subject to the Netscape Public # License Version 1.1 (the "License"); you may not use this file # except in compliance with the License. You may obtain a copy of # the License at http://www.mozilla.org/NPL/ # # Software distributed under the License is distributed on an "AS # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or # implied. See the License for the specific language governing # rights and limitations under the License. # # The Original Code is the Bonsai CVS tool. # # The Initial Developer of the Original Code is Netscape Communications # Corporation. Portions created by Netscape are # Copyright (C) 1998 Netscape Communications Corporation. All # Rights Reserved. # # Contributor(s): # # Multi file diff cgi # use strict; use CGI::Carp qw(fatalsToBrowser); require 'globals.pl'; $|=1; my %form; &validateReferer('cvsquery.cgi','showcheckins.cgi'); print "Content-type: text/html; charset=UTF-8
";
my @revs = ();
#if( $ENV{"QUERY_STRING"} eq "" ){
# $ENV{"QUERY_STRING"}="brendan%2Cns%2Fjs%2Fsrc%2Cjsapi.c%2C-1=on&brendan%2Cns%2Fjs%2Fsrc%2Cjsapi.h%2C-1=on&brendan%2Cns%2Fjs%2Fsrc%2Cjsarray.c%2C-106=on&brendan%2Cns%2Fjs%2Fsrc%2Cjsarray.h%2C-0=on&brendan%2Cns%2Fjs%2Fsrc%2Cjsatom.c%2C-9=on";
#}
&split_cgi_args;
#while( ($k,$v) = each(%ENV) ){
# print "$k='$v'\n";
#}
my $cvsroot;
if( $form{"cvsroot"} ){
$cvsroot = $form{"cvsroot"};
}
else {
$cvsroot = pickDefaultRepository();
}
&validateRepository($cvsroot);
if( $form{"allchanges"} ){
@revs = split(/,/, $form{"allchanges"} );
}
else {
while( my ($k, $v) = each( %form ) ){
push( @revs, $k );
}
}
my $didone = 0;
my $rcsdiffcommand = Param('rcsdiffcommand');
for my $k (@revs) {
my ($who,$dir,$file,$rev) = split(/\|/, $k );
if ($rev eq "") {
next;
}
$rev = &SanitizeRevision($rev);
my $prevrev = &PrevRev($rev);
my $fullname = "$cvsroot/$dir/$file,v";
$fullname = "$cvsroot/$dir/Attic/$file,v" if (! -r $fullname);
if (! -e $fullname || ! -r $fullname || IsHidden($fullname)) {
next;
}
&ChrootFilename($cvsroot, $fullname);
open(DIFF, "-|", "$rcsdiffcommand -r$prevrev -r$rev -u " . shell_escape($fullname) . " 2>&1") || die "rcsdiff failed\n";
while(){
if (($_ =~ /RCS file/) || ($_ =~ /rcsdiff/)) {
$_ =~ s/(^.*)(.*\/)(.*)/$1 $3/;
print "$who: $_";
} else {
$_ =~ s/&/&/g;
$_ =~ s/</g;
$_ =~ s/>/>/g;
print "$who: $_";
}
}
$didone = 1;
}
if ($didone == 0) {
print "No changes were selected. Please press Back and try again.\n";
}
sub split_cgi_args {
my ($i,$var,$value, $s);
if( $ENV{"REQUEST_METHOD"} eq 'POST'){
while(<> ){
$s .= $_;
}
}
else {
$s = $ENV{"QUERY_STRING"};
}
my @args= split(/\&/, $s );
for my $i (@args) {
my ($var, $value) = split(/=/, $i);
$var =~ tr/+/ /;
$var =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$var} = $value;
}
}
sub PrevRev {
my( $rev ) = @_;
my( $i, $j, $ret, @r );
@r = split( /\./, $rev );
$i = @r-1;
$r[$i]--;
if( $r[$i] == 0 ){
$i -= 2;
}
$j = 0;
while( $j < $i ){
$ret .= "$r[$j]\.";
$j++
}
$ret .= $r[$i];
}