=================================================================== RCS file: /cvs/cvsweb/cvsweb.cgi,v retrieving revision 1.1.1.10 retrieving revision 3.23 diff -u -p -r1.1.1.10 -r3.23 --- cvsweb/cvsweb.cgi 2000/10/07 07:50:18 1.1.1.10 +++ cvsweb/cvsweb.cgi 2000/09/19 19:57:58 3.23 @@ -42,8 +42,8 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -# $zId: cvsweb.cgi,v 1.103 2000/09/20 17:02:29 jumager Exp $ -# $kId: cvsweb.cgi,v 1.33 2000/10/07 07:44:12 knu Exp $ +# $zId: cvsweb.cgi,v 1.101 2000/09/13 22:44:05 jumager Exp $ +# $Id: cvsweb.cgi,v 3.23 2000/09/19 19:57:58 knu Exp $ # ### @@ -64,9 +64,8 @@ use vars qw ( $bylog $byfile $hr_default $logsort $cvstree $cvsroot $mimetype $defaultTextPlain $defaultViewable $allow_compress $GZIPBIN $backicon $diricon $fileicon $fullname $newname - $cvstreedefault $body_tag $body_tag_for_src - $logo $defaulttitle $address - $long_intro $short_instruction $shortLogLen + $cvstreedefault $body_tag $logo $defaulttitle $address + $backcolor $long_intro $short_instruction $shortLogLen $show_author $dirtable $tablepadding $columnHeaderColorDefault $columnHeaderColorSorted $hr_breakable $showfunc $hr_ignwhite $hr_ignkeysubst $diffcolorHeading $diffcolorEmpty $diffcolorRemove @@ -79,7 +78,6 @@ use vars qw ( $tabstop $state $annTable $sel $curbranch @HideModules $module $use_descriptions %descriptions @mytz $dwhere $moddate $use_moddate $has_zlib $gzip_open - $LOG_FILESEPARATOR $LOG_REVSEPARATOR ); sub printDiffSelect($); @@ -92,8 +90,6 @@ sub fatal($$); sub redirect($); sub safeglob($); sub getMimeTypeFromSuffix($); -sub head($;$); -sub scan_directives(@); sub doAnnotate($$); sub doCheckout($$); sub cvswebMarkup($$$); @@ -126,13 +122,14 @@ sub forbidden_module($); use Cwd; # == EDIT this == -# Locations to search for user configuration, in order: -for ( - $ENV{CVSWEB_CONFIG}, +# User configuration is stored in +$config = undef; + +for ($ENV{CVSWEB_CONFIG}, +# '/home/knu/etc/cvsweb.conf', '/usr/local/etc/cvsweb.conf', - getcwd() . '/cvsweb.conf' - ) { - $config = $_ if defined($_) && -r $_; + getcwd . '/cvsweb.conf') { + $config = $_ if defined($_) && -r $_; } # == Configuration defaults == @@ -146,9 +143,8 @@ $allow_version_select = 1; # These are defined to allow checking with perl -cw %CVSROOT = %MIRRORS = %DEFAULTVALUE = %ICONS = %MTYPES = %tags = %alltags = @tabcolors = (); -$cvstreedefault = $body_tag = $body_tag_for_src = -$logo = $defaulttitle = $address = -$long_intro = $short_instruction = $shortLogLen = +$cvstreedefault = $body_tag = $logo = $defaulttitle = $address = +$backcolor = $long_intro = $short_instruction = $shortLogLen = $show_author = $dirtable = $tablepadding = $columnHeaderColorDefault = $columnHeaderColorSorted = $hr_breakable = $showfunc = $hr_ignwhite = $hr_ignkeysubst = $diffcolorHeading = $diffcolorEmpty = $diffcolorRemove = @@ -158,11 +154,8 @@ $allow_markup = $use_java_script = $open_extern_window $extern_window_width = $extern_window_height = $edit_option_form = $checkout_magic = $show_subdir_lastmod = $show_log_in_markup = $v = $navigationHeaderColor = $tableBorderColor = $markupLogColor = -$tabstop = $use_moddate = $moddate = $gzip_open = undef; +$tabstop = $use_moddate = $moddate = undef; -$LOG_FILESEPARATOR = q/^={77}$/; -$LOG_REVSEPARATOR = q/^-{28}$/; - ##### End of configuration variables ##### use Time::Local; @@ -214,8 +207,7 @@ $nofilelinks = $is_textbased; # display garbage then :-/ # Turn off gzip if running under mod_perl and no zlib is available, # piping does not work as expected inside the server. -$maycompress = (((defined($ENV{HTTP_ACCEPT_ENCODING}) - && $ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip`) +$maycompress = (($ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip` || $is_mozilla3) && !$is_msie && !($is_mod_perl && !$has_zlib)); @@ -227,11 +219,9 @@ $maycompress = (((defined($ENV{HTTP_ACCEPT_ENCODING}) @stickyvars = qw(cvsroot hideattic sortby logsort f only_with_tag); if (-f $config) { - do $config - || &fatal("500 Internal Error", - sprintf('Error in loading configuration file: %s

