[Cvsnt] Cvsweb, annotate, and LockDir

Jeff Loomis jloomis at authentica.com
Thu Jul 25 12:06:40 BST 2002


"Tony Hoyle" <tmh at nothing-on.tv> wrote in message
news:3d3806e8.1186991421 at news.cvsnt.org...

> CVSWeb probably needs modifying to use the rannotate command rather
> than trying to do it itself.  I did something like this once but
> unfortunately have lost that version.

I did this myself.  I also removed some code that prevented file download
off the mainline, and allowed for longer revision numbers without breaking
the annotation.  If you are using cvswebnt with a cvs that has LockDir
enbabled, it is not obeying those locks so you could be risking problems.

I found that viewcvs works fine for annotations and is probably nicer, but
is quite a bit slower.  It doesn't use CVS for annotations but instead
builds them itself using rlog.

For those interested in cvswebnt, here are diffs from the version at:
http://198.142.100.140/cvswebnt/cvsweb.cgi/

--- cvsweb.cgi Thu Dec  6 15:14:00 2001
+++ newcvsweb.cgi Wed Jul 24 15:17:23 2002
@@ -70,7 +70,7 @@
     $navigationHeaderColor $tableBorderColor $markupLogColor
     $tabstop $state $annTable $sel $curbranch @HideModules
     $module $use_descriptions %descriptions @mytz $dwhere $moddate
-    $use_moddate $annotate_file
+    $use_moddate $annotate_file %REMOTEROOT
 );

 ##### Start of Configuration Area ########
@@ -88,7 +88,7 @@
 ######## Configuration variables #########
 # These are defined to allow checking with perl -cw
 %CVSROOT = %MIRRORS = %DEFAULTVALUE = %ICONS = %MTYPES =
-%tags = %alltags = @tabcolors = ();
+%tags = %alltags = @tabcolors = %REMOTEROOT = ();
 $cvstreedefault = $body_tag = $logo = $defaulttitle = $address =
 $backcolor = $long_intro = $short_instruction = $shortLogLen =
 $show_author = $dirtable = $tablepadding = $columnHeaderColorDefault =
@@ -1038,75 +1038,13 @@
     # this seems to be necessary
     $| = 1; $| = 0; # Flush

-    # this annotate version is based on the
-    # cvs annotate-demo Perl script by Cyclic Software
-    # It was written by Cyclic Software, http://www.cyclic.com/, and is in

