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

Diff for /cvsweb/cvsweb.cgi between version 4.35 and 4.38

version 4.35, 2019/11/29 18:15:48 version 4.38, 2019/11/29 19:30:16
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 66  use vars qw (
Line 66  use vars qw (
   $is_links $is_lynx $is_w3m $is_msie $is_mozilla3 $is_textbased    $is_links $is_lynx $is_w3m $is_msie $is_mozilla3 $is_textbased
   %input $query $barequery $sortby $bydate $byrev $byauthor    %input $query $barequery $sortby $bydate $byrev $byauthor
   $bylog $byfile $defaultDiffType $logsort $cvstree $cvsroot    $bylog $byfile $defaultDiffType $logsort $cvstree $cvsroot
   $charset $output_filter %CMD $allow_compress $backicon $diricon $fileicon    %CMD $allow_compress $backicon $diricon $fileicon
   $fullname $logo $defaulttitle $address $binfileicon $iconsdir    $fullname $logo $defaulttitle $address $binfileicon $iconsdir
   $shortLogLen $show_author $hr_breakable $hr_ignwhite $hr_ignkeysubst    $shortLogLen $show_author $hr_breakable $hr_ignwhite $hr_ignkeysubst
   $inputTextSize $mime_types $allow_annotate $allow_markup $allow_mailtos    $mime_types $allow_annotate $allow_markup $allow_mailtos
   $allow_log_extra $allow_dir_extra $allow_source_extra    $allow_log_extra $allow_dir_extra $allow_source_extra
   $edit_option_form    $edit_option_form
   $show_subdir_lastmod $show_log_in_markup $preformat_in_markup    $show_subdir_lastmod $show_log_in_markup $preformat_in_markup
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 149  sub search_path($);
Line 149  sub search_path($);
 sub getMimeType($;$);  sub getMimeType($;$);
 sub head($;$);  sub head($;$);
 sub scan_directives(@);  sub scan_directives(@);
 sub openOutputFilter();  
 sub doAnnotate($$);  sub doAnnotate($$);
 sub doCheckout($$$);  sub doCheckout($$$);
 sub cvswebMarkup($$$$$$;$);  sub cvswebMarkup($$$$$$;$);
Line 182  sub link_tags($);
Line 181  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 196  $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 =
   $hr_breakable = $hr_ignwhite =    $hr_breakable = $hr_ignwhite =
   $hr_ignkeysubst = $inputTextSize = $mime_types = $allow_annotate =    $hr_ignkeysubst = $mime_types = $allow_annotate =
   $allow_markup = $allow_compress = $edit_option_form =    $allow_markup = $allow_compress = $edit_option_form =
   $show_subdir_lastmod = $show_log_in_markup = $preformat_in_markup =    $show_subdir_lastmod = $show_log_in_markup = $preformat_in_markup =
   $tabstop = $use_moddate = $gzip_open = $DEBUG =    $tabstop = $use_moddate = $gzip_open = $DEBUG =
Line 1631  sub scan_directives(@)
Line 1629  sub scan_directives(@)
 }  }
   
   
 sub openOutputFilter()  
 {  
   return unless $output_filter;  
   
   open(STDOUT, "|-") and return;  
   
   # child of child  
   open(STDERR, '>', devnull()) unless $DEBUG;  
   exec($output_filter) or exit -1;  
 }  
   
   
 ###############################  ###############################
 # show Annotation  # show Annotation
 ###############################  ###############################
Line 2062  sub doDiff($$$$$$)
Line 2048  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 2136  sub doDiff($$$$$$)
Line 2068  sub doDiff($$$$$$)
   my $fh = do { local (*FH); };    my $fh = do { local (*FH); };
   if (!open($fh, "-|")) {    # child    if (!open($fh, "-|")) {    # child
     open(STDERR, ">&STDOUT");    # Redirect stderr to stdout      open(STDERR, ">&STDOUT");    # Redirect stderr to stdout
     openOutputFilter();  
     exec($CMD{rcsdiff}, @rcsdiff_options, @difftype, "-r$rev1", "-r$rev2",      exec($CMD{rcsdiff}, @rcsdiff_options, @difftype, "-r$rev1", "-r$rev2",
          $fullname) or exit -1;           $fullname) or exit -1;
   }    }