%s
', - $config, &htmlify($@))); -} else { + do $config; +} +else { &fatal("500 Internal Error", 'Configuration not found. Set the variable $config ' . 'in cvsweb.cgi, or the environment variable ' @@ -283,24 +273,25 @@ foreach (keys %DEFAULTVALUE) } $barequery = ""; -my @barequery; foreach (@stickyvars) { # construct a query string with the sticky non default parameters set if (defined($input{$_}) && $input{$_} ne '' && !(defined($DEFAULTVALUE{$_}) && $input{$_} eq $DEFAULTVALUE{$_})) { - push @barequery, join('=', urlencode($_), urlencode($input{$_})); + if ($barequery) { + $barequery = $barequery . "&"; + } + my $thisval = urlencode($_) . "=" . urlencode($input{$_}); + $barequery .= $thisval; } } # is there any query ? -if (@barequery) { - $barequery = join('&', @barequery); +if ($barequery) { $query = "?$barequery"; - $barequery = "&$barequery"; + $barequery = "&" . $barequery; } else { $query = ""; } -undef @barequery; # get actual parameters $sortby = $input{"sortby"}; @@ -348,8 +339,7 @@ if ($input{'cvsroot'} && $CVSROOT{$input{'cvsroot'}}) $cvsroot = $CVSROOT{$cvstree}; # create icons out of description -my $k; -foreach $k (keys %ICONS) { +foreach my $k (keys %ICONS) { no strict 'refs'; my ($itxt,$ipath,$iwidth,$iheight) = @{$ICONS{$k}}; if ($ipath) { @@ -359,18 +349,9 @@ foreach $k (keys %ICONS) { ${"${k}icon"} = $itxt; } } -undef $k; -my $config_cvstree = "$config-$cvstree"; - # Do some special configuration for cvstrees -if (-f $config_cvstree) { - do $config_cvstree - || &fatal("500 Internal Error", - sprintf('Error in loading configuration file: %s