-    # the public domain.
-    # we could abandon the use of rlog, rcsdiff and co using
-    # the cvsserver in a similiar way one day (..after rewrite)
-    # $pid = open2($reader, $writer, "cvs server") || fatal ("500 Internal
Error",
-    #               "Fatal Error - unable to open cvs for annotation");
-    open ($writer, ">".$annotate_file) || fatal ("500 Internal Error",
-              "Fatal Error - unable to open cvs temp file for annotation -
$!");
-
-    binmode($writer);
-    # OK, first send the request to the server.  A simplified example is:
-    #     Root /home/kingdon/zwork/cvsroot
-    #     Argument foo/xx
-    #     Directory foo
-    #     /home/kingdon/zwork/cvsroot/foo
-    #     Directory .
-    #     /home/kingdon/zwork/cvsroot
-    #     annotate
-    # although as you can see there are a few more details.
-
-    print $writer "Root $cvsroot\n";
-    print $writer "Valid-responses ok error Valid-requests Checked-in
Updated Merged Removed M E\n";
-    # Don't worry about sending valid-requests, the server just needs to
-    # support "annotate" and if it doesn't, there isn't anything to be
done.
-    print $writer "UseUnchanged\n";
-    print $writer "Argument -r\n";
-    print $writer "Argument $rev\n";
-    print $writer "Argument $where\n";
-
-    # The protocol requires us to fully fake a working directory (at
-    # least to the point of including the directories down to the one
-    # containing the file in question).
-    # So if $where is "dir/sdir/file", then @dirs will be
("dir","sdir","file")
-    my @dirs = split (/\//, $where);
-    my $path = "";
-    foreach (@dirs) {
- if ($path eq "") {
-     # In our example, $_ is "dir".
-     $path = $_;
- }
- else {
-     print $writer "Directory " . $path . "\n";
-     print $writer "$cvsroot/" . $path ."\n";
-     # In our example, $_ is "sdir" and $path becomes "dir/sdir"
-     # And the next time, "file" and "dir/sdir/file" (which then gets
-     # ignored, because we don't need to send Directory for the file).
-            $path = $path . "/" . $_;
- }
-    }
-    # And the last "Directory" before "annotate" is the top level.
-    print $writer "Directory .\n";
-    print $writer "$cvsroot\n";
-
-    print $writer "annotate\n";
-    # 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"
-    # were nicer about buffering, then we could just leave it open, I
think.
-    close ($writer) || die "cannot close: $!";
-    $pid = open($reader,  "type \"$annotate_file\" | cvs server 2>&1 |" )
|| fatal ("500 Internal Error",
-              "Fatal Error - unable to open cvs for annotation - currently
under repair");
-
+    $pid = open($reader,  "cvs -d$REMOTEROOT{$cvsroot} rannotate -r$rev
$where 2>&1 |" ) || fatal ("500 Internal Error",
+              "Fatal Error - unable to execute cvs rannotate");
     # Ready to get the responses from the server.
     # For example:
-    #     E Annotations for foo/xx
-    #     E ***************
-    #     M 1.3          (kingdon  06-Sep-97): hello
-    #     ok
+    #     Annotations for foo/xx
+    #     ***************
+    #     1.3          (kingdon  06-Sep-97): hello
     my ($lineNr) = 0;
     my ($oldLrev, $oldLusr) = ("", "");
     my ($revprint, $usrprint);
@@ -1117,48 +1055,37 @@
  print "<pre>";
     }
     while (<$reader>) {
- my @words = split;
- # Adding one is for the (single) space which follows $words[0].
- my $rest = substr ($_, length ($words[0]) + 1);
- if ($words[0] eq "E") {
+        if(/^Annotations/ || /^\*+$/) {
      next;
  }
- elsif ($words[0] eq "M") {
+ elsif (/^([0-9.]+)\s+\((\S+)\s+..-...-...:(.*\n)/) {
      $lineNr++;
-     my $lrev = substr ($_, 2, 13);
-     my $lusr = substr ($_, 16,  9);
-     my $line = substr ($_, 36);
+            my $lrev = $1;
+            my $lusr = $2;
+            my $line = $3;
+
      # we should parse the date here ..
      if ($lrev eq $oldLrev) {
-  $revprint = "             ";
+  $revprint = "";
      }
      else {
   $revprint = $lrev; $oldLusr = "";
      }
      if ($lusr eq $oldLusr) {
-  $usrprint = "         ";
+  $usrprint = "";
      }
      else {
   $usrprint = $lusr;
      }
      $oldLrev = $lrev;
      $oldLusr = $lusr;
-     # is there a less timeconsuming way to strip spaces ?
-     ($lrev = $lrev) =~ s/\s+//g;
      my $isCurrentRev = ("$rev" eq "$lrev");

      print "<b>" if ($isCurrentRev);
-     printf ("%8s%s%8s %4d:", $revprint, ($isCurrentRev ? "|" : " "),
$usrprint, $lineNr);
+     printf ("%-13s%s%-9s%5d:", $revprint, ($isCurrentRev ? "|" : " "),
$usrprint, $lineNr);
      print spacedHtmlText($line);
      print "</b>" if ($isCurrentRev);
  }
- elsif ($words[0] eq "ok") {
-     # We could complain about any text received after this, like the
-     # CVS command line client.  But for simplicity, we don't.
- }
- elsif ($words[0] eq "error") {
-     fatal ("500 Internal Error", "Error occured during annotate:
<b>$_</b>");
- }
     }
     if ($annTable) {
  print "</table>";
@@ -1267,9 +1194,8 @@

 sub cvswebMarkup {
     my ($filehandle,$fullname,$revision) = @_;
-    my ($pathname, $filename, $revnum);
+    my ($pathname, $filename);

-    $revnum = $revision * 1; # force numeric
     ($pathname = $where) =~ s/(Attic\/)?[^\/]*$//;
     ($filename = $where) =~ s/^.*\///;
     my ($fileurl) = urlencode($filename);
@@ -1290,7 +1216,7 @@
     print "<BR>\n";
     if ($show_log_in_markup) {
  readLog($fullname); #,$revision);
- printLog($revnum,0);
+ printLog($revision,0);
     }
     else {
  print "Version: <B>$revision</B><BR>\n";
@@ -2366,18 +2292,17 @@

 sub navigateHeader ($$$$$) {
     my ($swhere,$path,$filename,$rev,$title) = @_;
-    my $revnum = $rev *1; # force numeric
     $swhere = "" if ($swhere eq $scriptwhere);
     $swhere = urlencode($filename) if ($swhere eq "");
     print "<\!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"
>";
     print "<HTML>\n<HEAD>\n";
     print '<!-- march-hare.com CVSwebNT $Revision: 1.93.2.2 $ -->';
-    print "\n<TITLE>$path$filename - $title - $revnum</TITLE></HEAD>\n";
+    print "\n<TITLE>$path$filename - $title - $rev</TITLE></HEAD>\n";
     print  "<BODY BGCOLOR=\"$backcolor\">\n";
     print "<table width=\"100%\" border=0 cellspacing=0 cellpadding=1
bgcolor=\"$navigationHeaderColor\">";
     print "<tr valign=bottom><td>";
-    print  "<a href=\"$swhere$query#rev$revnum\">$backicon";
-    print "</a> <b>Return to ",
&link("$filename","$swhere$query#rev$revnum")," CVS log";
+    print  "<a href=\"$swhere$query#rev$rev\">$backicon";
+    print "</a> <b>Return to ",
&link("$filename","$swhere$query#rev$rev")," CVS log";
     print "</b> $fileicon</td>";

     print "<td align=right>$diricon <b>Up to ". &clickablePath($path, 1).
"</b></td>";
@@ -2574,9 +2499,6 @@
 # make A url for downloading
 sub download_url {
     my ($url,$revision,$mimetype) = @_;
-    my $revnum = $revision *1; #force numeric
-
-    $revision =~ s/\b0\.//;

     if (defined($checkout_magic)
  && (!defined($mimetype) || $mimetype ne "text/x-cvsweb-markup")) {
@@ -2584,7 +2506,7 @@
  ($path = $where) =~ s|/[^/]*$|/|;
  $url = "$scriptname/$checkoutMagic/${path}$url";
     }
-    $url .= "?rev=$revnum";
+    $url .= "?rev=$revision";
     $url .= "&amp;content-type=$mimetype" if (defined($mimetype));

     return $url;
--- cvsweb.conf Wed Jul 24 15:26:48 2002
+++ newcvsweb.conf Wed Jul 24 15:28:05 2002
@@ -27,6 +27,14 @@
     'Configuration' => 'c:/cvsroot_config'
 );

+# This indicates a CVSROOT value used to connect to each
+# repository for annotations.  SSPI works well if you are using
+# windows authentication on your web server.  For other auth
+# types you will need to establish an appropriate .cvspass.
+%REMOTEROOT = (
+    'c:/cvs' => ':sspi:cvsweb_server:c:\\cvs'
+);
+
 # This tree is enabled by default when
 # you enter the page
 # $cvstreedefault = 'Configuration';



_______________________________________________
Cvsnt mailing list
Cvsnt at cvsnt.org
http://www.cvsnt.org/cgi-bin/mailman/listinfo/cvsnt



More information about the cvsnt mailing list