[BACK]Return to cvsweb.cgi CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / cvsweb

Diff for /cvsweb/cvsweb.cgi between version 4.36 and 4.37

version 4.36, 2019/11/29 18:33:24 version 4.37, 2019/11/29 18:50:15
Line 57  use vars qw (
Line 57  use vars qw (
   $VERSION $CheckoutMagic $MimeTypes $DEBUG    $VERSION $CheckoutMagic $MimeTypes $DEBUG
   $config $allow_version_select    $config $allow_version_select
   @CVSrepositories @CVSROOT %CVSROOT %CVSROOTdescr %DEFAULTVALUE %MTYPES    @CVSrepositories @CVSROOT %CVSROOT %CVSROOTdescr %DEFAULTVALUE %MTYPES
   %DIFF_COMMANDS @DIFFTYPES %DIFFTYPES @LOGSORTKEYS %LOGSORTKEYS    @DIFFTYPES %DIFFTYPES @LOGSORTKEYS %LOGSORTKEYS
   %alltags %fileinfo %tags @branchnames %nameprinted    %alltags %fileinfo %tags @branchnames %nameprinted
   %symrev %revsym @allrevisions %date %author @revdisplayorder    %symrev %revsym @allrevisions %date %author @revdisplayorder
   @revisions %state %difflines %log %branchpoint @revorder $keywordsubstitution    @revisions %state %difflines %log %branchpoint @revorder $keywordsubstitution
Line 86  use Cwd                   qw(abs_path);
Line 86  use Cwd                   qw(abs_path);
 use File::Path            qw(rmtree);  use File::Path            qw(rmtree);
 use File::Spec::Functions qw(canonpath catdir catfile curdir devnull rootdir  use File::Spec::Functions qw(canonpath catdir catfile curdir devnull rootdir
                              tmpdir updir);                               tmpdir updir);
 use File::Temp            qw(tempdir tempfile);  use File::Temp            qw(tempdir);
 use IPC::Run              qw();  use IPC::Run              qw();
 use Time::Local           qw(timegm);  use Time::Local           qw(timegm);
 use URI::Escape           qw(uri_escape uri_unescape);  use URI::Escape           qw(uri_escape uri_unescape);
Line 182  sub link_tags($);
Line 182  sub link_tags($);
 sub forbidden($);  sub forbidden($);
 sub startproc(@);  sub startproc(@);
 sub runproc(@);  sub runproc(@);
 sub checkout_to_temp($$$);  
   
 # Get rid of unsafe environment vars.  Don't do this in the BEGIN block  # Get rid of unsafe environment vars.  Don't do this in the BEGIN block
 # (think mod_perl)...  # (think mod_perl)...
Line 198  $config = '/conf/cvsweb/cvsweb.conf';
Line 197  $config = '/conf/cvsweb/cvsweb.conf';
 ######## Configuration parameters #########  ######## Configuration parameters #########
   
 @CVSrepositories = @CVSROOT = %CVSROOT = %DEFAULTVALUE =  @CVSrepositories = @CVSROOT = %CVSROOT = %DEFAULTVALUE =
   %MTYPES = %tags = %alltags = %fileinfo = %DIFF_COMMANDS = ();    %MTYPES = %tags = %alltags = %fileinfo = ();
   
 $logo = $defaulttitle =  $logo = $defaulttitle =
   $address = $shortLogLen = $show_author =    $address = $shortLogLen = $show_author =
Line 2062  sub doDiff($$$$$$)
Line 2061  sub doDiff($$$$$$)
   
   my $mimetype = getMimeType($fullname);    my $mimetype = getMimeType($fullname);
   
   #  
   #  Check for per-MIME type diff commands.  
   #  
   my $diffcmd = undef;  
   if (my $diffcmds = $DIFF_COMMANDS{lc($mimetype)}) {  
     if ($f =~ /^ext(\d*)$/) {  
       my $n = $1 || 0;  
       $diffcmd = $diffcmds->[$n];  
     }  
   }  
   if ($diffcmd && $diffcmd->{cmd} && $diffcmd->{name}) {  
   
     if ($diffcmd->{args} && ref($diffcmd->{args}) ne 'ARRAY') {  
       fatal('500 Internal Error',  
             'Configuration error: arguments to external diff tools must ' .  
             'be given as array refs.  See "<code>%s</code>" in ' .  
             '<code>%%DIFF_COMMANDS</code>.',  
             $diffcmd->{name});  
     }  
   
     (my $cvsname = $where) =~ s/\.diff$//;  
   
     # Create two temporary files with the two revisions  
     my $temp_fn1 = checkout_to_temp($cvsroot, $cvsname, $rev1);  
     my $temp_fn2 = checkout_to_temp($cvsroot, $cvsname, $rev2);  
   
     # Execute chosen diff binary.  
     local (*DIFF_OUT);  
     my @cmd = ($diffcmd->{cmd});  
     push(@cmd, @{$diffcmd->{args}}) if $diffcmd->{args};  
     push(@cmd, $temp_fn1, $temp_fn2);  
     my ($h, $err) = startproc(\@cmd, \"", '>pipe', \*DIFF_OUT);  
     if (!$h) {  
       unlink($temp_fn1);  
       unlink($temp_fn2);  
       fatal('500 Internal Error',  
             'Diff failure (exit status %s), output: <pre>%s</pre>',  
             $? >> 8 || -1, $err);  
     }  
   
     http_header($diffcmd->{type} || 'text/plain');  
     local $/ = undef;  
     print <DIFF_OUT>;  
     $h->finish();  
     unlink($temp_fn1);  
     unlink($temp_fn2);  
   
     exit;  
   }  
   
   #  
   # Normal CVS diff.  
   #  
   
   $f = $DEFAULTVALUE{f} || 'u' if ($f =~ /^ext\d*$/);    $f = $DEFAULTVALUE{f} || 'u' if ($f =~ /^ext\d*$/);
   my $difftype = $DIFFTYPES{$f};    my $difftype = $DIFFTYPES{$f};
   if (!$difftype) {    if (!$difftype) {
Line 2647  sub getDiffLinks($$$)
Line 2592  sub getDiffLinks($$$)
            &link(htmlquote(lc($DIFFTYPES{$difftype}{descr})), "$url;f=$f"));             &link(htmlquote(lc($DIFFTYPES{$difftype}{descr})), "$url;f=$f"));
     }      }
   }    }
   if (my $extdiffs = $DIFF_COMMANDS{lc($mimetype)}) {  
     for my $i (0 .. scalar(@$extdiffs)-1) {  
       my $extdiff = $extdiffs->[$i];  
       push(@links, &link(htmlquote($extdiff->{name}), "$url;f=ext$i"))  
         if ($extdiff->{cmd} && $extdiff->{name});  
     }  
   }  
   return @links;    return @links;
 }  }
   
