[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.29 and 1.1.1.30

version 1.1.1.29, 2002/04/10 20:03:49 version 1.1.1.30, 2002/05/22 07:00:03
Line 43 
Line 43 
 # 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.
 #  #
 # $FreeBSD: projects/cvsweb/cvsweb.cgi,v 1.90 2002/04/10 19:25:11 knu Exp $  # $FreeBSD: projects/cvsweb/cvsweb.cgi,v 1.102 2002/05/22 06:51:59 knu Exp $
 # $zId: cvsweb.cgi,v 1.112 2001/07/24 13:03:16 hzeller Exp $  # $zId: cvsweb.cgi,v 1.112 2001/07/24 13:03:16 hzeller Exp $
 # $Idaemons: /home/cvs/cvsweb/cvsweb.cgi,v 1.84 2001/10/07 20:50:10 knu Exp $  # $Idaemons: /home/cvs/cvsweb/cvsweb.cgi,v 1.84 2001/10/07 20:50:10 knu Exp $
 #  #
Line 64  use vars qw (
Line 64  use vars qw (
     @revisions %state %difflines %log %branchpoint @revorder      @revisions %state %difflines %log %branchpoint @revorder
     $prcgi @prcategories $re_prcategories $prkeyword $re_prkeyword $mancgi      $prcgi @prcategories $re_prcategories $prkeyword $re_prkeyword $mancgi
     $checkoutMagic $doCheckout $scriptname $scriptwhere      $checkoutMagic $doCheckout $scriptname $scriptwhere
     $where $pathinfo $Browser $nofilelinks $maycompress @stickyvars      $where $pathinfo $Browser $nofilelinks $maycompress
       @stickyvars @unsafevars
     %funcline_regexp $is_mod_perl      %funcline_regexp $is_mod_perl
     $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 79  use vars qw (
Line 80  use vars qw (
     $columnHeaderColorSorted $hr_breakable $showfunc $hr_ignwhite      $columnHeaderColorSorted $hr_breakable $showfunc $hr_ignwhite
     $hr_ignkeysubst $diffcolorHeading $diffcolorEmpty $diffcolorRemove      $hr_ignkeysubst $diffcolorHeading $diffcolorEmpty $diffcolorRemove
     $diffcolorChange $diffcolorAdd $diffcolorDarkChange $difffontface      $diffcolorChange $diffcolorAdd $diffcolorDarkChange $difffontface
     $difffontsize $inputTextSize $mime_types $allow_annotate      $difffontsize $inputTextSize $mime_types
     $allow_markup $use_java_script $open_extern_window      $allow_annotate $allow_markup
       $allow_log_extra $allow_dir_extra $allow_source_extra
       $use_java_script $open_extern_window
     $extern_window_width $extern_window_height $edit_option_form      $extern_window_width $extern_window_height $edit_option_form
     $show_subdir_lastmod $show_log_in_markup $preformat_in_markup $v      $show_subdir_lastmod $show_log_in_markup $preformat_in_markup $v
     $navigationHeaderColor $tableBorderColor $markupLogColor      $navigationHeaderColor $tableBorderColor $markupLogColor
Line 89  use vars qw (
Line 92  use vars qw (
     $use_moddate $has_zlib $gzip_open      $use_moddate $has_zlib $gzip_open
     $allow_tar @tar_options @gzip_options @zip_options @cvs_options      $allow_tar @tar_options @gzip_options @zip_options @cvs_options
     $LOG_FILESEPARATOR $LOG_REVSEPARATOR      $LOG_FILESEPARATOR $LOG_REVSEPARATOR
     $tmpdir      $tmpdir $HTML_DOCTYPE
 );  );
   
 sub printDiffSelect($);  sub printDiffSelect($);
Line 144  sub forbidden_module($);
Line 147  sub forbidden_module($);
 ##### Start of Configuration Area ########  ##### Start of Configuration Area ########
 delete $ENV{PATH};  delete $ENV{PATH};
   
 $cvsweb_revision = '2.0.1';  $cvsweb_revision = '2.0.2';
   
 use File::Basename;  use File::Basename ();
   
 ($mydir) = (dirname($0) =~ /(.*)/);    # untaint  ($mydir) = (File::Basename::dirname($0) =~ /(.*)/);    # untaint
   
 # == EDIT this ==  # == EDIT this ==
 # Locations to search for user configuration, in order:  # Locations to search for user configuration, in order:
Line 163  for ("$mydir/cvsweb.conf", '/usr/local/etc/cvsweb/cvsw
Line 166  for ("$mydir/cvsweb.conf", '/usr/local/etc/cvsweb/cvsw
 # Defaults for configuration variables that shouldn't need  # Defaults for configuration variables that shouldn't need
 # to be configured..  # to be configured..
 $allow_version_select = 1;  $allow_version_select = 1;
   $allow_log_extra = 1;
   
 ##### End of Configuration Area   ########  ##### End of Configuration Area   ########
   
Line 181  $cvstreedefault = $body_tag = $body_tag_for_src = $log
Line 185  $cvstreedefault = $body_tag = $body_tag_for_src = $log
     $extern_window_width = $extern_window_height = $edit_option_form   =      $extern_window_width = $extern_window_height = $edit_option_form   =
     $show_subdir_lastmod = $show_log_in_markup = $v = $navigationHeaderColor =      $show_subdir_lastmod = $show_log_in_markup = $v = $navigationHeaderColor =
     $tableBorderColor = $markupLogColor = $tabstop = $use_moddate = $moddate =      $tableBorderColor = $markupLogColor = $tabstop = $use_moddate = $moddate =
     $gzip_open = undef;      $gzip_open = $HTML_DOCTYPE = undef;
 $tmpdir = defined($ENV{TMPDIR}) ? $ENV{TMPDIR} : "/var/tmp";  $tmpdir = defined($ENV{TMPDIR}) ? $ENV{TMPDIR} : "/var/tmp";
   
 $LOG_FILESEPARATOR = q/^={77}$/;  $LOG_FILESEPARATOR = q/^={77}$/;
Line 229  $LOG_REVSEPARATOR  = q/^-{28}$/;
Line 233  $LOG_REVSEPARATOR  = q/^-{28}$/;
         },          },
 );  );
   
   $HTML_DOCTYPE =
     '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">';
   
 ##### End of configuration variables #####  ##### End of configuration variables #####
   
 use Time::Local;  use Time::Local ();
 use IPC::Open2;  use IPC::Open2 qw(open2);
   
 # Check if the zlib C library interface is installed, and if yes  # Check if the zlib C library interface is installed, and if yes
 # we can avoid using the extra gzip process.  # we can avoid using the extra gzip process.
Line 295  $maycompress =
Line 302  $maycompress =
 # their current value) to any link/query string  # their current value) to any link/query string
 # you construct  # you construct
 @stickyvars = qw(cvsroot hideattic sortby logsort f only_with_tag);  @stickyvars = qw(cvsroot hideattic sortby logsort f only_with_tag);
   @unsafevars = qw(logsort only_with_tag r1 r2 rev sortby tr1 tr2);
   
 if (-f $config) {  if (-f $config) {
         require $config || &fatal(          do "$config" or &fatal(
                 "500 Internal Error",                  "500 Internal Error",
                 sprintf(                  sprintf(
                         'Error in loading configuration file: %s<br><br>%s<br>',                          'Error in loading configuration file: %s<br><br>%s<br>',
Line 331  if (defined($query) && $query ne '') {
Line 339  if (defined($query) && $query ne '') {
 $input{only_with_tag} = $input{only_on_branch}  $input{only_with_tag} = $input{only_on_branch}
     if (defined($input{only_on_branch}));      if (defined($input{only_on_branch}));
   
   # Prevent cross-site scripting
   foreach (@unsafevars) {
       if (defined($input{$_}) && $input{$_} =~ /[^\w\-.]/) {
           fatal("500 Internal Error", "Malformed query string ($_)");
       }
   }
   
   if (defined($input{"content-type"})) {
           fatal("500 Internal Error", "Unsupported content-type")
               if ($input{"content-type"} !~ /^[-0-9A-Za-z]+\/[-0-9A-Za-z]+$/);
   }
   
 $DEFAULTVALUE{'cvsroot'} = $cvstreedefault;  $DEFAULTVALUE{'cvsroot'} = $cvstreedefault;
   
 foreach (keys %DEFAULTVALUE) {  foreach (keys %DEFAULTVALUE) {
Line 409  $defaultDiffType = $input{'f'};
Line 429  $defaultDiffType = $input{'f'};
   
 $logsort = $input{'logsort'};  $logsort = $input{'logsort'};
   
 my @tmp = @CVSrepositories;  {
 my @pair;          my @tmp = @CVSrepositories;
           my @pair;
   
 while (@pair = splice(@tmp, 0, 2)) {          while (@pair = splice(@tmp, 0, 2)) {
         my ($key,   $val)     = @pair;                  my ($key,   $val)     = @pair;
         my ($descr, $cvsroot) = @$val;                  my ($descr, $cvsroot) = @$val;
   
         next if !-d $cvsroot;                  next if !-d $cvsroot;
   
         $CVSROOTdescr{$key} = $descr;                  $CVSROOTdescr{$key} = $descr;
         $CVSROOT{$key}      = $cvsroot;                  $CVSROOT{$key}      = $cvsroot;
         push @CVSROOT, $key;                  push @CVSROOT, $key;
           }
 }  }
 undef @tmp;  
 undef @pair;  
   
 ## Default CVS-Tree  ## Default CVS-Tree
 if (!defined($CVSROOT{$cvstreedefault})) {  if (!defined($CVSROOT{$cvstreedefault})) {
Line 462  my $config_cvstree = "$config-$cvstree";
Line 482  my $config_cvstree = "$config-$cvstree";
   
 # Do some special configuration for cvstrees  # Do some special configuration for cvstrees
 if (-f $config_cvstree) {  if (-f $config_cvstree) {
         require $config_cvstree || &fatal(          do "$config_cvstree" or &fatal(
                 "500 Internal Error",                  "500 Internal Error",
                 sprintf(                  sprintf(
                         'Error in loading configuration file: %s<br><br>%s<br>',                          'Error in loading configuration file: %s<br><br>%s<br>',
Line 592  if ($input{tarball}) {
Line 612  if ($input{tarball}) {
 ###############################  ###############################
 if (-d $fullname) {  if (-d $fullname) {
         my $dh = do { local (*DH); };          my $dh = do { local (*DH); };
         opendir($dh, $fullname) || &fatal("404 Not Found", "$where: $!");          opendir($dh, $fullname) or &fatal("404 Not Found", "$where: $!");
         my @dir = readdir($dh);          my @dir = readdir($dh);
         closedir($dh);          closedir($dh);
         my @subLevelFiles = findLastModifiedSubdirs(@dir)          my @subLevelFiles = findLastModifiedSubdirs(@dir)
Line 641  if (-d $fullname) {
Line 661  if (-d $fullname) {
   
         my $infocols = 0;          my $infocols = 0;
         if ($dirtable) {          if ($dirtable) {
                 if (defined($tableBorderColor)) {                  print "<table style=\"border-width: 0";
                   print "; background-color: $tableBorderColor"
                         # Can't this be done by defining the border for the inner table?                      if (defined $tableBorderColor);
                         print                  print "\" width=\"100%\" cellspacing=\"1\" cellpadding=\"$tablepadding\">\n";
                             "<table border=\"0\" cellpadding=\"0\" width=\"100%\"><tr><td bgcolor=\"$tableBorderColor\">";  
                 }  
                 print  
                     "<table width=\"100%\" border=\"0\" cellspacing=\"1\" cellpadding=\"$tablepadding\">\n";  
                 $infocols++;                  $infocols++;
                 printf '<tr><th align="left" bgcolor="%s">',                  printf "<tr>\n<th style=\"text-align: left; background-color: %s\">",
                     $byfile ? $columnHeaderColorSorted :                      $byfile ? $columnHeaderColorSorted :
                     $columnHeaderColorDefault;                      $columnHeaderColorDefault;
   
Line 665  if (-d $fullname) {
Line 681  if (-d $fullname) {
                                 )                                  )
                         );                          );
                 }                  }
                 print "</th>";                  print "</th>\n";
   
                 # do not display the other column-headers, if we do not have any files                  # do not display the other column-headers, if we do not have any files
                 # with revision information:                  # with revision information:
                 if (scalar(%fileinfo)) {                  if (scalar(%fileinfo)) {
                         $infocols++;                          $infocols++;
                         printf '<th align="left" bgcolor="%s">',                          printf '<th style="text-align: left; background-color: %s">',
                             $byrev ? $columnHeaderColorSorted :                              $byrev ? $columnHeaderColorSorted :
                             $columnHeaderColorDefault;                              $columnHeaderColorDefault;
   
Line 686  if (-d $fullname) {
Line 702  if (-d $fullname) {
                                         )                                          )
                                 );                                  );
                         }                          }
                         print "</th>";                          print "</th>\n";
                         $infocols++;                          $infocols++;
                         printf '<th align="left" bgcolor="%s">',                          printf '<th style="text-align: left; background-color: %s">',
                             $bydate ? $columnHeaderColorSorted :                              $bydate ? $columnHeaderColorSorted :
                             $columnHeaderColorDefault;                              $columnHeaderColorDefault;
   
Line 703  if (-d $fullname) {
Line 719  if (-d $fullname) {
                                         )                                          )
                                 );                                  );
                         }                          }
                         print "</th>";                          print "</th>\n";
   
                         if ($show_author) {                          if ($show_author) {
                                 $infocols++;                                  $infocols++;
                                 printf '<th align="left" bgcolor="%s">',                                  printf '<th style="text-align: left; background-color: %s">',
                                     $byauthor ? $columnHeaderColorSorted :                                      $byauthor ? $columnHeaderColorSorted :
                                     $columnHeaderColorDefault;                                      $columnHeaderColorDefault;
   
Line 725  if (-d $fullname) {
Line 741  if (-d $fullname) {
                                                 )                                                  )
                                         );                                          );
                                 }                                  }
                                 print "</th>";                                  print "</th>\n";
                         }                          }
                         $infocols++;                          $infocols++;
                         printf '<th align="left" bgcolor="%s">',                          printf '<th style="text-align: left; background-color: %s">',
                             $bylog ? $columnHeaderColorSorted :                              $bylog ? $columnHeaderColorSorted :
                             $columnHeaderColorDefault;                              $columnHeaderColorDefault;
   
Line 743  if (-d $fullname) {
Line 759  if (-d $fullname) {
                                         )                                          )
                                 );                                  );
                         }                          }
                         print "</th>";                          print "</th>\n";
                 } elsif ($use_descriptions) {                  } elsif ($use_descriptions) {
                         printf '<th align="left" bgcolor="%s">',                          printf '<th style="text-align: left; background-color: s">',
                             $columnHeaderColorDefault;                              $columnHeaderColorDefault;
                         print "Description";                          print "Description</th>\n";
                         $infocols++;                          $infocols++;
                 }                  }
                 print "</tr>\n";                  print "</tr>\n";
Line 813  if (-d $fullname) {
Line 829  if (-d $fullname) {
                         ($rev, $date, $log, $author, $filename) =                          ($rev, $date, $log, $author, $filename) =
                             @{$fileinfo{$_}}                              @{$fileinfo{$_}}
                             if (defined($fileinfo{$_}));                              if (defined($fileinfo{$_}));
                         printf '<tr bgcolor="%s"><td>', $tabcolors[$dirrow % 2]                          printf "<tr style=\"background-color: %s\">\n<td>",
                             if $dirtable;                               $tabcolors[$dirrow % 2] if $dirtable;
   
                         if ($_ eq '..') {                          if ($_ eq '..') {
                                 $url = "../$query";                                  $url = "../$query";
Line 823  if (-d $fullname) {
Line 839  if (-d $fullname) {
                                 } else {                                  } else {
                                         print &link($backicon, $url);                                          print &link($backicon, $url);
                                 }                                  }
                                 print " ", &link("Parent Directory", $url);                                  print '&nbsp;', &link("Parent Directory", $url);
                         } else {                          } else {
                                 $url = './' . urlencode($_) . "/$query";                                  $url = './' . urlencode($_) . "/$query";
                                 print "<a name=\"$_\"></a>";                                  print "<a name=\"$_\"></a>";
Line 833  if (-d $fullname) {
Line 849  if (-d $fullname) {
                                 } else {                                  } else {
                                         print &link($diricon, $url);                                          print &link($diricon, $url);
                                 }                                  }
                                 print " ", &link("$_/", $url), $attic;                                  print '&nbsp;', &link("$_/", $url), $attic;
   
                                 if ($_ eq "Attic") {                                  if ($_ eq "Attic") {
                                         print "&nbsp; ";                                          print "&nbsp; ";
Line 850  if (-d $fullname) {
Line 866  if (-d $fullname) {
   
                         # Show last change in dir                          # Show last change in dir
                         if ($filename) {                          if ($filename) {
                                 print "</td><td>&nbsp;</td><td>&nbsp;"                                  print "</td>\n<td>&nbsp;</td>\n<td>&nbsp;"
                                     if ($dirtable);                                      if ($dirtable);
                                 if ($date) {                                  if ($date) {
                                         print " <i>",                                          print " <i>",
Line 859  if (-d $fullname) {
Line 875  if (-d $fullname) {
                                 }                                  }
   
                                 if ($show_author) {                                  if ($show_author) {
                                         print "</td><td>&nbsp;" if ($dirtable);                                          print "</td>\n<td>&nbsp;" if ($dirtable);
                                         print $author;                                          print $author;
                                 }                                  }
                                 print "</td><td>&nbsp;" if ($dirtable);                                  print "</td>\n<td>&nbsp;" if ($dirtable);
                                 $filename =~ s%^[^/]+/%%;                                  $filename =~ s%^[^/]+/%%;
                                 print "$filename/$rev";                                  print "$filename/$rev";
                                 print "<br>" if ($dirtable);                                  print "<br>" if ($dirtable);
   
                                 if ($log) {                                  if ($log) {
                                         print "&nbsp;<font size=\"-1\">",                                          print "&nbsp;<span style=\"font-size: smaller\">",
                                           &htmlify(                                            &htmlify(
                                                 substr($log, 0, $shortLogLen));                                                  substr($log, 0, $shortLogLen), $allow_dir_extra);
                                         if (length $log > 80) {                                          if (length $log > 80) {
                                                 print "...";                                                  print "...";
                                         }                                          }
                                         print "</font>";                                          print "</span>";
                                 }                                  }
                         } else {                          } else {
                                 my ($dwhere) =                                  my ($dwhere) =
Line 893  if (-d $fullname) {
Line 909  if (-d $fullname) {
                                         # columns, so that the vertical seperators are visible                                          # columns, so that the vertical seperators are visible
                                         my ($cols) = $infocols;                                          my ($cols) = $infocols;
                                         while ($cols > 1) {                                          while ($cols > 1) {
                                                 print "</td><td>&nbsp;";                                                  print "</td>\n<td>&nbsp;";
                                                 $cols--;                                                  $cols--;
                                         }                                          }
                                 }                                  }
                         }                          }
   
                         if ($dirtable) {                          if ($dirtable) {
                                 print "</td></tr>\n";                                  print "</td>\n</tr>\n";
                         } else {                          } else {
                                 print "<br>\n";                                  print "<br>\n";
                         }                          }
Line 916  if (-d $fullname) {
Line 932  if (-d $fullname) {
                         next if (!defined($fileinfo{$_}));                          next if (!defined($fileinfo{$_}));
                         ($rev, $date, $log, $author) = @{$fileinfo{$_}};                          ($rev, $date, $log, $author) = @{$fileinfo{$_}};
                         $filesfound++;                          $filesfound++;
                         printf '<tr bgcolor="%s"><td>', $tabcolors[$dirrow % 2]                          printf "<tr style=\"background-color: %s\">\n<td>",
                             if $dirtable;                              $tabcolors[$dirrow % 2] if $dirtable;
                         print "<a name=\"$_\"></a>";                          print "<a name=\"$_\"></a>";
   
                         if ($nofilelinks) {                          if ($nofilelinks) {
Line 925  if (-d $fullname) {
Line 941  if (-d $fullname) {
                         } else {                          } else {
                                 print &link($fileicon, $url);                                  print &link($fileicon, $url);
                         }                          }
                         print " ", &link($_, $url), $attic;                          print '&nbsp;', &link($_, $url), $attic;
                         print "</td><td>&nbsp;" if ($dirtable);                          print "</td>\n<td>&nbsp;" if ($dirtable);
                         download_link($fileurl, $rev, $rev,                          download_link($fileurl, $rev, $rev,
                                 $defaultViewable ? "text/x-cvsweb-markup" :                                  $defaultViewable ? "text/x-cvsweb-markup" :
                                 undef);                                  undef);
                         print "</td><td>&nbsp;" if ($dirtable);                          print "</td>\n<td>&nbsp;" if ($dirtable);
   
                         if ($date) {                          if ($date) {
                                 print " <i>", readableTime(time() - $date, 0),                                  print " <i>", readableTime(time() - $date, 0),
                                     "</i>";                                      "</i>";
                         }                          }
                         if ($show_author) {                          if ($show_author) {
                                 print "</td><td>&nbsp;" if ($dirtable);                                  print "</td>\n<td>&nbsp;" if ($dirtable);
                                 print $author;                                  print $author;
                         }                          }
                         print "</td><td>&nbsp;" if ($dirtable);                          print "</td>\n<td>&nbsp;" if ($dirtable);
   
                         if ($log) {                          if ($log) {
                                 print " <font size=\"-1\">",                                  print " <span style=\"font-size: smaller\">",
                                     &htmlify(substr($log, 0, $shortLogLen));                                      &htmlify(substr($log, 0, $shortLogLen), $allow_dir_extra);
                                 if (length $log > 80) {                                  if (length $log > 80) {
                                         print "...";                                          print "...";
                                 }                                  }
                                 print "</font>";                                  print "</span>";
                         }                          }
                         print "</td>" if ($dirtable);                          print "</td>\n" if ($dirtable);
                         print(($dirtable) ? "</tr>" : "<br>");                          print(($dirtable) ? "</tr>" : "<br>");
                         $dirrow++;                          $dirrow++;
                 }                  }
Line 959  if (-d $fullname) {
Line 975  if (-d $fullname) {
   
         print($dirtable ? "</table>\n" : "</menu>\n");          print($dirtable ? "</table>\n" : "</menu>\n");
   
         if ($dirtable && defined($tableBorderColor)) {  
                 print "</td></tr></table>";  
         }  
   
         if ($filesexists && !$filesfound) {          if ($filesexists && !$filesfound) {
                 print                  print
                     "<p><b>NOTE:</b> There are $filesexists files, but none matches the current tag ($input{only_with_tag}).</p>\n";                      "<p><b>NOTE:</b> There are $filesexists files, but none matches the current tag ($input{only_with_tag}).</p>\n";
Line 975  if (-d $fullname) {
Line 987  if (-d $fullname) {
         if (scalar %tags || $input{only_with_tag} || $edit_option_form          if (scalar %tags || $input{only_with_tag} || $edit_option_form
             || defined($input{"options"}))              || defined($input{"options"}))
         {          {
                 print "<hr size=\"1\" noshade>";                  print "<hr size=\"1\" noshade>\n";
         }          }
   
         if (scalar %tags || $input{only_with_tag}) {          if (scalar %tags || $input{only_with_tag}) {
Line 1024  if (-d $fullname) {
Line 1036  if (-d $fullname) {
                                     &link("zip archive", "./$basefile.zip$query"                                      &link("zip archive", "./$basefile.zip$query"
                                         . ($query ? "&" : "?") . "tarball=1");                                          . ($query ? "&" : "?") . "tarball=1");
                         }                          }
                         print "</div>";                          print "</div>\n";
                 }                  }
         }          }
   
         my $formwhere = $scriptwhere;  
         $formwhere =~ s|Attic/?$|| if ($input{'hideattic'});  
   
         if ($edit_option_form || defined($input{"options"})) {          if ($edit_option_form || defined($input{"options"})) {
   
                   my $formwhere = $scriptwhere;
                   $formwhere =~ s|Attic/?$|| if ($input{'hideattic'});
   
                 print "<form method=\"get\" action=\"${formwhere}\">\n";                  print "<form method=\"get\" action=\"${formwhere}\">\n";
                 print "<input type=\"hidden\" name=\"copt\" value=\"1\">\n";                  print "<input type=\"hidden\" name=\"copt\" value=\"1\">\n";
                 if ($cvstree ne $cvstreedefault) {                  if ($cvstree ne $cvstreedefault) {
                         print                          print
                             "<input type=\"hidden\" name=\"cvsroot\" value=\"$cvstree\">\n";                              "<input type=\"hidden\" name=\"cvsroot\" value=\"$cvstree\">\n";
                 }                  }
                 print "<center><table cellpadding=\"0\" cellspacing=\"0\">";                  print "<center>\n<table cellpadding=\"0\" cellspacing=\"0\">";
                 print                  print "\n<tr style=\"background-color: $columnHeaderColorDefault\">\n";
                     "<tr bgcolor=\"$columnHeaderColorDefault\"><th colspan=\"2\">Preferences</th></tr>";                  print "<th colspan=\"2\">Preferences</th>\n</tr>\n";
                 print "<tr><td>Sort files by <select name=\"sortby\">";                  print "<tr>\n<td>Sort files by <select name=\"sortby\">\n";
                 print "<option value=\"\">File</option>";                  print "<option value=\"\">File</option>\n";
                 print "<option", $bydate ? " selected" : "",                  print "<option", $bydate ? " selected" : "",
                     " value=\"date\">Age</option>";                      " value=\"date\">Age</option>\n";
                 print "<option", $byauthor ? " selected" : "",                  print "<option", $byauthor ? " selected" : "",
                     " value=\"author\">Author</option>"                      " value=\"author\">Author</option>\n"
                     if ($show_author);                      if ($show_author);
                 print "<option", $byrev ? " selected" : "",                  print "<option", $byrev ? " selected" : "",
                     " value=\"rev\">Revision</option>";                      " value=\"rev\">Revision</option>\n";
                 print "<option", $bylog ? " selected" : "",                  print "<option", $bylog ? " selected" : "",
                     " value=\"log\">Log message</option>";                      " value=\"log\">Log message</option>\n";
                 print "</select></td>";                  print "</select>\n</td>\n";
                 print "<td>Sort log by: ";                  print "<td>Sort log by: ";
                 printLogSortSelect(0);                  printLogSortSelect(0);
                 print "</td></tr>";                  print "</td>\n</tr>\n";
                 print "<tr><td>Diff format: ";                  print "<tr>\n<td>Diff format: ";
                 printDiffSelect(0);                  printDiffSelect(0);
                 print "</td>";                  print "</td>\n";
                 print "<td><label>Show Attic files: ";                  print "<td><label>Show Attic files: ";
                 print "<input name=\"hideattic\" type=\"checkbox\"",                  print "<input name=\"hideattic\" type=\"checkbox\"",
                     $input{'hideattic'} ? " checked" : "", "></label></td></tr>\n";                      $input{'hideattic'} ? " checked" : "",
                 print                       "></label></td>\n</tr>\n";
                     "<tr><td align=\"center\" colspan=\"2\"><input type=\"submit\" value=\"Change Options\">";                  print "<tr>\n<td align=\"center\" colspan=\"2\">";
                 print "</td></tr></table></center></form>\n";                  print "<input type=\"submit\" value=\"Change Options\">";
                   print "</td>\n</tr>\n</table>\n</center>\n</form>\n";
         }          }
         print &html_footer;          html_footer();
 }  }
   
 ###############################  ###############################
Line 1168  sub printDiffSelect($) {
Line 1182  sub printDiffSelect($) {
   
         print '<select name="f"';          print '<select name="f"';
         print ' onchange="this.form.submit()"' if $use_java_script;          print ' onchange="this.form.submit()"' if $use_java_script;
         print '>';          print ">\n";
   
         local $_;          local $_;
         for (@DIFFTYPES) {          for (@DIFFTYPES) {
                 printf('<option value="%s"%s>%s</option>', $_,                  printf("<option value=\"%s\"%s>%s</option>\n", $_,
                     $f eq $_ ? ' selected' : '', "\u$DIFFTYPES{$_}{'descr'}");                      $f eq $_ ? ' selected' : '', "\u$DIFFTYPES{$_}{'descr'}");
         }          }
   
Line 1184  sub printLogSortSelect($) {
Line 1198  sub printLogSortSelect($) {
   
         print '<select name="logsort"';          print '<select name="logsort"';
         print ' onchange="this.form.submit()"' if $use_java_script;          print ' onchange="this.form.submit()"' if $use_java_script;
         print '>';          print ">\n";
   
         local $_;          local $_;
         for (@LOGSORTKEYS) {          for (@LOGSORTKEYS) {
                 printf('<option value="%s"%s>%s</option>', $_,                  printf("<option value=\"%s\"%s>%s</option>\n", $_,
                     $logsort eq $_ ? ' selected' : '',                      $logsort eq $_ ? ' selected' : '',
                     "\u$LOGSORTKEYS{$_}{'descr'}");                      "\u$LOGSORTKEYS{$_}{'descr'}");
         }          }
Line 1210  sub findLastModifiedSubdirs(@) {
Line 1224  sub findLastModifiedSubdirs(@) {
                 my ($lastmodtime) = undef;                  my ($lastmodtime) = undef;
                 my $dh = do { local (*DH); };                  my $dh = do { local (*DH); };
   
                 opendir($dh, $dir) || next;                  opendir($dh, $dir) or next;
                 my (@filenames) = readdir($dh);                  my (@filenames) = readdir($dh);
                 closedir($dh);                  closedir($dh);
   
Line 1271  sub htmlify($;$) {
Line 1285  sub htmlify($;$) {
         if ($extra) {          if ($extra) {
   
                 # get PR #'s as link: "PR#nnnn" "PR: nnnn, ..." "PR nnnn, ..." "bin/nnnn"                  # get PR #'s as link: "PR#nnnn" "PR: nnnn, ..." "PR nnnn, ..." "bin/nnnn"
                 if (defined($prcgi) && defined($re_prcategories)                  if (defined($prcgi) && defined($re_prkeyword))
                     && defined($re_prkeyword))  
                 {                  {
                         my $prev;                          my $prev;
   
Line 1295  sub htmlify($;$) {
Line 1308  sub htmlify($;$) {
                                     $_;                                      $_;
                         } while ($_ ne $prev);                          } while ($_ ne $prev);
   
                         $_ = htmlify_sub {                          if (defined($re_prcategories)) {
                                 s{                                  $_ = htmlify_sub {
                   (\b$re_prcategories/(\d+)\b)                                          s{
                  }{                            (\b$re_prcategories/(\d+)\b)
                      &link($1, sprintf($prcgi, $2))                          }{
                  }egox;                                  &link($1, sprintf($prcgi, $2))
                             }                          }egox;
                             $_;                                      }
                                       $_;
                           }
                 }                  }
   
                 # get manpage specs as link: "foo.1" "foo(1)"                  # get manpage specs as link: "foo.1" "foo(1)"
Line 1351  sub spacedHtmlText($;$) {
Line 1366  sub spacedHtmlText($;$) {
                 s/ /\001nbsp;/g;                  s/ /\001nbsp;/g;
         }          }
   
         $_ = htmlify($_);          $_ = htmlify($_, $allow_source_extra);
   
         # unescape          # unescape
         y/\001/&/;          y/\001/&/;
Line 1396  sub fatal($$) {
Line 1411  sub fatal($$) {
                 print "Status: $errcode\r\n";                  print "Status: $errcode\r\n";
         }          }
         html_header("Error");          html_header("Error");
         print "Error: $errmsg\n";          print "<p>Error: ", htmlquote($errmsg), "</p>\n";
         print &html_footer;          html_footer();
         exit(1);          exit(1);
 }  }
   
Line 1411  sub redirect($) {
Line 1426  sub redirect($) {
                 print "Location: $url\r\n";                  print "Location: $url\r\n";
         }          }
         html_header("Moved");          html_header("Moved");
         print "This document is located ", &link('here', $url), "\n";          print "<p>This document is located ", &link('here', $url), "</p>\n";
         print &html_footer;          html_footer();
         exit(1);          exit(1);
 }  }
   
Line 1526  sub scan_directives(@) {
Line 1541  sub scan_directives(@) {
 sub openOutputFilter() {  sub openOutputFilter() {
         return if !defined($output_filter) || $output_filter eq '';          return if !defined($output_filter) || $output_filter eq '';
   
         open(STDOUT, "|-") && return;          open(STDOUT, "|-") and return;
   
         # child of child          # child of child
         open(STDERR, '>/dev/null');          open(STDERR, '>/dev/null');
         exec($output_filter);          exec($output_filter) or exit -1;
   
         exit -1;  
 }  }
   
 ###############################  ###############################
Line 1573  sub doAnnotate($$) {
Line 1586  sub doAnnotate($$) {
         # 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, $CMD{cvs}, @cvs_options, "server")          $pid = open2($reader, $writer, $CMD{cvs}, @cvs_options, "server")
             || fatal("500 Internal Error",              or 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 1629  sub doAnnotate($$) {
Line 1642  sub doAnnotate($$) {
         # OK, we've sent our command to the server.  Thing to do is to          # OK, we've sent our command to the server.  Thing to do is to
         # close the writer side and get all the responses.  If "cvs server"          # close the writer side and get all the responses.  If "cvs server"
         # 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) or die "cannot close: $!";
   
         http_header();          http_header();
   
         navigateHeader($scriptwhere, $pathname, $filename, $rev, "annotate");          navigateHeader($scriptwhere, $pathname, $filename, $rev, "annotate");
         print          print
             "<h3 align=\"center\">Annotation of $pathname$filename, Revision $rev</h3>\n";              "<h3 style=\"text-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:
Line 1648  sub doAnnotate($$) {
Line 1661  sub doAnnotate($$) {
         my ($revprint, $usrprint);          my ($revprint, $usrprint);
   
         if ($annTable) {          if ($annTable) {
                 print "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n";                  print "<table style=\"border: none\" cellspacing=\"0\" cellpadding=\"0\">\n";
         } else {          } else {
                 print "<pre>";                  print "<pre>";
         }          }
Line 1718  sub doAnnotate($$) {
Line 1731  sub doAnnotate($$) {
         } else {          } else {
                 print "</pre>";                  print "</pre>";
         }          }
         close($reader) || warn "cannot close: $!";          close($reader) or warn "cannot close: $!";
         wait;          wait;
 }  }
   
Line 1782  sub doCheckout($$) {
Line 1795  sub doCheckout($$) {
                  # chdir to $tmpdir before to avoid non-readable cgi-bin directories                   # chdir to $tmpdir before to avoid non-readable cgi-bin directories
                 chdir($tmpdir);                  chdir($tmpdir);
                 open(STDERR, ">&STDOUT");    # Redirect stderr to stdout                  open(STDERR, ">&STDOUT");    # Redirect stderr to stdout
                 exec($CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p',  
                     $revopt, $where);                  # work around a bug of cvs -p; expand symlinks
                   use Cwd 'abs_path';
                   exec($CMD{cvs}, @cvs_options,
                        '-d', abs_path($cvsroot),
                        'co', '-p',
                        $revopt, $where) or exit -1;
         }          }
   
         if (eof($fh)) {          if (eof($fh)) {
Line 1837  sub cvswebMarkup($$$) {
Line 1855  sub cvswebMarkup($$$) {
   
         navigateHeader($scriptwhere, $pathname, $filename, $revision, "view");          navigateHeader($scriptwhere, $pathname, $filename, $revision, "view");
         print "<hr noshade>";          print "<hr noshade>";
         print "<table width=\"100%\"><tr><td bgcolor=\"$markupLogColor\">";          print "<table width=\"100%\">\n<tr>\n<td style=\"background-color: $markupLogColor\">";
         print "File: ", &clickablePath($where, 1);          print "File: ", &clickablePath($where, 1);
         print "&nbsp;(";          print "&nbsp;(";
         &download_link($fileurl, $revision, "download");          &download_link($fileurl, $revision, "download");
Line 1858  sub cvswebMarkup($$$) {
Line 1876  sub cvswebMarkup($$$) {
                 print "Tag: <b>", $input{only_with_tag}, "</b><br>\n"                  print "Tag: <b>", $input{only_with_tag}, "</b><br>\n"
                     if $input{only_with_tag};                      if $input{only_with_tag};
         }          }
         print "</td></tr></table>";          print "</td>\n</tr>\n</table>";
         my $url = download_url($fileurl, $revision, $mimetype);          my $url = download_url($fileurl, $revision, $mimetype);
         print "<hr noshade>";          print "<hr noshade>";
   
Line 1981  sub doDiff($$$$$$) {
Line 1999  sub doDiff($$$$$$) {
         if (!open($fh, "-|")) {    # child          if (!open($fh, "-|")) {    # child
                 open(STDERR, ">&STDOUT");    # Redirect stderr to stdout                  open(STDERR, ">&STDOUT");    # Redirect stderr to stdout
                 openOutputFilter();                  openOutputFilter();
                 exec($CMD{rcsdiff}, @difftype, "-r$rev1", "-r$rev2", $fullname);                  exec($CMD{rcsdiff}, @difftype, "-r$rev1", "-r$rev2", $fullname) or exit -1;
         }          }
         if ($human_readable) {          if ($human_readable) {
                 http_header();                  http_header();
                 &human_readable_diff($fh, $rev2);                  &human_readable_diff($fh, $rev2);
                   html_footer();
                 gzipclose();                  gzipclose();
                 exit;                  exit;
         } else {          } else {
Line 2070  sub getDirLogs($$@) {
Line 2089  sub getDirLogs($$@) {
                 if (!open($fh, "-|")) {    # child                  if (!open($fh, "-|")) {    # child
                         open(STDERR, '>/dev/null'); # rlog may complain; ignore.                          open(STDERR, '>/dev/null'); # rlog may complain; ignore.
                         openOutputFilter();                          openOutputFilter();
                         exec($CMD{rlog}, @files);                          exec($CMD{rlog}, @files) or exit -1;
                 }                  }
         } else {          } else {
   
                 if (!open($fh, "-|")) {    # child                  if (!open($fh, "-|")) {    # child
                         open(STDERR, '>/dev/null'); # rlog may complain; ignore.                          open(STDERR, '>/dev/null'); # rlog may complain; ignore.
                         openOutputFilter();                          openOutputFilter();
                         exec($CMD{rlog}, '-r', @files);                          exec($CMD{rlog}, '-r', @files) or exit -1;
                 }                  }
         }          }
         $state = "start";          $state = "start";
Line 2135  sub getDirLogs($$@) {
Line 2154  sub getDirLogs($$@) {
                 }                  }
   
                 if ($state eq "tags") {                  if ($state eq "tags") {
                         if (/^\s+(.+):\s+([\d\.]+)\s+$/) {                          if (/^\s+([^:]+):\s+([\d\.]+)\s*$/) {
                                 push (@filetags, $1);                                  push (@filetags, $1);
                                 $symrev{$1}  = $2;                                  $symrev{$1}  = $2;
                                 $alltags{$1} = 1;                                  $alltags{$1} = 1;
Line 2227  sub getDirLogs($$@) {
Line 2246  sub getDirLogs($$@) {
                                 $state = "log";                                  $state = "log";
                                 $log   = '';                                  $log   = '';
                                 next;                                  next;
                         } elsif ($rev eq '' && /^revision (.*)$/) {                          } elsif ($rev eq '' && /^revision (\d+(?:\.\d+)+).*$/) {
                                 $rev = $1;                                  $rev = $1; # .*$ eats up the locker(lockers?) info, if any
                                 next;                                  next;
                         } else {                          } else {
                                 $log .= $_;                                  $log .= $_;
Line 2274  sub readLog($;$) {
Line 2293  sub readLog($;$) {
         if (!open($fh, "-|")) {    # child          if (!open($fh, "-|")) {    # child
                 if ($revision ne '') {                  if ($revision ne '') {
                         openOutputFilter();                          openOutputFilter();
                         exec($CMD{rlog}, $revision, $fullname);                          exec($CMD{rlog}, $revision, $fullname) or exit -1;
                 } else {                  } else {
                         openOutputFilter();                          openOutputFilter();
                         exec($CMD{rlog}, $fullname);                          exec($CMD{rlog}, $fullname) or exit -1;
                 }                  }
         }          }
   
Line 2307  sub readLog($;$) {
Line 2326  sub readLog($;$) {
         # date: 1995/11/29 22:15:52;  author: fenner;  state: Exp;  lines: +5 -3          # date: 1995/11/29 22:15:52;  author: fenner;  state: Exp;  lines: +5 -3
         # log info          # log info
         # ----------------------------          # ----------------------------
   
           # For a locked revision, the first line after the separator
           # becomes smth like
           # revision 9.19 locked by: vassilii;
   
         logentry:          logentry:
   
         while (!/$LOG_FILESEPARATOR/o) {          while (!/$LOG_FILESEPARATOR/o) {
                 $_ = <$fh>;                  $_ = <$fh>;
                 last logentry if (!defined($_));    # EOF                  last logentry if (!defined($_));    # EOF
                 print "R:", $_ if ($verbose);                  print "R:", $_ if ($verbose);
                 if (/^revision ([\d\.]+)/) {                  if (/^revision (\d+(?:\.\d+)+)/) {
                         $rev = $1;                          $rev = $1;
                         unshift (@allrevisions, $rev);                          unshift (@allrevisions, $rev);
                 } elsif (/$LOG_FILESEPARATOR/o || /$LOG_REVSEPARATOR/o) {                  } elsif (/$LOG_FILESEPARATOR/o || /$LOG_REVSEPARATOR/o) {
Line 2516  sub printLog($;$) {
Line 2540  sub printLog($;$) {
         $link = 1 if (!defined($link));          $link = 1 if (!defined($link));
         $isDead = ($state{$_} eq "dead");          $isDead = ($state{$_} eq "dead");
   
           print "<p>\n";
         if ($link && !$isDead) {          if ($link && !$isDead) {
                 my ($filename);                  my ($filename);
                 ($filename = $where) =~ s/^.*\///;                  ($filename = $where) =~ s/^.*\///;
Line 2637  sub printLog($;$) {
Line 2662  sub printLog($;$) {
                 my %diffrev = ();                  my %diffrev = ();
                 $diffrev{$_} = 1;                  $diffrev{$_} = 1;
                 $diffrev{""} = 1;                  $diffrev{""} = 1;
                 print "<br>Diff";                  print '<br>';
                   my $diff = 'Diff';
   
                 #                  #
                 # Offer diff to previous revision                  # Offer diff to previous revision
Line 2648  sub printLog($;$) {
Line 2674  sub printLog($;$) {
                             sprintf('%s.diff?r1=%s&r2=%s%s', $scriptwhere,                              sprintf('%s.diff?r1=%s&r2=%s%s', $scriptwhere,
                                 $prev, $_, $barequery);                                  $prev, $_, $barequery);
   
                         print " to previous ";                          print $diff, " to previous ";
                           $diff = '';
                         printDiffLinks($prev, $url);                          printDiffLinks($prev, $url);
                 }                  }
   
Line 2662  sub printLog($;$) {
Line 2689  sub printLog($;$) {
                             sprintf('%s.diff?r1=%s&r2=%s%s', $scriptwhere, $brp,                              sprintf('%s.diff?r1=%s&r2=%s%s', $scriptwhere, $brp,
                                 $_, $barequery);                                  $_, $barequery);
   
                         print " to branchpoint ";                          print $diff, " to branchpoint ";
                           $diff = '';
                         printDiffLinks($brp, $url);                          printDiffLinks($brp, $url);
                 }                  }
   
Line 2704  sub printLog($;$) {
Line 2732  sub printLog($;$) {
                                         $scriptwhere, $nextmain, $_,                                          $scriptwhere, $nextmain, $_,
                                         $barequery);                                          $barequery);
   
                                 print " next main ";                                  print $diff, " next main ";
                                   $diff = '';
                                 printDiffLinks($nextmain, $url);                                  printDiffLinks($nextmain, $url);
                         }                          }
                 }                  }
Line 2718  sub printLog($;$) {
Line 2747  sub printLog($;$) {
                             sprintf('%s.diff?r1=%s&r2=%s%s', $scriptwhere,                              sprintf('%s.diff?r1=%s&r2=%s%s', $scriptwhere,
                                 $input{'r1'}, $_, $barequery);                                  $input{'r1'}, $_, $barequery);
   
                         print " to selected ";                          print $diff, " to selected ";
                           $diff = '';
                         printDiffLinks($input{'r1'}, $url);                          printDiffLinks($input{'r1'}, $url);
                 }                  }
   
                   print '<br>' if $diff;
         }          }
         print "<pre>\n";          print "\n</p>\n<pre>\n";
         print &htmlify($log{$_}, 1);          print &htmlify($log{$_}, $allow_log_extra);
         print "</pre>\n";          print "</pre>\n";
 }  }
   
Line 2737  sub doLog($) {
Line 2769  sub doLog($) {
         ($upwhere  = $where) =~ s|(Attic/)?[^/]+$||;          ($upwhere  = $where) =~ s|(Attic/)?[^/]+$||;
         ($filename = $where) =~ s|^.*/||;          ($filename = $where) =~ s|^.*/||;
         $backurl = $scriptname . "/" . urlencode($upwhere) . $query;          $backurl = $scriptname . "/" . urlencode($upwhere) . $query;
           print "<p>\n ";
         print &link($backicon, "$backurl#$filename"), " <b>Up to ",          print &link($backicon, "$backurl#$filename"), " <b>Up to ",
             &clickablePath($upwhere, 1), "</b><p>\n";              &clickablePath($upwhere, 1), "</b>\n</p>\n";
           print "<p>\n ";
         print &link('Request diff between arbitrary revisions', '#diff');          print &link('Request diff between arbitrary revisions', '#diff');
         print '<hr noshade>';          print "\n</p>\n<hr noshade>\n";
   
           print "<p>\n";
         if ($curbranch) {          if ($curbranch) {
                 print "Default branch: ", ($revsym{$curbranch} || $curbranch);                  print "Default branch: ", ($revsym{$curbranch} || $curbranch);
         } else {          } else {
Line 2752  sub doLog($) {
Line 2787  sub doLog($) {
         if ($input{only_with_tag}) {          if ($input{only_with_tag}) {
                 print "Current tag: $input{only_with_tag}<br>\n";                  print "Current tag: $input{only_with_tag}<br>\n";
         }          }
           print "</p>\n";
   
         undef %nameprinted;          undef %nameprinted;
   
         for (my $i = 0 ; $i <= $#revdisplayorder ; $i++) {          for (my $i = 0 ; $i <= $#revdisplayorder ; $i++) {
                 print "<hr size=\"1\" noshade>";                  print "<hr size=\"1\" noshade>\n";
                 printLog($revdisplayorder[$i]);                  printLog($revdisplayorder[$i]);
         }          }
   
         print "<hr noshade>";          print "<hr noshade>\n<p>\n";
         print "<a name=\"diff\">\n";          print "<a name=\"diff\">\n";
         print "This form allows you to request diff's between any two\n";          print "This form allows you to request diff's between any two\n";
         print "revisions of a file.  You may select a symbolic revision\n";          print "revisions of a file.  You may select a symbolic revision\n";
         print "name using the selection box or you may type in a numeric\n";          print "name using the selection box or you may type in a numeric\n";
         print "name using the type-in text box.\n";          print "name using the type-in text box.\n";
         print "</a><p>\n";          print "</a>\n</p>\n";
         print          print
             "<form method=\"get\" action=\"${scriptwhere}.diff\" name=\"diff_select\">\n";              "<form method=\"get\" action=\"${scriptwhere}.diff\" name=\"diff_select\">\n";
   
Line 2777  sub doLog($) {
Line 2813  sub doLog($) {
                     && ((!defined($DEFAULTVALUE{$_})                      && ((!defined($DEFAULTVALUE{$_})
                     || $input{$_} ne $DEFAULTVALUE{$_}) && $input{$_} ne ""));                      || $input{$_} ne $DEFAULTVALUE{$_}) && $input{$_} ne ""));
         }          }
         print "<table><tr>\n";          print "<table style=\"border: none\">\n<tr>\n";
         print "<td align=\"right\">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</option>\n";          print "<option value=\"text\" selected>Use Text Field</option>\n";
Line 2786  sub doLog($) {
Line 2822  sub doLog($) {
         $diffrev = $revdisplayorder[$#revdisplayorder];          $diffrev = $revdisplayorder[$#revdisplayorder];
         $diffrev = $input{"r1"} if (defined($input{"r1"}));          $diffrev = $input{"r1"} if (defined($input{"r1"}));
         print          print
             "<input type=\"text\" size=\"$inputTextSize\" name=\"tr1\" value=\"$diffrev\" onchange=\"document.diff_select.r1.selectedIndex=0\"></td>";              "<input type=\"text\" size=\"$inputTextSize\" name=\"tr1\" value=\"$diffrev\" onchange=\"document.diff_select.r1.selectedIndex=0\"></td>\n";
         print "<td><br></td></tr>\n";          print "<td><br></td>\n</tr>\n";
         print "<tr><td align=\"right\">and \n";          print "<tr>\n<td align=\"right\">and \n";
         print "<select name=\"r2\">\n";          print "<select name=\"r2\">\n";
         print "<option value=\"text\" selected>Use Text Field</option>\n";          print "<option value=\"text\" selected>Use Text Field</option>\n";
         print $sel;          print $sel;
Line 2796  sub doLog($) {
Line 2832  sub doLog($) {
         $diffrev = $revdisplayorder[0];          $diffrev = $revdisplayorder[0];
         $diffrev = $input{"r2"} if (defined($input{"r2"}));          $diffrev = $input{"r2"} if (defined($input{"r2"}));
         print          print
             "<input type=\"text\" size=\"$inputTextSize\" name=\"tr2\" value=\"$diffrev\" onchange=\"document.diff_select.r2.selectedIndex=0\"></td>";              "<input type=\"text\" size=\"$inputTextSize\" name=\"tr2\" value=\"$diffrev\" onchange=\"document.diff_select.r2.selectedIndex=0\"></td>\n";
         print "<td><input type=\"submit\" value=\"  Get Diffs  \"></td>\n";          print "<td><input type=\"submit\" value=\"  Get Diffs  \"></td>\n";
           print "</tr>\n</table>\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 "<form method=\"get\" action=\"$scriptwhere\">\n";
         print "<tr><td align=\"right\">Preferred Diff type:</td>";          print "<table style=\"border: none\">\n";
           print "<tr>\n<td align=\"right\">Preferred Diff type:</td>\n";
         print "<td>";          print "<td>";
         printDiffSelect($use_java_script);          printDiffSelect($use_java_script);
         print "</td><td></td></tr>\n";          print "</td>\n<td></td>\n</tr>\n";
   
         if (@branchnames) {          if (@branchnames) {
                 print "<tr><td align=\"right\">View only Branch:</td>";                  print "<tr>\n<td align=\"right\">View only Branch:</td>\n";
                 print "<td>";                  print "<td>";
                 print "<a name=\"branch\"></a>\n";                  print "<a name=\"branch\"></a>\n";
                 print "<select name=\"only_with_tag\"";                  print "<select name=\"only_with_tag\"";
Line 2828  sub doLog($) {
Line 2864  sub doLog($) {
                             && $input{"only_with_tag"} eq $_);                              && $input{"only_with_tag"} eq $_);
                         print ">${_}</option>\n";                          print ">${_}</option>\n";
                 }                  }
                 print "</select></td><td></td></tr>\n";                  print "</select></td>\n<td></td>\n</tr>\n";
         }          }
   
         foreach (@stickyvars) {          foreach (@stickyvars) {
Line 2840  sub doLog($) {
Line 2876  sub doLog($) {
                     && (!defined($DEFAULTVALUE{$_})                      && (!defined($DEFAULTVALUE{$_})
                     || $input{$_} ne $DEFAULTVALUE{$_}) && $input{$_} ne "");                      || $input{$_} ne $DEFAULTVALUE{$_}) && $input{$_} ne "");
         }          }
         print "<tr><td align=\"right\">";          print "<tr>\n<td align=\"right\">";
         print "<a name=\"logsort\"></a>\n";          print "<a name=\"logsort\"></a>\n";
         print "Sort log by:</td>";          print "Sort log by:</td>\n";
         print "<td>";          print "<td>";
         printLogSortSelect($use_java_script);          printLogSortSelect($use_java_script);
         print "</td>";          print "</td>\n";
         print "<td><input type=\"submit\" value=\"  Set  \"></td>";          print "<td><input type=\"submit\" value=\"  Set  \"></td>\n";
           print "</tr>\n</table>\n";
         print "</form>\n";          print "</form>\n";
         print "</tr></table>";          html_footer();
         print &html_footer;  
 }  }
   
 sub flush_diff_rows($$$$) {  sub flush_diff_rows($$$$) {
Line 2863  sub flush_diff_rows($$$$) {
Line 2899  sub flush_diff_rows($$$$) {
         if ($state eq "PreChangeRemove") {    # we just got remove-lines before          if ($state eq "PreChangeRemove") {    # we just got remove-lines before
                 for ($j = 0 ; $j < $leftRow ; $j++) {                  for ($j = 0 ; $j < $leftRow ; $j++) {
                         print                          print
                             "<tr><td bgcolor=\"$diffcolorRemove\">@$leftColRef[$j]</td>";                              "<tr>\n<td class=\"diff-removed\">&nbsp;@$leftColRef[$j]</td>\n";
                         print                          print
                             "<td bgcolor=\"$diffcolorEmpty\">&nbsp;</td></tr>\n";                              "<td class=\"diff-empty\">&nbsp;</td>\n</tr>\n";
                 }                  }
         } elsif ($state eq "PreChange") {    # state eq "PreChange"          } elsif ($state eq "PreChange") {    # state eq "PreChange"
                     # we got removes with subsequent adds                      # we got removes with subsequent adds
   
                 for ($j = 0 ; $j < $leftRow || $j < $rightRow ; $j++)                  for ($j = 0 ; $j < $leftRow || $j < $rightRow ; $j++)
                 {    # dump out both cols                  {    # dump out both cols
                         print "<tr>";                          print "<tr>\n";
                         if ($j < $leftRow) {                          if ($j < $leftRow) {
                                 print                                  print
                                     "<td bgcolor=\"$diffcolorChange\">@$leftColRef[$j]</td>";                                      "<td class=\"diff-changed\">&nbsp;@$leftColRef[$j]</td>";
                         } else {                          } else {
                                 print                                  print
                                     "<td bgcolor=\"$diffcolorDarkChange\">&nbsp;</td>";                                      "<td class=\"diff-changed-missing\">&nbsp;</td>";
                         }                          }
                           print "\n";
   
                         if ($j < $rightRow) {                          if ($j < $rightRow) {
                                 print                                  print
                                     "<td bgcolor=\"$diffcolorChange\">@$rightColRef[$j]</td>";                                      "<td class=\"diff-changed\">&nbsp;@$rightColRef[$j]</td>";
                         } else {                          } else {
                                 print                                  print
                                     "<td bgcolor=\"$diffcolorDarkChange\">&nbsp;</td>";                                      "<td class=\"diff-changed-missing\">&nbsp;</td>";
                         }                          }
                         print "</tr>\n";                          print "\n</tr>\n";
                 }                  }
         }          }
 }  }
Line 2927  sub human_readable_diff($) {
Line 2964  sub human_readable_diff($) {
         }          }
   
         print          print
             "<h3 align=\"center\">Diff for /$where_nd between version $rev1 and $rev2</h3>\n",              "<h3 style=\"text-align: center\">Diff for /$where_nd between version $rev1 and $rev2</h3>\n",
               # Using style=\"border: none\" here breaks NS 4.x badly...
             "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">\n",              "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">\n",
             "<tr bgcolor=\"#ffffff\">\n", "<th width=\"50%\" valign=\"top\">",              "<tr style=\"background-color: #ffffff\">\n", "<th width=\"50%\" valign=\"top\">",
             "version $rev1";              "version $rev1";
         print ", $date1"         if (defined($date1));          print ", $date1"         if (defined($date1));
         print "<br>Tag: $sym1\n" if ($sym1);          print "<br>Tag: $sym1\n" if ($sym1);
Line 2938  sub human_readable_diff($) {
Line 2976  sub human_readable_diff($) {
         print "<br>Tag: $sym2\n" if ($sym1);          print "<br>Tag: $sym2\n" if ($sym1);
         print "</th>\n";          print "</th>\n";
   
         my $fs = "<font face=\"$difffontface\" size=\"$difffontsize\"><tt>";  
         my $fe = "</tt></font>";  
   
         my $leftRow  = 0;          my $leftRow  = 0;
         my $rightRow = 0;          my $rightRow = 0;
         my ($oldline, $newline, $funname, $diffcode, $rest);          my ($oldline, $newline, $funname, $diffcode, $rest);
   
         # Process diff text          # Process diff text
         # The diffrows are could make excellent use of  
         # cascading style sheets because we've to set the  
         # font and color for each row. anyone ...?  
         ####  
   
         # prefetch several lines          # prefetch several lines
         my @buf = head($fh);          my @buf = head($fh);
Line 2963  sub human_readable_diff($) {
Line 2994  sub human_readable_diff($) {
                         ($oldline, $newline, $funname) =                          ($oldline, $newline, $funname) =
                             $difftxt =~ /@@ \-([0-9]+).*\+([0-9]+).*@@(.*)/;                              $difftxt =~ /@@ \-([0-9]+).*\+([0-9]+).*@@(.*)/;
                         $funname = htmlquote($funname);                          $funname = htmlquote($funname);
                           $funname =~ s/\s/&nbsp;/go;
                         print                          print
                             "<tr bgcolor=\"$diffcolorHeading\"><td width=\"50%\">";                              "<tr class=\"diff-heading\">\n<td width=\"50%\">";
                         print                          print
                             "<table width=\"100%\" border=\"1\" cellpadding=\"5\"><tr><td><b>Line $oldline</b>";                              "<table width=\"100%\" border=\"1\" cellpadding=\"5\">\n<tr>\n<td><b>Line&nbsp;$oldline</b>";
                         print                          print
                             "&nbsp;<font size=\"-1\">$funname</font></td></tr></table>";                              "&nbsp;<span style=\"font-size: smaller\">$funname</span></td>\n</tr>\n</table>";
                         print "</td><td width=\"50%\">";                          print "</td>\n<td width=\"50%\">";
                         print                          print
                             "<table width=\"100%\" border=\"1\" cellpadding=\"5\"><tr><td><b>Line $newline</b>";                              "<table width=\"100%\" border=\"1\" cellpadding=\"5\">\n<tr>\n<td><b>Line&nbsp;$newline</b>";
                         print                          print
                             "&nbsp;<font size=\"-1\">$funname</font></td></tr></table>";                              "&nbsp;<span style=\"font-size: smaller\">$funname</span></td>\n</tr>\n</table>\n";
                         print "</td>\n";                          print "</td>\n";
                         $state    = "dump";                          $state    = "dump";
                         $leftRow  = 0;                          $leftRow  = 0;
Line 2982  sub human_readable_diff($) {
Line 3014  sub human_readable_diff($) {
                         ($diffcode, $rest) = $difftxt =~ /^([-+ ])(.*)/;                          ($diffcode, $rest) = $difftxt =~ /^([-+ ])(.*)/;
                         $_ = spacedHtmlText($rest, $d{'tabstop'});                          $_ = spacedHtmlText($rest, $d{'tabstop'});
   
                         # Add fontface, size  
                         $_ = "$fs&nbsp;$_$fe";  
   
                         #########                          #########
                         # little state machine to parse unified-diff output (Hen, zeller@think.de)                          # little state machine to parse unified-diff output (Hen, zeller@think.de)
                         # in order to get some nice 'ediff'-mode output                          # in order to get some nice 'ediff'-mode output
Line 2998  sub human_readable_diff($) {
Line 3027  sub human_readable_diff($) {
                                 if ($state eq "dump")                                  if ($state eq "dump")
                                 { # 'change' never begins with '+': just dump out value                                  { # 'change' never begins with '+': just dump out value
                                         print                                          print
                                             "<tr><td bgcolor=\"$diffcolorEmpty\">&nbsp;</td><td bgcolor=\"$diffcolorAdd\">$_</td></tr>\n";                                              "<tr>\n<td class=\"diff-empty\">&nbsp;</td>\n<td class=\"diff-added\">&nbsp;$_</td>\n</tr>\n";
                                 } else {    # we got minus before                                  } else {    # we got minus before
                                         $state = "PreChange";                                          $state = "PreChange";
                                         $rightCol[$rightRow++] = $_;                                          $rightCol[$rightRow++] = $_;
Line 3009  sub human_readable_diff($) {
Line 3038  sub human_readable_diff($) {
                         } else {    # empty diffcode                          } else {    # empty diffcode
                                 flush_diff_rows \@leftCol, \@rightCol, $leftRow,                                  flush_diff_rows \@leftCol, \@rightCol, $leftRow,
                                     $rightRow;                                      $rightRow;
                                 print "<tr><td>$_</td><td>$_</td></tr>\n";                                  print "<tr>\n<td class=\"diff-same\">&nbsp;$_</td>\n<td class=\"diff-same\">&nbsp;$_</td>\n</tr>\n";
                                 $state    = "dump";                                  $state    = "dump";
                                 $leftRow  = 0;                                  $leftRow  = 0;
                                 $rightRow = 0;                                  $rightRow = 0;
Line 3022  sub human_readable_diff($) {
Line 3051  sub human_readable_diff($) {
   
         # state is empty if we didn't have any change          # state is empty if we didn't have any change
         if (!$state) {          if (!$state) {
                 print "<tr><td colspan=\"2\">&nbsp;</td></tr>";                  print "<tr>\n<td colspan=\"2\">&nbsp;</td>\n</tr>\n";
                 print "<tr bgcolor=\"$diffcolorEmpty\">";                  print "<tr class=\"diff-empty\">\n";
                 print                  print
                     "<td colspan=\"2\" align=\"center\"><b>- No viewable change -</b></td></tr>";                      "<td colspan=\"2\" align=\"center\"><b>- No viewable change -</b></td>\n</tr>\n";
         }          }
         print "</table>";          print "</table>\n";
   
         print "<br><hr noshade width=\"100%\">\n";          print "<hr style=\"width: 100%\" noshade>\n";
           print "<form method=\"get\" action=\"${scriptwhere}\">\n";
           print "<table style=\"border: none\">\n<tr>\n<td>\n";
   
         print "<table border=\"0\">";  
   
         print "<tr><td>";  
   
         # print legend          # print legend
         print "<table border=\"1\"><tr><td>";          print "<table border=\"1\">\n<tr>\n<td>";
         print "Legend:<br><table border=\"0\" cellspacing=\"0\" cellpadding=\"1\">\n";          print "Legend:<br><table style=\"border: none\" cellspacing=\"0\" cellpadding=\"1\">\n";
         print          print
             "<tr><td align=\"center\" bgcolor=\"$diffcolorRemove\">Removed from v.$rev1</td><td bgcolor=\"$diffcolorEmpty\">&nbsp;</td></tr>";              "<tr>\n<td align=\"center\" class=\"diff-removed\">Removed from v.$rev1</td>\n<td class=\"diff-empty\">&nbsp;</td>\n</tr>\n";
         print          print
             "<tr bgcolor=\"$diffcolorChange\"><td align=\"center\" colspan=\"2\">changed lines</td></tr>";              "<tr class=\"diff-changed\">\n<td align=\"center\" colspan=\"2\">changed lines</td>\n</tr>\n";
         print          print
             "<tr><td bgcolor=\"$diffcolorEmpty\">&nbsp;</td><td align=\"center\" bgcolor=\"$diffcolorAdd\">Added in v.$rev2</td></tr>";              "<tr>\n<td class=\"diff-empty\">&nbsp;</td>\n<td align=\"center\" class=\"diff-added\">Added in v.$rev2</td>\n</tr>\n";
         print "</table></td></tr></table>\n";          print "</table>\n</td>\n</tr>\n</table>\n</td>\n<td>";
   
         print "<td>";  
   
         # Print format selector          # Print format selector
         print "<form method=\"get\" action=\"${scriptwhere}\">\n";  
         foreach my $var (keys %input) {          foreach my $var (keys %input) {
                 next if ($var eq "f");                  next if ($var eq "f");
                 next                  next
Line 3060  sub human_readable_diff($) {
Line 3084  sub human_readable_diff($) {
         }          }
         printDiffSelect($use_java_script);          printDiffSelect($use_java_script);
         print "<input type=\"submit\" value=\"Show\">\n";          print "<input type=\"submit\" value=\"Show\">\n";
         print "</form>\n";          print "</td>\n";
         print "</td>";  
   
         print "</tr></table>";          print "</tr>\n</table>\n";
           print "</form>\n";
 }  }
   
 sub navigateHeader($$$$$) {  sub navigateHeader($$$$$) {
Line 3071  sub navigateHeader($$$$$) {
Line 3095  sub navigateHeader($$$$$) {
         $swhere = "" if ($swhere eq $scriptwhere);          $swhere = "" if ($swhere eq $scriptwhere);
         $swhere = './' . urlencode($filename) if ($swhere eq "");          $swhere = './' . urlencode($filename) if ($swhere eq "");
   
           # TODO: this should be moved into external CSS file.
           my $css = '';
           if ($title eq 'diff') {
               $css = "
   <style type=\"text/css\">
   .diff-heading {
     background-color: $diffcolorHeading;
   }
   .diff-same {
     font-family: $difffontface;
     font-size: smaller;
   }
   .diff-empty {
     background-color: $diffcolorEmpty;
   }
   .diff-added {
     background-color: $diffcolorAdd;
     font-family: $difffontface;
     font-size: smaller;
   }
   .diff-removed {
     background-color: $diffcolorRemove;
     font-family: $difffontface;
     font-size: smaller;
   }
   .diff-changed {
     background-color: $diffcolorChange;
     font-family: $difffontface;
     font-size: smaller;
   }
   .diff-changed-missing {
     background-color: $diffcolorDarkChange;
   }
   </style>";
           }
   
         print <<EOF;          print <<EOF;
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  $HTML_DOCTYPE
 <html>  <html>
 <head>  <head>
 <meta name="robots" content="nofollow">  <meta name="robots" content="nofollow">
   <meta http-equiv="Content-Script-Type" content="application/x-javascript">
   <meta http-equiv="Content-Style-Type" content="text/css">
 <!-- FreeBSD-cvsweb $cvsweb_revision -->  <!-- FreeBSD-cvsweb $cvsweb_revision -->
 <title>$path$filename - $title - $rev</title>  <title>$path$filename - $title - $rev</title>$css
 </head>  </head>
 $body_tag_for_src  $body_tag_for_src
 <table width="100%" border="0" cellspacing="0" cellpadding="1" bgcolor="$navigationHeaderColor">  <table width="100%" style="border: none; background-color: $navigationHeaderColor" cellspacing="0" cellpadding="1">
 <tr valign="bottom"><td>  <tr valign="bottom"><td>
 EOF  EOF
   
Line 3195  sub clickablePath($$) {
Line 3257  sub clickablePath($$) {
 }  }
   
 sub chooseCVSRoot() {  sub chooseCVSRoot() {
   
           print "<form method=\"get\" action=\"${scriptwhere}\">\n";
         if (2 <= @CVSROOT) {          if (2 <= @CVSROOT) {
                 my ($k);                  my ($k);
                 print "<form method=\"GET\" action=\"${scriptwhere}\">\n";  
                 foreach $k (keys %input) {                  foreach $k (keys %input) {
                         print "<input type=\"hidden\" name=\"$k\" value=\"$input{$k}\">\n"                          print "<input type=\"hidden\" name=\"$k\" value=\"$input{$k}\">\n"
                             if ($input{$k}) && ($k ne "cvsroot");                              if ($input{$k}) && ($k ne "cvsroot");
Line 3206  sub chooseCVSRoot() {
Line 3269  sub chooseCVSRoot() {
                 # Form-Elements look wierd in Netscape if the background                  # Form-Elements look wierd in Netscape if the background
                 # isn't gray and the form elements are not placed                  # isn't gray and the form elements are not placed
                 # within a table ...                  # within a table ...
                 print "<table><tr>";                  print "<table style=\"border: none\">\n<tr>\n";
                 print "<td>CVS Root:</td>";                  print "<td>CVS Root:</td>\n";
                 print "<td>\n<select name=\"cvsroot\"";                  print "<td>\n<select name=\"cvsroot\"";
                 print " onchange=\"this.form.submit()\"" if $use_java_script;                  print " onchange=\"this.form.submit()\"" if $use_java_script;
                 print ">\n";                  print ">\n";
Line 3218  sub chooseCVSRoot() {
Line 3281  sub chooseCVSRoot() {
                         print ">",($CVSROOTdescr{$k} ? $CVSROOTdescr{$k} : $k),                          print ">",($CVSROOTdescr{$k} ? $CVSROOTdescr{$k} : $k),
                             "</option>\n";                              "</option>\n";
                 }                  }
                 print "</select>\n</td>";                  print "</select>\n</td>\n<td>";
                 print "<td>";  
         } else {          } else {
   
                 # no choice -- but we need the form to select module/path, at least for Netscape                  # no choice -- but we need the form to select module/path,
                 print "<form method=\"get\" action=\"${scriptwhere}\">\n";                  # at least for Netscape
                   print "<p>\n";
                 print "CVS Root: <b>[$cvstree]</b>";                  print "CVS Root: <b>[$cvstree]</b>";
         }          }
   
Line 3232  sub chooseCVSRoot() {
Line 3295  sub chooseCVSRoot() {
         print "<input type=\"submit\" value=\"Go\">";          print "<input type=\"submit\" value=\"Go\">";
   
         if (2 <= @CVSROOT) {          if (2 <= @CVSROOT) {
                 print "</td></tr></table>";                  print "</td>\n</tr>\n</table>";
           } else {
                   print "</p>";
         }          }
         print "</form>";          print "\n</form>";
 }  }
   
 sub chooseMirror() {  sub chooseMirror() {
Line 3499  sub http_header(;$) {
Line 3564  sub http_header(;$) {
                                 print "\r\n";    # Close headers                                  print "\r\n";    # Close headers
                         }                          }
                         print                          print
                             "<font size=\"-1\">Unable to find gzip binary in the <b>\$command_path</b> ($command_path) to compress output</font><br>";                              "<span style=\"font-size: smaller\">Unable to find gzip binary in the <b>\$command_path</b> ($command_path) to compress output</span><br>";
                 }                  }
         } else {          } else {
   
Line 3515  sub html_header($) {
Line 3580  sub html_header($) {
         my ($title) = @_;          my ($title) = @_;
         http_header("text/html");          http_header("text/html");
         print <<EOH;          print <<EOH;
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  $HTML_DOCTYPE
 <html>  <html>
 <head>  <head>
 <meta name="robots" content="nofollow">  <meta name="robots" content="nofollow">
   <meta http-equiv="Content-Script-Type" content="application/x-javascript">
   <meta http-equiv="Content-Style-Type" content="text/css">
 <title>$title</title>  <title>$title</title>
 <!-- FreeBSD-cvsweb $cvsweb_revision -->  <!-- FreeBSD-cvsweb $cvsweb_revision -->
 </head>  </head>
Line 3528  EOH
Line 3595  EOH
 }  }
   
 sub html_footer() {  sub html_footer() {
         return "<hr noshade><address>$address</address></body></html>\n";          print "<hr noshade>\n<address>$address</address>\n</body>\n</html>\n";
 }  }
   
 sub link_tags($) {  sub link_tags($) {

Legend:
Removed from v.1.1.1.29  
changed lines
  Added in v.1.1.1.30

CVSweb