version 1.1.1.10, 2000/10/07 07:50:18 |
version 3.14, 2000/08/24 15:53:11 |
|
|
# 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.103 2000/09/20 17:02:29 jumager Exp $ |
# $zId: cvsweb.cgi,v 1.94 2000/08/24 06:41:22 hnordstrom Exp $ |
# $kId: cvsweb.cgi,v 1.33 2000/10/07 07:44:12 knu Exp $ |
# $Id$ |
# |
# |
### |
### |
|
|
|
|
%CVSROOT %CVSROOTdescr %MIRRORS %DEFAULTVALUE %ICONS %MTYPES |
%CVSROOT %CVSROOTdescr %MIRRORS %DEFAULTVALUE %ICONS %MTYPES |
%alltags @tabcolors %fileinfo %tags @branchnames %nameprinted |
%alltags @tabcolors %fileinfo %tags @branchnames %nameprinted |
%symrev %revsym @allrevisions %date %author @revdisplayorder |
%symrev %revsym @allrevisions %date %author @revdisplayorder |
@revisions %state %difflines %log %branchpoint @revorder |
@revisions %state %difflines %log %branchpoint @revorder $prcgi |
$prcgi @prcategories $prcategories $mancgi |
@prcategories $prcategories |
$checkoutMagic $doCheckout $scriptname $scriptwhere |
$checkoutMagic $doCheckout $scriptname $scriptwhere |
$where $pathinfo $Browser $nofilelinks $maycompress @stickyvars |
$where $pathinfo $Browser $nofilelinks $maycompress @stickyvars |
%funcline_regexp $is_mod_perl |
%funcline_regexp $is_mod_perl |
|
|
$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 $body_tag_for_src |
$cvstreedefault $body_tag $logo $defaulttitle $address |
$logo $defaulttitle $address |
$backcolor $long_intro $short_instruction $shortLogLen |
$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 |
|
|
$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 $has_zlib $gzip_open |
$use_moddate |
$LOG_FILESEPARATOR $LOG_REVSEPARATOR |
|
); |
); |
|
|
sub printDiffSelect($); |
sub printDiffSelect($); |
sub findLastModifiedSubdirs(@); |
sub findLastModifiedSubdirs(@); |
sub htmlify($;$); |
sub htmlify($;$); |
sub spacedHtmlText($;$); |
sub spacedHtmlText($); |
sub link($$); |
sub link($$); |
sub revcmp($$); |
sub revcmp($$); |
sub fatal($$); |
sub fatal($$); |
sub redirect($); |
sub redirect($); |
sub safeglob($); |
sub safeglob($); |
sub getMimeTypeFromSuffix($); |
sub getMimeTypeFromSuffix($); |
sub head($;$); |
|
sub scan_directives(@); |
|
sub doAnnotate($$); |
sub doAnnotate($$); |
sub doCheckout($$); |
sub doCheckout($$); |
sub cvswebMarkup($$$); |
sub cvswebMarkup($$$); |
Line 126 sub forbidden_module($); |
|
Line 121 sub forbidden_module($); |
|
use Cwd; |
use Cwd; |
|
|
# == EDIT this == |
# == EDIT this == |
# Locations to search for user configuration, in order: |
# User configuration is stored in |
for ( |
$config = undef; |
$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 146 $allow_version_select = 1; |
|
Line 142 $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 = $body_tag_for_src = |
$cvstreedefault = $body_tag = $logo = $defaulttitle = $address = |
$logo = $defaulttitle = $address = |
$backcolor = $long_intro = $short_instruction = $shortLogLen = |
$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 158 $allow_markup = $use_java_script = $open_extern_window |
|
Line 153 $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 = $gzip_open = undef; |
$tabstop = $use_moddate = $moddate = undef; |
|
|
$LOG_FILESEPARATOR = q/^={77}$/; |
|
$LOG_REVSEPARATOR = q/^-{28}$/; |
|
|
|
##### End of configuration variables ##### |
##### End of configuration variables ##### |
|
|
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 212 $nofilelinks = $is_textbased; |
|
Line 197 $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 and no zlib is available, |
# Turn off gzip if running under mod_perl. piping does |
# piping does not work as expected inside the server. |
# not work as expected inside the server. One can probably |
$maycompress = (((defined($ENV{HTTP_ACCEPT_ENCODING}) |
# achieve the same result using Apache::GZIPFilter. |
&& $ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip`) |
$maycompress = (($ENV{HTTP_ACCEPT_ENCODING} =~ m`gzip` |
|| $is_mozilla3) |
|| $is_mozilla3) |
&& !$is_msie |
&& !$is_msie |
&& !($is_mod_perl && !$has_zlib)); |
&& !$is_mod_perl); |
|
|
# 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 227 $maycompress = (((defined($ENV{HTTP_ACCEPT_ENCODING}) |
|
Line 212 $maycompress = (((defined($ENV{HTTP_ACCEPT_ENCODING}) |
|
@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", |
} |
sprintf('Error in loading configuration file: %s<BR><BR>%s<BR>', |
else { |
$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 283 foreach (keys %DEFAULTVALUE) |
|
Line 266 foreach (keys %DEFAULTVALUE) |
|
} |
} |
|
|
$barequery = ""; |
$barequery = ""; |
my @barequery; |
|
foreach (@stickyvars) { |
foreach (@stickyvars) { |
# construct a query string with the sticky non default parameters set |
# construct a query string with the sticky non default parameters set |
if (defined($input{$_}) && $input{$_} ne '' && |
if (defined($input{$_}) && $input{$_} ne '' && |
!(defined($DEFAULTVALUE{$_}) && $input{$_} eq $DEFAULTVALUE{$_})) { |
!(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 ? |
# is there any query ? |
if (@barequery) { |
if ($barequery) { |
$barequery = join('&', @barequery); |
|
$query = "?$barequery"; |
$query = "?$barequery"; |
$barequery = "&$barequery"; |
$barequery = "&" . $barequery; |
} |
} |
else { |
else { |
$query = ""; |
$query = ""; |
} |
} |
undef @barequery; |
|
|
|
# get actual parameters |
# get actual parameters |
$sortby = $input{"sortby"}; |
$sortby = $input{"sortby"}; |
Line 348 if ($input{'cvsroot'} && $CVSROOT{$input{'cvsroot'}}) |
|
Line 332 if ($input{'cvsroot'} && $CVSROOT{$input{'cvsroot'}}) |
|
$cvsroot = $CVSROOT{$cvstree}; |
$cvsroot = $CVSROOT{$cvstree}; |
|
|
# create icons out of description |
# create icons out of description |
my $k; |
foreach my $k (keys %ICONS) { |
foreach $k (keys %ICONS) { |
|
no strict 'refs'; |
no strict 'refs'; |
my ($itxt,$ipath,$iwidth,$iheight) = @{$ICONS{$k}}; |
my ($itxt,$ipath,$iwidth,$iheight) = @{$ICONS{$k}}; |
if ($ipath) { |
if ($ipath) { |
Line 359 foreach $k (keys %ICONS) { |
|
Line 342 foreach $k (keys %ICONS) { |
|
${"${k}icon"} = $itxt; |
${"${k}icon"} = $itxt; |
} |
} |
} |
} |
undef $k; |
|
|
|
my $config_cvstree = "$config-$cvstree"; |
|
|
|
# Do some special configuration for cvstrees |
# Do some special configuration for cvstrees |
if (-f $config_cvstree) { |
do "$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($@))); |
|
} |
|
undef $config_cvstree; |
|
|
|
$prcategories = '(?:' . join('|', @prcategories) . ')'; |
$prcategories = '(?:' . join('|', @prcategories) . ')'; |
$prcgi .= '%s' if defined($prcgi) && $prcgi !~ /%s/; |
|
|
|
$fullname = $cvsroot . '/' . $where; |
$fullname = $cvsroot . '/' . $where; |
$mimetype = &getMimeTypeFromSuffix ($fullname); |
$mimetype = &getMimeTypeFromSuffix ($fullname); |
Line 385 $defaultViewable = $allow_markup && viewable($mimetype |
|
Line 358 $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 && !$has_zlib) { |
if ($allow_compress && $maycompress) { |
foreach (split(/:/, $ENV{PATH})) { |
foreach (split(/:/, $ENV{PATH})) { |
if (-x "$_/gzip") { |
if (-x "$_/gzip") { |
$GZIPBIN = "$_/gzip"; |
$GZIPBIN = "$_/gzip"; |
Line 736 elsif (-d $fullname) { |
|
Line 709 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}) |
&& (!defined($DEFAULTVALUE{$var}) |
&& $input{$var} ne $DEFAULTVALUE{$var} |
|| $input{$var} ne $DEFAULTVALUE{$var}) |
|
&& $input{$var} ne "" |
&& $input{$var} ne "" |
&& $var ne "only_with_tag"); |
&& $var ne "only_with_tag"); |
} |
} |
Line 799 elsif (-d $fullname) { |
|
Line 771 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'}); |
gzipclose(); |
|
exit; |
exit; |
} |
} |
if (defined($input{'annotate'}) && $allow_annotate) { |
if (defined($input{'annotate'}) && $allow_annotate) { |
&doAnnotate($input{'annotate'}); |
&doAnnotate($input{'annotate'}); |
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'}); |
gzipclose(); |
|
exit; |
exit; |
} |
} |
print("going to dolog($fullname)\n") if ($verbose); |
print("going to dolog($fullname)\n") if ($verbose); |
Line 833 elsif (-d $fullname) { |
|
Line 802 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'}); |
gzipclose(); |
|
exit; |
exit; |
} |
} |
elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| && |
elsif (($newname = $fullname) =~ s|/([^/]+)$|/Attic/$1| && |
Line 867 elsif (-d $fullname) { |
|
Line 835 elsif (-d $fullname) { |
|
} |
} |
&fatal("404 Not Found","$where: no such file or directory"); |
&fatal("404 Not Found","$where: no such file or directory"); |
} |
} |
|
|
gzipclose(); |
|
## End MAIN |
## End MAIN |
|
|
sub printDiffSelect($) { |
sub printDiffSelect($) { |
Line 920 sub findLastModifiedSubdirs(@) { |
|
Line 886 sub findLastModifiedSubdirs(@) { |
|
} |
} |
|
|
sub htmlify($;$) { |
sub htmlify($;$) { |
my($string, $extra) = @_; |
my($string, $pr) = @_; |
|
|
# Special Characters; RFC 1866 |
# Special Characters; RFC 1866 |
$string =~ s/&/&/g; |
$string =~ s/&/&/g; |
Line 929 sub htmlify($;$) { |
|
Line 895 sub htmlify($;$) { |
|
$string =~ s/>/>/g; |
$string =~ s/>/>/g; |
|
|
# get URL's as link .. |
# get URL's as link .. |
$string =~ s`(http|ftp|https)(://[-a-zA-Z0-9%.~:_/]+)([?&]([-a-zA-Z0-9%.~:_]+)=([-a-zA-Z0-9%.~:_])+)*`<A HREF="$1$2$3">$1$2$3</A>`g; # ` |
$string =~ s`(http|ftp|https)(://[-a-zA-Z0-9%.~:_/]+)([?&]([-a-zA-Z0-9%.~:_]+)=([-a-zA-Z0-9%.~:_])+)*`<A HREF="$1$2$3">$1$2$3</A>`; |
# get e-mails as link |
# get e-mails as link |
$string =~ s`([-a-zA-Z0-9_.]+@([-a-zA-Z0-9]+\.)+[A-Za-z]{2,4})`<A HREF="mailto:$1">$1</A>`g; # ` |
$string =~ s`([-a-zA-Z0-9_.]+@([-a-zA-Z0-9]+\.)+[A-Za-z]{2,4})`<A HREF="mailto:$1">$1</A>`; |
|
|
if ($extra) { |
# get #PR as link .. |
# get PR #'s as link .. |
if ($pr && defined($prcgi)) { |
if (defined($prcgi)) { |
1 while $string =~ s`\b(pr[:#]?\s*(?:#?\d+[,\s]\s*)*#?)(\d+)\b`$1<A HREF="$prcgi$2">$2</A>`i; |
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`<A HREF="$prcgi$1">$&</A>`igo; |
$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; |
|
} |
|
} |
} |
|
|
return $string; |
return $string; |
} |
} |
|
|
sub spacedHtmlText($;$) { |
sub spacedHtmlText($) { |
local $_ = $_[0]; |
local $_ = $_[0]; |
my $ts = $_[1] || $tabstop; |
|
|
|
# Cut trailing spaces and tabs |
# Cut trailing spaces |
s/[ \t]+$//; |
s/\s+\n$//; |
|
|
if (defined($ts)) { |
# Expand tabs |
# Expand tabs |
s/\t+/' ' x (length($&) * $tabstop - length($`) % $tabstop)/e |
1 while s/\t+/' ' x (length($&) * $ts - length($`) % $ts)/e |
if (defined($tabstop)); |
} |
|
|
|
# replace <tab> and <space> (\001 is to protect us from htmlify) |
# replace <tab> and <space> (\001 is to protect us from htmlify) |
# gzip can make excellent use of this repeating pattern :-) |
# gzip can make excellent use of this repeating pattern :-) |
|
s/\001/\001%/g; #protect our & substitute |
if ($hr_breakable) { |
if ($hr_breakable) { |
# make every other space 'breakable' |
# make every other space 'breakable' |
|
s/ / \001nbsp; \001nbsp; \001nbsp; \001nbsp;/g; # <tab> |
s/ / \001nbsp;/g; # 2 * <space> |
s/ / \001nbsp;/g; # 2 * <space> |
# leave single space as it is |
# leave single space as it is |
} else { |
} |
|
else { |
|
s/ /\001nbsp;\001nbsp;\001nbsp;\001nbsp;\001nbsp;\001nbsp;\001nbsp;\001nbsp;/g; |
s/ /\001nbsp;/g; |
s/ /\001nbsp;/g; |
} |
} |
|
|
$_ = htmlify($_); |
$_ = htmlify($_); |
|
|
# unescape |
# unescape |
y/\001/&/; |
s/\001([^%])/&$1/g; |
|
s/\001%/\001/g; |
|
|
return $_; |
return $_; |
} |
} |
Line 982 sub spacedHtmlText($;$) { |
|
Line 944 sub spacedHtmlText($;$) { |
|
sub link($$) { |
sub link($$) { |
my($name, $where) = @_; |
my($name, $where) = @_; |
|
|
return "<A HREF=\"$where\">$name</A>"; |
return "<A HREF=\"$where\">$name</A>\n"; |
} |
} |
|
|
sub revcmp($$) { |
sub revcmp($$) { |
my($rev1, $rev2) = @_; |
my($rev1, $rev2) = @_; |
|
|
# make no comparison for a tag or a branch |
|
return 0 if $rev1 =~ /[^\d.]/ || $rev2 =~ /[^\d.]/; |
|
|
|
my(@r1) = split(/\./, $rev1); |
my(@r1) = split(/\./, $rev1); |
my(@r2) = split(/\./, $rev2); |
my(@r2) = split(/\./, $rev2); |
my($a,$b); |
my($a,$b); |
Line 1094 sub getMimeTypeFromSuffix($) { |
|
Line 1052 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 |
# show Annotation |
############################### |
############################### |
sub doAnnotate($$) { |
sub doAnnotate($$) { |
Line 1139 sub doAnnotate($$) { |
|
Line 1063 sub doAnnotate($$) { |
|
|
|
# make sure the revisions a wellformed, for security |
# make sure the revisions a wellformed, for security |
# reasons .. |
# reasons .. |
if ($rev =~ /[^\w.]/) { |
if (!($rev =~ /^[\d\.]+$/)) { |
&fatal("404 Not Found", |
&fatal("404 Not Found", |
"Malformed query \"$ENV{QUERY_STRING}\""); |
"Malformed query \"$ENV{QUERY_STRING}\""); |
} |
} |
Line 1147 sub doAnnotate($$) { |
|
Line 1071 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 1156 sub doAnnotate($$) { |
|
Line 1085 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 -Rl server") || fatal ("500 Internal Error", |
$pid = open2($reader, $writer, "cvs 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 1208 sub doAnnotate($$) { |
|
Line 1137 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 1152 sub doAnnotate($$) { |
|
else { |
else { |
print "<pre>"; |
print "<pre>"; |
} |
} |
|
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; |
my @words = split; |
# Adding one is for the (single) space which follows $words[0]. |
# Adding one is for the (single) space which follows $words[0]. |
my $rest = substr ($_, length ($words[0]) + 1); |
my $rest = substr ($_, length ($words[0]) + 1); |
Line 1245 sub doAnnotate($$) { |
|
Line 1161 sub doAnnotate($$) { |
|
} |
} |
elsif ($words[0] eq "M") { |
elsif ($words[0] eq "M") { |
$lineNr++; |
$lineNr++; |
(my $lrev = substr($_, 2, 13)) =~ y/ //d; |
my $lrev = substr ($_, 2, 13); |
(my $lusr = substr($_, 16, 9)) =~ y/ //d; |
my $lusr = substr ($_, 16, 9); |
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 = sprintf('%-8s', ''); |
$revprint = " "; |
} |
} |
else { |
else { |
$revprint = sprintf('%-8s', $lrev); |
$revprint = $lrev; $oldLusr = ""; |
$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); |
|
|
# Set bold for text-based browsers only - graphical |
print "<b>" if ($isCurrentRev); |
# browsers show bold fonts a bit wider than regular fonts, |
printf ("%8s%s%8s %4d:", $revprint, ($isCurrentRev ? "|" : " "), $usrprint, $lineNr); |
# so it looks irregular. |
print spacedHtmlText($line); |
print "<b>" if ($isCurrentRev && $is_textbased); |
print "</b>" if ($isCurrentRev); |
|
|
printf "%s%s %-8s %4d:", |
|
$revprint, |
|
$isCurrentRev ? '!' : ' ', |
|
$usrprint, |
|
$lineNr; |
|
print spacedHtmlText($line, $d{'tabstop'}); |
|
|
|
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 1307 sub doCheckout($$) { |
|
Line 1214 sub doCheckout($$) { |
|
my ($mimetype,$revopt); |
my ($mimetype,$revopt); |
my $fh = do {local(*FH);}; |
my $fh = do {local(*FH);}; |
|
|
if ($rev eq 'HEAD' || $rev eq '.') { |
|
$rev = undef; |
|
} |
|
|
|
# make sure the revisions a wellformed, for security |
# make sure the revisions a wellformed, for security |
# reasons .. |
# reasons .. |
if (defined($rev) && $rev =~ /[^\w.]/) { |
if (defined($rev) && !($rev =~ /^[\d\.]+$/)) { |
&fatal("404 Not Found", |
&fatal("404 Not Found", |
"Malformed query \"$ENV{QUERY_STRING}\""); |
"Malformed query \"$ENV{QUERY_STRING}\""); |
} |
} |
Line 1349 sub doCheckout($$) { |
|
Line 1252 sub doCheckout($$) { |
|
# Safely for a child process to read from. |
# Safely for a child process to read from. |
if (! open($fh, "-|")) { # child |
if (! open($fh, "-|")) { # child |
open(STDERR, ">&STDOUT"); # Redirect stderr to stdout |
open(STDERR, ">&STDOUT"); # Redirect stderr to stdout |
exec("cvs", "-Rld", $cvsroot, "co", "-p", $revopt, $where); |
exec("cvs", "-d", $cvsroot, "co", "-p", $revopt, $where); |
} |
} |
#=================================================================== |
#=================================================================== |
#Checking out squid/src/ftp.c |
#Checking out squid/src/ftp.c |
Line 1421 sub cvswebMarkup($$$) { |
|
Line 1324 sub cvswebMarkup($$$) { |
|
$input{only_with_tag}; |
$input{only_with_tag}; |
} |
} |
print "</td></tr></table>"; |
print "</td></tr></table>"; |
|
my @content = <$filehandle>; |
my $url = download_url($fileurl, $revision, $mimetype); |
my $url = download_url($fileurl, $revision, $mimetype); |
print "<HR noshade>"; |
print "<HR noshade>"; |
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) { |
# prefetch several lines |
print spacedHtmlText($_); |
my @buf = head($filehandle); |
|
|
|
my %d = scan_directives(@buf); |
|
|
|
while (@buf || !eof($filehandle)) { |
|
$_ = @buf ? shift @buf : <$filehandle>; |
|
|
|
print spacedHtmlText($_, $d{'tabstop'}); |
|
} |
} |
print "</PRE>"; |
print "</PRE>"; |
} |
} |
Line 1449 sub cvswebMarkup($$$) { |
|
Line 1342 sub cvswebMarkup($$$) { |
|
sub viewable($) { |
sub viewable($) { |
my ($mimetype) = @_; |
my ($mimetype) = @_; |
|
|
$mimetype =~ m%^((text|image)/|application/pdf)% ; |
$mimetype =~ m%^(text|image)/%; |
} |
} |
|
|
############################### |
############################### |
Line 1476 sub doDiff($$$$$$) { |
|
Line 1369 sub doDiff($$$$$$) { |
|
$rev2 = $tr2; |
$rev2 = $tr2; |
$sym2 = ""; |
$sym2 = ""; |
} |
} |
|
|
# make sure the revisions a wellformed, for security |
# make sure the revisions a wellformed, for security |
# reasons .. |
# reasons .. |
if ($rev1 =~ /[^\w.]/ || $rev2 =~ /[^\w.]/) { |
if (!($rev1 =~ /^[\d\.]+$/) || !($rev2 =~ /^[\d\.]+$/)) { |
&fatal("404 Not Found", |
&fatal("404 Not Found", |
"Malformed query \"$ENV{QUERY_STRING}\""); |
"Malformed query \"$ENV{QUERY_STRING}\""); |
} |
} |
Line 1521 sub doDiff($$$$$$) { |
|
Line 1413 sub doDiff($$$$$$) { |
|
|
|
# apply special options |
# apply special options |
if ($showfunc) { |
if ($showfunc) { |
push @difftype, '-p' if $f =~ /^[cHhu]$/; |
push @difftype, '-p'; |
|
|
my($re1, $re2); |
my($re1, $re2); |
|
|
Line 1547 sub doDiff($$$$$$) { |
|
Line 1439 sub doDiff($$$$$$) { |
|
if ($human_readable) { |
if ($human_readable) { |
http_header(); |
http_header(); |
&human_readable_diff($fh, $rev2); |
&human_readable_diff($fh, $rev2); |
gzipclose(); |
|
exit; |
exit; |
} |
} |
else { |
else { |
|
|
$state = "head"; |
$state = "head"; |
goto again; |
goto again; |
} |
} |
if ($state eq "head" && /$LOG_REVSEPARATOR/o) { |
if ($state eq "head" && /^----------------------------$/) { |
$state = "log"; |
$state = "log"; |
$rev = undef; |
$rev = undef; |
$date = undef; |
$date = undef; |
|
|
next; |
next; |
} |
} |
if ($state eq "log") { |
if ($state eq "log") { |
if (/$LOG_REVSEPARATOR/o || /$LOG_FILESEPARATOR/o) { |
if (/^----------------------------$/ |
|
|| /^=============================/) { |
# End of a log entry. |
# End of a log entry. |
my $revbranch; |
my $revbranch; |
($revbranch = $rev) =~ s/\.\d+$//; |
($revbranch = $rev) =~ s/\.\d+$//; |
|
|
$log = $log . $_; |
$log = $log . $_; |
} |
} |
} |
} |
if (/$LOG_FILESEPARATOR/o) { |
if (/^===============/) { |
$state = "start"; |
$state = "start"; |
next; |
next; |
} |
} |
Line 1829 sub readLog($;$) { |
|
Line 1721 sub readLog($;$) { |
|
# log info |
# log info |
# ---------------------------- |
# ---------------------------- |
logentry: |
logentry: |
while (!/$LOG_FILESEPARATOR/o) { |
while (!/^=========/) { |
$_ = <$fh>; |
$_ = <$fh>; |
last logentry if (!defined($_)); # EOF |
last logentry if (!defined($_)); # EOF |
print "R:", $_ if ($verbose); |
print "R:", $_ if ($verbose); |
Line 1837 sub readLog($;$) { |
|
Line 1729 sub readLog($;$) { |
|
$rev = $1; |
$rev = $1; |
unshift(@allrevisions,$rev); |
unshift(@allrevisions,$rev); |
} |
} |
elsif (/$LOG_FILESEPARATOR/o || /$LOG_REVSEPARATOR/o) { |
elsif (/^========/ || /^----------------------------$/) { |
next logentry; |
next logentry; |
} |
} |
else { |
else { |
Line 1871 sub readLog($;$) { |
|
Line 1763 sub readLog($;$) { |
|
while (<$fh>) { |
while (<$fh>) { |
print "L:", $_ if ($verbose); |
print "L:", $_ if ($verbose); |
next line if (/^branches:\s/); |
next line if (/^branches:\s/); |
last line if (/$LOG_FILESEPARATOR/o || /$LOG_REVSEPARATOR/o); |
last line if (/^----------------------------$/ || /^=========/); |
$log{$rev} .= $_; |
$log{$rev} .= $_; |
} |
} |
print "E:", $_ if ($verbose); |
print "E:", $_ if ($verbose); |
|
|
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{$_}) |
&& ((!defined($DEFAULTVALUE{$_}) |
&& ($input{$_} ne $DEFAULTVALUE{$_} && $input{$_} ne "")); |
|| $input{$_} ne $DEFAULTVALUE{$_}) |
|
&& $input{$_} ne "")); |
|
} |
} |
print "<TABLE><TR>\n"; |
print "Diffs between \n"; |
print "<TD align=right>Diffs between \n"; |
|
print "<SELECT NAME=\"r1\">\n"; |
print "<SELECT NAME=\"r1\">\n"; |
print "<OPTION VALUE=\"text\" SELECTED>Use Text Field\n"; |
print "<OPTION VALUE=\"text\" SELECTED>Use Text Field\n"; |
print $sel; |
print $sel; |
print "</SELECT>\n"; |
print "</SELECT>\n"; |
$diffrev = $revdisplayorder[$#revdisplayorder]; |
$diffrev = $revdisplayorder[$#revdisplayorder]; |
$diffrev = $input{"r1"} if (defined($input{"r1"})); |
$diffrev = $input{"r1"} if (defined($input{"r1"})); |
print "<INPUT TYPE=\"TEXT\" SIZE=\"$inputTextSize\" NAME=\"tr1\" VALUE=\"$diffrev\" onChange='document.diff_select.r1.selectedIndex=0'></TD>"; |
print "<INPUT TYPE=\"TEXT\" SIZE=\"$inputTextSize\" NAME=\"tr1\" VALUE=\"$diffrev\" onChange='document.diff_select.r1.selectedIndex=0'>\n"; |
print "<TD><BR></TD></TR>\n"; |
print " and \n"; |
print "<TR><TD align=right>and \n"; |
|
print "<SELECT NAME=\"r2\">\n"; |
print "<SELECT NAME=\"r2\">\n"; |
print "<OPTION VALUE=\"text\" SELECTED>Use Text Field\n"; |
print "<OPTION VALUE=\"text\" SELECTED>Use Text Field\n"; |
print $sel; |
print $sel; |
print "</SELECT>\n"; |
print "</SELECT>\n"; |
$diffrev = $revdisplayorder[0]; |
$diffrev = $revdisplayorder[0]; |
$diffrev = $input{"r2"} if (defined($input{"r2"})); |
$diffrev = $input{"r2"} if (defined($input{"r2"})); |
print "<INPUT TYPE=\"TEXT\" SIZE=\"$inputTextSize\" NAME=\"tr2\" VALUE=\"$diffrev\" onChange='document.diff_select.r2.selectedIndex=0'></TD>"; |
print "<INPUT TYPE=\"TEXT\" SIZE=\"$inputTextSize\" NAME=\"tr2\" VALUE=\"$diffrev\" onChange='document.diff_select.r2.selectedIndex=0'>\n"; |
print "<TD><INPUT TYPE=SUBMIT VALUE=\" Get Diffs \"></TD>\n"; |
print "<BR>Type of Diff should be a "; |
|
printDiffSelect(0); |
|
print "<INPUT TYPE=SUBMIT VALUE=\" Get Diffs \">\n"; |
print "</FORM>\n"; |
print "</FORM>\n"; |
print "</TR></TABLE>\n"; |
|
print "<HR noshade>\n"; |
print "<HR noshade>\n"; |
print "<TABLE>"; |
|
print "<FORM METHOD=\"GET\" ACTION=\"$scriptwhere\">\n"; |
|
print "<TR><TD align=right>Preferred Diff type:</TD>"; |
|
print "<TD>"; |
|
printDiffSelect($use_java_script); |
|
print "</TD><TD></TD></TR>\n"; |
|
if (@branchnames) { |
if (@branchnames) { |
print "<TR><TD align=right>View only Branch:</TD>"; |
|
print "<TD>"; |
|
print "<A name=branch></A>\n"; |
print "<A name=branch></A>\n"; |
|
print "<FORM METHOD=\"GET\" ACTION=\"$scriptwhere\">\n"; |
|
foreach (@stickyvars) { |
|
next if ($_ eq "only_with_tag"); |
|
next if ($_ eq "logsort"); |
|
print "<INPUT TYPE=HIDDEN NAME=\"$_\" VALUE=\"$input{$_}\">\n" |
|
if (defined($input{$_}) && $input{$_} ne $DEFAULTVALUE{$_} |
|
&& $input{$_} ne ""); |
|
} |
|
print "View only Branch: \n"; |
print "<SELECT NAME=\"only_with_tag\""; |
print "<SELECT NAME=\"only_with_tag\""; |
print " onchange=\"submit()\"" if ($use_java_script); |
print " onchange=\"submit()\"" if ($use_java_script); |
print ">\n"; |
print ">\n"; |
|
|
&& $input{"only_with_tag"} eq $_); |
&& $input{"only_with_tag"} eq $_); |
print ">${_}\n"; |
print ">${_}\n"; |
} |
} |
print "</SELECT></TD><TD></TD></TR>\n"; |
print "</SELECT>\n"; |
|
print "<INPUT TYPE=SUBMIT VALUE=\" View Branch \">\n"; |
|
print "</FORM>\n"; |
} |
} |
|
print "<A name=logsort></A>\n"; |
|
print "<FORM METHOD=\"GET\" ACTION=\"$scriptwhere\">\n"; |
foreach (@stickyvars) { |
foreach (@stickyvars) { |
next if ($_ eq "f"); |
|
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{$_}) |
if (defined($input{$_}) && $input{$_} ne $DEFAULTVALUE{$_} |
&& (!defined($DEFAULTVALUE{$_}) |
|
|| $input{$_} ne $DEFAULTVALUE{$_}) |
|
&& $input{$_} ne ""); |
&& $input{$_} ne ""); |
} |
} |
print "<TR><TD align=right>"; |
print "Sort log by: \n"; |
print "<A name=logsort></A>\n"; |
print "<SELECT NAME=\"logsort\""; |
print "Sort log by:</TD>"; |
|
print "<TD><SELECT NAME=\"logsort\""; |
|
print " onchange=\"submit()\"" if ($use_java_script); |
print " onchange=\"submit()\"" if ($use_java_script); |
print ">\n"; |
print ">\n"; |
print "<OPTION VALUE=cvs",$logsort eq "cvs" ? " SELECTED" : "", ">Not sorted"; |
print "<OPTION VALUE=cvs",$logsort eq "cvs" ? " SELECTED" : "", ">Not sorted"; |
print "<OPTION VALUE=date",$logsort eq "date" ? " SELECTED" : "", ">Commit date"; |
print "<OPTION VALUE=date",$logsort eq "date" ? " SELECTED" : "", ">Commit date"; |
print "<OPTION VALUE=rev",$logsort eq "rev" ? " SELECTED" : "", ">Revision"; |
print "<OPTION VALUE=rev",$logsort eq "rev" ? " SELECTED" : "", ">Revision"; |
print "</SELECT></TD>"; |
print "</SELECT>\n"; |
print "<TD><INPUT TYPE=SUBMIT VALUE=\" Set \"></TD>"; |
print "<INPUT TYPE=SUBMIT VALUE=\" Sort \">\n"; |
print "</FORM>\n"; |
print "</FORM>\n"; |
print "</TR></TABLE>"; |
|
print &html_footer; |
print &html_footer; |
print "</BODY></HTML>\n"; |
print "</BODY></HTML>\n"; |
} |
} |
Line 2329 sub flush_diff_rows($$$$) { |
|
Line 2217 sub flush_diff_rows($$$$) { |
|
# human_readable_diff(String revision_to_return_to); |
# human_readable_diff(String revision_to_return_to); |
## |
## |
sub human_readable_diff($){ |
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 ($fh, $rev) = @_; |
my ($date1, $date2, $r1d, $r2d, $r1r, $r2r, $rev1, $rev2, $sym1, $sym2); |
my ($date1, $date2, $r1d, $r2d, $r1r, $r2r, $rev1, $rev2, $sym1, $sym2); |
my (@rightCol, @leftCol); |
my (@rightCol, @leftCol); |
Line 2383 sub human_readable_diff($){ |
|
Line 2271 sub human_readable_diff($){ |
|
# cascading style sheets because we've to set the |
# cascading style sheets because we've to set the |
# font and color for each row. anyone ...? |
# 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 =~ /^@@/) { |
if ($difftxt =~ /^@@/) { |
($oldline,$newline,$funname) = $difftxt =~ /@@ \-([0-9]+).*\+([0-9]+).*@@(.*)/; |
($oldline,$newline,$funname) = $difftxt =~ /@@ \-([0-9]+).*\+([0-9]+).*@@(.*)/; |
print "<tr bgcolor=\"$diffcolorHeading\"><td width=\"50%\">"; |
print "<tr bgcolor=\"$diffcolorHeading\"><td width=\"50%\">"; |
Line 2407 sub human_readable_diff($){ |
|
Line 2289 sub human_readable_diff($){ |
|
} |
} |
else { |
else { |
($diffcode,$rest) = $difftxt =~ /^([-+ ])(.*)/; |
($diffcode,$rest) = $difftxt =~ /^([-+ ])(.*)/; |
$_ = spacedHtmlText($rest, $d{'tabstop'}); |
$_ = spacedHtmlText ($rest); |
|
|
# Add fontface, size |
# Add fontface, size |
$_ = "$fs $_$fe"; |
$_ = "$fs $_$fe"; |
Line 2491 sub navigateHeader($$$$$) { |
|
Line 2373 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.103 $ $kRevision: 1.33 $ -->'; |
print '<!-- CVSweb $zRevision: 1.94 $ $Revision$ -->'; |
print "\n<TITLE>$path$filename - $title - $rev</TITLE></HEAD>\n"; |
print "\n<TITLE>$path$filename - $title - $rev</TITLE></HEAD>\n"; |
print "$body_tag_for_src\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\">"; |
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 2792 sub http_header(;$) { |
|
Line 2674 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 2805 sub http_header(;$) { |
|
Line 2687 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) { |
if ($has_zlib || (defined($GZIPBIN) && open(GZIP, "|$GZIPBIN -1 -c"))) { |
my $fh = do {local(*FH);}; |
|
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 2817 sub http_header(;$) { |
|
Line 2700 sub http_header(;$) { |
|
print "\r\n"; # Close headers |
print "\r\n"; # Close headers |
} |
} |
$| = 1; $| = 0; # Flush header output |
$| = 1; $| = 0; # Flush header output |
if ($has_zlib) { |
select ($fh); |
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 2846 sub http_header(;$) { |
|
Line 2725 sub http_header(;$) { |
|
|
|
sub html_header($) { |
sub html_header($) { |
my ($title) = @_; |
my ($title) = @_; |
my $version = '$zRevision: 1.103 $ $kRevision: 1.33 $'; #' |
my $version = '$zRevision: 1.94 $ $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 2891 sub forbidden_module($) { |
|
Line 2770 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 |
|
# 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); |
|
} |
} |