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

Diff for /cvsweb/cvsweb.cgi between version 1.1.1.9 and 3.23

version 1.1.1.9, 2000/09/30 20:17:23 version 3.23, 2000/09/19 19:57:58
Line 42 
Line 42 
 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF  # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 # SUCH DAMAGE.  # SUCH DAMAGE.
 #  #
 # $zId: cvsweb.cgi,v 1.103 2000/09/20 17:02:29 jumager Exp $  # $zId: cvsweb.cgi,v 1.101 2000/09/13 22:44:05 jumager Exp $
 # $kId: cvsweb.cgi,v 1.30 2000/09/30 20:10:01 knu Exp $  # $Id$
 #  #
 ###  ###
   
Line 64  use vars qw (
Line 64  use vars qw (
     $bylog $byfile $hr_default $logsort $cvstree $cvsroot      $bylog $byfile $hr_default $logsort $cvstree $cvsroot
     $mimetype $defaultTextPlain $defaultViewable $allow_compress      $mimetype $defaultTextPlain $defaultViewable $allow_compress
     $GZIPBIN $backicon $diricon $fileicon $fullname $newname      $GZIPBIN $backicon $diricon $fileicon $fullname $newname
     $cvstreedefault $body_tag $body_tag_for_src      $cvstreedefault $body_tag $logo $defaulttitle $address
     $logo $defaulttitle $address      $backcolor $long_intro $short_instruction $shortLogLen
     $long_intro $short_instruction $shortLogLen  
     $show_author $dirtable $tablepadding $columnHeaderColorDefault      $show_author $dirtable $tablepadding $columnHeaderColorDefault
     $columnHeaderColorSorted $hr_breakable $showfunc $hr_ignwhite      $columnHeaderColorSorted $hr_breakable $showfunc $hr_ignwhite
     $hr_ignkeysubst $diffcolorHeading $diffcolorEmpty $diffcolorRemove      $hr_ignkeysubst $diffcolorHeading $diffcolorEmpty $diffcolorRemove
Line 91  sub fatal($$);
Line 90  sub fatal($$);
 sub redirect($);  sub redirect($);
 sub safeglob($);  sub safeglob($);
 sub getMimeTypeFromSuffix($);  sub getMimeTypeFromSuffix($);
 sub head($;$);  
 sub scan_directives(@);  
 sub doAnnotate($$);  sub doAnnotate($$);
 sub doCheckout($$);  sub doCheckout($$);
 sub cvswebMarkup($$$);  sub cvswebMarkup($$$);
Line 125  sub forbidden_module($);
Line 122  sub forbidden_module($);
 use Cwd;  use Cwd;
   
 # == EDIT this ==  # == EDIT this ==
 # Locations to search for user configuration, in order:  # User configuration is stored in
 for (  $config = undef;
      $ENV{CVSWEB_CONFIG},  
   for ($ENV{CVSWEB_CONFIG},
   #     '/home/knu/etc/cvsweb.conf',
      '/usr/local/etc/cvsweb.conf',       '/usr/local/etc/cvsweb.conf',
      getcwd() . '/cvsweb.conf'       getcwd . '/cvsweb.conf') {
     ) {    $config = $_ if defined($_) && -r $_;
     $config = $_ if defined($_) && -r $_;  
 }  }
   
 # == Configuration defaults ==  # == Configuration defaults ==
Line 145  $allow_version_select = 1;
Line 143  $allow_version_select = 1;
 # These are defined to allow checking with perl -cw  # These are defined to allow checking with perl -cw
 %CVSROOT = %MIRRORS = %DEFAULTVALUE = %ICONS = %MTYPES =  %CVSROOT = %MIRRORS = %DEFAULTVALUE = %ICONS = %MTYPES =
 %tags = %alltags = @tabcolors = ();  %tags = %alltags = @tabcolors = ();
 $cvstreedefault = $body_tag = $body_tag_for_src =  $cvstreedefault = $body_tag = $logo = $defaulttitle = $address =
 $logo = $defaulttitle = $address =  $backcolor = $long_intro = $short_instruction = $shortLogLen =
 $long_intro = $short_instruction = $shortLogLen =  
 $show_author = $dirtable = $tablepadding = $columnHeaderColorDefault =  $show_author = $dirtable = $tablepadding = $columnHeaderColorDefault =
 $columnHeaderColorSorted = $hr_breakable = $showfunc = $hr_ignwhite =  $columnHeaderColorSorted = $hr_breakable = $showfunc = $hr_ignwhite =
 $hr_ignkeysubst = $diffcolorHeading = $diffcolorEmpty = $diffcolorRemove =  $hr_ignkeysubst = $diffcolorHeading = $diffcolorEmpty = $diffcolorRemove =
Line 157  $allow_markup = $use_java_script = $open_extern_window
Line 154  $allow_markup = $use_java_script = $open_extern_window
 $extern_window_width = $extern_window_height = $edit_option_form =  $extern_window_width = $extern_window_height = $edit_option_form =
 $checkout_magic = $show_subdir_lastmod = $show_log_in_markup = $v =  $checkout_magic = $show_subdir_lastmod = $show_log_in_markup = $v =
 $navigationHeaderColor = $tableBorderColor = $markupLogColor =  $navigationHeaderColor = $tableBorderColor = $markupLogColor =
 $tabstop = $use_moddate = $moddate = $gzip_open = undef;  $tabstop = $use_moddate = $moddate = undef;
   
 ##### End of configuration variables #####  ##### End of configuration variables #####
   
Line 210  $nofilelinks = $is_textbased;
Line 207  $nofilelinks = $is_textbased;
 # display garbage then :-/  # display garbage then :-/
 # Turn off gzip if running under mod_perl and no zlib is available,  # Turn off gzip if running under mod_perl and no zlib is available,
 # piping does not work as expected inside the server.  # piping does not work as expected inside the server.
 $maycompress = (((defined($ENV{HTTP_ACCEPT_ENCODING})  $maycompress = (($ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip`
                  && $ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip`)  
                  || $is_mozilla3)                   || $is_mozilla3)
                 && !$is_msie                  && !$is_msie
                 && !($is_mod_perl && !$has_zlib));                  && !($is_mod_perl && !$has_zlib));
Line 223  $maycompress = (((defined($ENV{HTTP_ACCEPT_ENCODING})
Line 219  $maycompress = (((defined($ENV{HTTP_ACCEPT_ENCODING})
 @stickyvars = qw(cvsroot hideattic sortby logsort f only_with_tag);  @stickyvars = qw(cvsroot hideattic sortby logsort f only_with_tag);
   
 if (-f $config) {  if (-f $config) {
    do $config      do $config;
      || &fatal("500 Internal Error",  }
                sprintf('Error in loading configuration file: %s<BR><BR>%s<BR>',  else {
                        $config, &htmlify($@)));  
 } else {  
    &fatal("500 Internal Error",     &fatal("500 Internal Error",
           'Configuration not found.  Set the variable <code>$config</code> '            'Configuration not found.  Set the variable <code>$config</code> '
           . 'in cvsweb.cgi, or the environment variable '            . 'in cvsweb.cgi, or the environment variable '
Line 356  foreach my $k (keys %ICONS) {
Line 350  foreach my $k (keys %ICONS) {
     }      }
 }  }
   
 my $config_cvstree = "$config-$cvstree";  
   
 # Do some special configuration for cvstrees  # Do some special configuration for cvstrees
 if (-f $config_cvstree) {  do "$config-$cvstree" if (-f "$config-$cvstree");
    do $config_cvstree  
      || &fatal("500 Internal Error",  
                sprintf('Error in loading configuration file: %s<BR><BR>%s<BR>',  
                        $config_cvstree, &htmlify($@)));  
 }  
   
 $prcategories = '(?:' . join('|', @prcategories) . ')';  $prcategories = '(?:' . join('|', @prcategories) . ')';
 $prcgi .= '%s' if defined($prcgi) && $prcgi !~ /%s/;  $prcgi .= '%s' if defined($prcgi) && $prcgi !~ /%s/;
Line 793  elsif (-d $fullname) {
Line 780  elsif (-d $fullname) {
     elsif (-f $fullname . ',v') {      elsif (-f $fullname . ',v') {
         if (defined($input{'rev'}) || $doCheckout) {          if (defined($input{'rev'}) || $doCheckout) {
             &doCheckout($fullname, $input{'rev'});              &doCheckout($fullname, $input{'rev'});
             gzipclose();              close(GZIP) if ($gzip_open);
             exit;              exit;
         }          }
         if (defined($input{'annotate'}) && $allow_annotate) {          if (defined($input{'annotate'}) && $allow_annotate) {
             &doAnnotate($input{'annotate'});              &doAnnotate($input{'annotate'});
             gzipclose();              close(GZIP) if ($gzip_open);
             exit;              exit;
         }          }
         if (defined($input{'r1'}) && defined($input{'r2'})) {          if (defined($input{'r1'}) && defined($input{'r2'})) {
             &doDiff($fullname, $input{'r1'}, $input{'tr1'},              &doDiff($fullname, $input{'r1'}, $input{'tr1'},
                     $input{'r2'}, $input{'tr2'}, $input{'f'});                      $input{'r2'}, $input{'tr2'}, $input{'f'});
             gzipclose();              close(GZIP) if ($gzip_open);
             exit;              exit;
         }          }
         print("going to dolog($fullname)\n") if ($verbose);          print("going to dolog($fullname)\n") if ($verbose);
Line 827  elsif (-d $fullname) {
Line 814  elsif (-d $fullname) {
         # e.g. foo.c          # e.g. foo.c
         &doDiff($fullname, $input{'r1'}, $input{'tr1'},          &doDiff($fullname, $input{'r1'}, $input{'tr1'},
                 $input{'r2'}, $input{'tr2'}, $input{'f'});                  $input{'r2'}, $input{'tr2'}, $input{'f'});
         gzipclose();          close(GZIP) if ($gzip_open);
         exit;          exit;
     }      }
     elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| &&      elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| &&
Line 862  elsif (-d $fullname) {
Line 849  elsif (-d $fullname) {
         &fatal("404 Not Found","$where: no such file or directory");          &fatal("404 Not Found","$where: no such file or directory");
     }      }
   
 gzipclose();  close(GZIP) if ($gzip_open);
 ## End MAIN  ## End MAIN
   
 sub printDiffSelect($) {  sub printDiffSelect($) {
Line 1088  sub getMimeTypeFromSuffix($) {
Line 1075  sub getMimeTypeFromSuffix($) {
 }  }
   
 ###############################  ###############################
 # read first lines like head(1)  
 ###############################  
 sub head($;$) {  
     my $fh = $_[0];  
     my $linecount = $_[1] || 10;  
   
     my @buf;  
   
     if ($linecount > 0) {  
         my $i;  
         for ($i = 0; !eof($fh) && $i < $linecount; $i++) {  
             push @buf, scalar <$fh>;  
         }  
     } else {  
         @buf = <$fh>;  
     }  
   
     @buf;  
 }  
   
 ###############################  
 # scan vim and Emacs directives  
 ###############################  
 sub scan_directives(@) {  
     my $ts = undef;  
   
     for (@_) {  
         $ts = $1 if /\b(?:ts|tabstop|tab-width)[:=]\s*([1-9]\d*)\b/;  
     }  
   
     ('tabstop' => $ts);  
 }  
   
 ###############################  
 # show Annotation  # show Annotation
 ###############################  ###############################
 sub doAnnotate($$) {  sub doAnnotate($$) {
Line 1141  sub doAnnotate($$) {
Line 1094  sub doAnnotate($$) {
     ($pathname = $where) =~ s/(Attic\/)?[^\/]*$//;      ($pathname = $where) =~ s/(Attic\/)?[^\/]*$//;
     ($filename = $where) =~ s/^.*\///;      ($filename = $where) =~ s/^.*\///;
   
       http_header();
   
       navigateHeader($scriptwhere,$pathname,$filename,$rev, "annotate");
       print "<h3 align=center>Annotation of $pathname$filename, Revision $rev</h3>\n";
   
     # this seems to be necessary      # this seems to be necessary
     $| = 1; $| = 0; # Flush      $| = 1; $| = 0; # Flush
   
Line 1150  sub doAnnotate($$) {
Line 1108  sub doAnnotate($$) {
     # the public domain.      # the public domain.
     # we could abandon the use of rlog, rcsdiff and co using      # we could abandon the use of rlog, rcsdiff and co using
     # the cvsserver in a similiar way one day (..after rewrite)      # the cvsserver in a similiar way one day (..after rewrite)
     $pid = open2($reader, $writer, "cvs -Rl server") || fatal ("500 Internal Error",      $pid = open2($reader, $writer, "cvs server") || fatal ("500 Internal Error",
                                                                "Fatal Error - unable to open cvs for annotation");                                                                 "Fatal Error - unable to open cvs for annotation");
   
     # OK, first send the request to the server.  A simplified example is:      # OK, first send the request to the server.  A simplified example is:
Line 1202  sub doAnnotate($$) {
Line 1160  sub doAnnotate($$) {
     # were nicer about buffering, then we could just leave it open, I think.      # were nicer about buffering, then we could just leave it open, I think.
     close ($writer) || die "cannot close: $!";      close ($writer) || die "cannot close: $!";
   
     http_header();  
   
     navigateHeader($scriptwhere,$pathname,$filename,$rev, "annotate");  
     print "<h3 align=center>Annotation of $pathname$filename, Revision $rev</h3>\n";  
   
     # Ready to get the responses from the server.      # Ready to get the responses from the server.
     # For example:      # For example:
     #     E Annotations for foo/xx      #     E Annotations for foo/xx
Line 1222  sub doAnnotate($$) {
Line 1175  sub doAnnotate($$) {
     else {      else {
         print "<pre>";          print "<pre>";
     }      }
       while (<$reader>) {
     # prefetch several lines  
     my @buf = head($reader);  
   
     my %d = scan_directives(@buf);  
   
     while (@buf || !eof($reader)) {  
         $_ = @buf ? shift @buf : <$reader>;  
   
         my @words = split;          my @words = split;
         # Adding one is for the (single) space which follows $words[0].          # Adding one is for the (single) space which follows $words[0].
         my $rest = substr ($_, length ($words[0]) + 1);          my $rest = substr ($_, length ($words[0]) + 1);
Line 1239  sub doAnnotate($$) {
Line 1184  sub doAnnotate($$) {
         }          }
         elsif ($words[0] eq "M") {          elsif ($words[0] eq "M") {
             $lineNr++;              $lineNr++;
             (my $lrev = substr($_, 2, 13)) =~ y/ //d;              my $lrev = substr ($_, 2, 13);
             (my $lusr = substr($_, 16,  9)) =~ y/ //d;              my $lusr = substr ($_, 16,  9);
             my $line = substr($_, 36);              my $line = substr ($_, 36);
             my $isCurrentRev = ($rev eq $lrev);  
             # we should parse the date here ..              # we should parse the date here ..
             if ($lrev eq $oldLrev) {              if ($lrev eq $oldLrev) {
                 $revprint = sprintf('%-8s', '');                  $revprint = "             ";
             }              }
             else {              else {
                 $revprint = sprintf('%-8s', $lrev);                  $revprint = $lrev; $oldLusr = "";
                 $revprint =~ s`\S+`<a href="${scriptwhere}${barequery}#rev$1">$&</A>`;  # `                  $revprint =~ s`^(\S+)`<a href="${scriptwhere}${barequery}#rev$1">$1</A>`;       # `
                 $oldLusr = '';  
             }              }
             if ($lusr eq $oldLusr) {              if ($lusr eq $oldLusr) {
                 $usrprint = '';                  $usrprint = "         ";
             }              }
             else {              else {
                 $usrprint = $lusr;                  $usrprint = $lusr;
             }              }
             $oldLrev = $lrev;              $oldLrev = $lrev;
             $oldLusr = $lusr;              $oldLusr = $lusr;
               # is there a less timeconsuming way to strip spaces ?
               ($lrev = $lrev) =~ s/\s+//g;
               my $isCurrentRev = ($rev eq $lrev);
   
             # Set bold for text-based browsers only - graphical              print "<b>" if ($isCurrentRev);
             # browsers show bold fonts a bit wider than regular fonts,              printf ("%8s%s%8s %4d:", $revprint, ($isCurrentRev ? "|" : " "), $usrprint, $lineNr);
             # so it looks irregular.              print spacedHtmlText($line);
             print "<b>" if ($isCurrentRev && $is_textbased);              print "</b>" if ($isCurrentRev);
   
             printf ("%s%s %-8s %4d:",  
                     $revprint,  
                     $isCurrentRev ? '!' : ' ',  
                     $usrprint,  
                     $lineNr);  
             print spacedHtmlText($line, $d{'tabstop'});  
   
             print "</b>" if ($isCurrentRev && $is_textbased);  
         }          }
         elsif ($words[0] eq "ok") {          elsif ($words[0] eq "ok") {
             # We could complain about any text received after this, like the              # We could complain about any text received after this, like the
Line 1415  sub cvswebMarkup($$$) {
Line 1352  sub cvswebMarkup($$$) {
             $input{only_with_tag};              $input{only_with_tag};
     }      }
     print "</td></tr></table>";      print "</td></tr></table>";
       my @content = <$filehandle>;
     my $url = download_url($fileurl, $revision, $mimetype);      my $url = download_url($fileurl, $revision, $mimetype);
     print "<HR noshade>";      print "<HR noshade>";
     if ($mimetype =~ /^image/) {      if ($mimetype =~ /^image/) {
Line 1425  sub cvswebMarkup($$$) {
Line 1363  sub cvswebMarkup($$$) {
     }      }
     else {      else {
         print "<PRE>";          print "<PRE>";
           foreach (@content) {
         # prefetch several lines              print spacedHtmlText($_);
         my @buf = head($filehandle);  
   
         my %d = scan_directives(@buf);  
   
         while (@buf || !eof($filehandle)) {  
             $_ = @buf ? shift @buf : <$filehandle>;  
   
             print spacedHtmlText($_, $d{'tabstop'});  
         }          }
         print "</PRE>";          print "</PRE>";
     }      }
Line 1541  sub doDiff($$$$$$) {
Line 1471  sub doDiff($$$$$$) {
         if ($human_readable) {          if ($human_readable) {
             http_header();              http_header();
             &human_readable_diff($fh, $rev2);              &human_readable_diff($fh, $rev2);
             gzipclose();              close(GZIP) if ($gzip_open);
             exit;              exit;
         }          }
         else {          else {
Line 2324  sub flush_diff_rows($$$$) {
Line 2254  sub flush_diff_rows($$$$) {
 # human_readable_diff(String revision_to_return_to);  # human_readable_diff(String revision_to_return_to);
 ##  ##
 sub human_readable_diff($){  sub human_readable_diff($){
   my ($difftxt, $where_nd, $filename, $pathname, $scriptwhere_nd);    my ($i,$difftxt, $where_nd, $filename, $pathname, $scriptwhere_nd);
   my ($fh, $rev) = @_;    my ($fh, $rev) = @_;
   my ($date1, $date2, $r1d, $r2d, $r1r, $r2r, $rev1, $rev2, $sym1, $sym2);    my ($date1, $date2, $r1d, $r2d, $r1r, $r2r, $rev1, $rev2, $sym1, $sym2);
   my (@rightCol, @leftCol);    my (@rightCol, @leftCol);
Line 2378  sub human_readable_diff($){
Line 2308  sub human_readable_diff($){
   # cascading style sheets because we've to set the    # cascading style sheets because we've to set the
   # font and color for each row. anyone ...?    # font and color for each row. anyone ...?
   ####    ####
     while (<$fh>) {
         $difftxt = $_;
   
   # prefetch several lines  
   my @buf = head($fh);  
   
   my %d = scan_directives(@buf);  
   
   while (@buf || !eof($fh)) {  
       $difftxt = @buf ? shift @buf : <$fh>;  
   
       if ($difftxt =~ /^@@/) {        if ($difftxt =~ /^@@/) {
           ($oldline,$newline,$funname) = $difftxt =~ /@@ \-([0-9]+).*\+([0-9]+).*@@(.*)/;            ($oldline,$newline,$funname) = $difftxt =~ /@@ \-([0-9]+).*\+([0-9]+).*@@(.*)/;
           print  "<tr bgcolor=\"$diffcolorHeading\"><td width=\"50%\">";            print  "<tr bgcolor=\"$diffcolorHeading\"><td width=\"50%\">";
Line 2402  sub human_readable_diff($){
Line 2326  sub human_readable_diff($){
       }        }
       else {        else {
           ($diffcode,$rest) = $difftxt =~ /^([-+ ])(.*)/;            ($diffcode,$rest) = $difftxt =~ /^([-+ ])(.*)/;
           $_ = spacedHtmlText($rest, $d{'tabstop'});            $_ = spacedHtmlText ($rest);
   
           # Add fontface, size            # Add fontface, size
           $_ = "$fs&nbsp;$_$fe";            $_ = "$fs&nbsp;$_$fe";
Line 2486  sub navigateHeader($$$$$) {
Line 2410  sub navigateHeader($$$$$) {
     $swhere = urlencode($filename) if ($swhere eq "");      $swhere = urlencode($filename) if ($swhere eq "");
     print "<\!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">";      print "<\!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">";
     print "<HTML>\n<HEAD>\n";      print "<HTML>\n<HEAD>\n";
     print '<!-- CVSweb $zRevision: 1.103 $  $lRevision: 1.30 $ -->';      print '<!-- CVSweb $zRevision: 1.101 $  $Revision$ -->';
     print "\n<TITLE>$path$filename - $title - $rev</TITLE></HEAD>\n";      print "\n<TITLE>$path$filename - $title - $rev</TITLE></HEAD>\n";
     print  "$body_tag_for_src\n";      print  "<BODY BGCOLOR=\"$backcolor\">\n";
     print "<table width=\"100%\" border=0 cellspacing=0 cellpadding=1 bgcolor=\"$navigationHeaderColor\">";      print "<table width=\"100%\" border=0 cellspacing=0 cellpadding=1 bgcolor=\"$navigationHeaderColor\">";
     print "<tr valign=bottom><td>";      print "<tr valign=bottom><td>";
     print  "<a href=\"$swhere$query#rev$rev\">$backicon";      print  "<a href=\"$swhere$query#rev$rev\">$backicon";
Line 2841  sub http_header(;$) {
Line 2765  sub http_header(;$) {
   
 sub html_header($) {  sub html_header($) {
     my ($title) = @_;      my ($title) = @_;
     my $version = '$zRevision: 1.103 $  $kRevision: 1.30 $'; #'      my $version = '$zRevision: 1.101 $  $Revision$'; #'
     http_header();      http_header();
     print <<EOH;      print <<EOH;
 <!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"  <!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN"
Line 2886  sub forbidden_module($) {
Line 2810  sub forbidden_module($) {
     }      }
   
     return 0;      return 0;
 }  
   
 # Close the GZIP handle remove the tie.  
   
 sub gzipclose {  
         if ($gzip_open) {  
             select(STDOUT);  
             close(GZIP);  
             untie *GZIP;  
             $gzip_open = 0;  
         }  
 }  }
   
 # implement a gzipped file handle via the Compress:Zlib compression  # implement a gzipped file handle via the Compress:Zlib compression

Legend:
Removed from v.1.1.1.9  
changed lines
  Added in v.3.23

CVSweb