[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.11 and 3.35

version 1.1.1.11, 2000/10/20 15:54:58 version 3.35, 2000/10/10 21:14:05
Line 43 
Line 43 
 # SUCH DAMAGE.  # SUCH DAMAGE.
 #  #
 # $zId: cvsweb.cgi,v 1.103 2000/09/20 17:02:29 jumager Exp $  # $zId: cvsweb.cgi,v 1.103 2000/09/20 17:02:29 jumager Exp $
 # $kId: cvsweb.cgi,v 1.37 2000/10/20 15:46:01 knu Exp $  # $Id$
 #  #
 ###  ###
   
Line 52  use strict;
Line 52  use strict;
 use vars qw (  use vars qw (
     $config $allow_version_select $verbose      $config $allow_version_select $verbose
     %CVSROOT %CVSROOTdescr %MIRRORS %DEFAULTVALUE %ICONS %MTYPES      %CVSROOT %CVSROOTdescr %MIRRORS %DEFAULTVALUE %ICONS %MTYPES
     @DIFFTYPES %DIFFTYPES @LOGSORTKEYS %LOGSORTKEYS  
     %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
Line 62  use vars qw (
Line 61  use vars qw (
     %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
     $bylog $byfile $defaultDiffType $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 $body_tag_for_src
Line 84  use vars qw (
Line 83  use vars qw (
 );  );
   
 sub printDiffSelect($);  sub printDiffSelect($);
 sub printDiffLinks($$);  
 sub printLogSortSelect($);  
 sub findLastModifiedSubdirs(@);  sub findLastModifiedSubdirs(@);
 sub htmlify_sub(&$);  
 sub htmlify($;$);  sub htmlify($;$);
 sub spacedHtmlText($;$);  sub spacedHtmlText($;$);
 sub link($$);  sub link($$);
Line 121  sub download_link($$$;$);
Line 117  sub download_link($$$;$);
 sub toggleQuery($$);  sub toggleQuery($$);
 sub urlencode($);  sub urlencode($);
 sub htmlquote($);  sub htmlquote($);
 sub htmlunquote($);  
 sub http_header(;$);  sub http_header(;$);
 sub html_header($);  sub html_header($);
 sub html_footer();  sub html_footer();
Line 169  $tabstop = $use_moddate = $moddate = $gzip_open = unde
Line 164  $tabstop = $use_moddate = $moddate = $gzip_open = unde
 $LOG_FILESEPARATOR = q/^={77}$/;  $LOG_FILESEPARATOR = q/^={77}$/;
 $LOG_REVSEPARATOR = q/^-{28}$/;  $LOG_REVSEPARATOR = q/^-{28}$/;
   
 @DIFFTYPES = qw(h H u c s);  
 @DIFFTYPES{@DIFFTYPES} = (  
                           {  
                            'descr'   => 'colored',  
                            'opts'    => [ '-u' ],  
                            'colored' => 1,  
                           },  
                           {  
                            'descr'   => 'long colored',  
                            'opts'    => [ '--unified=15' ],  
                            'colored' => 1,  
                           },  
                           {  
                            'descr'   => 'unified',  
                            'opts'    => [ '-u' ],  
                            'colored' => 0,  
                           },  
                           {  
                            'descr'   => 'context',  
                            'opts'    => [ '-c' ],  
                            'colored' => 0,  
                           },  
                           {  
                            'descr'   => 'side by side',  
                            'opts'    => [ '--side-by-side', '--width=164' ],  
                            'colored' => 0,  
                           },  
                          );  
   
 @LOGSORTKEYS = qw(cvs date rev);  
 @LOGSORTKEYS{@LOGSORTKEYS} = (  
                               {  
                                'descr' => 'Not sorted',  
                               },  
                               {  
                                'descr' => 'Commit date',  
                               },  
                               {  
                                'descr' => 'Revision',  
                               },  
                              );  
   
   
 ##### End of configuration variables #####  ##### End of configuration variables #####
   
 use Time::Local;  use Time::Local;
Line 375  else {
Line 327  else {
     $byfile = 1;      $byfile = 1;
 }  }
   
 $defaultDiffType = $input{'f'};  $hr_default = $input{'f'} eq 'h';
   
 $logsort = $input{'logsort'};  $logsort = $input{'logsort'};
   
Line 530  elsif (-d $fullname) {
Line 482  elsif (-d $fullname) {
             }              }
             print "<table  width=\"100%\" border=0 cellspacing=1 cellpadding=$tablepadding>\n";              print "<table  width=\"100%\" border=0 cellspacing=1 cellpadding=$tablepadding>\n";
             $infocols++;              $infocols++;
             printf '<tr><th align=left bgcolor="%s">',              print "<tr><th align=left bgcolor=\"" . (($byfile) ?
               $byfile ? $columnHeaderColorSorted : $columnHeaderColorDefault;                                                     $columnHeaderColorSorted :
                                                      $columnHeaderColorDefault) . "\">";
             if ($byfile) {              if ($byfile) {
                 print 'File';                  print 'File';
             } else {              } else {
Line 543  elsif (-d $fullname) {
Line 496  elsif (-d $fullname) {
             # with revision information:              # with revision information:
             if (scalar(%fileinfo)) {              if (scalar(%fileinfo)) {
                 $infocols++;                  $infocols++;
                 printf '<th align=left bgcolor="%s">',                  print "<th align=left bgcolor=\"" . (($byrev) ?
                   $byrev ? $columnHeaderColorSorted : $columnHeaderColorDefault;                                                     $columnHeaderColorSorted :
                                                      $columnHeaderColorDefault) . "\">";
                 if ($byrev) {                  if ($byrev) {
                     print 'Rev.';                      print 'Rev.';
                 } else {                  } else {
Line 553  elsif (-d $fullname) {
Line 507  elsif (-d $fullname) {
                 }                  }
                 print "</th>";                  print "</th>";
                 $infocols++;                  $infocols++;
                 printf '<th align=left bgcolor="%s">',                  print "<th align=left bgcolor=\"" . (($bydate) ?
                   $bydate ? $columnHeaderColorSorted : $columnHeaderColorDefault;                                                     $columnHeaderColorSorted :
                                                      $columnHeaderColorDefault) . "\">";
                 if ($bydate) {                  if ($bydate) {
                     print 'Age';                      print 'Age';
                 } else {                  } else {
                     print &link('Age', sprintf('./%s#dirlist',                      print &link('Age', sprintf('./%s#dirlist',
                                                &toggleQuery("sortby", "date")));                                                  &toggleQuery("sortby", "date")));
                 }                  }
                 print "</th>";                  print "</th>";
                 if ($show_author) {                  if ($show_author) {
                     $infocols++;                      $infocols++;
                     printf '<th align=left bgcolor="%s">',                      print "<th align=left bgcolor=\"" . (($byauthor) ?
                       $byauthor ? $columnHeaderColorSorted : $columnHeaderColorDefault;                                                     $columnHeaderColorSorted :
                                                      $columnHeaderColorDefault) . "\">";
                     if ($byauthor) {                      if ($byauthor) {
                         print 'Author';                          print 'Author';
                     } else {                      } else {
Line 575  elsif (-d $fullname) {
Line 531  elsif (-d $fullname) {
                     print "</th>";                      print "</th>";
                 }                  }
                 $infocols++;                  $infocols++;
                 printf '<th align=left bgcolor="%s">',                  print "<th align=left bgcolor=\"" . (($bylog) ?
                   $bylog ? $columnHeaderColorSorted : $columnHeaderColorDefault;                                                 $columnHeaderColorSorted :
                                                  $columnHeaderColorDefault) . "\">";
                 if ($bylog) {                  if ($bylog) {
                     print 'Last log entry';                      print 'Last log entry';
                 } else {                  } else {
                     print &link('Last log entry', sprintf('./%s#dirlist',                      print &link('Last log entry', sprintf('./%s#dirlist',
                                                           &toggleQuery("sortby", "log")));                                                    &toggleQuery("sortby", "log")));
                 }                  }
                 print "</th>";                  print "</th>";
             }              }
             elsif ($use_descriptions) {              elsif ($use_descriptions) {
                 printf '<th align=left bgcolor="%s">', $columnHeaderColorDefault;                  print "<th align=left bgcolor=\"". $columnHeaderColorDefault . "\">";
                 print "Description";                  print "Description";
                 $infocols++;                  $infocols++;
             }              }
Line 651  elsif (-d $fullname) {
Line 608  elsif (-d $fullname) {
                 next if ($_ eq '..' && $where eq '/');                  next if ($_ eq '..' && $where eq '/');
                 my ($rev,$date,$log,$author,$filename) = @{$fileinfo{$_}}                  my ($rev,$date,$log,$author,$filename) = @{$fileinfo{$_}}
                     if (defined($fileinfo{$_}));                      if (defined($fileinfo{$_}));
                 printf '<tr bgcolor="%s"><td>', $tabcolors[$dirrow % 2] if $dirtable;                  print "<tr bgcolor=\"" . @tabcolors[$dirrow%2] . "\"><td>" if ($dirtable);
                 if ($_ eq '..') {                  if ($_ eq '..') {
                     $url = "../$query";                      $url = "../" . $query;
                     if ($nofilelinks) {                      if ($nofilelinks) {
                         print $backicon;                          print $backicon;
                     }                      }
Line 663  elsif (-d $fullname) {
Line 620  elsif (-d $fullname) {
                     print " ", &link("Previous Directory", $url);                      print " ", &link("Previous Directory", $url);
                 }                  }
                 else {                  else {
                     $url = urlencode($_) . "/$query";                      $url = urlencode($_) . '/' . $query;
                     print "<A NAME=\"$_\"></A>";                      print "<A NAME=\"$_\"></A>";
                     if ($nofilelinks) {                      if ($nofilelinks) {
                         print $diricon;                          print $diricon;
Line 682  elsif (-d $fullname) {
Line 639  elsif (-d $fullname) {
                 if ($filename) {                  if ($filename) {
                     print "</td><td>&nbsp;</td><td>&nbsp;" if ($dirtable);                      print "</td><td>&nbsp;</td><td>&nbsp;" if ($dirtable);
                     if ($date) {                      if ($date) {
                         print " <i>", readableTime(time() - $date,0), "</i>";                          print " <i>" . readableTime(time() - $date,0) . "</i>";
                     }                      }
                     if ($show_author) {                      if ($show_author) {
                         print "</td><td>&nbsp;" if ($dirtable);                          print "</td><td>&nbsp;" if ($dirtable);
Line 693  elsif (-d $fullname) {
Line 650  elsif (-d $fullname) {
                     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;<font size=-1>"
                           &htmlify(substr($log,0,$shortLogLen));                              . &htmlify(substr($log,0,$shortLogLen));
                         if (length $log > 80) {                          if (length $log > 80) {
                             print "...";                              print "...";
                         }                          }
Line 704  elsif (-d $fullname) {
Line 661  elsif (-d $fullname) {
                 else {                  else {
                     my ($dwhere) = ($where ne "/" ? $where : "") . $_;                      my ($dwhere) = ($where ne "/" ? $where : "") . $_;
                     if ($use_descriptions && defined $descriptions{$dwhere}) {                      if ($use_descriptions && defined $descriptions{$dwhere}) {
                         print "<TD COLSPAN=", ($infocols-1), ">&nbsp;" if $dirtable;                          print "<TD COLSPAN=" . ($infocols-1) . ">&nbsp;" if $dirtable;
                         print $descriptions{$dwhere};                          print $descriptions{$dwhere};
                     } elsif ($dirtable && $infocols > 1) {                      } elsif ($dirtable && $infocols > 1) {
                         # close the row with the appropriate number of                          # close the row with the appropriate number of
Line 735  elsif (-d $fullname) {
Line 692  elsif (-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] if $dirtable;                  print "<tr bgcolor=\"" . @tabcolors[$dirrow%2] . "\"><td>" if ($dirtable);
                 print "<A NAME=\"$_\"></A>";                  print "<A NAME=\"$_\"></A>";
                 if ($nofilelinks) {                  if ($nofilelinks) {
                     print $fileicon;                      print $fileicon;
Line 750  elsif (-d $fullname) {
Line 707  elsif (-d $fullname) {
                               $defaultViewable ? "text/x-cvsweb-markup" : undef);                                $defaultViewable ? "text/x-cvsweb-markup" : undef);
                 print "</td><td>&nbsp;" if ($dirtable);                  print "</td><td>&nbsp;" if ($dirtable);
                 if ($date) {                  if ($date) {
                     print " <i>", readableTime(time() - $date,0), "</i>";                      print " <i>" . readableTime(time() - $date,0) . "</i>";
                 }                  }
                 if ($show_author) {                  if ($show_author) {
                     print "</td><td>&nbsp;" if ($dirtable);                      print "</td><td>&nbsp;" if ($dirtable);
Line 758  elsif (-d $fullname) {
Line 715  elsif (-d $fullname) {
                 }                  }
                 print "</td><td>&nbsp;" if ($dirtable);                  print "</td><td>&nbsp;" if ($dirtable);
                 if ($log) {                  if ($log) {
                     print " <font size=-1>", &htmlify(substr($log,0,$shortLogLen));                      print " <font size=-1>" . &htmlify(substr($log,0,$shortLogLen));
                     if (length $log > 80) {                      if (length $log > 80) {
                         print "...";                          print "...";
                     }                      }
Line 773  elsif (-d $fullname) {
Line 730  elsif (-d $fullname) {
         if ($dirtable && defined($tableBorderColor)) {          if ($dirtable && defined($tableBorderColor)) {
             print "</td></tr></table>";              print "</td></tr></table>";
         }          }
         print( $dirtable == 1 ? "</table>\n" : "</menu>\n" );          print "". ($dirtable == 1) ? "</table>" : "</menu>" . "\n";
   
         if ($filesexists && !$filesfound) {          if ($filesexists && !$filesfound) {
             print "<P><B>NOTE:</B> There are $filesexists files, but none matches the current tag ($input{only_with_tag})\n";              print "<P><B>NOTE:</B> There are $filesexists files, but none matches the current tag ($input{only_with_tag})\n";
Line 831  elsif (-d $fullname) {
Line 788  elsif (-d $fullname) {
             print "<OPTION",$byrev ? " SELECTED" : ""," VALUE=rev>Revision";              print "<OPTION",$byrev ? " SELECTED" : ""," VALUE=rev>Revision";
             print "<OPTION",$bylog ? " SELECTED" : ""," VALUE=log>Log message";              print "<OPTION",$bylog ? " SELECTED" : ""," VALUE=log>Log message";
             print "</SELECT></td>";              print "</SELECT></td>";
             print "<td>Sort log by: ";              print "<td>revisions by: \n";
             printLogSortSelect(0);              print "<SELECT NAME=logsort>\n";
             print "</td></tr>";              print "<OPTION VALUE=cvs",$logsort eq "cvs" ? " SELECTED" : "", ">Not sorted";
               print "<OPTION VALUE=date",$logsort eq "date" ? " SELECTED" : "", ">Commit date";
               print "<OPTION VALUE=rev",$logsort eq "rev" ? " SELECTED" : "", ">Revision";
               print "</SELECT></td></tr>";
             print "<tr><td>Diff format: ";              print "<tr><td>Diff format: ";
             printDiffSelect(0);              printDiffSelect(0);
             print "</td>";              print "</td>";
Line 927  gzipclose();
Line 887  gzipclose();
   
 sub printDiffSelect($) {  sub printDiffSelect($) {
     my ($use_java_script) = @_;      my ($use_java_script) = @_;
     my $f = $input{'f'};      my ($f) = $input{'f'};
       print "<SELECT NAME=\"f\"";
     print '<SELECT NAME="f"';      print " onchange=\"submit()\"" if ($use_java_script);
     print ' onchange="submit()"' if $use_java_script;      print ">\n";
     print '>';      print "<OPTION VALUE=h",$f eq "h" ? " SELECTED" : "", ">Colored Diff";
       print "<OPTION VALUE=H",$f eq "H" ? " SELECTED" : "", ">Long Colored Diff";
     local $_;      print "<OPTION VALUE=u",$f eq "u" ? " SELECTED" : "", ">Unidiff";
     for (@DIFFTYPES) {      print "<OPTION VALUE=c",$f eq "c" ? " SELECTED" : "", ">Context Diff";
         printf('<OPTION VALUE="%s"%s>%s',      print "<OPTION VALUE=s",$f eq "s" ? " SELECTED" : "", ">Side by Side";
                $_,  
                $f eq $_ ? ' SELECTED' : '',  
                "\u$DIFFTYPES{$_}{'descr'}"  
               );  
     }  
   
     print "</SELECT>";      print "</SELECT>";
 }  }
   
 sub printLogSortSelect($) {  
     my ($use_java_script) = @_;  
   
     print '<SELECT NAME="logsort"';  
     print ' onchange="submit()"' if $use_java_script;  
     print '>';  
   
     local $_;  
     for (@LOGSORTKEYS) {  
         printf('<OPTION VALUE="%s"%s>%s',  
                $_,  
                $logsort eq $_ ? ' SELECTED' : '',  
                "\u$LOGSORTKEYS{$_}{'descr'}"  
               );  
     }  
   
     print "</SELECT>";  
 }  
   
 sub findLastModifiedSubdirs(@) {  sub findLastModifiedSubdirs(@) {
     my (@dirs) = @_;      my (@dirs) = @_;
     my ($dirname, @files);      my ($dirname, @files);
Line 998  sub findLastModifiedSubdirs(@) {
Line 933  sub findLastModifiedSubdirs(@) {
     return @files;      return @files;
 }  }
   
 sub htmlify_sub(&$) {  
     (my $proc, local $_) = @_;  
     local @_ = split(m`(<a [^>]+>[^<]*</a>)`i);  
     my ($linked, $result);  
   
     while (($_, $linked) = splice(@_, 0, 2)) {  
         &$proc();  
         $result .= $_;  
         $result .= $linked;  
     }  
   
     $result;  
 }  
   
 sub htmlify($;$) {  sub htmlify($;$) {
     (local $_, my $extra) = @_;          (local $_, my $extra) = @_;
   
     $_ = htmlquote($_);          $_ = htmlquote($_);
   
     # get URL's as link          # get URL's as link
     s{          s`(http|ftp|https)(://[-a-zA-Z0-9%.~:_/]+)([?&]([-a-zA-Z0-9%.~:_]+)=([-a-zA-Z0-9%.~:_])+)*`&link("$1$2$3", "$1$2$3")`ge;        # `
       (http|ftp|https)://\S+          # get e-mails as link
      }{          s`[-a-zA-Z0-9_.]+@([-a-zA-Z0-9]+\.)+[A-Za-z]{2,4}`&link($&, "mailto:$&")`ge;    # `
          &link($&, htmlunquote($&))  
      }egx;  
   
     # get e-mails as link          if ($extra) {
     $_ = htmlify_sub {              # get PR #'s as link: "PR#nnnn" "PR: nnnn, ..." "PR nnnn, ..." "bin/nnnn"
         s<              if (defined($prcgi)) {
           [\w+=\-.!]+@[\w\-]+(\.[\w\-]+)+                  1 while s`\b(pr[:#]?\s*(?:#?\d+[,\s]\s*)*#?)(\d+)\b`$1 . &link($2, sprintf($prcgi, $2))`ie; # `;
             ><                  s`\b${prcategories}/(\d+)\b`&link($&, sprintf($prcgi, $1))`igeo;        # `;
               &link($&, "mailto:$&")              }
                 >egix;  
     } $_;  
   
     if ($extra) {              # get manpage specs as link: "foo.1" "foo(1)"
         # get PR #'s as link: "PR#nnnn" "PR: nnnn, ..." "PR nnnn, ..." "bin/nnnn"              if (defined($mancgi)) {
         if (defined($prcgi)) {                  s`\b([a-zA-Z]\w+)(?:\(([0-9n])\)\B|\.([0-9n])\b)`&link($&, sprintf($mancgi, $2 ne '' ? $2 : $3, $1))`ge; # `x;
             my $prev;              }
   
             do {  
                 $prev = $_;  
   
                 $_ = htmlify_sub {  
                     s{  
                       (\bPR[:\#]?\s*  
                        (?:  
                         \#?  
                         \d+[,\s]\s*  
                        )*  
                        \#?)  
                       (\d+)\b  
                      }{  
                          $1 . &link($2, sprintf($prcgi, $2)) . $3  
                      }egix;  
                 } $_;  
             } while ($_ ne $prev);  
   
             $_ = htmlify_sub {  
                 s{  
                   (\b$prcategories/(\d+)\b)  
                  }{  
                      &link($1, sprintf($prcgi, $2)) . $3  
                  }egox;  
             } $_;  
         }          }
   
         # get manpage specs as link: "foo.1" "foo(1)"          $_;
         if (defined($mancgi)) {  
             $_ = htmlify_sub {  
                 s{  
                   (\b([a-zA-Z][\w_.]+)  
                    (?:  
                     \( ([0-9n]) \)\B  
                     |  
                     \.([0-9n])\b  
                    )  
                   )  
                  }{  
                      &link($1, sprintf($mancgi, $3 ne '' ? $3 : $4, $2)) . $5  
                  }egx;  
             } $_;  
         }  
     }  
   
     $_;  
 }  }
   
 sub spacedHtmlText($;$) {  sub spacedHtmlText($;$) {
Line 1193  sub safeglob($) {
Line 1066  sub safeglob($) {
                 $glob =~ s/{([^}]+)}/($t = $1) =~ s-,-|-g; "($t)"/eg;                  $glob =~ s/{([^}]+)}/($t = $1) =~ s-,-|-g; "($t)"/eg;
                 foreach (readdir($dh)) {                  foreach (readdir($dh)) {
                         if (/^${glob}$/) {                          if (/^${glob}$/) {
                                 push(@results, "$dirname/" .$_);                                  push(@results, $dirname . "/" .$_);
                         }                          }
                 }                  }
         }          }
Line 1392  sub doAnnotate($$) {
Line 1265  sub doAnnotate($$) {
             }              }
             else {              else {
                 $revprint = sprintf('%-8s', $lrev);                  $revprint = sprintf('%-8s', $lrev);
                 $revprint =~ s`\S+`&link($&, "$scriptwhere$query#rev$&")`e;     # `                  $revprint =~ s`\S+`&link($&, "$scriptwhere$barequery#rev$&")`e; # `
                 $oldLusr = '';                  $oldLusr = '';
             }              }
             if ($lusr eq $oldLusr) {              if ($lusr eq $oldLusr) {
Line 1423  sub doAnnotate($$) {
Line 1296  sub doAnnotate($$) {
             # CVS command line client.  But for simplicity, we don't.              # CVS command line client.  But for simplicity, we don't.
         }          }
         elsif ($words[0] eq "error") {          elsif ($words[0] eq "error") {
             fatal("500 Internal Error", "Error occured during annotate: <b>$_</b>");              fatal ("500 Internal Error", "Error occured during annotate: <b>$_</b>");
         }          }
     }      }
     if ($annTable) {      if ($annTable) {
Line 1597  sub viewable($) {
Line 1470  sub viewable($) {
 sub doDiff($$$$$$) {  sub doDiff($$$$$$) {
         my($fullname, $r1, $tr1, $r2, $tr2, $f) = @_;          my($fullname, $r1, $tr1, $r2, $tr2, $f) = @_;
         my $fh = do {local(*FH);};          my $fh = do {local(*FH);};
         my ($rev1, $rev2, $sym1, $sym2, $f1, $f2);          my ($rev1, $rev2, $sym1, $sym2, @difftype, $diffname, $f1, $f2);
   
         if ($r1 =~ /([^:]+)(:(.+))?/) {          if ($r1 =~ /([^:]+)(:(.+))?/) {
             $rev1 = $1;              $rev1 = $1;
Line 1631  sub doDiff($$$$$$) {
Line 1504  sub doDiff($$$$$$) {
             ($rev1, $sym1) = ($rev2, $sym2);              ($rev1, $sym1) = ($rev2, $sym2);
             ($rev2, $sym2) = ($tmp1, $tmp2);              ($rev2, $sym2) = ($tmp1, $tmp2);
         }          }
         my $difftype = $DIFFTYPES{$f};          my $human_readable = 0;
           if ($f eq 'c') {
         if (!$difftype) {              @difftype = qw{-c};
               $diffname = "Context diff";
           }
           elsif ($f eq 's') {
               @difftype = qw{--side-by-side --width=164};
               $diffname = "Side by Side";
           }
           elsif ($f eq 'H') {
               $human_readable = 1;
               @difftype = qw{--unified=15};
               $diffname = "Long Human readable";
           }
           elsif ($f eq 'h') {
               @difftype =qw{-u};
               $human_readable = 1;
               $diffname = "Human readable";
           }
           elsif ($f eq 'u') {
               @difftype = qw{-u};
               $diffname = "Unidiff";
           }
           else {
             fatal ("400 Bad arguments", "Diff format $f not understood");              fatal ("400 Bad arguments", "Diff format $f not understood");
         }          }
   
         my @difftype       = @{$difftype->{'opts'}};  
         my $human_readable = $difftype->{'colored'};  
   
         # apply special options          # apply special options
         if ($showfunc) {          if ($showfunc) {
             push @difftype, '-p' if $f ne 's';              push @difftype, '-p' if $f =~ /^[cHhu]$/;
   
             my($re1, $re2);              my($re1, $re2);
   
Line 1704  sub doDiff($$$$$$) {
Line 1595  sub doDiff($$$$$$) {
                 s|$cvsroot/||o;                  s|$cvsroot/||o;
                 if ($sym1) {                  if ($sym1) {
                     chop;                      chop;
                     $_ .= " $sym1\n";                      $_ .= " " . $sym1 . "\n";
                 }                  }
             }              }
             elsif (m|^$f2 $cvsroot|o) {              elsif (m|^$f2 $cvsroot|o) {
                 s|$cvsroot/||o;                  s|$cvsroot/||o;
                 if ($sym2) {                  if ($sym2) {
                     chop;                      chop;
                     $_ .= " $sym2\n";                      $_ .= " " . $sym2 . "\n";
                 }                  }
             }              }
             print $_;              print $_;
Line 1833  again:
Line 1724  again:
                 # End of a log entry.                  # End of a log entry.
                 my $revbranch;                  my $revbranch;
                 ($revbranch = $rev) =~ s/\.\d+$//;                  ($revbranch = $rev) =~ s/\.\d+$//;
                 print "$filename $rev Wanted: $revwanted ",                  print "$filename $rev Wanted: $revwanted "
                   "Revbranch: $revbranch Branch: $branch ",                      . "Revbranch: $revbranch Branch: $branch "
                     "Branchpoint: $branchpoint\n" if ($verbose);                      . "Branchpoint: $branchpoint\n" if ($verbose);
                 if (!defined($revwanted) && defined($branch)                  if (!defined($revwanted) && defined($branch)
                     && $branch eq $revbranch || !defined($tag)) {                      && $branch eq $revbranch || !defined($tag)) {
                     print "File revision $rev found for branch $branch\n"                      print "File revision $rev found for branch $branch\n"
Line 1873  again:
Line 1764  again:
                 next;                  next;
             }              }
             else {              else {
                 $log .= $_;                  $log = $log . $_;
             }              }
         }          }
         if (/$LOG_FILESEPARATOR/o) {          if (/$LOG_FILESEPARATOR/o) {
Line 2116  sub readLog($;$) {
Line 2007  sub readLog($;$) {
   
 }  }
   
 sub printDiffLinks($$) {  
     my($text, $url) = @_;  
     my @extra;  
   
     local $_;  
     for ($DIFFTYPES{$defaultDiffType}{'colored'} ? qw(u) : qw(h)) {  
         my $f = $_ eq $defaultDiffType ? '' : $_;  
   
         push @extra, &link(lc $DIFFTYPES{$_}{'descr'}, "$url&f=$f");  
     }  
   
     print &link($text, $url), ' (', join(', ', @extra), ')';  
 }  
   
 sub printLog($;$) {  sub printLog($;$) {
         my ($link, $br, $brp);          my ($link, $br, $brp);
         ($_,$link) = @_;          ($_,$link) = @_;
Line 2206  sub printLog($;$) {
Line 2083  sub printLog($;$) {
         }          }
         if (defined @mytz) {          if (defined @mytz) {
             my ($est) = $mytz[(localtime($date{$_}))[8]];              my ($est) = $mytz[(localtime($date{$_}))[8]];
             print ", <i>", scalar localtime($date{$_}), " $est</i> (";              print ", <i>" . scalar localtime($date{$_}) . " $est</i> (";
         } else {          } else {
             print ", <i>", scalar gmtime($date{$_}), " UTC</i> (";              print ", <i>" . scalar gmtime($date{$_}) . " UTC</i> (";
         }          }
         print readableTime(time() - $date{$_},1), " ago)";          print readableTime(time() - $date{$_},1) . " ago)";
         print " by ";          print " by ";
         print "<i>", $author{$_}, "</i>\n";          print "<i>" . $author{$_} . "</i>\n";
         print "<BR>Branch: <b>",$link?link_tags($revsym{$br}):$revsym{$br},"</b>\n"          print "<BR>Branch: <b>",$link?link_tags($revsym{$br}):$revsym{$br},"</b>\n"
             if ($revsym{$br});              if ($revsym{$br});
         print "<BR>CVS Tags: <b>",$link?link_tags($revsym{$_}):$revsym{$_},"</b>"          print "<BR>CVS Tags: <b>",$link?link_tags($revsym{$_}):$revsym{$_},"</b>"
Line 2254  sub printLog($;$) {
Line 2131  sub printLog($;$) {
                                   $barequery);                                    $barequery);
   
                 print " to previous ";                  print " to previous ";
                 printDiffLinks($prev, $url);                  print &link($prev, $url);
                   if (!$hr_default) { # offer a human readable version if not default
                       print &link('colored', "$url&f=h");
                   }
             }              }
             #              #
             # Plus, if it's on a branch, and it's not a vendor branch,              # Plus, if it's on a branch, and it's not a vendor branch,
Line 2267  sub printLog($;$) {
Line 2147  sub printLog($;$) {
                                   $barequery);                                    $barequery);
   
                 print " to branchpoint ";                  print " to branchpoint ";
                 printDiffLinks($brp, $url);                  print &link($brp, $url);
                   if (!$hr_default) { # offer a human readable version if not default
                       print &link('colored', "$url&f=h");
                   }
             }              }
             #              #
             # Plus, if it's on a branch, and it's not a vendor branch,              # Plus, if it's on a branch, and it's not a vendor branch,
Line 2300  sub printLog($;$) {
Line 2183  sub printLog($;$) {
                                       $barequery);                                        $barequery);
   
                     print " next main ";                      print " next main ";
                     printDiffLinks($nextmain, $url);                      print &link($nextmain, $url);
                       if (!$hr_default) { # offer a human readable version if not default
                           print &link('colored', "$url&f=h");
                       }
                 }                  }
             }              }
             # Plus if user has selected only r1, then present a link              # Plus if user has selected only r1, then present a link
Line 2315  sub printLog($;$) {
Line 2201  sub printLog($;$) {
                                   $barequery);                                    $barequery);
   
                 print " to selected ";                  print " to selected ";
                 printDiffLinks($input{'r1'}, $url);                  print &link($input{'r1'}, $url);
                   if (!$hr_default) { # offer a human readable version if not default
                       print &link('colored', "$url&f=h");
                   }
             }              }
         }          }
         print "<PRE>\n";          print "<PRE>\n";
Line 2395  sub doLog($) {
Line 2284  sub doLog($) {
         print "<HR noshade>\n";          print "<HR noshade>\n";
         print "<TABLE>";          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 "<TR><TD align=right>Preferred Diff type:</TD>";
         print "<TD>";          print "<TD>";
         printDiffSelect($use_java_script);          printDiffSelect($use_java_script);
         print "</TD><TD></TD></TR>\n";          print "</TD><TD></TD></TR>\n";
         if (@branchnames) {          if (@branchnames) {
Line 2431  sub doLog($) {
Line 2320  sub doLog($) {
         print "<TR><TD align=right>";          print "<TR><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>";
         print "<TD>";          print "<TD><SELECT NAME=\"logsort\"";
         printLogSortSelect($use_java_script);          print " onchange=\"submit()\"" if ($use_java_script);
         print "</TD>";          print ">\n";
           print "<OPTION VALUE=cvs",$logsort eq "cvs" ? " SELECTED" : "", ">Not sorted";
           print "<OPTION VALUE=date",$logsort eq "date" ? " SELECTED" : "", ">Commit date";
           print "<OPTION VALUE=rev",$logsort eq "rev" ? " SELECTED" : "", ">Revision";
           print "</SELECT></TD>";
         print "<TD><INPUT TYPE=SUBMIT VALUE=\"  Set  \"></TD>";          print "<TD><INPUT TYPE=SUBMIT VALUE=\"  Set  \"></TD>";
         print "</FORM>\n";          print "</FORM>\n";
         print "</TR></TABLE>";          print "</TR></TABLE>";
Line 2503  sub human_readable_diff($){
Line 2396  sub human_readable_diff($){
     $date2 = $r2d;      $date2 = $r2d;
   }    }
   
   print "<h3 align=center>Diff for /$where_nd between version $rev1 and $rev2</h3>\n",    print "<h3 align=center>Diff for /$where_nd between version $rev1 and $rev2</h3>\n";
     "<table border=0 cellspacing=0 cellpadding=0 width=\"100%\">\n",  
       "<tr bgcolor=\"#ffffff\">\n",    print "<table border=0 cellspacing=0 cellpadding=0 width=\"100%\">\n";
         "<th width=\"50%\" valign=TOP>",    print "<tr bgcolor=\"#ffffff\">\n";
           "version $rev1";    print "<th width=\"50%\" valign=TOP>";
     print "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);
   print "</th>\n",    print "</th>\n";
     "<th width=\"50%\" valign=TOP>",    print "<th width=\"50%\" valign=TOP>";
       "version $rev2";    print "version $rev2";
   print ", $date2" if (defined($date2));    print ", $date2" if (defined($date2));
   print "<br>Tag: $sym2\n" if ($sym1);    print "<br>Tag: $sym2\n" if ($sym1);
   print "</th>\n";    print "</th>\n";
Line 2637  sub navigateHeader($$$$$) {
Line 2531  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.37 $ -->';      print '<!-- CVSweb $zRevision: 1.103 $  $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_tag_for_src\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\">";
Line 2653  sub navigateHeader($$$$$) {
Line 2547  sub navigateHeader($$$$$) {
 sub plural_write($$) {  sub plural_write($$) {
     my ($num,$text) = @_;      my ($num,$text) = @_;
     if ($num != 1) {      if ($num != 1) {
         $text .= "s";          $text = $text . "s";
     }      }
     if ($num > 0) {      if ($num > 0) {
         return join(' ', $num, $text);          return $num . " " . $text;
     }      }
     else {      else {
         return "";          return "";
Line 2700  sub readableTime($$) {
Line 2594  sub readableTime($$) {
         my $resttime = plural_write(int ($rest / $break),          my $resttime = plural_write(int ($rest / $break),
                                 $desc{$break});                                  $desc{$break});
         if ($resttime) {          if ($resttime) {
             $retval .= ", $resttime";              $retval = $retval . ", " . $resttime;
         }          }
     }      }
   
Line 2730  sub clickablePath($$) {
Line 2624  sub clickablePath($$) {
         my $wherepath = '';          my $wherepath = '';
         my ($lastslash) = $pathname =~ m|/$|;          my ($lastslash) = $pathname =~ m|/$|;
         foreach (split(/\//, $pathname)) {          foreach (split(/\//, $pathname)) {
             $retval .= " / ";              $retval = $retval . " / ";
             $wherepath .= "/$_";              $wherepath = $wherepath . '/' . $_;
             my ($last) = "$wherepath/" eq "/$pathname"              my ($last) = "$wherepath/" eq "/$pathname"
                 || $wherepath eq "/$pathname";                  || $wherepath eq "/$pathname";
             if ($clickLast || !$last) {              if ($clickLast || !$last) {
Line 2775  sub chooseCVSRoot() {
Line 2669  sub chooseCVSRoot() {
         foreach $k (@foo) {          foreach $k (@foo) {
             print "<option value=\"$k\"";              print "<option value=\"$k\"";
             print " selected" if ($k eq $cvstree);              print " selected" if ($k eq $cvstree);
             print ">", ($CVSROOTdescr{$k} ? $CVSROOTdescr{$k} : $k), "</option>\n";              print ">" . ($CVSROOTdescr{$k} ? $CVSROOTdescr{$k} :
                           $k). "</option>\n";
         }          }
         print "</select>\n</td>";          print "</select>\n</td>";
         print "<td><input type=submit value=\"Go\"></td>";          print "<td><input type=submit value=\"Go\"></td>";
Line 2950  sub htmlquote($) {
Line 2845  sub htmlquote($) {
     $_;      $_;
 }  }
   
 sub htmlunquote($) {  
     local($_) = @_;  
   
     # Special Characters; RFC 1866  
     s/&quot;/\"/g;  
     s/&lt;/</g;  
     s/&gt;/>/g;  
     s/&amp;/&/g;  
   
     $_;  
 }  
   
 sub http_header(;$) {  sub http_header(;$) {
     my $content_type = shift || "text/html";      my $content_type = shift || "text/html";
     if (defined($moddate)) {      if (defined($moddate)) {
Line 2969  sub http_header(;$) {
Line 2852  sub http_header(;$) {
             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";
         }          }
     }      }
     if ($is_mod_perl) {      if ($is_mod_perl) {
Line 3020  sub http_header(;$) {
Line 2903  sub http_header(;$) {
   
 sub html_header($) {  sub html_header($) {
     my ($title) = @_;      my ($title) = @_;
     my $version = '$zRevision: 1.103 $  $kRevision: 1.37 $'; #'      my $version = '$zRevision: 1.103 $  $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"

Legend:
Removed from v.1.1.1.11  
changed lines
  Added in v.3.35

CVSweb