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

Diff for /cvsweb/cvsweb.cgi between version 4.18 and 4.24

version 4.18, 2019/11/11 14:37:54 version 4.24, 2019/11/26 11:28:43
Line 62  use vars qw (
Line 62  use vars qw (
   %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
   $prcgi @prcategories $re_prcategories $prkeyword $re_prkeyword $mancgi    $mancgi $doCheckout $scriptname $scriptwhere
   $doCheckout $scriptname $scriptwhere  
   $where $Browser $nofilelinks $maycompress @stickyvars    $where $Browser $nofilelinks $maycompress @stickyvars
   $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
Line 78  use vars qw (
Line 77  use vars qw (
   $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
   $tabstop $state $annTable $sel @ForbiddenFiles    $tabstop $state $annTable $sel @ForbiddenFiles
   $use_descriptions %descriptions @mytz $dwhere    $use_descriptions %descriptions $dwhere
   $use_moddate $gzip_open $file_list_len    $use_moddate $gzip_open $file_list_len
   $allow_tar @tar_options @gzip_options @zip_options @cvs_options    $allow_tar @tar_options @gzip_options @zip_options @cvs_options
   @annotate_options @rcsdiff_options    @annotate_options @rcsdiff_options
   $HTML_DOCTYPE $HTML_META $cssurl $CSS $cvshistory_url    $HTML_DOCTYPE $HTML_META $cssurl $CSS
   $allow_enscript @enscript_options %enscript_types  
 );  );
   
 require Compress::Zlib;  require Compress::Zlib;
Line 146  sub spacedHtmlText($;$);
Line 144  sub spacedHtmlText($;$);
 sub link($$);  sub link($$);
 sub revcmp($$);  sub revcmp($$);
 sub fatal($$@);  sub fatal($$@);
 sub config_error($$);  
 sub redirect($;$);  sub redirect($;$);
 sub safeglob($);  sub safeglob($);
 sub search_path($);  sub search_path($);
 sub getEnscriptHL($);  
 sub getMimeType($;$);  sub getMimeType($;$);
 sub head($;$);  sub head($;$);
 sub scan_directives(@);  sub scan_directives(@);
 sub openOutputFilter();  sub openOutputFilter();
 sub doAnnotate($$);  sub doAnnotate($$);
 sub doCheckout($$$);  sub doCheckout($$$);
 sub doEnscript($$$;$);  
 sub cvswebMarkup($$$$$$;$);  sub cvswebMarkup($$$$$$;$);
 sub viewable($);  sub viewable($);
 sub doDiff($$$$$$);  sub doDiff($$$$$$);
Line 178  sub download_url($$;$);
Line 173  sub download_url($$;$);
 sub download_link($$$;$);  sub download_link($$$;$);
 sub display_url($$;$);  sub display_url($$;$);
 sub display_link($$;$$);  sub display_link($$;$$);
 sub history_link($$;$);  
 sub toggleQuery($;$);  sub toggleQuery($;$);
 sub htmlquote($);  sub htmlquote($);
 sub htmlunquote($);  sub htmlunquote($);
Line 211  $cvstreedefault = $logo = $defaulttitle =
Line 205  $cvstreedefault = $logo = $defaulttitle =
   $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 =
   $cvshistory_url = $allow_tar = undef;    $allow_tar = undef;
   
 $allow_version_select = $allow_mailtos = $allow_log_extra = 1;  $allow_version_select = $allow_mailtos = $allow_log_extra = 1;
   
Line 267  $scriptname    = '' unless defined($scriptname);
Line 261  $scriptname    = '' unless defined($scriptname);
 $where         =  $pathinfo;  $where         =  $pathinfo;
 $doCheckout    =  $where =~ s|^/$CheckoutMagic/|/|o;  $doCheckout    =  $where =~ s|^/$CheckoutMagic/|/|o;
 $where         =~ s|^/||;  $where         =~ s|^/||;
 $scriptname    =~ s|^/*|/|;  $scriptname    =~ s|^/+||;
   
 # Let's workaround thttpd's stupidity..  # Let's workaround thttpd's stupidity..
 if ($scriptname =~ m|/$|) {  if ($scriptname =~ m|/$|) {
Line 275  if ($scriptname =~ m|/$|) {
Line 269  if ($scriptname =~ m|/$|) {
   my $re = quotemeta $pathinfo;    my $re = quotemeta $pathinfo;
   $scriptname =~ s/$re$//;    $scriptname =~ s/$re$//;
 }  }
   $scriptname = "/$scriptname" if $scriptname;
   
 # $scriptname : the URI escaped path to this script  # $scriptname : the URI escaped path to this script
 # $where      : the path in the CVS repository (without leading /, or only /)  # $where      : the path in the CVS repository (without leading /, or only /)
Line 319  $maycompress = (
Line 314  $maycompress = (
   qw(cvsroot hideattic ignorecase sortby logsort f only_with_tag ln    qw(cvsroot hideattic ignorecase sortby logsort f only_with_tag ln
      hidecvsroot hidenonreadable);       hidecvsroot hidenonreadable);
   
 #  
 # Load configuration.  # Load configuration.
 #  {
 if (-f $config) {    $config =~ m|^/| or fatal '500 Internal Error',
   do "$config" or config_error($config, $@);      'Configuration file name "<code>%s</code>" is not an absolute path.',
 } else {      $config;
   fatal("500 Internal Error",    defined do $config and last;
         'Configuration not found.  Set the parameter <code>$config</code> in cvsweb.cgi to your <b>cvsweb.conf</b> configuration file first.');    $@ and fatal '500 Internal Error',
       'Error loading configuration file "<code>%s</code>": <pre>%s</pre>',
       $config, $@;
     fatal '500 Internal Error',
       'Cannot read configuration file "<code>%s</code>": %s',
       $config, $! || 'unknown error';
 }  }
   
 # Try to find a readable dir where we can cd into.  Some abs_path()  # Try to find a readable dir where we can cd into.  Some abs_path()
Line 534  foreach (@stickyvars) {
Line 533  foreach (@stickyvars) {
   }    }
 }  }
   
 if ($allow_enscript) {  
   push(@DIFFTYPES, qw(uc cc));  
   @DIFFTYPES{qw(uc cc)} = (  
     {  
      'descr'   => 'unified, colored',  
      'opts'    => ['-u'],  
      'colored' => 0,  
     },  
     {  
      'descr'   => 'context, colored',  
      'opts'    => ['-c'],  
      'colored' => 0,  
     },  
   );  
 } else {  
   # No Enscript -> respect difftype, but don't offer colorization.  
   if ($input{f} && $input{f} =~ /^([ucs])c$/) {  
     $input{f} = $1;  
   }  
 }  
   
 # is there any query ?  # is there any query ?
 if (@barequery) {  if (@barequery) {
   $barequery = join (';', @barequery);    $barequery = join (';', @barequery);
Line 627  if (-f $config_cvstree) {
Line 605  if (-f $config_cvstree) {
 }  }
 undef $config_cvstree;  undef $config_cvstree;
   
 $re_prcategories  = '(?:' . join ('|', @prcategories) . ')' if @prcategories;  
 $re_prkeyword     = quotemeta($prkeyword) if defined($prkeyword);  
 $prcgi           .= '%s' if defined($prcgi) && $prcgi !~ /%s/;  
   
 $fullname         = catfile($cvsroot, $where);  $fullname         = catfile($cvsroot, $where);
   
 my $rewrite = 0;  my $rewrite = 0;
Line 841  if (-d $fullname) {
Line 815  if (-d $fullname) {
   
   } else {    } else {
     print '<p>Current directory: <b>', clickablePath($where, 0), '</b>';      print '<p>Current directory: <b>', clickablePath($where, 0), '</b>';
     if ($cvshistory_url) {  
       (my $d = $where) =~ s|^/*(.*?)/*$|$1|;  
       print ' - ', history_link($d, '');  
     }  
     print "</p>\n";      print "</p>\n";
     print "<p>Current tag: <b>", htmlquote($input{only_with_tag}), "</b></p>\n"      print "<p>Current tag: <b>", htmlquote($input{only_with_tag}), "</b></p>\n"
       if $input{only_with_tag};        if $input{only_with_tag};
Line 1478  sub htmlify($;$)
Line 1448  sub htmlify($;$)
   }    }
   
   if ($extra) {    if ($extra) {
   
     # get PR #'s as link: "PR#nnnn" "PR: nnnn, ..." "PR nnnn, ..." "bin/nnnn"  
     if (defined($prcgi) && defined($re_prkeyword)) {  
       my $prev;  
   
       do {  
         $prev = $_;  
         $_ = htmlify_sub {  
           s{  
             (\b$re_prkeyword[:\#]?\s*  
              (?:  
               \#?  
               \d+[,\s]\s*  
              )*  
              \#?)  
             (\d+)\b  
            }{  
              $1 . &link($2, sprintf($prcgi, $2))  
            }egix;  
         } $_;  
       } while ($_ ne $prev);  
   
       if (defined($re_prcategories)) {  
         $_ = htmlify_sub {  
           s{  
             (\b$re_prcategories/(\d+)\b)  
            }{  
              &link($1, sprintf($prcgi, $2))  
            }egox;  
         } $_;  
       }  
     }  
   
     # get manpage specs as link: "foo.1" "foo(1)"      # get manpage specs as link: "foo.1" "foo(1)"
     if (defined($mancgi)) {      if (defined($mancgi)) {
       $_ = htmlify_sub {        $_ = htmlify_sub {
Line 1607  sub fatal($$@)
Line 1544  sub fatal($$@)
   
   
 #  #
 # Signal a (fatal) configuration error.  
 #  
 sub config_error($$)  
 {  
   fatal('500 Internal Error',  
         'Error loading configuration file "<code>%s</code>":<br /><br />' .  
         '%s<br />', @_);  
 }  
   
   
 #  
 # Sends a redirect to the given URL.  # Sends a redirect to the given URL.
 #  #
 sub redirect($;$)  sub redirect($;$)
Line 1688  sub search_path($)
Line 1614  sub search_path($)
   
   
 #  #
 # Gets the enscript(1) highlight mode corresponding to the given filename,  
 # or undef if unsupported.  
 #  
 sub getEnscriptHL($)  
 {  
   return undef unless $allow_enscript;  
   my ($filename) = @_;  
   while (my ($hl, $regex) = each %enscript_types) {  
     return $hl if ($filename =~ $regex);  
   }  
   return undef;  
 }  
   
   
 #  
 # Gets the MIME type for the given file name.  # Gets the MIME type for the given file name.
 #  #
 sub getMimeType($;$)  sub getMimeType($;$)
Line 2130  EOF
Line 2041  EOF
     printf '<embed src="%s" width="100%%" height="100%%" /><br />',      printf '<embed src="%s" width="100%%" height="100%%" /><br />',
       $url . $barequery;        $url . $barequery;
   } else {    } else {
   
     print "<pre>\n";      print "<pre>\n";
     my $linenumbers = $input{ln} || 0;      my $linenumbers = $input{ln} || 0;
   
     if (my $enscript_hl = getEnscriptHL($filename)) {  
       doEnscript($filehandle, $enscript_hl, $linenumbers);  
   
     } else {  
       my $ln  = 0;        my $ln  = 0;
       my @buf = ();        my @buf = ();
       my $ts  = undef;        my $ts  = undef;
Line 2157  EOF
Line 2062  EOF
         }          }
         print $preformat_in_markup ? spacedHtmlText($_, $ts) : htmlquote($_);          print $preformat_in_markup ? spacedHtmlText($_, $ts) : htmlquote($_);
       }        }
     }  
   
     print "</pre>\n";      print "</pre>\n";
   }    }
   html_footer();    html_footer();
Line 2301  sub doDiff($$$$$$)
Line 2204  sub doDiff($$$$$$)
     html_footer();      html_footer();
     gzipclose();      gzipclose();
     exit;      exit;
   
   } elsif ($f =~ /^([ucs])c$/) {  
     #  
     # Enscript colored diff.  
     #  
     my $hl = 'diff';  
     $hl .= $1 if ($1 eq 'u' || $1 eq 's');  
     (my $where_nd = $where)       =~ s/\.diff$//;  
     (my $pathname = $where_nd)    =~ s|((?<=/)Attic/)?[^/]*$||;  
     (my $filename = $where_nd)    =~ s|^.*/||;  
     (my $swhere   = $scriptwhere) =~ s|\.diff$||;  
     navigateHeader($swhere, $pathname, $filename, $rev2, 'diff');  
     printf(<<EOF, $where_nd, $rev1, $rev2);  
 <h3 style="text-align: center">Diff for /%s between versions %s and %s</h3>  
 <pre>  
 EOF  
     doEnscript(\$fh, $hl, 0, 'cvsweb_diff');  
     print <<EOF;  
 </pre>  
 <hr style="width: 100%" />  
 <form method="get" action="$scriptwhere">  
 EOF  
     printDiffSelectStickyVars();  
     print 'Diff format: ';  
     printDiffSelect();  
     print "<input type=\"submit\" value=\"Show\" />\n</form>\n";  
     html_footer();  
     gzipclose();  
     exit;  
   
   } else {    } else {
     #      #
     # Plain diff.      # Plain diff.
Line 2902  sub printLog($$$;$$)
Line 2775  sub printLog($$$;$$)
   print "<br />\n";    print "<br />\n";
   
   print '<i>';    print '<i>';
   if (@mytz) {    print scalar gmtime($date{$_}), ' UTC</i> (';
     my ($est) = $mytz[(localtime($date{$_}))[8]];  
     print scalar localtime($date{$_}), " $est</i> (";  
   } else {  
     print scalar gmtime($date{$_}), " UTC</i> (";  
   }  
   print readableTime(time() - $date{$_}, 1), ' ago)';    print readableTime(time() - $date{$_}, 1), ' ago)';
   print ' by <i>', htmlquote($author{$_}), "</i><br />\n";    print ' by <i>', htmlquote($author{$_}), "</i><br />\n";
   
Line 3054  sub doLog($)
Line 2922  sub doLog($)
     &clickablePath($upwhere, 1), "</b>\n</p>\n";      &clickablePath($upwhere, 1), "</b>\n</p>\n";
   print "<p>\n ";    print "<p>\n ";
   print &link('Request diff between arbitrary revisions', '#diff');    print &link('Request diff between arbitrary revisions', '#diff');
   if ($cvshistory_url) {  
     (my $d = $upwhere) =~ s|/+$||;  
     print ' - ', history_link($d, $filename);  
   }  
   print "\n</p>\n<hr />\n";    print "\n</p>\n<hr />\n";
   
   print "<p>\n";    print "<p>\n";
Line 3453  EOF
Line 3317  EOF
 }  }
   
   
 sub doEnscript($$$;$)  
 {  
   my ($filehandle, $highlight, $linenumbers, $lang) = @_;  
   $lang ||= 'cvsweb';  
   
   my @cmd = ($CMD{enscript},  
              @enscript_options,  
              '-q', "--language=$lang", '-o', '-', "--highlight=$highlight");  
   
   local *ENSCRIPT_OUT;  
   my ($h, $err) =  
     startproc(\@cmd, $filehandle, '>pipe', \*ENSCRIPT_OUT);  
   fatal('500 Internal Error', $err) unless $h;  
   
   # We could short-circuit and have enscript output directly to STDOUT above,  
   # but that doesn't work with mod_perl (at least some 1.99 versions).  
   if ($linenumbers) {  
     my $ln = 0;  
     while (<ENSCRIPT_OUT>) {  
       printf '<a id="l%d" class="src">%5d: </a>', (++$ln) x 2;  
       print $_;  
     }  
   } else {  
     local $/ = undef;  
     print <ENSCRIPT_OUT>;  
   }  
   $h->finish();  
 }  
   
   
 #  #
 # The passed in $path and $filename should not be URI escaped, and $swhere  # The passed in $path and $filename should not be URI escaped, and $swhere
 # *should* be.  # *should* be.
Line 3818  sub display_link($$;$$)
Line 3652  sub display_link($$;$$)
   return sprintf('<a href="%s" class="display-link">%s</a>',    return sprintf('<a href="%s" class="display-link">%s</a>',
                  display_url($url, $revision, $mtype) . $barequery,                   display_url($url, $revision, $mtype) . $barequery,
                  htmlquote($textlink));                   htmlquote($textlink));
 }  
   
 #  
 # Returns a link to CVSHistory for the given directory and filename.  
 #  
 sub history_link($$;$)  
 {  
   my ($dir, $file, $text) = @_;  
   $dir  ||= '';  
   $file ||= '';  
   $text ||= 'History';  
   return &link($text,  
                sprintf('%s?cvsroot=%s;dsearch=%s;fsearch=%s;limit=1',  
                        $cvshistory_url, uri_escape($input{cvsroot} || ''),  
                        uri_escape($dir), uri_escape($file)));  
 }  }
   
 # Returns a Query string with the  # Returns a Query string with the

Legend:
Removed from v.4.18  
changed lines
  Added in v.4.24

CVSweb