[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.7 and 3.12

version 1.1.1.7, 2000/09/23 20:23:34 version 3.12, 2000/08/15 06:54:01
Line 9 
Line 9 
 #             Ken Coar         <coar@Apache.Org>  #             Ken Coar         <coar@Apache.Org>
 #             Dick Balaska     <dick@buckosoft.com>  #             Dick Balaska     <dick@buckosoft.com>
 #             Akinori MUSHA    <knu@FreeBSD.org>  #             Akinori MUSHA    <knu@FreeBSD.org>
 #             Jens-Uwe Mager   <jum@helios.de>  
 #  #
 # Based on:  # Based on:
 # * Bill Fenners cvsweb.cgi revision 1.28 available from:  # * Bill Fenners cvsweb.cgi revision 1.28 available from:
Line 42 
Line 41 
 # 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.93 2000/07/27 17:42:28 hzeller Exp $
 # $kId: cvsweb.cgi,v 1.26 2000/09/22 11:13:17 knu Exp $  # $Id$
 #  #
 ###  ###
   
Line 54  use vars qw (
Line 53  use vars qw (
     %CVSROOT %CVSROOTdescr %MIRRORS %DEFAULTVALUE %ICONS %MTYPES      %CVSROOT %CVSROOTdescr %MIRRORS %DEFAULTVALUE %ICONS %MTYPES
     %alltags @tabcolors %fileinfo %tags @branchnames %nameprinted      %alltags @tabcolors %fileinfo %tags @branchnames %nameprinted
     %symrev %revsym @allrevisions %date %author @revdisplayorder      %symrev %revsym @allrevisions %date %author @revdisplayorder
     @revisions %state %difflines %log %branchpoint @revorder      @revisions %state %difflines %log %branchpoint @revorder $prcgi
     $prcgi @prcategories $prcategories $mancgi      @prcategories $prcategories
     $checkoutMagic $doCheckout $scriptname $scriptwhere      $checkoutMagic $doCheckout $scriptname $scriptwhere
     $where $pathinfo $Browser $nofilelinks $maycompress @stickyvars      $where $pathinfo $Browser $nofilelinks $maycompress @stickyvars
     %funcline_regexp $is_mod_perl      %funcline_regexp $is_mod_perl
Line 64  use vars qw (
Line 63  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 78  use vars qw (
Line 76  use vars qw (
     $navigationHeaderColor $tableBorderColor $markupLogColor      $navigationHeaderColor $tableBorderColor $markupLogColor
     $tabstop $state $annTable $sel $curbranch @HideModules      $tabstop $state $annTable $sel $curbranch @HideModules
     $module $use_descriptions %descriptions @mytz $dwhere $moddate      $module $use_descriptions %descriptions @mytz $dwhere $moddate
     $use_moddate $has_zlib $gzip_open      $use_moddate
 );  );
   
 sub printDiffSelect($);  sub printDiffSelect($);
 sub findLastModifiedSubdirs(@);  sub findLastModifiedSubdirs(@);
 sub htmlify($;$);  sub htmlify($;$);
 sub spacedHtmlText($;$);  sub spacedHtmlText($);
 sub link($$);  sub link($$);
 sub revcmp($$);  sub revcmp($$);
 sub fatal($$);  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 128  use Cwd;
Line 124  use Cwd;
 # User configuration is stored in  # User configuration is stored in
 $config = undef;  $config = undef;
   
 for ($ENV{CVSWEB_CONFIG},  for ($ENV{CVSWEB_CONFIG}, '/usr/local/etc/cvsweb.conf', getcwd . '/cvsweb.conf') {
 #     '/home/knu/etc/cvsweb.conf',  
      '/usr/local/etc/cvsweb.conf',  
      getcwd . '/cvsweb.conf') {  
   $config = $_ if defined($_) && -r $_;    $config = $_ if defined($_) && -r $_;
 }  }
   
Line 146  $allow_version_select = 1;
Line 139  $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 158  $allow_markup = $use_java_script = $open_extern_window
Line 150  $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 #####
   
 use Time::Local;  use Time::Local;
 use IPC::Open2;  use IPC::Open2;
   
 # Check if the zlib C library interface is installed, and if yes  
 # we can avoid using the extra gzip process.  
 eval {  
         require Compress::Zlib;  
 };  
 $has_zlib = !$@;  
   
 $verbose = $v;  $verbose = $v;
 $checkoutMagic = "~checkout~";  $checkoutMagic = "~checkout~";
 $pathinfo = defined($ENV{PATH_INFO}) ? $ENV{PATH_INFO} : '';  $pathinfo = defined($ENV{PATH_INFO}) ? $ENV{PATH_INFO} : '';
Line 209  $nofilelinks = $is_textbased;
Line 194  $nofilelinks = $is_textbased;
 #  braindamaged MS-Internet Exploders claim that they  #  braindamaged MS-Internet Exploders claim that they
 # accept gzip .. but don't in fact and  # accept gzip .. but don't in fact and
 # 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. piping does
 # piping does not work as expected inside the server.  # not work as expected inside the server. One can probably
 $maycompress = (((defined($ENV{HTTP_ACCEPT_ENCODING})  # achieve the same result using Apache::GZIPFilter.
                  && $ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip`)  $maycompress = (($ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip`
                  || $is_mozilla3)                   || $is_mozilla3)
                 && !$is_msie                  && !$is_msie
                 && !($is_mod_perl && !$has_zlib));                  && !$is_mod_perl);
   
 # put here the variables we need in order  # put here the variables we need in order
 # to hold our state - they will be added (with  # to hold our state - they will be added (with
Line 359  foreach my $k (keys %ICONS) {
Line 344  foreach my $k (keys %ICONS) {
 do "$config-$cvstree" if (-f "$config-$cvstree");  do "$config-$cvstree" if (-f "$config-$cvstree");
   
 $prcategories = '(?:' . join('|', @prcategories) . ')';  $prcategories = '(?:' . join('|', @prcategories) . ')';
 $prcgi .= '%s' if defined($prcgi) && $prcgi !~ /%s/;  
   
 $fullname = $cvsroot . '/' . $where;  $fullname = $cvsroot . '/' . $where;
 $mimetype = &getMimeTypeFromSuffix ($fullname);  $mimetype = &getMimeTypeFromSuffix ($fullname);
Line 371  $defaultViewable = $allow_markup && viewable($mimetype
Line 355  $defaultViewable = $allow_markup && viewable($mimetype
 # ge get an Internal Server Error if we try to pipe the  # ge get an Internal Server Error if we try to pipe the
 # output through the nonexistent gzip ..  # output through the nonexistent gzip ..
 # any more elegant ways to prevent this are welcome!  # any more elegant ways to prevent this are welcome!
 if ($allow_compress && $maycompress && !$has_zlib) {  if ($allow_compress && $maycompress) {
     foreach (split(/:/, $ENV{PATH})) {      foreach (split(/:/, $ENV{PATH})) {
         if (-x "$_/gzip") {          if (-x "$_/gzip") {
             $GZIPBIN = "$_/gzip";              $GZIPBIN = "$_/gzip";
Line 722  elsif (-d $fullname) {
Line 706  elsif (-d $fullname) {
             foreach my $var (@stickyvars) {              foreach my $var (@stickyvars) {
                 print "<INPUT TYPE=HIDDEN NAME=\"$var\" VALUE=\"$input{$var}\">\n"                  print "<INPUT TYPE=HIDDEN NAME=\"$var\" VALUE=\"$input{$var}\">\n"
                     if (defined($input{$var})                      if (defined($input{$var})
                         && (!defined($DEFAULTVALUE{$var})                          && $input{$var} ne $DEFAULTVALUE{$var}
                             || $input{$var} ne $DEFAULTVALUE{$var})  
                         && $input{$var} ne ""                          && $input{$var} ne ""
                         && $var ne "only_with_tag");                          && $var ne "only_with_tag");
             }              }
Line 734  elsif (-d $fullname) {
Line 717  elsif (-d $fullname) {
             print "<OPTION VALUE=\"\">All tags / default branch\n";              print "<OPTION VALUE=\"\">All tags / default branch\n";
             foreach my $tag (reverse sort { lc $a cmp lc $b } keys %tags) {              foreach my $tag (reverse sort { lc $a cmp lc $b } keys %tags) {
                 print "<OPTION",defined($input{only_with_tag}) &&                  print "<OPTION",defined($input{only_with_tag}) &&
                        $input{only_with_tag} eq $tag ? " SELECTED" : "",                         $input{only_with_tag} eq $tag ? " SELECTED":"",
                        ">$tag\n";                         ">$tag\n";
             }              }
             print "</SELECT>\n";              print "</SELECT>\n";
Line 770  elsif (-d $fullname) {
Line 753  elsif (-d $fullname) {
             printDiffSelect(0);              printDiffSelect(0);
             print "</td>";              print "</td>";
             print "<td>Show Attic files: ";              print "<td>Show Attic files: ";
             print "<INPUT NAME=hideattic TYPE=CHECKBOX", $input{'hideattic'} ? " CHECKED" : "",              print "<INPUT NAME=hideattic TYPE=CHECKBOX", $input{'hideattic'}?" CHECKED":"",
             "></td></tr>\n";              "></td></tr>\n";
             print "<tr><td align=center colspan=2><input type=submit value=\"Change Options\">";              print "<tr><td align=center colspan=2><input type=submit value=\"Change Options\">";
             print "</td></tr></table></center></FORM>\n";              print "</td></tr></table></center></FORM>\n";
Line 785  elsif (-d $fullname) {
Line 768  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();  
             exit;              exit;
         }          }
         if (defined($input{'annotate'}) && $allow_annotate) {          if (defined($input{'annotate'}) && $allow_annotate) {
             &doAnnotate($input{'annotate'});              &doAnnotate($input{'annotate'});
             gzipclose();  
             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();  
             exit;              exit;
         }          }
         print("going to dolog($fullname)\n") if ($verbose);          print("going to dolog($fullname)\n") if ($verbose);
Line 819  elsif (-d $fullname) {
Line 799  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();  
         exit;          exit;
     }      }
     elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| &&      elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| &&
Line 853  elsif (-d $fullname) {
Line 832  elsif (-d $fullname) {
         }          }
         &fatal("404 Not Found","$where: no such file or directory");          &fatal("404 Not Found","$where: no such file or directory");
     }      }
   
 gzipclose();  
 ## End MAIN  ## End MAIN
   
 sub printDiffSelect($) {  sub printDiffSelect($) {
Line 906  sub findLastModifiedSubdirs(@) {
Line 883  sub findLastModifiedSubdirs(@) {
 }  }
   
 sub htmlify($;$) {  sub htmlify($;$) {
         my($string, $extra) = @_;          my($string, $pr) = @_;
   
         # Special Characters; RFC 1866          # Special Characters; RFC 1866
         $string =~ s/&/&amp;/g;          $string =~ s/&/&amp;/g;
Line 915  sub htmlify($;$) {
Line 892  sub htmlify($;$) {
         $string =~ s/>/&gt;/g;          $string =~ s/>/&gt;/g;
   
         # get URL's as link ..          # get URL's as link ..
         $string =~ s`(http|ftp|https)(://[-a-zA-Z0-9%.~:_/]+)([?&]([-a-zA-Z0-9%.~:_]+)=([-a-zA-Z0-9%.~:_])+)*`<A HREF="$1$2$3">$1$2$3</A>`g;    # `          $string =~ s`(http|ftp|https)(://[-a-zA-Z0-9%.~:_/]+)([?&]([-a-zA-Z0-9%.~:_]+)=([-a-zA-Z0-9%.~:_])+)*`<A HREF="$1$2$3">$1$2$3</A>`;
         # get e-mails as link          # get e-mails as link
         $string =~ s`([-a-zA-Z0-9_.]+@([-a-zA-Z0-9]+\.)+[A-Za-z]{2,4})`<A HREF="mailto:$1">$1</A>`g;    # `          $string =~ s`([-a-zA-Z0-9_.]+@([-a-zA-Z0-9]+\.)+[A-Za-z]{2,4})`<A HREF="mailto:$1">$1</A>`;
   
         if ($extra) {          # get #PR as link ..
             # get PR #'s as link ..          if ($pr && defined($prcgi)) {
             if (defined($prcgi)) {              1 while $string =~ s`\b(pr[:#]?\s*(?:#?\d+[,\s]\s*)*#?)(\d+)\b`$1<A HREF="$prcgi$2">$2</A>`i;
                 1 while $string =~ s`\b(pr[:#]?\s*(?:#?\d+[,\s]\s*)*#?)(\d+)\b`$1 . &link($2, sprintf($prcgi, $2))`ie; # `              $string =~ s`\b${prcategories}/(\d+)\b`<A HREF="$prcgi$1">$&</A>`igo;
                 $string =~ s`\b${prcategories}/(\d+)\b`&link($&, sprintf($prcgi, $1))`igeo;     # `  
             }  
   
             # get manpage specs as link ..  
             if (defined($mancgi)) {  
                 $string =~ s`\b([a-zA-Z]\w+)\(([0-9n])\)\B`&link($&, sprintf($mancgi, $2, $1))`ge; # `  
             }  
         }          }
   
         return $string;          return $string;
 }  }
   
 sub spacedHtmlText($;$) {  sub spacedHtmlText($) {
         local $_ = $_[0];          local $_ = $_[0];
         my $ts = $_[1] || $tabstop;  
   
         # Cut trailing spaces and tabs          # Cut trailing spaces
         s/[ \t]+$//;          s/\s+$//;
   
         if (defined($ts)) {          # Expand tabs
             # Expand tabs          s/\t+/' ' x (length($&) * $tabstop - length($`) % $tabstop)/e
             1 while s/\t+/' ' x (length($&) * $ts - length($`) % $ts)/e              if (defined($tabstop));
         }  
   
         # replace <tab> and <space> (\001 is to protect us from htmlify)          # replace <tab> and <space> (\001 is to protect us from htmlify)
         # gzip can make excellent use of this repeating pattern :-)          # gzip can make excellent use of this repeating pattern :-)
           s/\001/\001%/g; #protect our & substitute
         if ($hr_breakable) {          if ($hr_breakable) {
             # make every other space 'breakable'              # make every other space 'breakable'
               s/  / \001nbsp; \001nbsp; \001nbsp; \001nbsp;/g;    # <tab>
             s/  / \001nbsp;/g;                              # 2 * <space>              s/  / \001nbsp;/g;                              # 2 * <space>
             # leave single space as it is              # leave single space as it is
         } else {          }
           else {
               s/  /\001nbsp;\001nbsp;\001nbsp;\001nbsp;\001nbsp;\001nbsp;\001nbsp;\001nbsp;/g;
             s/ /\001nbsp;/g;              s/ /\001nbsp;/g;
         }          }
   
         $_ = htmlify($_);          $_ = htmlify($_);
   
         # unescape          # unescape
         y/\001/&/;          s/\001([^%])/&$1/g;
           s/\001%/\001/g;
   
         return $_;          return $_;
 }  }
Line 973  sub link($$) {
Line 946  sub link($$) {
   
 sub revcmp($$) {  sub revcmp($$) {
         my($rev1, $rev2) = @_;          my($rev1, $rev2) = @_;
   
         # make no comparison for a tag or a branch  
         return 0 if $rev1 =~ /[^\d.]/ || $rev2 =~ /[^\d.]/;  
   
         my(@r1) = split(/\./, $rev1);          my(@r1) = split(/\./, $rev1);
         my(@r2) = split(/\./, $rev2);          my(@r2) = split(/\./, $rev2);
         my($a,$b);          my($a,$b);
Line 1080  sub getMimeTypeFromSuffix($) {
Line 1049  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 1125  sub doAnnotate($$) {
Line 1060  sub doAnnotate($$) {
   
     # make sure the revisions a wellformed, for security      # make sure the revisions a wellformed, for security
     # reasons ..      # reasons ..
     if ($rev =~ /[^\w.]/) {      if (!($rev =~ /^[\d\.]+$/)) {
         &fatal("404 Not Found",          &fatal("404 Not Found",
                 "Malformed query \"$ENV{QUERY_STRING}\"");                  "Malformed query \"$ENV{QUERY_STRING}\"");
     }      }
Line 1214  sub doAnnotate($$) {
Line 1149  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 1240  sub doAnnotate($$) {
Line 1167  sub doAnnotate($$) {
             }              }
             else {              else {
                 $revprint = $lrev; $oldLusr = "";                  $revprint = $lrev; $oldLusr = "";
                 $revprint =~ s`^(\S+)`<a href="${scriptwhere}${barequery}#rev$1">$1</A>`;       # `  
             }              }
             if ($lusr eq $oldLusr) {              if ($lusr eq $oldLusr) {
                 $usrprint = "         ";                  $usrprint = "         ";
Line 1256  sub doAnnotate($$) {
Line 1182  sub doAnnotate($$) {
   
             print "<b>" if ($isCurrentRev);              print "<b>" if ($isCurrentRev);
             printf ("%8s%s%8s %4d:", $revprint, ($isCurrentRev ? "|" : " "), $usrprint, $lineNr);              printf ("%8s%s%8s %4d:", $revprint, ($isCurrentRev ? "|" : " "), $usrprint, $lineNr);
             print spacedHtmlText($line, $d{'tabstop'});              print spacedHtmlText($line);
             print "</b>" if ($isCurrentRev);              print "</b>" if ($isCurrentRev);
         }          }
         elsif ($words[0] eq "ok") {          elsif ($words[0] eq "ok") {
Line 1285  sub doCheckout($$) {
Line 1211  sub doCheckout($$) {
     my ($mimetype,$revopt);      my ($mimetype,$revopt);
     my $fh = do {local(*FH);};      my $fh = do {local(*FH);};
   
     if ($rev eq 'HEAD' || $rev eq '.') {  
         $rev = undef;  
     }  
   
     # make sure the revisions a wellformed, for security      # make sure the revisions a wellformed, for security
     # reasons ..      # reasons ..
     if (defined($rev) && $rev =~ /[^\w.]/) {      if (defined($rev) && !($rev =~ /^[\d\.]+$/)) {
         &fatal("404 Not Found",          &fatal("404 Not Found",
                 "Malformed query \"$ENV{QUERY_STRING}\"");                  "Malformed query \"$ENV{QUERY_STRING}\"");
     }      }
Line 1327  sub doCheckout($$) {
Line 1249  sub doCheckout($$) {
     # Safely for a child process to read from.      # Safely for a child process to read from.
     if (! open($fh, "-|")) { # child      if (! open($fh, "-|")) { # child
       open(STDERR, ">&STDOUT"); # Redirect stderr to stdout        open(STDERR, ">&STDOUT"); # Redirect stderr to stdout
       exec("cvs", "-Rld", $cvsroot, "co", "-p", $revopt, $where);        exec("cvs", "-d", $cvsroot, "co", "-p", $revopt, $where);
     }      }
 #===================================================================  #===================================================================
 #Checking out squid/src/ftp.c  #Checking out squid/src/ftp.c
Line 1399  sub cvswebMarkup($$$) {
Line 1321  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/) {
         print "<IMG SRC=\"$url$barequery\"><BR>";          print "<IMG SRC=\"$url$barequery\"><BR>";
     }      }
     elsif ($mimetype =~ m%^application/pdf%) {  
         print "<EMBED SRC=\"$url$barequery\" WIDTH=\"100%\"><BR>";  
     }  
     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 1427  sub cvswebMarkup($$$) {
Line 1339  sub cvswebMarkup($$$) {
 sub viewable($) {  sub viewable($) {
     my ($mimetype) = @_;      my ($mimetype) = @_;
   
     $mimetype =~ m%^((text|image)/|application/pdf)% ;      $mimetype =~ m%^(text|image)/%;
 }  }
   
 ###############################  ###############################
Line 1454  sub doDiff($$$$$$) {
Line 1366  sub doDiff($$$$$$) {
             $rev2 = $tr2;              $rev2 = $tr2;
             $sym2 = "";              $sym2 = "";
         }          }
   
         # make sure the revisions a wellformed, for security          # make sure the revisions a wellformed, for security
         # reasons ..          # reasons ..
         if ($rev1 =~ /[^\w.]/ || $rev2 =~ /[^\w.]/) {          if (!($rev1 =~ /^[\d\.]+$/) || !($rev2 =~ /^[\d\.]+$/)) {
             &fatal("404 Not Found",              &fatal("404 Not Found",
                     "Malformed query \"$ENV{QUERY_STRING}\"");                      "Malformed query \"$ENV{QUERY_STRING}\"");
         }          }
Line 1499  sub doDiff($$$$$$) {
Line 1410  sub doDiff($$$$$$) {
   
         # apply special options          # apply special options
         if ($showfunc) {          if ($showfunc) {
             push @difftype, '-p' if $f =~ /^[cHhu]$/;              push @difftype, '-p';
   
             my($re1, $re2);              my($re1, $re2);
   
Line 1525  sub doDiff($$$$$$) {
Line 1436  sub doDiff($$$$$$) {
         if ($human_readable) {          if ($human_readable) {
             http_header();              http_header();
             &human_readable_diff($fh, $rev2);              &human_readable_diff($fh, $rev2);
             gzipclose();  
             exit;              exit;
         }          }
         else {          else {
Line 2195  EOF
Line 2105  EOF
         foreach (@stickyvars) {          foreach (@stickyvars) {
             print "<INPUT TYPE=HIDDEN NAME=\"$_\" VALUE=\"$input{$_}\">\n"              print "<INPUT TYPE=HIDDEN NAME=\"$_\" VALUE=\"$input{$_}\">\n"
                 if (defined($input{$_})                  if (defined($input{$_})
                     && ((!defined($DEFAULTVALUE{$_})                      && ($input{$_} ne $DEFAULTVALUE{$_} && $input{$_} ne ""));
                          || $input{$_} ne $DEFAULTVALUE{$_})  
                         && $input{$_} ne ""));  
         }          }
         print "<TABLE><TR>\n";          print "Diffs between \n";
         print "<TD align=right>Diffs between \n";  
         print "<SELECT NAME=\"r1\">\n";          print "<SELECT NAME=\"r1\">\n";
         print "<OPTION VALUE=\"text\" SELECTED>Use Text Field\n";          print "<OPTION VALUE=\"text\" SELECTED>Use Text Field\n";
         print $sel;          print $sel;
         print "</SELECT>\n";          print "</SELECT>\n";
         $diffrev = $revdisplayorder[$#revdisplayorder];          $diffrev = $revdisplayorder[$#revdisplayorder];
         $diffrev = $input{"r1"} if (defined($input{"r1"}));          $diffrev = $input{"r1"} if (defined($input{"r1"}));
         print "<INPUT TYPE=\"TEXT\" SIZE=\"$inputTextSize\" NAME=\"tr1\" VALUE=\"$diffrev\" onChange='document.diff_select.r1.selectedIndex=0'></TD>";          print "<INPUT TYPE=\"TEXT\" SIZE=\"$inputTextSize\" NAME=\"tr1\" VALUE=\"$diffrev\" onChange='document.diff_select.r1.selectedIndex=0'>\n";
         print "<TD><BR></TD></TR>\n";          print " and \n";
         print "<TR><TD align=right>and \n";  
         print "<SELECT NAME=\"r2\">\n";          print "<SELECT NAME=\"r2\">\n";
         print "<OPTION VALUE=\"text\" SELECTED>Use Text Field\n";          print "<OPTION VALUE=\"text\" SELECTED>Use Text Field\n";
         print $sel;          print $sel;
         print "</SELECT>\n";          print "</SELECT>\n";
         $diffrev = $revdisplayorder[0];          $diffrev = $revdisplayorder[0];
         $diffrev = $input{"r2"} if (defined($input{"r2"}));          $diffrev = $input{"r2"} if (defined($input{"r2"}));
         print "<INPUT TYPE=\"TEXT\" SIZE=\"$inputTextSize\" NAME=\"tr2\" VALUE=\"$diffrev\" onChange='document.diff_select.r2.selectedIndex=0'></TD>";          print "<INPUT TYPE=\"TEXT\" SIZE=\"$inputTextSize\" NAME=\"tr2\" VALUE=\"$diffrev\" onChange='docuement.diff_select.r2.selectedIndex=0'>\n";
         print "<TD><INPUT TYPE=SUBMIT VALUE=\"  Get Diffs  \"></TD>\n";          print "<BR>Type of Diff should be a&nbsp;";
           printDiffSelect(0);
           print "<INPUT TYPE=SUBMIT VALUE=\"  Get Diffs  \">\n";
         print "</FORM>\n";          print "</FORM>\n";
         print "</TR></TABLE>\n";  
         print "<HR noshade>\n";          print "<HR noshade>\n";
         print "<TABLE>";  
         print "<FORM METHOD=\"GET\" ACTION=\"$scriptwhere\">\n";  
         print "<TR><TD align=right>Preferred Diff type:</TD>";  
         print "<TD>";  
         printDiffSelect($use_java_script);  
         print "</TD><TD></TD></TR>\n";  
         if (@branchnames) {          if (@branchnames) {
             print "<TR><TD align=right>View only Branch:</TD>";  
             print "<TD>";  
             print "<A name=branch></A>\n";              print "<A name=branch></A>\n";
               print "<FORM METHOD=\"GET\" ACTION=\"$scriptwhere\">\n";
               foreach (@stickyvars) {
                   next if ($_ eq "only_with_tag");
                   next if ($_ eq "logsort");
                   print "<INPUT TYPE=HIDDEN NAME=\"$_\" VALUE=\"$input{$_}\">\n"
                       if (defined($input{$_}) && $input{$_} ne $DEFAULTVALUE{$_}
                           && $input{$_} ne "");
               }
               print "View only Branch: \n";
             print "<SELECT NAME=\"only_with_tag\"";              print "<SELECT NAME=\"only_with_tag\"";
             print " onchange=\"submit()\"" if ($use_java_script);              print " onchange=\"submit()\"" if ($use_java_script);
             print ">\n";              print ">\n";
Line 2244  EOF
Line 2152  EOF
                         && $input{"only_with_tag"} eq $_);                          && $input{"only_with_tag"} eq $_);
                 print ">${_}\n";                  print ">${_}\n";
             }              }
             print "</SELECT></TD><TD></TD></TR>\n";              print "</SELECT>\n";
               print "<INPUT TYPE=SUBMIT VALUE=\"  View Branch  \">\n";
               print "</FORM>\n";
         }          }
           print "<A name=logsort></A>\n";
           print "<FORM METHOD=\"GET\" ACTION=\"$scriptwhere\">\n";
         foreach (@stickyvars) {          foreach (@stickyvars) {
             next if ($_ eq "f");  
             next if ($_ eq "only_with_tag");              next if ($_ eq "only_with_tag");
             next if ($_ eq "logsort");              next if ($_ eq "logsort");
             print "<INPUT TYPE=HIDDEN NAME=\"$_\" VALUE=\"$input{$_}\">\n"              print "<INPUT TYPE=HIDDEN NAME=\"$_\" VALUE=\"$input{$_}\">\n"
                 if (defined($input{$_})                  if (defined($input{$_}) && $input{$_} ne $DEFAULTVALUE{$_}
                     && (!defined($DEFAULTVALUE{$_})  
                         || $input{$_} ne $DEFAULTVALUE{$_})  
                     && $input{$_} ne "");                      && $input{$_} ne "");
         }          }
         print "<TR><TD align=right>";          print "Sort log by: \n";
         print "<A name=logsort></A>\n";          print "<SELECT NAME=\"logsort\"";
         print "Sort log by:</TD>";  
         print "<TD><SELECT NAME=\"logsort\"";  
         print " onchange=\"submit()\"" if ($use_java_script);          print " onchange=\"submit()\"" if ($use_java_script);
         print ">\n";          print ">\n";
         print "<OPTION VALUE=cvs",$logsort eq "cvs" ? " SELECTED" : "", ">Not sorted";          print "<OPTION VALUE=cvs",$logsort eq "cvs" ? " SELECTED" : "", ">Not sorted";
         print "<OPTION VALUE=date",$logsort eq "date" ? " SELECTED" : "", ">Commit date";          print "<OPTION VALUE=date",$logsort eq "date" ? " SELECTED" : "", ">Commit date";
         print "<OPTION VALUE=rev",$logsort eq "rev" ? " SELECTED" : "", ">Revision";          print "<OPTION VALUE=rev",$logsort eq "rev" ? " SELECTED" : "", ">Revision";
         print "</SELECT></TD>";          print "</SELECT>\n";
         print "<TD><INPUT TYPE=SUBMIT VALUE=\"  Set  \"></TD>";          print "<INPUT TYPE=SUBMIT VALUE=\"  Sort  \">\n";
         print "</FORM>\n";          print "</FORM>\n";
         print "</TR></TABLE>";  
         print &html_footer;          print &html_footer;
         print "</BODY></HTML>\n";          print "</BODY></HTML>\n";
 }  }
Line 2308  sub flush_diff_rows($$$$) {
Line 2214  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 2362  sub human_readable_diff($){
Line 2268  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 2386  sub human_readable_diff($){
Line 2286  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 2470  sub navigateHeader($$$$$) {
Line 2370  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 $  $kRevision: 1.26 $ -->';      print '<!-- CVSweb $zRevision: 1.93 $  $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 2771  sub http_header(;$) {
Line 2671  sub http_header(;$) {
     my $content_type = shift || "text/html";      my $content_type = shift || "text/html";
     if (defined($moddate)) {      if (defined($moddate)) {
         if ($is_mod_perl) {          if ($is_mod_perl) {
             Apache->request->header_out("Last-Modified" => scalar gmtime($moddate) . " GMT");              Apache->request->header_out(Last_modified => scalar gmtime($moddate) . " GMT");
         }          }
         else {          else {
             print "Last-Modified: " . scalar gmtime($moddate) . " GMT\r\n";              print "Last-Modified: " . scalar gmtime($moddate) . " GMT\r\n";
Line 2784  sub http_header(;$) {
Line 2684  sub http_header(;$) {
             print "Content-type: $content_type\r\n";              print "Content-type: $content_type\r\n";
     }      }
     if ($allow_compress && $maycompress) {      if ($allow_compress && $maycompress) {
         if ($has_zlib || (defined($GZIPBIN) && open(GZIP, "|$GZIPBIN -1 -c"))) {          my $fh = do {local(*FH);};
           if (defined($GZIPBIN) && open($fh, "|$GZIPBIN -1 -c")) {
             if ($is_mod_perl) {              if ($is_mod_perl) {
                     Apache->request->content_encoding("x-gzip");                      Apache->request->content_encoding("x-gzip");
                     Apache->request->header_out(Vary => "Accept-Encoding");                      Apache->request->header_out(Vary => "Accept-Encoding");
Line 2796  sub http_header(;$) {
Line 2697  sub http_header(;$) {
                     print "\r\n"; # Close headers                      print "\r\n"; # Close headers
             }              }
             $| = 1; $| = 0; # Flush header output              $| = 1; $| = 0; # Flush header output
             if ($has_zlib) {              select ($fh);
                 tie *GZIP, __PACKAGE__, \*STDOUT;  
             }  
             select(GZIP);  
             $gzip_open = 1;  
 #           print "<!-- gzipped -->" if ($content_type eq "text/html");  #           print "<!-- gzipped -->" if ($content_type eq "text/html");
         }          }
         else {          else {
Line 2825  sub http_header(;$) {
Line 2722  sub http_header(;$) {
   
 sub html_header($) {  sub html_header($) {
     my ($title) = @_;      my ($title) = @_;
     my $version = '$zRevision: 1.103 $  $kRevision: 1.26 $'; #'      my $version = '$zRevision: 1.93 $  $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 2870  sub forbidden_module($) {
Line 2767  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  
 # library.  
   
 sub MAGIC1() { 0x1f }  
 sub MAGIC2() { 0x8b }  
 sub OSCODE() { 3    }  
   
 sub TIEHANDLE {  
         my ($class, $out) = @_;  
         my ($d) = Compress::Zlib::deflateInit(-Level => Compress::Zlib::Z_BEST_COMPRESSION(),  
                 -WindowBits => -Compress::Zlib::MAX_WBITS()) or return undef;  
         my ($o) = {  
                 handle => $out,  
                 dh => $d,  
                 crc => 0,  
                 len => 0,  
         };  
         my ($header) = pack("c10", MAGIC1, MAGIC2, Compress::Zlib::Z_DEFLATED(), 0,0,0,0,0,0, OSCODE);  
         print {$o->{handle}} $header;  
         return bless($o, $class);  
 }  
   
 sub PRINT {  
         my ($o) = shift;  
         my ($buf) = join(defined $, ? $, : "",@_);  
         my ($len) = length($buf);  
         my ($compressed, $status) = $o->{dh}->deflate($buf);  
         print {$o->{handle}} $compressed if defined($compressed);  
         $o->{crc} = Compress::Zlib::crc32($buf, $o->{crc});  
         $o->{len} += $len;  
         return $len;  
 }  
   
 sub PRINTF {  
         my ($o) = shift;  
         my ($fmt) = shift;  
         my ($buf) = sprintf($fmt, @_);  
         my ($len) = length($buf);  
         my ($compressed, $status) = $o->{dh}->deflate($buf);  
         print {$o->{handle}} $compressed if defined($compressed);  
         $o->{crc} = Compress::Zlib::crc32($buf, $o->{crc});  
         $o->{len} += $len;  
         return $len;  
 }  
   
 sub WRITE {  
         my ($o, $buf, $len, $off) = @_;  
         my ($compressed, $status) = $o->{dh}->deflate(substr($buf, 0, $len));  
         print {$o->{handle}} $compressed if defined($compressed);  
         $o->{crc} = Compress::Zlib::crc32(substr($buf, 0, $len), $o->{crc});  
         $o->{len} += $len;  
         return $len;  
 }  
   
 sub CLOSE {  
         my ($o) = @_;  
         return if !defined( $o->{dh});  
         my ($buf) = $o->{dh}->flush();  
         $buf .= pack("V V", $o->{crc}, $o->{len});  
         print {$o->{handle}} $buf;  
         undef $o->{dh};  
 }  
   
 sub DESTROY {  
         my ($o) = @_;  
         CLOSE($o);  
 }  }

Legend:
Removed from v.1.1.1.7  
changed lines
  Added in v.3.12

CVSweb