=================================================================== RCS file: /cvs/cvsweb/cvsweb.cgi,v retrieving revision 3.23 retrieving revision 3.27 diff -u -p -r3.23 -r3.27 --- cvsweb/cvsweb.cgi 2000/09/19 19:57:58 3.23 +++ cvsweb/cvsweb.cgi 2000/09/28 18:06:58 3.27 @@ -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.101 2000/09/13 22:44:05 jumager Exp $ -# $Id: cvsweb.cgi,v 3.23 2000/09/19 19:57:58 knu Exp $ +# $zId: cvsweb.cgi,v 1.103 2000/09/20 17:02:29 jumager Exp $ +# $Id: cvsweb.cgi,v 3.27 2000/09/28 18:06:58 knu Exp $ # ### @@ -64,8 +64,9 @@ use vars qw ( $bylog $byfile $hr_default $logsort $cvstree $cvsroot $mimetype $defaultTextPlain $defaultViewable $allow_compress $GZIPBIN $backicon $diricon $fileicon $fullname $newname - $cvstreedefault $body_tag $logo $defaulttitle $address - $backcolor $long_intro $short_instruction $shortLogLen + $cvstreedefault $body_tag $body_tag_for_src + $logo $defaulttitle $address + $long_intro $short_instruction $shortLogLen $show_author $dirtable $tablepadding $columnHeaderColorDefault $columnHeaderColorSorted $hr_breakable $showfunc $hr_ignwhite $hr_ignkeysubst $diffcolorHeading $diffcolorEmpty $diffcolorRemove @@ -90,6 +91,8 @@ sub fatal($$); sub redirect($); sub safeglob($); sub getMimeTypeFromSuffix($); +sub head($;$); +sub scan_directives(@); sub doAnnotate($$); sub doCheckout($$); sub cvswebMarkup($$$); @@ -143,8 +146,9 @@ $allow_version_select = 1; # These are defined to allow checking with perl -cw %CVSROOT = %MIRRORS = %DEFAULTVALUE = %ICONS = %MTYPES = %tags = %alltags = @tabcolors = (); -$cvstreedefault = $body_tag = $logo = $defaulttitle = $address = -$backcolor = $long_intro = $short_instruction = $shortLogLen = +$cvstreedefault = $body_tag = $body_tag_for_src = +$logo = $defaulttitle = $address = +$long_intro = $short_instruction = $shortLogLen = $show_author = $dirtable = $tablepadding = $columnHeaderColorDefault = $columnHeaderColorSorted = $hr_breakable = $showfunc = $hr_ignwhite = $hr_ignkeysubst = $diffcolorHeading = $diffcolorEmpty = $diffcolorRemove = @@ -154,7 +158,7 @@ $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 = undef; +$tabstop = $use_moddate = $moddate = $gzip_open = undef; ##### End of configuration variables ##### @@ -207,7 +211,8 @@ $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 = (($ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip` +$maycompress = (((defined($ENV{HTTP_ACCEPT_ENCODING}) + && $ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip`) || $is_mozilla3) && !$is_msie && !($is_mod_perl && !$has_zlib)); @@ -219,9 +224,11 @@ $maycompress = (($ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip` @stickyvars = qw(cvsroot hideattic sortby logsort f only_with_tag); if (-f $config) { - do $config; -} -else { + do $config + || &fatal("500 Internal Error", + sprintf('Error in loading configuration file: %s

%s
', + $config, &htmlify($@))); +} else { &fatal("500 Internal Error", 'Configuration not found. Set the variable $config ' . 'in cvsweb.cgi, or the environment variable ' @@ -350,8 +357,15 @@ foreach my $k (keys %ICONS) { } } +my $config_cvstree = "$config-$cvstree"; + # Do some special configuration for cvstrees -do "$config-$cvstree" if (-f "$config-$cvstree"); +if (-f $config_cvstree) { + do $config_cvstree + || &fatal("500 Internal Error", + sprintf('Error in loading configuration file: %s