%s
', - $config_cvstree, &htmlify($@))); -} -undef $config_cvstree; +do "$config-$cvstree" if (-f "$config-$cvstree"); $prcategories = '(?:' . join('|', @prcategories) . ')'; $prcgi .= '%s' if defined($prcgi) && $prcgi !~ /%s/; @@ -799,18 +780,18 @@ elsif (-d $fullname) { elsif (-f $fullname . ',v') { if (defined($input{'rev'}) || $doCheckout) { &doCheckout($fullname, $input{'rev'}); - gzipclose(); + close(GZIP) if ($gzip_open); exit; } if (defined($input{'annotate'}) && $allow_annotate) { &doAnnotate($input{'annotate'}); - gzipclose(); + close(GZIP) if ($gzip_open); exit; } if (defined($input{'r1'}) && defined($input{'r2'})) { &doDiff($fullname, $input{'r1'}, $input{'tr1'}, $input{'r2'}, $input{'tr2'}, $input{'f'}); - gzipclose(); + close(GZIP) if ($gzip_open); exit; } print("going to dolog($fullname)\n") if ($verbose); @@ -833,7 +814,7 @@ elsif (-d $fullname) { # e.g. foo.c &doDiff($fullname, $input{'r1'}, $input{'tr1'}, $input{'r2'}, $input{'tr2'}, $input{'f'}); - gzipclose(); + close(GZIP) if ($gzip_open); exit; } elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| && @@ -868,7 +849,7 @@ elsif (-d $fullname) { &fatal("404 Not Found","$where: no such file or directory"); } -gzipclose(); +close(GZIP) if ($gzip_open); ## End MAIN sub printDiffSelect($) { @@ -936,13 +917,13 @@ sub htmlify($;$) { if ($extra) { # get PR #'s as link .. if (defined($prcgi)) { - 1 while $string =~ s`\b(pr[:#]?\s*(?:#?\d+[,\s]\s*)*#?)(\d+)\b`$1 . &link($2, sprintf($prcgi, $2))`ie; # `; - $string =~ s`\b${prcategories}/(\d+)\b`&link($&, sprintf($prcgi, $1))`igeo; # `; + 1 while $string =~ s`\b(pr[:#]?\s*(?:#?\d+[,\s]\s*)*#?)(\d+)\b`$1 . &link($2, sprintf($prcgi, $2))`ie; # ` + $string =~ s`\b${prcategories}/(\d+)\b`&link($&, sprintf($prcgi, $1))`igeo; # ` } # get manpage specs as link .. if (defined($mancgi)) { - $string =~ s`\b([a-zA-Z]\w+)(?:\(([0-9n])\)\B|\.([0-9n])\b)`&link($&, sprintf($mancgi, $2 ne '' ? $2 : $3, $1))`ge; # `x; + $string =~ s`\b([a-zA-Z]\w+)\(([0-9n])\)\B`&link($&, sprintf($mancgi, $2, $1))`ge; # ` } } @@ -982,7 +963,7 @@ sub spacedHtmlText($;$) { sub link($$) { my($name, $where) = @_; - return "$name"; + return "$name\n"; } sub revcmp($$) { @@ -1094,40 +1075,6 @@ sub getMimeTypeFromSuffix($) { } ############################### -# read first lines like head(1) -############################### -sub head($;$) { - my $fh = $_[0]; - my $linecount = $_[1] || 10; - - my @buf; - - if ($linecount > 0) { - my $i; - for ($i = 0; !eof($fh) && $i < $linecount; $i++) { - push @buf, scalar <$fh>; - } - } else { - @buf = <$fh>; - } - - @buf; -} - -############################### -# scan vim and Emacs directives -############################### -sub scan_directives(@) { - my $ts = undef; - - for (@_) { - $ts = $1 if /\b(?:ts|tabstop|tab-width)[:=]\s*([1-9]\d*)\b/; - } - - ('tabstop' => $ts); -} - -############################### # show Annotation ############################### sub doAnnotate($$) { @@ -1147,6 +1094,11 @@ sub doAnnotate($$) { ($pathname = $where) =~ s/(Attic\/)?[^\/]*$//; ($filename = $where) =~ s/^.*\///; + http_header(); + + navigateHeader($scriptwhere,$pathname,$filename,$rev, "annotate"); + print "

Annotation of $pathname$filename, Revision $rev