Line 3770  sub runproc(@)
Line 3708  sub runproc(@)
     $errormsg = "'@{$_[0]}' failed: $@";      $errormsg = "'@{$_[0]}' failed: $@";
   }    }
   return ($exitcode, $errormsg);    return ($exitcode, $errormsg);
 }  
   
 #  
 # Check out a file to a temporary file.  
 #  
 sub checkout_to_temp($$$)  
 {  
   my ($cvsroot, $cvsname, $rev) = @_;  
   
   # Pipe given cvs file into a temporary place.  
   my ($temp_fh, $temp_fn) = tempfile('.cvsweb.XXXXXXXX', DIR => tmpdir());  
   
   my @cmd = ($CMD{cvs}, @cvs_options, '-Qd', $cvsroot,  
              'co', '-p', "-r$rev", $cvsname);  
   
   local (*DIFF_OUT);  
   my ($h, $err) = startproc(\@cmd, \"", '>pipe', \*DIFF_OUT);  
   if ($h) {  
     local $/ = undef;  
     print $temp_fh <DIFF_OUT>;  
     $h->finish();  
     close($temp_fh);  
   } else {  
     close($temp_fh);  
     unlink($temp_fn);  
     fatal('500 Internal Error',  
           'Checkout failure (exit status %s), output: <pre>%s</pre>',  
           $? >> 8 || -1, $err);  
   }  
   
   return $temp_fn;  
 }  }
   
 #  #

Legend:
Removed from v.4.36  
changed lines
  Added in v.4.37

CVSweb