version 1.1.1.6, 2000/09/19 20:14:40 |
version 3.30, 2000/09/30 20:10:01 |
|
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# SUCH DAMAGE. |
# |
# |
# $zId: cvsweb.cgi,v 1.101 2000/09/13 22:44:05 jumager Exp $ |
# $zId: cvsweb.cgi,v 1.103 2000/09/20 17:02:29 jumager Exp $ |
# $kId: cvsweb.cgi,v 1.24 2000/09/19 20:07:16 knu Exp $ |
# $Id$ |
# |
# |
### |
### |
|
|
|
|
$bylog $byfile $hr_default $logsort $cvstree $cvsroot |
$bylog $byfile $hr_default $logsort $cvstree $cvsroot |
$mimetype $defaultTextPlain $defaultViewable $allow_compress |
$mimetype $defaultTextPlain $defaultViewable $allow_compress |
$GZIPBIN $backicon $diricon $fileicon $fullname $newname |
$GZIPBIN $backicon $diricon $fileicon $fullname $newname |
$cvstreedefault $body_tag $logo $defaulttitle $address |
$cvstreedefault $body_tag $body_tag_for_src |
$backcolor $long_intro $short_instruction $shortLogLen |
$logo $defaulttitle $address |
|
$long_intro $short_instruction $shortLogLen |
$show_author $dirtable $tablepadding $columnHeaderColorDefault |
$show_author $dirtable $tablepadding $columnHeaderColorDefault |
$columnHeaderColorSorted $hr_breakable $showfunc $hr_ignwhite |
$columnHeaderColorSorted $hr_breakable $showfunc $hr_ignwhite |
$hr_ignkeysubst $diffcolorHeading $diffcolorEmpty $diffcolorRemove |
$hr_ignkeysubst $diffcolorHeading $diffcolorEmpty $diffcolorRemove |
Line 124 sub forbidden_module($); |
|
Line 125 sub forbidden_module($); |
|
use Cwd; |
use Cwd; |
|
|
# == EDIT this == |
# == EDIT this == |
# User configuration is stored in |
# Locations to search for user configuration, in order: |
$config = undef; |
for ( |
|
$ENV{CVSWEB_CONFIG}, |
for ($ENV{CVSWEB_CONFIG}, |
|
# '/home/knu/etc/cvsweb.conf', |
|
'/usr/local/etc/cvsweb.conf', |
'/usr/local/etc/cvsweb.conf', |
getcwd . '/cvsweb.conf') { |
getcwd() . '/cvsweb.conf' |
$config = $_ if defined($_) && -r $_; |
) { |
|
$config = $_ if defined($_) && -r $_; |
} |
} |
|
|
# == Configuration defaults == |
# == Configuration defaults == |
Line 145 $allow_version_select = 1; |
|
Line 145 $allow_version_select = 1; |
|
# These are defined to allow checking with perl -cw |
# These are defined to allow checking with perl -cw |
%CVSROOT = %MIRRORS = %DEFAULTVALUE = %ICONS = %MTYPES = |
%CVSROOT = %MIRRORS = %DEFAULTVALUE = %ICONS = %MTYPES = |
%tags = %alltags = @tabcolors = (); |
%tags = %alltags = @tabcolors = (); |
$cvstreedefault = $body_tag = $logo = $defaulttitle = $address = |
$cvstreedefault = $body_tag = $body_tag_for_src = |
$backcolor = $long_intro = $short_instruction = $shortLogLen = |
$logo = $defaulttitle = $address = |
|
$long_intro = $short_instruction = $shortLogLen = |
$show_author = $dirtable = $tablepadding = $columnHeaderColorDefault = |
$show_author = $dirtable = $tablepadding = $columnHeaderColorDefault = |
$columnHeaderColorSorted = $hr_breakable = $showfunc = $hr_ignwhite = |
$columnHeaderColorSorted = $hr_breakable = $showfunc = $hr_ignwhite = |
$hr_ignkeysubst = $diffcolorHeading = $diffcolorEmpty = $diffcolorRemove = |
$hr_ignkeysubst = $diffcolorHeading = $diffcolorEmpty = $diffcolorRemove = |
Line 156 $allow_markup = $use_java_script = $open_extern_window |
|
Line 157 $allow_markup = $use_java_script = $open_extern_window |
|
$extern_window_width = $extern_window_height = $edit_option_form = |
$extern_window_width = $extern_window_height = $edit_option_form = |
$checkout_magic = $show_subdir_lastmod = $show_log_in_markup = $v = |
$checkout_magic = $show_subdir_lastmod = $show_log_in_markup = $v = |
$navigationHeaderColor = $tableBorderColor = $markupLogColor = |
$navigationHeaderColor = $tableBorderColor = $markupLogColor = |
$tabstop = $use_moddate = $moddate = undef; |
$tabstop = $use_moddate = $moddate = $gzip_open = undef; |
|
|
##### End of configuration variables ##### |
##### End of configuration variables ##### |
|
|
Line 209 $nofilelinks = $is_textbased; |
|
Line 210 $nofilelinks = $is_textbased; |
|
# display garbage then :-/ |
# display garbage then :-/ |
# Turn off gzip if running under mod_perl and no zlib is available, |
# Turn off gzip if running under mod_perl and no zlib is available, |
# piping does not work as expected inside the server. |
# 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_mozilla3) |
&& !$is_msie |
&& !$is_msie |
&& !($is_mod_perl && !$has_zlib)); |
&& !($is_mod_perl && !$has_zlib)); |
Line 221 $maycompress = (($ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip` |
|
Line 223 $maycompress = (($ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip` |
|
@stickyvars = qw(cvsroot hideattic sortby logsort f only_with_tag); |
@stickyvars = qw(cvsroot hideattic sortby logsort f only_with_tag); |
|
|
if (-f $config) { |
if (-f $config) { |
do $config; |
do $config |
} |
|| &fatal("500 Internal Error", |
else { |
sprintf('Error in loading configuration file: %s<BR><BR>%s<BR>', |
|
$config, &htmlify($@))); |
|
} else { |
&fatal("500 Internal Error", |
&fatal("500 Internal Error", |
'Configuration not found. Set the variable <code>$config</code> ' |
'Configuration not found. Set the variable <code>$config</code> ' |
. 'in cvsweb.cgi, or the environment variable ' |
. 'in cvsweb.cgi, or the environment variable ' |
Line 352 foreach my $k (keys %ICONS) { |
|
Line 356 foreach my $k (keys %ICONS) { |
|
} |
} |
} |
} |
|
|
|
my $config_cvstree = "$config-$cvstree"; |
|
|
# Do some special configuration for cvstrees |
# 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<BR><BR>%s<BR>', |
|
$config_cvstree, &htmlify($@))); |
|
} |
|
|
$prcategories = '(?:' . join('|', @prcategories) . ')'; |
$prcategories = '(?:' . join('|', @prcategories) . ')'; |
$prcgi .= '%s' if defined($prcgi) && $prcgi !~ /%s/; |
$prcgi .= '%s' if defined($prcgi) && $prcgi !~ /%s/; |
Line 782 elsif (-d $fullname) { |
|
Line 793 elsif (-d $fullname) { |
|
elsif (-f $fullname . ',v') { |
elsif (-f $fullname . ',v') { |
if (defined($input{'rev'}) || $doCheckout) { |
if (defined($input{'rev'}) || $doCheckout) { |
&doCheckout($fullname, $input{'rev'}); |
&doCheckout($fullname, $input{'rev'}); |
close(GZIP) if ($gzip_open); |
gzipclose(); |
exit; |
exit; |
} |
} |
if (defined($input{'annotate'}) && $allow_annotate) { |
if (defined($input{'annotate'}) && $allow_annotate) { |
&doAnnotate($input{'annotate'}); |
&doAnnotate($input{'annotate'}); |
close(GZIP) if ($gzip_open); |
gzipclose(); |
exit; |
exit; |
} |
} |
if (defined($input{'r1'}) && defined($input{'r2'})) { |
if (defined($input{'r1'}) && defined($input{'r2'})) { |
&doDiff($fullname, $input{'r1'}, $input{'tr1'}, |
&doDiff($fullname, $input{'r1'}, $input{'tr1'}, |
$input{'r2'}, $input{'tr2'}, $input{'f'}); |
$input{'r2'}, $input{'tr2'}, $input{'f'}); |
close(GZIP) if ($gzip_open); |
gzipclose(); |
exit; |
exit; |
} |
} |
print("going to dolog($fullname)\n") if ($verbose); |
print("going to dolog($fullname)\n") if ($verbose); |
Line 816 elsif (-d $fullname) { |
|
Line 827 elsif (-d $fullname) { |
|
# e.g. foo.c |
# 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'}); |
close(GZIP) if ($gzip_open); |
gzipclose(); |
exit; |
exit; |
} |
} |
elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| && |
elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| && |
Line 851 elsif (-d $fullname) { |
|
Line 862 elsif (-d $fullname) { |
|
&fatal("404 Not Found","$where: no such file or directory"); |
&fatal("404 Not Found","$where: no such file or directory"); |
} |
} |
|
|
close(GZIP) if ($gzip_open); |
gzipclose(); |
## End MAIN |
## End MAIN |
|
|
sub printDiffSelect($) { |
sub printDiffSelect($) { |
Line 1130 sub doAnnotate($$) { |
|
Line 1141 sub doAnnotate($$) { |
|
($pathname = $where) =~ s/(Attic\/)?[^\/]*$//; |
($pathname = $where) =~ s/(Attic\/)?[^\/]*$//; |
($filename = $where) =~ s/^.*\///; |
($filename = $where) =~ s/^.*\///; |
|
|
http_header(); |
|
|
|
navigateHeader($scriptwhere,$pathname,$filename,$rev, "annotate"); |
|
print "<h3 align=center>Annotation of $pathname$filename, Revision $rev</h3>\n"; |
|
|
|
# this seems to be necessary |
# this seems to be necessary |
$| = 1; $| = 0; # Flush |
$| = 1; $| = 0; # Flush |
|
|
Line 1144 sub doAnnotate($$) { |
|
Line 1150 sub doAnnotate($$) { |
|
# the public domain. |
# the public domain. |
# we could abandon the use of rlog, rcsdiff and co using |
# we could abandon the use of rlog, rcsdiff and co using |
# the cvsserver in a similiar way one day (..after rewrite) |
# the cvsserver in a similiar way one day (..after rewrite) |
$pid = open2($reader, $writer, "cvs server") || fatal ("500 Internal Error", |
$pid = open2($reader, $writer, "cvs -Rl server") || fatal ("500 Internal Error", |
"Fatal Error - unable to open cvs for annotation"); |
"Fatal Error - unable to open cvs for annotation"); |
|
|
# OK, first send the request to the server. A simplified example is: |
# OK, first send the request to the server. A simplified example is: |
Line 1196 sub doAnnotate($$) { |
|
Line 1202 sub doAnnotate($$) { |
|
# were nicer about buffering, then we could just leave it open, I think. |
# were nicer about buffering, then we could just leave it open, I think. |
close ($writer) || die "cannot close: $!"; |
close ($writer) || die "cannot close: $!"; |
|
|
|
http_header(); |
|
|
|
navigateHeader($scriptwhere,$pathname,$filename,$rev, "annotate"); |
|
print "<h3 align=center>Annotation of $pathname$filename, Revision $rev</h3>\n"; |
|
|
# Ready to get the responses from the server. |
# Ready to get the responses from the server. |
# For example: |
# For example: |
# E Annotations for foo/xx |
# E Annotations for foo/xx |
Line 1228 sub doAnnotate($$) { |
|
Line 1239 sub doAnnotate($$) { |
|
} |
} |
elsif ($words[0] eq "M") { |
elsif ($words[0] eq "M") { |
$lineNr++; |
$lineNr++; |
my $lrev = substr ($_, 2, 13); |
(my $lrev = substr($_, 2, 13)) =~ y/ //d; |
my $lusr = substr ($_, 16, 9); |
(my $lusr = substr($_, 16, 9)) =~ y/ //d; |
my $line = substr ($_, 36); |
my $line = substr($_, 36); |
|
my $isCurrentRev = ($rev eq $lrev); |
# we should parse the date here .. |
# we should parse the date here .. |
if ($lrev eq $oldLrev) { |
if ($lrev eq $oldLrev) { |
$revprint = " "; |
$revprint = sprintf('%-8s', ''); |
} |
} |
else { |
else { |
$revprint = $lrev; $oldLusr = ""; |
$revprint = sprintf('%-8s', $lrev); |
$revprint =~ s`^(\S+)`<a href="${scriptwhere}${barequery}#rev$1">$1</A>`; # ` |
$revprint =~ s`\S+`<a href="${scriptwhere}${barequery}#rev$1">$&</A>`; # ` |
|
$oldLusr = ''; |
} |
} |
if ($lusr eq $oldLusr) { |
if ($lusr eq $oldLusr) { |
$usrprint = " "; |
$usrprint = ''; |
} |
} |
else { |
else { |
$usrprint = $lusr; |
$usrprint = $lusr; |
} |
} |
$oldLrev = $lrev; |
$oldLrev = $lrev; |
$oldLusr = $lusr; |
$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); |
# Set bold for text-based browsers only - graphical |
printf ("%8s%s%8s %4d:", $revprint, ($isCurrentRev ? "|" : " "), $usrprint, $lineNr); |
# browsers show bold fonts a bit wider than regular fonts, |
|
# so it looks irregular. |
|
print "<b>" if ($isCurrentRev && $is_textbased); |
|
|
|
printf ("%s%s %-8s %4d:", |
|
$revprint, |
|
$isCurrentRev ? '!' : ' ', |
|
$usrprint, |
|
$lineNr); |
print spacedHtmlText($line, $d{'tabstop'}); |
print spacedHtmlText($line, $d{'tabstop'}); |
print "</b>" if ($isCurrentRev); |
|
|
print "</b>" if ($isCurrentRev && $is_textbased); |
} |
} |
elsif ($words[0] eq "ok") { |
elsif ($words[0] eq "ok") { |
# We could complain about any text received after this, like the |
# We could complain about any text received after this, like the |
Line 1522 sub doDiff($$$$$$) { |
|
Line 1541 sub doDiff($$$$$$) { |
|
if ($human_readable) { |
if ($human_readable) { |
http_header(); |
http_header(); |
&human_readable_diff($fh, $rev2); |
&human_readable_diff($fh, $rev2); |
close(GZIP) if ($gzip_open); |
gzipclose(); |
exit; |
exit; |
} |
} |
else { |
else { |
Line 2467 sub navigateHeader($$$$$) { |
|
Line 2486 sub navigateHeader($$$$$) { |
|
$swhere = urlencode($filename) if ($swhere eq ""); |
$swhere = urlencode($filename) if ($swhere eq ""); |
print "<\!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"; |
print "<\!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"; |
print "<HTML>\n<HEAD>\n"; |
print "<HTML>\n<HEAD>\n"; |
print '<!-- CVSweb $zRevision: 1.101 $ $kRevision: 1.24 $ -->'; |
print '<!-- CVSweb $zRevision: 1.103 $ $Revision$ -->'; |
print "\n<TITLE>$path$filename - $title - $rev</TITLE></HEAD>\n"; |
print "\n<TITLE>$path$filename - $title - $rev</TITLE></HEAD>\n"; |
print "<BODY BGCOLOR=\"$backcolor\">\n"; |
print "$body_tag_for_src\n"; |
print "<table width=\"100%\" border=0 cellspacing=0 cellpadding=1 bgcolor=\"$navigationHeaderColor\">"; |
print "<table width=\"100%\" border=0 cellspacing=0 cellpadding=1 bgcolor=\"$navigationHeaderColor\">"; |
print "<tr valign=bottom><td>"; |
print "<tr valign=bottom><td>"; |
print "<a href=\"$swhere$query#rev$rev\">$backicon"; |
print "<a href=\"$swhere$query#rev$rev\">$backicon"; |
Line 2822 sub http_header(;$) { |
|
Line 2841 sub http_header(;$) { |
|
|
|
sub html_header($) { |
sub html_header($) { |
my ($title) = @_; |
my ($title) = @_; |
my $version = '$zRevision: 1.101 $ $kRevision: 1.24 $'; #' |
my $version = '$zRevision: 1.103 $ $Revision$'; #' |
http_header(); |
http_header(); |
print <<EOH; |
print <<EOH; |
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" |
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" |
Line 2867 sub forbidden_module($) { |
|
Line 2886 sub forbidden_module($) { |
|
} |
} |
|
|
return 0; |
return 0; |
|
} |
|
|
|
# Close the GZIP handle remove the tie. |
|
|
|
sub gzipclose { |
|
if ($gzip_open) { |
|
select(STDOUT); |
|
close(GZIP); |
|
untie *GZIP; |
|
$gzip_open = 0; |
|
} |
} |
} |
|
|
# implement a gzipped file handle via the Compress:Zlib compression |
# implement a gzipped file handle via the Compress:Zlib compression |