Line 2243  sub getDirLogs($$@)
Line 2174  sub getDirLogs($$@)
   my $fh = do { local (*FH); };    my $fh = do { local (*FH); };
   if (!open($fh, '-|')) {                       # Child    if (!open($fh, '-|')) {                       # Child
     open(STDERR, '>', devnull()) unless $DEBUG; # Ignore rlog's complaints.      open(STDERR, '>', devnull()) unless $DEBUG; # Ignore rlog's complaints.
     openOutputFilter();  
     if ($file_list_len && $file_list_len > 1) {      if ($file_list_len && $file_list_len > 1) {
       while (scalar(@files) > $file_list_len) {  # Process files in chunks.        while (scalar(@files) > $file_list_len) {  # Process files in chunks.
         system(@cmd, splice(@files, 0, $file_list_len)) == 0 or exit -1;          system(@cmd, splice(@files, 0, $file_list_len)) == 0 or exit -1;
Line 2421  sub readLog($;$)
Line 2351  sub readLog($;$)
   
   my $fh = do { local (*FH); };    my $fh = do { local (*FH); };
   if (!open($fh, "-|")) {    # child    if (!open($fh, "-|")) {    # child
     openOutputFilter();  
     $revision = defined($revision) ? "-r$revision" : '';      $revision = defined($revision) ? "-r$revision" : '';
     if ($revision =~ /\./) {      if ($revision =~ /\./) {
       # Normal revision, not a branch/tag name.        # Normal revision, not a branch/tag name.
Line 2647  sub getDiffLinks($$$)
Line 2576  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 2929  EOF
Line 2851  EOF
   my $diffrev = defined($input{r1}) ?    my $diffrev = defined($input{r1}) ?
     $input{r1} : $revdisplayorder[$#revdisplayorder];      $input{r1} : $revdisplayorder[$#revdisplayorder];
   
   printf(<<EOF, $inputTextSize, $diffrev);    printf(<<EOF, $diffrev);
 <input type="text" size="%s" name="tr1" value="%s" onchange="this.form.r1.selectedIndex=0" />  <input type="text" size="12" name="tr1" value="%s" onchange="this.form.r1.selectedIndex=0" />
 </td>  </td>
 <td></td>  <td></td>
 </tr>  </tr>
Line 2946  EOF
Line 2868  EOF
   
   $diffrev = defined($input{r2}) ? $input{r2} : $revdisplayorder[0];    $diffrev = defined($input{r2}) ? $input{r2} : $revdisplayorder[0];
   
   printf(<<EOF, $inputTextSize, $diffrev, $scriptwhere);    printf(<<EOF, $diffrev, $scriptwhere);
 <input type="text" size="%s" name="tr2" value="%s" onchange="this.form.r2.selectedIndex=0" />  <input type="text" size="12" name="tr2" value="%s" onchange="this.form.r2.selectedIndex=0" />
 </td>  </td>
 <td><input type="submit" value="Get Diffs" accesskey="G" /></td>  <td><input type="submit" value="Get Diffs" accesskey="G" /></td>
 </tr>  </tr>
Line 3641  sub http_header(;$$)
Line 3563  sub http_header(;$$)
 {  {
   my ($content_type, $moddate) = @_;    my ($content_type, $moddate) = @_;
   $content_type ||= 'text/html';    $content_type ||= 'text/html';
     $content_type .= '; charset="UTF-8"' if $content_type =~ /^text\//;
   
   $content_type .= "; charset=$charset"  
     if ($charset && $content_type =~ m,^text/,);  
   
   # Note that in the following, we explicitly join() and concatenate the    # Note that in the following, we explicitly join() and concatenate the
   # headers instead of printing them as an array.  This is because some    # headers instead of printing them as an array.  This is because some
   # systems, eg. early versions of mod_perl 2 don't quite get it if the    # systems, eg. early versions of mod_perl 2 don't quite get it if the
Line 3770  sub runproc(@)
Line 3690  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.35  
changed lines
  Added in v.4.38

CVSweb