%s
', + $config_cvstree, &htmlify($@))); +} $prcategories = '(?:' . join('|', @prcategories) . ')'; $prcgi .= '%s' if defined($prcgi) && $prcgi !~ /%s/; @@ -780,18 +794,18 @@ elsif (-d $fullname) { elsif (-f $fullname . ',v') { if (defined($input{'rev'}) || $doCheckout) { &doCheckout($fullname, $input{'rev'}); - close(GZIP) if ($gzip_open); + gzipclose(); exit; } if (defined($input{'annotate'}) && $allow_annotate) { &doAnnotate($input{'annotate'}); - close(GZIP) if ($gzip_open); + gzipclose(); exit; } if (defined($input{'r1'}) && defined($input{'r2'})) { &doDiff($fullname, $input{'r1'}, $input{'tr1'}, $input{'r2'}, $input{'tr2'}, $input{'f'}); - close(GZIP) if ($gzip_open); + gzipclose(); exit; } print("going to dolog($fullname)\n") if ($verbose); @@ -814,7 +828,7 @@ elsif (-d $fullname) { # e.g. foo.c &doDiff($fullname, $input{'r1'}, $input{'tr1'}, $input{'r2'}, $input{'tr2'}, $input{'f'}); - close(GZIP) if ($gzip_open); + gzipclose(); exit; } elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| && @@ -849,7 +863,7 @@ elsif (-d $fullname) { &fatal("404 Not Found","$where: no such file or directory"); } -close(GZIP) if ($gzip_open); +gzipclose(); ## End MAIN sub printDiffSelect($) { @@ -1075,6 +1089,40 @@ 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($$) { @@ -1175,7 +1223,15 @@ sub doAnnotate($$) { else { print "
";
     }
-    while (<$reader>) {
+
+    # prefetch several lines
+    my @buf = head($reader);
+
+    my %d = scan_directives(@buf);
+
+    while (@buf || !eof($reader)) {
+	$_ = @buf ? shift @buf : <$reader>;
+
 	my @words = split;
 	# Adding one is for the (single) space which follows $words[0].
 	my $rest = substr ($_, length ($words[0]) + 1);
@@ -1209,7 +1265,7 @@ sub doAnnotate($$) {
 
 	    print "" if ($isCurrentRev);
 	    printf ("%8s%s%8s %4d:", $revprint, ($isCurrentRev ? "|" : " "), $usrprint, $lineNr);
-	    print spacedHtmlText($line);
+	    print spacedHtmlText($line, $d{'tabstop'});
 	    print "" if ($isCurrentRev);
 	}
 	elsif ($words[0] eq "ok") {
@@ -1352,7 +1408,6 @@ sub cvswebMarkup($$$) {
 	    $input{only_with_tag};
     }
     print "";
-    my @content = <$filehandle>;
     my $url = download_url($fileurl, $revision, $mimetype);
     print "
"; if ($mimetype =~ /^image/) { @@ -1363,8 +1418,16 @@ sub cvswebMarkup($$$) { } else { print "
";
-	foreach (@content) {
-	    print spacedHtmlText($_);
+
+	# prefetch several lines
+	my @buf = head($filehandle);
+
+	my %d = scan_directives(@buf);
+
+	while (@buf || !eof($filehandle)) {
+	    $_ = @buf ? shift @buf : <$filehandle>;
+
+	    print spacedHtmlText($_, $d{'tabstop'});
 	}
 	print "
"; } @@ -1471,7 +1534,7 @@ sub doDiff($$$$$$) { if ($human_readable) { http_header(); &human_readable_diff($fh, $rev2); - close(GZIP) if ($gzip_open); + gzipclose(); exit; } else { @@ -2254,7 +2317,7 @@ sub flush_diff_rows($$$$) { # human_readable_diff(String revision_to_return_to); ## sub human_readable_diff($){ - my ($i,$difftxt, $where_nd, $filename, $pathname, $scriptwhere_nd); + my ($difftxt, $where_nd, $filename, $pathname, $scriptwhere_nd); my ($fh, $rev) = @_; my ($date1, $date2, $r1d, $r2d, $r1r, $r2r, $rev1, $rev2, $sym1, $sym2); my (@rightCol, @leftCol); @@ -2308,9 +2371,15 @@ 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 ""; @@ -2326,7 +2395,7 @@ sub human_readable_diff($){ } else { ($diffcode,$rest) = $difftxt =~ /^([-+ ])(.*)/; - $_ = spacedHtmlText ($rest); + $_ = spacedHtmlText($rest, $d{'tabstop'}); # Add fontface, size $_ = "$fs $_$fe"; @@ -2410,9 +2479,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 "\n"; + print "$body_tag_for_src\n"; print ""; print "
"; print "$backicon"; @@ -2765,7 +2834,7 @@ sub http_header(;$) { sub html_header($) { my ($title) = @_; - my $version = '$zRevision: 1.101 $ $Revision: 3.23 $'; #' + my $version = '$zRevision: 1.103 $ $Revision: 3.27 $'; #' http_header(); print <