===================================================================
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 "