version 3.22, 2000/09/19 18:35:50 |
version 3.23, 2000/09/19 19:57:58 |
|
|
# Ken Coar <coar@Apache.Org> |
# Ken Coar <coar@Apache.Org> |
# Dick Balaska <dick@buckosoft.com> |
# Dick Balaska <dick@buckosoft.com> |
# Akinori MUSHA <knu@FreeBSD.org> |
# Akinori MUSHA <knu@FreeBSD.org> |
|
# Jens-Uwe Mager <jum@helios.de> |
# |
# |
# Based on: |
# Based on: |
# * Bill Fenners cvsweb.cgi revision 1.28 available from: |
# * Bill Fenners cvsweb.cgi revision 1.28 available from: |
|
|
# 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.94 2000/08/24 06:41:22 hnordstrom Exp $ |
# $zId: cvsweb.cgi,v 1.101 2000/09/13 22:44:05 jumager Exp $ |
# $Id$ |
# $Id$ |
# |
# |
### |
### |
|
|
$navigationHeaderColor $tableBorderColor $markupLogColor |
$navigationHeaderColor $tableBorderColor $markupLogColor |
$tabstop $state $annTable $sel $curbranch @HideModules |
$tabstop $state $annTable $sel $curbranch @HideModules |
$module $use_descriptions %descriptions @mytz $dwhere $moddate |
$module $use_descriptions %descriptions @mytz $dwhere $moddate |
$use_moddate |
$use_moddate $has_zlib $gzip_open |
); |
); |
|
|
sub printDiffSelect($); |
sub printDiffSelect($); |
Line 160 $tabstop = $use_moddate = $moddate = undef; |
|
Line 161 $tabstop = $use_moddate = $moddate = undef; |
|
use Time::Local; |
use Time::Local; |
use IPC::Open2; |
use IPC::Open2; |
|
|
|
# Check if the zlib C library interface is installed, and if yes |
|
# we can avoid using the extra gzip process. |
|
eval { |
|
require Compress::Zlib; |
|
}; |
|
$has_zlib = !$@; |
|
|
$verbose = $v; |
$verbose = $v; |
$checkoutMagic = "~checkout~"; |
$checkoutMagic = "~checkout~"; |
$pathinfo = defined($ENV{PATH_INFO}) ? $ENV{PATH_INFO} : ''; |
$pathinfo = defined($ENV{PATH_INFO}) ? $ENV{PATH_INFO} : ''; |
Line 197 $nofilelinks = $is_textbased; |
|
Line 205 $nofilelinks = $is_textbased; |
|
# braindamaged MS-Internet Exploders claim that they |
# braindamaged MS-Internet Exploders claim that they |
# accept gzip .. but don't in fact and |
# accept gzip .. but don't in fact and |
# display garbage then :-/ |
# display garbage then :-/ |
# Turn off gzip if running under mod_perl. piping does |
# Turn off gzip if running under mod_perl and no zlib is available, |
# not work as expected inside the server. One can probably |
# piping does not work as expected inside the server. |
# achieve the same result using Apache::GZIPFilter. |
|
$maycompress = (($ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip` |
$maycompress = (($ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip` |
|| $is_mozilla3) |
|| $is_mozilla3) |
&& !$is_msie |
&& !$is_msie |
&& !$is_mod_perl); |
&& !($is_mod_perl && !$has_zlib)); |
|
|
# put here the variables we need in order |
# put here the variables we need in order |
# to hold our state - they will be added (with |
# to hold our state - they will be added (with |
Line 359 $defaultViewable = $allow_markup && viewable($mimetype |
|
Line 366 $defaultViewable = $allow_markup && viewable($mimetype |
|
# ge get an Internal Server Error if we try to pipe the |
# ge get an Internal Server Error if we try to pipe the |
# output through the nonexistent gzip .. |
# output through the nonexistent gzip .. |
# any more elegant ways to prevent this are welcome! |
# any more elegant ways to prevent this are welcome! |
if ($allow_compress && $maycompress) { |
if ($allow_compress && $maycompress && !$has_zlib) { |
foreach (split(/:/, $ENV{PATH})) { |
foreach (split(/:/, $ENV{PATH})) { |
if (-x "$_/gzip") { |
if (-x "$_/gzip") { |
$GZIPBIN = "$_/gzip"; |
$GZIPBIN = "$_/gzip"; |
Line 710 elsif (-d $fullname) { |
|
Line 717 elsif (-d $fullname) { |
|
foreach my $var (@stickyvars) { |
foreach my $var (@stickyvars) { |
print "<INPUT TYPE=HIDDEN NAME=\"$var\" VALUE=\"$input{$var}\">\n" |
print "<INPUT TYPE=HIDDEN NAME=\"$var\" VALUE=\"$input{$var}\">\n" |
if (defined($input{$var}) |
if (defined($input{$var}) |
&& $input{$var} ne $DEFAULTVALUE{$var} |
&& (!defined($DEFAULTVALUE{$var}) |
|
|| $input{$var} ne $DEFAULTVALUE{$var}) |
&& $input{$var} ne "" |
&& $input{$var} ne "" |
&& $var ne "only_with_tag"); |
&& $var ne "only_with_tag"); |
} |
} |
Line 772 elsif (-d $fullname) { |
|
Line 780 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); |
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); |
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); |
exit; |
exit; |
} |
} |
print("going to dolog($fullname)\n") if ($verbose); |
print("going to dolog($fullname)\n") if ($verbose); |
Line 803 elsif (-d $fullname) { |
|
Line 814 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); |
exit; |
exit; |
} |
} |
elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| && |
elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| && |
Line 836 elsif (-d $fullname) { |
|
Line 848 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); |
## End MAIN |
## End MAIN |
|
|
sub printDiffSelect($) { |
sub printDiffSelect($) { |
Line 1344 sub cvswebMarkup($$$) { |
|
Line 1358 sub cvswebMarkup($$$) { |
|
if ($mimetype =~ /^image/) { |
if ($mimetype =~ /^image/) { |
print "<IMG SRC=\"$url$barequery\"><BR>"; |
print "<IMG SRC=\"$url$barequery\"><BR>"; |
} |
} |
|
elsif ($mimetype =~ m%^application/pdf%) { |
|
print "<EMBED SRC=\"$url$barequery\" WIDTH=\"100%\"><BR>"; |
|
} |
else { |
else { |
print "<PRE>"; |
print "<PRE>"; |
foreach (@content) { |
foreach (@content) { |
Line 1356 sub cvswebMarkup($$$) { |
|
Line 1373 sub cvswebMarkup($$$) { |
|
sub viewable($) { |
sub viewable($) { |
my ($mimetype) = @_; |
my ($mimetype) = @_; |
|
|
$mimetype =~ m%^(text|image)/%; |
$mimetype =~ m%^((text|image)/|application/pdf)% ; |
} |
} |
|
|
############################### |
############################### |
Line 1454 sub doDiff($$$$$$) { |
|
Line 1471 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); |
exit; |
exit; |
} |
} |
else { |
else { |
|
|
foreach (@stickyvars) { |
foreach (@stickyvars) { |
print "<INPUT TYPE=HIDDEN NAME=\"$_\" VALUE=\"$input{$_}\">\n" |
print "<INPUT TYPE=HIDDEN NAME=\"$_\" VALUE=\"$input{$_}\">\n" |
if (defined($input{$_}) |
if (defined($input{$_}) |
&& ($input{$_} ne $DEFAULTVALUE{$_} && $input{$_} ne "")); |
&& ((!defined($DEFAULTVALUE{$_}) |
|
|| $input{$_} ne $DEFAULTVALUE{$_}) |
|
&& $input{$_} ne "")); |
} |
} |
print "<TABLE><TR>\n"; |
print "<TABLE><TR>\n"; |
print "<TD align=right>Diffs between \n"; |
print "<TD align=right>Diffs between \n"; |
|
|
next if ($_ eq "only_with_tag"); |
next if ($_ eq "only_with_tag"); |
next if ($_ eq "logsort"); |
next if ($_ eq "logsort"); |
print "<INPUT TYPE=HIDDEN NAME=\"$_\" VALUE=\"$input{$_}\">\n" |
print "<INPUT TYPE=HIDDEN NAME=\"$_\" VALUE=\"$input{$_}\">\n" |
if (defined($input{$_}) && $input{$_} ne $DEFAULTVALUE{$_} |
if (defined($input{$_}) |
|
&& (!defined($DEFAULTVALUE{$_}) |
|
|| $input{$_} ne $DEFAULTVALUE{$_}) |
&& $input{$_} ne ""); |
&& $input{$_} ne ""); |
} |
} |
print "<TR><TD align=right>"; |
print "<TR><TD align=right>"; |
Line 2388 sub navigateHeader($$$$$) { |
|
Line 2410 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.94 $ $Revision$ -->'; |
print '<!-- CVSweb $zRevision: 1.101 $ $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 BGCOLOR=\"$backcolor\">\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\">"; |
Line 2689 sub http_header(;$) { |
|
Line 2711 sub http_header(;$) { |
|
my $content_type = shift || "text/html"; |
my $content_type = shift || "text/html"; |
if (defined($moddate)) { |
if (defined($moddate)) { |
if ($is_mod_perl) { |
if ($is_mod_perl) { |
Apache->request->header_out(Last_modified => scalar gmtime($moddate) . " GMT"); |
Apache->request->header_out("Last-Modified" => scalar gmtime($moddate) . " GMT"); |
} |
} |
else { |
else { |
print "Last-Modified: " . scalar gmtime($moddate) . " GMT\r\n"; |
print "Last-Modified: " . scalar gmtime($moddate) . " GMT\r\n"; |
Line 2702 sub http_header(;$) { |
|
Line 2724 sub http_header(;$) { |
|
print "Content-type: $content_type\r\n"; |
print "Content-type: $content_type\r\n"; |
} |
} |
if ($allow_compress && $maycompress) { |
if ($allow_compress && $maycompress) { |
my $fh = do {local(*FH);}; |
if ($has_zlib || (defined($GZIPBIN) && open(GZIP, "|$GZIPBIN -1 -c"))) { |
if (defined($GZIPBIN) && open($fh, "|$GZIPBIN -1 -c")) { |
|
if ($is_mod_perl) { |
if ($is_mod_perl) { |
Apache->request->content_encoding("x-gzip"); |
Apache->request->content_encoding("x-gzip"); |
Apache->request->header_out(Vary => "Accept-Encoding"); |
Apache->request->header_out(Vary => "Accept-Encoding"); |
Line 2715 sub http_header(;$) { |
|
Line 2736 sub http_header(;$) { |
|
print "\r\n"; # Close headers |
print "\r\n"; # Close headers |
} |
} |
$| = 1; $| = 0; # Flush header output |
$| = 1; $| = 0; # Flush header output |
select ($fh); |
if ($has_zlib) { |
|
tie *GZIP, __PACKAGE__, \*STDOUT; |
|
} |
|
select(GZIP); |
|
$gzip_open = 1; |
# print "<!-- gzipped -->" if ($content_type eq "text/html"); |
# print "<!-- gzipped -->" if ($content_type eq "text/html"); |
} |
} |
else { |
else { |
Line 2740 sub http_header(;$) { |
|
Line 2765 sub http_header(;$) { |
|
|
|
sub html_header($) { |
sub html_header($) { |
my ($title) = @_; |
my ($title) = @_; |
my $version = '$zRevision: 1.94 $ $Revision$'; #' |
my $version = '$zRevision: 1.101 $ $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 2785 sub forbidden_module($) { |
|
Line 2810 sub forbidden_module($) { |
|
} |
} |
|
|
return 0; |
return 0; |
|
} |
|
|
|
# implement a gzipped file handle via the Compress:Zlib compression |
|
# library. |
|
|
|
sub MAGIC1() { 0x1f } |
|
sub MAGIC2() { 0x8b } |
|
sub OSCODE() { 3 } |
|
|
|
sub TIEHANDLE { |
|
my ($class, $out) = @_; |
|
my ($d) = Compress::Zlib::deflateInit(-Level => Compress::Zlib::Z_BEST_COMPRESSION(), |
|
-WindowBits => -Compress::Zlib::MAX_WBITS()) or return undef; |
|
my ($o) = { |
|
handle => $out, |
|
dh => $d, |
|
crc => 0, |
|
len => 0, |
|
}; |
|
my ($header) = pack("c10", MAGIC1, MAGIC2, Compress::Zlib::Z_DEFLATED(), 0,0,0,0,0,0, OSCODE); |
|
print {$o->{handle}} $header; |
|
return bless($o, $class); |
|
} |
|
|
|
sub PRINT { |
|
my ($o) = shift; |
|
my ($buf) = join(defined $, ? $, : "",@_); |
|
my ($len) = length($buf); |
|
my ($compressed, $status) = $o->{dh}->deflate($buf); |
|
print {$o->{handle}} $compressed if defined($compressed); |
|
$o->{crc} = Compress::Zlib::crc32($buf, $o->{crc}); |
|
$o->{len} += $len; |
|
return $len; |
|
} |
|
|
|
sub PRINTF { |
|
my ($o) = shift; |
|
my ($fmt) = shift; |
|
my ($buf) = sprintf($fmt, @_); |
|
my ($len) = length($buf); |
|
my ($compressed, $status) = $o->{dh}->deflate($buf); |
|
print {$o->{handle}} $compressed if defined($compressed); |
|
$o->{crc} = Compress::Zlib::crc32($buf, $o->{crc}); |
|
$o->{len} += $len; |
|
return $len; |
|
} |
|
|
|
sub WRITE { |
|
my ($o, $buf, $len, $off) = @_; |
|
my ($compressed, $status) = $o->{dh}->deflate(substr($buf, 0, $len)); |
|
print {$o->{handle}} $compressed if defined($compressed); |
|
$o->{crc} = Compress::Zlib::crc32(substr($buf, 0, $len), $o->{crc}); |
|
$o->{len} += $len; |
|
return $len; |
|
} |
|
|
|
sub CLOSE { |
|
my ($o) = @_; |
|
return if !defined( $o->{dh}); |
|
my ($buf) = $o->{dh}->flush(); |
|
$buf .= pack("V V", $o->{crc}, $o->{len}); |
|
print {$o->{handle}} $buf; |
|
undef $o->{dh}; |
|
} |
|
|
|
sub DESTROY { |
|
my ($o) = @_; |
|
CLOSE($o); |
} |
} |