\n"; + # this seems to be necessary $| = 1; $| = 0; # Flush @@ -1156,7 +1108,7 @@ sub doAnnotate($$) { # 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 -Rl server") || fatal ("500 Internal Error", + $pid = open2($reader, $writer, "cvs server") || fatal ("500 Internal Error", "Fatal Error - unable to open cvs for annotation"); # OK, first send the request to the server. A simplified example is: @@ -1208,11 +1160,6 @@ sub doAnnotate($$) { # were nicer about buffering, then we could just leave it open, I think. close ($writer) || die "cannot close: $!"; - http_header(); - - navigateHeader($scriptwhere,$pathname,$filename,$rev, "annotate"); - print "

Annotation of $pathname$filename, Revision $rev

\n"; - # Ready to get the responses from the server. # For example: # E Annotations for foo/xx @@ -1228,15 +1175,7 @@ sub doAnnotate($$) { else { print "
";
     }
-
-    # prefetch several lines
-    my @buf = head($reader);
-
-    my %d = scan_directives(@buf);
-
-    while (@buf || !eof($reader)) {
-	$_ = @buf ? shift @buf : <$reader>;
-
+    while (<$reader>) {
 	my @words = split;
 	# Adding one is for the (single) space which follows $words[0].
 	my $rest = substr ($_, length ($words[0]) + 1);
@@ -1245,41 +1184,33 @@ sub doAnnotate($$) {
 	}
 	elsif ($words[0] eq "M") {
 	    $lineNr++;
-	    (my $lrev = substr($_, 2, 13)) =~ y/ //d;
-	    (my $lusr = substr($_, 16,  9)) =~ y/ //d;
-	    my $line = substr($_, 36);
-	    my $isCurrentRev = ($rev eq $lrev);
+	    my $lrev = substr ($_, 2, 13);
+	    my $lusr = substr ($_, 16,  9);
+	    my $line = substr ($_, 36);
 	    # we should parse the date here ..
 	    if ($lrev eq $oldLrev) {
-		$revprint = sprintf('%-8s', '');
+		$revprint = "             ";
 	    }
 	    else {
-		$revprint = sprintf('%-8s', $lrev);
-		$revprint =~ s`\S+`$&`;	# `		
-		$oldLusr = '';
+		$revprint = $lrev; $oldLusr = "";
+		$revprint =~ s`^(\S+)`$1`;	# `		
 	    }
 	    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);
 
-	    # Set bold for text-based browsers only - graphical
-	    # browsers show bold fonts a bit wider than regular fonts,
-	    # so it looks irregular.
-	    print "" if ($isCurrentRev && $is_textbased);
-
-	    printf "%s%s %-8s %4d:",
-		    $revprint,
-		    $isCurrentRev ? '!' : ' ',
-		    $usrprint,
-		    $lineNr;
-	    print spacedHtmlText($line, $d{'tabstop'});
-
-	    print "" if ($isCurrentRev && $is_textbased);
+	    print "" if ($isCurrentRev);
+	    printf ("%8s%s%8s %4d:", $revprint, ($isCurrentRev ? "|" : " "), $usrprint, $lineNr);
+	    print spacedHtmlText($line);
+	    print "" if ($isCurrentRev);
 	}
 	elsif ($words[0] eq "ok") {
 	    # We could complain about any text received after this, like the
@@ -1421,6 +1352,7 @@ sub cvswebMarkup($$$) {
 	    $input{only_with_tag};
     }
     print "";
+    my @content = <$filehandle>;
     my $url = download_url($fileurl, $revision, $mimetype);
     print "
"; if ($mimetype =~ /^image/) { @@ -1431,16 +1363,8 @@ sub cvswebMarkup($$$) { } else { print "
";
-
-	# prefetch several lines
-	my @buf = head($filehandle);
-
-	my %d = scan_directives(@buf);
-
-	while (@buf || !eof($filehandle)) {
-	    $_ = @buf ? shift @buf : <$filehandle>;
-
-	    print spacedHtmlText($_, $d{'tabstop'});
+	foreach (@content) {
+	    print spacedHtmlText($_);
 	}
 	print "
"; } @@ -1547,7 +1471,7 @@ sub doDiff($$$$$$) { if ($human_readable) { http_header(); &human_readable_diff($fh, $rev2); - gzipclose(); + close(GZIP) if ($gzip_open); exit; } else { @@ -1698,7 +1622,7 @@ again: $state = "head"; goto again; } - if ($state eq "head" && /$LOG_REVSEPARATOR/o) { + if ($state eq "head" && /^----------------------------$/) { $state = "log"; $rev = undef; $date = undef; @@ -1708,7 +1632,8 @@ again: next; } if ($state eq "log") { - if (/$LOG_REVSEPARATOR/o || /$LOG_FILESEPARATOR/o) { + if (/^----------------------------$/ + || /^=============================/) { # End of a log entry. my $revbranch; ($revbranch = $rev) =~ s/\.\d+$//; @@ -1755,7 +1680,7 @@ again: $log = $log . $_; } } - if (/$LOG_FILESEPARATOR/o) { + if (/^===============/) { $state = "start"; next; } @@ -1829,7 +1754,7 @@ sub readLog($;$) { # log info # ---------------------------- logentry: - while (!/$LOG_FILESEPARATOR/o) { + while (!/^=========/) { $_ = <$fh>; last logentry if (!defined($_)); # EOF print "R:", $_ if ($verbose); @@ -1837,7 +1762,7 @@ sub readLog($;$) { $rev = $1; unshift(@allrevisions,$rev); } - elsif (/$LOG_FILESEPARATOR/o || /$LOG_REVSEPARATOR/o) { + elsif (/^========/ || /^----------------------------$/) { next logentry; } else { @@ -1871,7 +1796,7 @@ sub readLog($;$) { while (<$fh>) { print "L:", $_ if ($verbose); next line if (/^branches:\s/); - last line if (/$LOG_FILESEPARATOR/o || /$LOG_REVSEPARATOR/o); + last line if (/^----------------------------$/ || /^=========/); $log{$rev} .= $_; } print "E:", $_ if ($verbose); @@ -2329,7 +2254,7 @@ sub flush_diff_rows($$$$) { # human_readable_diff(String revision_to_return_to); ## sub human_readable_diff($){ - my ($difftxt, $where_nd, $filename, $pathname, $scriptwhere_nd); + my ($i,$difftxt, $where_nd, $filename, $pathname, $scriptwhere_nd); my ($fh, $rev) = @_; my ($date1, $date2, $r1d, $r2d, $r1r, $r2r, $rev1, $rev2, $sym1, $sym2); my (@rightCol, @leftCol); @@ -2383,15 +2308,9 @@ sub human_readable_diff($){ # cascading style sheets because we've to set the # font and color for each row. anyone ...? #### + while (<$fh>) { + $difftxt = $_; - # prefetch several lines - my @buf = head($fh); - - my %d = scan_directives(@buf); - - while (@buf || !eof($fh)) { - $difftxt = @buf ? shift @buf : <$fh>; - if ($difftxt =~ /^@@/) { ($oldline,$newline,$funname) = $difftxt =~ /@@ \-([0-9]+).*\+([0-9]+).*@@(.*)/; print ""; @@ -2407,7 +2326,7 @@ sub human_readable_diff($){ } else { ($diffcode,$rest) = $difftxt =~ /^([-+ ])(.*)/; - $_ = spacedHtmlText($rest, $d{'tabstop'}); + $_ = spacedHtmlText ($rest); # Add fontface, size $_ = "$fs $_$fe"; @@ -2491,9 +2410,9 @@ sub navigateHeader($$$$$) { $swhere = urlencode($filename) if ($swhere eq ""); print "<\!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"; print "\n\n"; - print ''; + print ''; print "\n$path$filename - $title - $rev\n"; - print "$body_tag_for_src\n"; + print "\n"; print ""; print "
"; print "$backicon"; @@ -2846,7 +2765,7 @@ sub http_header(;$) { sub html_header($) { my ($title) = @_; - my $version = '$zRevision: 1.103 $ $kRevision: 1.33 $'; #' + my $version = '$zRevision: 1.101 $ $Revision: 3.23 $'; #' http_header(); print <