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

Diff for /cvsweb/cvsweb.cgi between version 1.7 and 1.9

version 1.7, 1997/04/30 18:25:05 version 1.9, 1997/07/19 00:54:40
Line 70  if (!-d $cvsroot) {
Line 70  if (!-d $cvsroot) {
         &fatal("500 Internal Error",'$CVSROOT not found!');          &fatal("500 Internal Error",'$CVSROOT not found!');
 }  }
   
 if ($q = $ENV{'QUERY_STRING'}) {  if ($query = $ENV{'QUERY_STRING'}) {
     foreach (split(/&/, $q)) {      foreach (split(/&/, $query)) {
         s/%(..)/sprintf("%c", hex($1))/ge;      # unquote %-quoted          s/%(..)/sprintf("%c", hex($1))/ge;      # unquote %-quoted
         if (/(\S+)=(.*)/) {          if (/(\S+)=(.*)/) {
             $input{$1} = $2;              $input{$1} = $2;
Line 79  if ($q = $ENV{'QUERY_STRING'}) {
Line 79  if ($q = $ENV{'QUERY_STRING'}) {
             $input{$_}++;              $input{$_}++;
         }          }
     }      }
       $query = "?" . $query;
 }  }
 if (-d $fullname) {  if (-d $fullname) {
         opendir(DIR, $fullname) || &fatal("404 Not Found","$where: $!");          opendir(DIR, $fullname) || &fatal("404 Not Found","$where: $!");
Line 97  if (-d $fullname) {
Line 98  if (-d $fullname) {
         # provides the results that I want in most browsers.  Another          # provides the results that I want in most browsers.  Another
         # case of layout spooging up HTML.          # case of layout spooging up HTML.
         print "<MENU>\n";          print "<MENU>\n";
         foreach (sort @dir) {          lookingforattic:
           for ($i = 0; $i <= $#dir; $i++) {
                   if ($dir[$i] eq "Attic") {
                           last lookingforattic;
                   }
           }
           if (!$input{"showattic"} && ($i <= $#dir) &&
                                   opendir(DIR, $fullname . "/Attic")) {
                   splice(@dir, $i, 1,
                           grep((s|^|Attic/|,!m|/\.|), readdir(DIR)));
                   closedir(DIR);
           }
           # Sort without the Attic/ pathname.
           foreach (sort {($c=$a)=~s|.*/||;($d=$b)=~s|.*/||;($c cmp $d)} @dir) {
             if ($_ eq '.') {              if ($_ eq '.') {
                 next;                  next;
             }              }
               if (s|^Attic/||) {
                   $attic = " (in the Attic)";
               } else {
                   $attic = "";
               }
             if ($_ eq '..') {              if ($_ eq '..') {
                 next if ($where eq '');                  next if ($where eq '');
                 ($updir = $scriptwhere) =~ s|[^/]+$||;                  ($updir = $scriptwhere) =~ s|[^/]+$||;
                 print "<IMG SRC=\"/icons/back.gif\"> ",                  print "<IMG SRC=\"/icons/back.gif\"> ",
                     &link("Previous Directory",$updir), "<BR>";                      &link("Previous Directory",$updir . $query), "<BR>";
 #               print "<IMG SRC=???> ",  #               print "<IMG SRC=???> ",
 #                   &link("Directory-wide diffs", $scriptwhere . '/*'), "<BR>";  #                   &link("Directory-wide diffs", $scriptwhere . '/*'), "<BR>";
             } elsif (-d $fullname . "/" . $_) {              } elsif (-d $fullname . "/" . $_) {
                 print "<IMG SRC=\"/icons/dir.gif\"> ",                  print "<IMG SRC=\"/icons/dir.gif\"> ",
                     &link($_ . "/", $scriptwhere . '/' . $_ . '/'), "<BR>";                      &link($_ . "/", $scriptwhere . '/' . $_ . '/' . $query), $attic, "<BR>";
             } elsif (s/,v$//) {              } elsif (s/,v$//) {
 # TODO: add date/time?  How about sorting?  # TODO: add date/time?  How about sorting?
                 print "<IMG SRC=\"/icons/text.gif\"> ",                  print "<IMG SRC=\"/icons/text.gif\"> ",
                     &link($_, $scriptwhere . '/' . $_), "<BR>";                      &link($_, $scriptwhere . '/' .
                               ($attic ? "Attic/" : "") . $_ . $query),
                       $attic, "<BR>";
             }              }
         }          }
         print "</MENU>\n";          print "</MENU>\n";
           if ($input{"only_on_branch"}) {
               print "<HR><FORM METHOD=\"GET\" ACTION=\"${scriptwhere}\">\n";
               print "Currently showing only branch $input{'only_on_branch'}.\n";
               $input{"only_on_branch"}="";
               foreach $k (keys %input) {
                   print "<INPUT TYPE=hidden NAME=$k VALUE=$input{$k}>\n" if $input{$k};
               }
               print "<INPUT TYPE=SUBMIT VALUE=\"Show all branches\">\n";
               print "</FORM>\n";
           }
           $formwhere = $scriptwhere;
           $formwhere =~ s|Attic/?$|| if ($input{"showattic"});
           print "<HR><FORM METHOD=\"GET\" ACTION=\"${formwhere}\">\n";
           $input{"showattic"}=!$input{"showattic"};
           foreach $k (keys %input) {
               print "<INPUT TYPE=hidden NAME=$k VALUE=$input{$k}>\n" if $input{$k};
           }
           print "<INPUT TYPE=SUBMIT VALUE=\"";
           print ($input{"showattic"} ? "Show" : "Hide");
           print " attic directories\">\n";
           print "</FORM>\n";
         print &html_footer;          print &html_footer;
         print "</BODY></HTML>\n";          print "</BODY></HTML>\n";
 } elsif (-f $fullname . ',v') {  } elsif (-f $fullname . ',v') {
Line 134  if (-d $fullname) {
Line 176  if (-d $fullname) {
                                                 "Failed to spawn rlog");                                                  "Failed to spawn rlog");
         while (<RCS>) {          while (<RCS>) {
             print if ($verbose);              print if ($verbose);
               if (/^branch:\s+([\d\.]+)/) {
                   $curbranch = $1;
               }
             if ($symnames) {              if ($symnames) {
                 if (/^\s+([^:]+):\s+([\d\.]+)/) {                  if (/^\s+([^:]+):\s+([\d\.]+)/) {
                     $symrev{$1} = $2;                      $symrev{$1} = $2;
Line 175  if (-d $fullname) {
Line 220  if (-d $fullname) {
             }              }
             $_ = <RCS>;              $_ = <RCS>;
             print "D:", $_ if ($verbose);              print "D:", $_ if ($verbose);
             if (m|^date:\s+(\d+)/(\d+)/(\d+)\s+(\d+):(\d+):(\d+);\s+author:\s+(\S+);|) {              if (m|^date:\s+(\d+)/(\d+)/(\d+)\s+(\d+):(\d+):(\d+);\s+author:\s+(\S+);\s+state:\s+(\S+);|) {
                 $yr = $1;                  $yr = $1;
                 # damn 2-digit year routines                  # damn 2-digit year routines
                 if ($yr > 100) {                  if ($yr > 100) {
Line 183  if (-d $fullname) {
Line 228  if (-d $fullname) {
                 }                  }
                 $date{$rev} = &timelocal($6,$5,$4,$3,$2 - 1,$yr);                  $date{$rev} = &timelocal($6,$5,$4,$3,$2 - 1,$yr);
                 $author{$rev} = $7;                  $author{$rev} = $7;
                   $state{$rev} = $8;
             } else {              } else {
                 &fatal("500 Internal Error", "Error parsing RCS output: $_");                  &fatal("500 Internal Error", "Error parsing RCS output: $_");
             }              }
Line 203  if (-d $fullname) {
Line 249  if (-d $fullname) {
         print "Done sorting revisions\n" if ($verbose);          print "Done sorting revisions\n" if ($verbose);
 #  #
 # HEAD is an artificial tag which is simply the highest tag number on the main  # HEAD is an artificial tag which is simply the highest tag number on the main
 # branch (I think!).  Find it by looking through @revorder; it should at least  # branch, unless there is a branch tag in the RCS file in which case it's the
 # be near the beginning (In fact, it *should* be the first commit listed on  # highest revision on that branch.  Find it by looking through @revorder; it
 # the main branch.)  # is the first commit listed on the appropriate branch.
           $headrev = $curbranch || "1";
         revision:          revision:
         for ($i = 0; $i <= $#revorder; $i++) {          for ($i = 0; $i <= $#revorder; $i++) {
             if ($revorder[$i] =~ /^\d+\.\d+$/) {              if ($revorder[$i] =~ /^(\S*)\.\d+$/ && $headrev eq $1) {
                 if ($revsym{$revorder[$i]}) {                  if ($revsym{$revorder[$i]}) {
                     $revsym{$revorder[$i]} .= ", ";                      $revsym{$revorder[$i]} .= ", ";
                 }                  }
Line 236  if (-d $fullname) {
Line 283  if (-d $fullname) {
                 # If there is no branch A.B.D, then it translates into                  # If there is no branch A.B.D, then it translates into
                 # the head A.B .                  # the head A.B .
                 #                  #
                 # This is pure speculation.  
                 #  
                 $head = $1;                  $head = $1;
                 $branch = $3;                  $branch = $3;
                 $regex = $head . "." . $branch;                  $regex = $head . "." . $branch;
Line 255  if (-d $fullname) {
Line 300  if (-d $fullname) {
                 }                  }
                 $revsym{$rev} .= ", " if ($revsym{$rev});                  $revsym{$rev} .= ", " if ($revsym{$rev});
                 $revsym{$rev} .= $_;                  $revsym{$rev} .= $_;
                   if ($rev ne $head) {
                       $branchpoint{$head} .= ", " if ($branchpoint{$head});
                       $branchpoint{$head} .= $_;
                   }
             }              }
             $sel .= "<OPTION VALUE=\"${rev}:${_}\">$_\n";              $sel .= "<OPTION VALUE=\"${rev}:${_}\">$_\n";
         }          }
         print "Done associating revisions with branches\n" if ($verbose);          print "Done associating revisions with branches\n" if ($verbose);
         print &html_header("CVS log for $where");          print &html_header("CVS log for $where");
         ($upwhere = $where) =~ s|[^/]+$||;          ($upwhere = $where) =~ s|(Attic/)?[^/]+$||;
         print "Up to ", &link($upwhere,$scriptname . "/" . $upwhere);          print "Up to ", &link($upwhere,$scriptname . "/" . $upwhere . $query);
         print "<BR>\n";          print "<BR>\n";
         print "<A HREF=\"#diff\">Request diff between arbitrary revisions</A>\n";          print "<A HREF=\"#diff\">Request diff between arbitrary revisions</A>\n";
         print "<HR NOSHADE>\n";          print "<HR NOSHADE>\n";
           if ($curbranch) {
               print "Default branch is ";
               print ($revsym{$curbranch} || $curbranch);
           } else {
               print "No default branch";
           }
           print "<BR><HR NOSHADE>\n";
 # The other possible U.I. I can see is to have each revision be hot  # The other possible U.I. I can see is to have each revision be hot
 # and have the first one you click do ?r1=foo  # and have the first one you click do ?r1=foo
 # and since there's no r2 it keeps going & the next one you click  # and since there's no r2 it keeps going & the next one you click
Line 288  if (-d $fullname) {
Line 344  if (-d $fullname) {
                 $nameprinted{$br}++;                  $nameprinted{$br}++;
             }              }
             print "\n";              print "\n";
 #           print "RCS revision <b>$_</b>\n";  
             print "<A HREF=\"$scriptwhere?rev=$_\"><b>$_</b></A>";              print "<A HREF=\"$scriptwhere?rev=$_\"><b>$_</b></A>";
             if (/^1\.1\.1\.\d+$/) {              if (/^1\.1\.1\.\d+$/) {
                 print " <i>(vendor branch)</i>";                  print " <i>(vendor branch)</i>";
             }              }
 #           print "<BR>\n";  
 #           print "Checked in on <i>" . &ctime($date{$_}) . "</i> by ";  
 #           print "<i>" . $author{$_} . "</i><BR>\n";  
             print " <i>" . &ctime($date{$_}) . "</i> by ";              print " <i>" . &ctime($date{$_}) . "</i> by ";
             print "<i>" . $author{$_} . "</i>\n";              print "<i>" . $author{$_} . "</i>\n";
             if ($revsym{$_}) {              if ($revsym{$_}) {
 #               print "CVS Tags: <b>$revsym{$_}</b><BR>\n";  
                 print "<BR>CVS Tags: <b>$revsym{$_}</b>";                  print "<BR>CVS Tags: <b>$revsym{$_}</b>";
             }              }
             if ($revsym{$br})  {              if ($revsym{$br})  {
 #               print "Branch: <b>$revsym{$br}</b><BR>\n";  
                 if ($revsym{$_}) {                  if ($revsym{$_}) {
                     print "; ";                      print "; ";
                 } else {                  } else {
                     print "<BR>";                      print "<BR>";
                 }                  }
                 print "Branch: <b>$revsym{$br}</b>";                  print "Branch: <b>$revsym{$br}</b>\n";
             }              }
               if ($branchpoint{$_}) {
                   if ($revsym{$br} || $revsym{$_}) {
                       print "; ";
                   } else {
                       print "<BR>";
                   }
                   print "Branch point for: <b>$branchpoint{$_}</b>\n";
               }
             # Find the previous revision on this branch.              # Find the previous revision on this branch.
             # I think this can be done algorithmically.  
             @prevrev = split(/\./, $_);              @prevrev = split(/\./, $_);
             if (--$prevrev[$#prevrev] == 0) {              if (--$prevrev[$#prevrev] == 0) {
                 # If it was X.Y.Z.1, just make it X.Y                  # If it was X.Y.Z.1, just make it X.Y
Line 348  if (-d $fullname) {
Line 405  if (-d $fullname) {
                     }                      }
                 }                  }
             }              }
 #           print "Log message:<BR>\n";              if ($state{$_} eq "dead") {
                   print "<BR><B><I>FILE REMOVED</I></B>\n";
               }
             print "<PRE>\n";              print "<PRE>\n";
             print &htmlify($log{$_}, 1);              print &htmlify($log{$_}, 1);
             print "</PRE><HR NOSHADE>\n";              print "</PRE><HR NOSHADE>\n";
Line 385  if (-d $fullname) {
Line 444  if (-d $fullname) {
         print "<FORM METHOD=\"GET\" ACTION=\"$scriptwhere\">\n";          print "<FORM METHOD=\"GET\" ACTION=\"$scriptwhere\">\n";
         print "Branch: \n";          print "Branch: \n";
         print "<SELECT NAME=\"only_on_branch\">\n";          print "<SELECT NAME=\"only_on_branch\">\n";
           print "<OPTION VALUE=\"\"";
           print " SELECTED" if ($input{"only_on_branch"} eq "");
           print ">Show all branches\n";
         foreach (sort @branchnames) {          foreach (sort @branchnames) {
                 print "<OPTION>${_}\n";                  print "<OPTION";
                   print " SELECTED" if ($input{"only_on_branch"} eq $_);
                   print ">${_}\n";
         }          }
         print "</SELECT>\n";          print "</SELECT>\n";
         print "<INPUT TYPE=SUBMIT VALUE=\"View Branch\">\n";          print "<INPUT TYPE=SUBMIT VALUE=\"View Branch\">\n";
Line 395  if (-d $fullname) {
Line 459  if (-d $fullname) {
         print "</BODY></HTML>\n";          print "</BODY></HTML>\n";
 } elsif ($fullname =~ s/\.diff$// && -f $fullname . ",v" &&  } elsif ($fullname =~ s/\.diff$// && -f $fullname . ",v" &&
                                 $input{'r1'} && $input{'r2'}) {                                  $input{'r1'} && $input{'r2'}) {
           # Allow diffs using the ".diff" extension
           # so that browsers that default to the URL
           # for a save filename don't save diff's as
           # e.g. foo.c
         &dodiff($fullname, $input{'r1'}, $input{'tr1'},          &dodiff($fullname, $input{'r1'}, $input{'tr1'},
                 $input{'r2'}, $input{'tr2'}, $input{'f'});                  $input{'r2'}, $input{'tr2'}, $input{'f'});
         exit;          exit;
   } elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| &&
                                    -f $newname . ",v") {
           # The file has been removed and is in the Attic.
           # Send a redirect pointing to the file in the Attic.
           ($newplace = $scriptwhere) =~ s|/([^/]+)$|/Attic/$1|;
           &redirect($newplace);
           exit;
 } elsif (0 && (@files = &safeglob($fullname . ",v"))) {  } elsif (0 && (@files = &safeglob($fullname . ",v"))) {
         print "Content-type: text/plain\n\n";          print "Content-type: text/plain\n\n";
         print "You matched the following files:\n";          print "You matched the following files:\n";
Line 411  if (-d $fullname) {
Line 486  if (-d $fullname) {
         # Is there an indexed version of modules?          # Is there an indexed version of modules?
         if (open(MODULES, "$cvsroot/CVSROOT/modules")) {          if (open(MODULES, "$cvsroot/CVSROOT/modules")) {
                 while (<MODULES>) {                  while (<MODULES>) {
                         if (/^${module}\s+(\S+)/o && -d "${cvsroot}/$1" &&                          if (/^(\S+)\s+(\S+)/o && $module eq $1
                                         $module ne $1) {                                  && -d "${cvsroot}/$2" && $module ne $2) {
                                 &redirect($scriptname . '/' . $1 . $xtra);                                  &redirect($scriptname . '/' . $2 . $xtra);
                         }                          }
                 }                  }
         }          }
Line 496  sub safeglob {
Line 571  sub safeglob {
         #       transform filename from glob to regex.  Deal with:          #       transform filename from glob to regex.  Deal with:
         #       [, {, ?, * as glob chars          #       [, {, ?, * as glob chars
         #       make sure to escape all other regex chars          #       make sure to escape all other regex chars
                 $glob =~ s/\./\./g;                  $glob =~ s/([\.\(\)\|\+])/\\$1/g;
                 $glob =~ s/\*/.*/g;                  $glob =~ s/\*/.*/g;
                 $glob =~ s/\?/./g;                  $glob =~ s/\?/./g;
                   $glob =~ s/{([^}]+)}/($t = $1) =~ s-,-|-g; "($t)"/eg;
                 foreach (readdir(DIR)) {                  foreach (readdir(DIR)) {
                         if (/^${glob}$/) {                          if (/^${glob}$/) {
                                 push(@results, $dirname . "/" .$_);                                  push(@results, $dirname . "/" .$_);
Line 508  sub safeglob {
Line 584  sub safeglob {
   
         @results;          @results;
 }  }
   
 sub checkout {  sub checkout {
         local($fullname, $rev) = @_;          local($fullname, $rev) = @_;
   
         open(RCS, "co -p$rev '$fullname' 2>&1 |") ||          open(RCS, "co -p$rev '$fullname' 2>&1 |") ||
             &fail("500 Internal Error", "Couldn't co: $!");              &fail("500 Internal Error", "Couldn't co: $!");
 # /home/ncvs/src/sys/netinet/igmp.c,v  -->  standard output  # /home/ncvs/src/sys/netinet/igmp.c,v  -->  standard output
   # or
   # /home/ncvs/src/sys/netinet/igmp.c,v  -->  stdout
 # revision 1.1.1.2  # revision 1.1.1.2
 # /*  # /*
         $_ = <RCS>;          $_ = <RCS>;
         if (/^$fullname,v\s+-->\s+standard output\s*$/o) {          if (/^(\S+),v\s+-->\s+st(andar)?d ?out(put)?\s*$/o && $1 eq $fullname) {
             # As expected              # As expected
         } else {          } else {
             &fatal("500 Internal Error",              &fatal("500 Internal Error",

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.9

CVSweb