version 1.1.1.29, 2002/04/10 20:03:49 |
version 1.1.1.33, 2002/07/23 16:15:22 |
|
|
# cvsweb - a CGI interface to CVS trees. |
# cvsweb - a CGI interface to CVS trees. |
# |
# |
# Written in their spare time by |
# Written in their spare time by |
# Bill Fenner <fenner@FreeBSD.org> (original work) |
# Bill Fenner <fenner@FreeBSD.org> (original work) |
# extended by Henner Zeller <zeller@think.de>, |
# extended by Henner Zeller <zeller@think.de>, |
# Henrik Nordstrom <hno@hem.passagen.se> |
# Henrik Nordstrom <hno@hem.passagen.se> |
# 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> |
# Jens-Uwe Mager <jum@helios.de> |
# Ville Skyttä <ville.skytta@iki.fi> (html cleanup) |
# Ville Skyttä <scop@FreeBSD.org> |
|
# Vassilii Khachaturov <vassilii@tarunz.org> |
# |
# |
# Based on: |
# Based on: |
# * Bill Fenners cvsweb.cgi revision 1.28 available from: |
# * Bill Fenners cvsweb.cgi revision 1.28 available from: |
|
|
# |
# |
# Copyright (c) 1996-1998 Bill Fenner |
# Copyright (c) 1996-1998 Bill Fenner |
# (c) 1998-1999 Henner Zeller |
# (c) 1998-1999 Henner Zeller |
# (c) 1999 Henrik Nordstrom |
# (c) 1999 Henrik Nordstrom |
# (c) 2000-2002 Akinori MUSHA |
# (c) 2000-2002 Akinori MUSHA |
|
# (c) 2002 Ville Skyttä |
# All rights reserved. |
# All rights reserved. |
# |
# |
# Redistribution and use in source and binary forms, with or without |
# Redistribution and use in source and binary forms, with or without |
|
|
# 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. |
# |
# |
# $FreeBSD: projects/cvsweb/cvsweb.cgi,v 1.90 2002/04/10 19:25:11 knu Exp $ |
# $FreeBSD: projects/cvsweb/cvsweb.cgi,v 1.119 2002/07/23 13:58:32 scop Exp $ |
# $zId: cvsweb.cgi,v 1.112 2001/07/24 13:03:16 hzeller Exp $ |
# $zId: cvsweb.cgi,v 1.112 2001/07/24 13:03:16 hzeller Exp $ |
# $Idaemons: /home/cvs/cvsweb/cvsweb.cgi,v 1.84 2001/10/07 20:50:10 knu Exp $ |
# $Idaemons: /home/cvs/cvsweb/cvsweb.cgi,v 1.84 2001/10/07 20:50:10 knu Exp $ |
# |
# |
|
|
@revisions %state %difflines %log %branchpoint @revorder |
@revisions %state %difflines %log %branchpoint @revorder |
$prcgi @prcategories $re_prcategories $prkeyword $re_prkeyword $mancgi |
$prcgi @prcategories $re_prcategories $prkeyword $re_prkeyword $mancgi |
$checkoutMagic $doCheckout $scriptname $scriptwhere |
$checkoutMagic $doCheckout $scriptname $scriptwhere |
$where $pathinfo $Browser $nofilelinks $maycompress @stickyvars |
$where $pathinfo $Browser $nofilelinks $maycompress |
|
@stickyvars @unsafevars |
%funcline_regexp $is_mod_perl |
%funcline_regexp $is_mod_perl |
$is_links $is_lynx $is_w3m $is_msie $is_mozilla3 $is_textbased |
$is_links $is_lynx $is_w3m $is_msie $is_mozilla3 $is_textbased |
%input $query $barequery $sortby $bydate $byrev $byauthor |
%input $query $barequery $sortby $bydate $byrev $byauthor |
|
|
$columnHeaderColorSorted $hr_breakable $showfunc $hr_ignwhite |
$columnHeaderColorSorted $hr_breakable $showfunc $hr_ignwhite |
$hr_ignkeysubst $diffcolorHeading $diffcolorEmpty $diffcolorRemove |
$hr_ignkeysubst $diffcolorHeading $diffcolorEmpty $diffcolorRemove |
$diffcolorChange $diffcolorAdd $diffcolorDarkChange $difffontface |
$diffcolorChange $diffcolorAdd $diffcolorDarkChange $difffontface |
$difffontsize $inputTextSize $mime_types $allow_annotate |
$difffontsize $inputTextSize $mime_types |
$allow_markup $use_java_script $open_extern_window |
$allow_annotate $allow_markup |
|
$allow_log_extra $allow_dir_extra $allow_source_extra |
|
$use_java_script $open_extern_window |
$extern_window_width $extern_window_height $edit_option_form |
$extern_window_width $extern_window_height $edit_option_form |
$show_subdir_lastmod $show_log_in_markup $preformat_in_markup $v |
$show_subdir_lastmod $show_log_in_markup $preformat_in_markup $v |
$navigationHeaderColor $tableBorderColor $markupLogColor |
$navigationHeaderColor $tableBorderColor $markupLogColor |
|
|
$use_moddate $has_zlib $gzip_open |
$use_moddate $has_zlib $gzip_open |
$allow_tar @tar_options @gzip_options @zip_options @cvs_options |
$allow_tar @tar_options @gzip_options @zip_options @cvs_options |
$LOG_FILESEPARATOR $LOG_REVSEPARATOR |
$LOG_FILESEPARATOR $LOG_REVSEPARATOR |
$tmpdir |
$tmpdir $HTML_DOCTYPE $HTML_META |
); |
); |
|
|
sub printDiffSelect($); |
sub printDiffSelect($); |
Line 101 sub htmlify($;$); |
|
Line 106 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 search_path($); |
sub search_path($); |
Line 144 sub forbidden_module($); |
|
Line 149 sub forbidden_module($); |
|
##### Start of Configuration Area ######## |
##### Start of Configuration Area ######## |
delete $ENV{PATH}; |
delete $ENV{PATH}; |
|
|
$cvsweb_revision = '2.0.1'; |
$cvsweb_revision = '2.0.5'; |
|
|
use File::Basename; |
use File::Basename (); |
|
|
($mydir) = (dirname($0) =~ /(.*)/); # untaint |
($mydir) = (File::Basename::dirname($0) =~ /(.*)/); # untaint |
|
|
# == EDIT this == |
# == EDIT this == |
# Locations to search for user configuration, in order: |
# Locations to search for user configuration, in order: |
Line 163 for ("$mydir/cvsweb.conf", '/usr/local/etc/cvsweb/cvsw |
|
Line 168 for ("$mydir/cvsweb.conf", '/usr/local/etc/cvsweb/cvsw |
|
# Defaults for configuration variables that shouldn't need |
# Defaults for configuration variables that shouldn't need |
# to be configured.. |
# to be configured.. |
$allow_version_select = 1; |
$allow_version_select = 1; |
|
$allow_log_extra = 1; |
|
|
##### End of Configuration Area ######## |
##### End of Configuration Area ######## |
|
|
Line 181 $cvstreedefault = $body_tag = $body_tag_for_src = $log |
|
Line 187 $cvstreedefault = $body_tag = $body_tag_for_src = $log |
|
$extern_window_width = $extern_window_height = $edit_option_form = |
$extern_window_width = $extern_window_height = $edit_option_form = |
$show_subdir_lastmod = $show_log_in_markup = $v = $navigationHeaderColor = |
$show_subdir_lastmod = $show_log_in_markup = $v = $navigationHeaderColor = |
$tableBorderColor = $markupLogColor = $tabstop = $use_moddate = $moddate = |
$tableBorderColor = $markupLogColor = $tabstop = $use_moddate = $moddate = |
$gzip_open = undef; |
$gzip_open = $HTML_DOCTYPE = $HTML_META = undef; |
$tmpdir = defined($ENV{TMPDIR}) ? $ENV{TMPDIR} : "/var/tmp"; |
$tmpdir = defined($ENV{TMPDIR}) ? $ENV{TMPDIR} : "/var/tmp"; |
|
|
$LOG_FILESEPARATOR = q/^={77}$/; |
$LOG_FILESEPARATOR = q/^={77}$/; |
Line 229 $LOG_REVSEPARATOR = q/^-{28}$/; |
|
Line 235 $LOG_REVSEPARATOR = q/^-{28}$/; |
|
}, |
}, |
); |
); |
|
|
|
$HTML_DOCTYPE = |
|
'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'; |
|
|
|
$HTML_META = <<EOM; |
|
<meta name="robots" content="nofollow"> |
|
<meta name="generator" content="FreeBSD-CVSweb $cvsweb_revision"> |
|
<meta http-equiv="Content-Script-Type" content="text/javascript"> |
|
<meta http-equiv="Content-Style-Type" content="text/css"> |
|
EOM |
|
|
##### End of configuration variables ##### |
##### End of configuration variables ##### |
|
|
use Time::Local; |
use Time::Local (); |
use IPC::Open2; |
use IPC::Open2 qw(open2); |
|
|
# Check if the zlib C library interface is installed, and if yes |
# Check if the zlib C library interface is installed, and if yes |
# we can avoid using the extra gzip process. |
# we can avoid using the extra gzip process. |
|
|
# their current value) to any link/query string |
# their current value) to any link/query string |
# you construct |
# you construct |
@stickyvars = qw(cvsroot hideattic sortby logsort f only_with_tag); |
@stickyvars = qw(cvsroot hideattic sortby logsort f only_with_tag); |
|
@unsafevars = qw(logsort only_with_tag r1 r2 rev sortby tr1 tr2); |
|
|
if (-f $config) { |
if (-f $config) { |
require $config || &fatal( |
do "$config" or fatal("500 Internal Error", |
"500 Internal Error", |
'Error in loading configuration file: %s<br><br>%s<br>', |
sprintf( |
$config, $@); |
'Error in loading configuration file: %s<br><br>%s<br>', |
|
$config, |
|
&htmlify($@) |
|
) |
|
); |
|
} else { |
} 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 to your <b>cvsweb.conf</b> configuration file first.' |
. 'in cvsweb.cgi to your <b>cvsweb.conf</b> configuration file first.' |
); |
); |
|
} |
} |
|
|
undef %input; |
undef %input; |
Line 331 if (defined($query) && $query ne '') { |
|
Line 342 if (defined($query) && $query ne '') { |
|
$input{only_with_tag} = $input{only_on_branch} |
$input{only_with_tag} = $input{only_on_branch} |
if (defined($input{only_on_branch})); |
if (defined($input{only_on_branch})); |
|
|
|
# Prevent cross-site scripting |
|
foreach (@unsafevars) { |
|
# Colons are needed in diffs between tags. |
|
if (defined($input{$_}) && $input{$_} =~ /[^\w\-.:]/) { |
|
fatal("500 Internal Error", |
|
'Malformed query (%s=%s)', |
|
$_, $input{$_}); |
|
} |
|
} |
|
|
|
if (defined($input{"content-type"})) { |
|
fatal("500 Internal Error", "Unsupported content-type") |
|
if ($input{"content-type"} !~ /^[-0-9A-Za-z]+\/[-0-9A-Za-z]+$/); |
|
} |
|
|
$DEFAULTVALUE{'cvsroot'} = $cvstreedefault; |
$DEFAULTVALUE{'cvsroot'} = $cvstreedefault; |
|
|
foreach (keys %DEFAULTVALUE) { |
foreach (keys %DEFAULTVALUE) { |
Line 409 $defaultDiffType = $input{'f'}; |
|
Line 435 $defaultDiffType = $input{'f'}; |
|
|
|
$logsort = $input{'logsort'}; |
$logsort = $input{'logsort'}; |
|
|
my @tmp = @CVSrepositories; |
{ |
my @pair; |
my @tmp = @CVSrepositories; |
|
my @pair; |
|
|
while (@pair = splice(@tmp, 0, 2)) { |
while (@pair = splice(@tmp, 0, 2)) { |
my ($key, $val) = @pair; |
my ($key, $val) = @pair; |
my ($descr, $cvsroot) = @$val; |
my ($descr, $cvsroot) = @$val; |
|
|
next if !-d $cvsroot; |
next if !-d $cvsroot; |
|
|
$CVSROOTdescr{$key} = $descr; |
$CVSROOTdescr{$key} = $descr; |
$CVSROOT{$key} = $cvsroot; |
$CVSROOT{$key} = $cvsroot; |
push @CVSROOT, $key; |
push @CVSROOT, $key; |
|
} |
} |
} |
undef @tmp; |
|
undef @pair; |
|
|
|
## Default CVS-Tree |
## Default CVS-Tree |
if (!defined($CVSROOT{$cvstreedefault})) { |
if (!defined($CVSROOT{$cvstreedefault})) { |
&fatal("500 Internal Error", |
fatal("500 Internal Error", |
"<code>\$cvstreedefault</code> points to a repository ($cvstreedefault) " |
'<code>$cvstreedefault</code> points to a repository (%s) not defined in <code>%%CVSROOT</code> (edit your configuration file %s)', |
. "not defined in <code>%CVSROOT</code> " |
$cvstreedefault, $config); |
. "(edit your configuration file $config)"); |
|
} |
} |
|
|
# alternate CVS-Tree, configured in cvsweb.conf |
# alternate CVS-Tree, configured in cvsweb.conf |
Line 462 my $config_cvstree = "$config-$cvstree"; |
|
Line 487 my $config_cvstree = "$config-$cvstree"; |
|
|
|
# Do some special configuration for cvstrees |
# Do some special configuration for cvstrees |
if (-f $config_cvstree) { |
if (-f $config_cvstree) { |
require $config_cvstree || &fatal( |
do "$config_cvstree" or |
"500 Internal Error", |
fatal("500 Internal Error", |
sprintf( |
'Error in loading configuration file: %s<br><br>%s<br>', |
'Error in loading configuration file: %s<br><br>%s<br>', |
$config_cvstree, $@); |
$config_cvstree, |
|
&htmlify($@) |
|
) |
|
); |
|
} |
} |
undef $config_cvstree; |
undef $config_cvstree; |
|
|
|
|
undef $rewrite; |
undef $rewrite; |
|
|
if (!-d $cvsroot) { |
if (!-d $cvsroot) { |
&fatal("500 Internal Error", |
fatal("500 Internal Error", |
'$CVSROOT not found!<p>The server on which the CVS tree lives is probably down. Please try again in a few minutes.' |
'$CVSROOT not found!<p>The server on which the CVS tree lives is probably down. Please try again in a few minutes.'); |
); |
|
} |
} |
|
|
# |
# |
Line 517 if (!-d $cvsroot) { |
|
Line 537 if (!-d $cvsroot) { |
|
$where =~ m:([^/]*):; |
$where =~ m:([^/]*):; |
$module = $1; |
$module = $1; |
if ($module && &forbidden_module($module)) { |
if ($module && &forbidden_module($module)) { |
&fatal("403 Forbidden", "Access to $where forbidden."); |
fatal("403 Forbidden", |
|
'Access to %s forbidden.', |
|
$where); |
} |
} |
|
|
# |
# |
# Handle tarball downloads before any headers are output. |
# Handle tarball downloads before any headers are output. |
# |
# |
if ($input{tarball}) { |
if ($input{tarball}) { |
&fatal("403 Forbidden", "Downloading tarballs is prohibited.") |
fatal("403 Forbidden", |
|
'Downloading tarballs is prohibited.') |
unless $allow_tar; |
unless $allow_tar; |
my ($module) = ($where =~ m,^/?(.*),); # untaint |
my ($module) = ($where =~ m,^/?(.*),); # untaint |
$module =~ s,/([^/]*)$,,; |
$module =~ s,/([^/]*)$,,; |
Line 532 if ($input{tarball}) { |
|
Line 555 if ($input{tarball}) { |
|
my ($basedir) = ($module =~ m,([^/]+)$,); |
my ($basedir) = ($module =~ m,([^/]+)$,); |
|
|
if ($basedir eq '' || $module eq '') { |
if ($basedir eq '' || $module eq '') { |
&fatal("500 Internal Error", |
fatal("500 Internal Error", |
"You cannot download the top level directory."); |
'You cannot download the top level directory.'); |
} |
} |
|
|
my $tmpexportdir = "$tmpdir/.cvsweb.$$." . int(time); |
my $tmpexportdir = "$tmpdir/.cvsweb.$$." . int(time); |
|
|
mkdir($tmpexportdir, 0700) |
mkdir($tmpexportdir, 0700) |
or &fatal("500 Internal Error", |
or fatal("500 Internal Error", |
"Unable to make temporary directory: $!"); |
'Unable to make temporary directory: %s', |
|
$!); |
|
|
my @fatal; |
my @fatal; |
|
|
Line 555 if ($input{tarball}) { |
|
Line 579 if ($input{tarball}) { |
|
if (system $CMD{cvs}, @cvs_options, '-Qd', $cvsroot, 'export', '-r', |
if (system $CMD{cvs}, @cvs_options, '-Qd', $cvsroot, 'export', '-r', |
$tag, '-d', "$tmpexportdir/$basedir", $module) |
$tag, '-d', "$tmpexportdir/$basedir", $module) |
{ |
{ |
@fatal = ("500 Internal Error", "cvs co failure: $!: $module"); |
@fatal = ("500 Internal Error", |
|
'cvs co failure: %s: %s', |
|
$!, $module); |
} else { |
} else { |
$| = 1; # Essential to get the buffering right. |
$| = 1; # Essential to get the buffering right. |
|
|
Line 565 if ($input{tarball}) { |
|
Line 591 if ($input{tarball}) { |
|
system |
system |
"$CMD{tar} @tar_options -cf - -C $tmpexportdir $basedir | $CMD{gzip} @gzip_options -c" |
"$CMD{tar} @tar_options -cf - -C $tmpexportdir $basedir | $CMD{gzip} @gzip_options -c" |
and @fatal = |
and @fatal = |
("500 Internal Error", |
("500 Internal Error", |
"tar zc failure: $!: $basedir"); |
'tar zc failure: %s: %s', |
|
$!, $basedir); |
} elsif ($ext eq '.zip' && $CMD{zip}) { |
} elsif ($ext eq '.zip' && $CMD{zip}) { |
print "Content-Type: application/zip\r\n\r\n"; |
print "Content-Type: application/zip\r\n\r\n"; |
|
|
system |
system |
"cd $tmpexportdir && $CMD{zip} @zip_options -r - $basedir" |
"cd $tmpexportdir && $CMD{zip} @zip_options -r - $basedir" |
and @fatal = |
and @fatal = |
("500 Internal Error", "zip failure: $!: $basedir"); |
("500 Internal Error", |
|
'zip failure: %s: %s', |
|
$!, $basedir); |
} else { |
} else { |
@fatal = |
@fatal = |
("500 Internal Error", "unsupported file type"); |
("500 Internal Error", |
|
'unsupported file type'); |
} |
} |
} |
} |
|
|
Line 592 if ($input{tarball}) { |
|
Line 622 if ($input{tarball}) { |
|
############################### |
############################### |
if (-d $fullname) { |
if (-d $fullname) { |
my $dh = do { local (*DH); }; |
my $dh = do { local (*DH); }; |
opendir($dh, $fullname) || &fatal("404 Not Found", "$where: $!"); |
opendir($dh, $fullname) or fatal("404 Not Found", |
|
'%s: %s', |
|
$where, $!); |
my @dir = readdir($dh); |
my @dir = readdir($dh); |
closedir($dh); |
closedir($dh); |
my @subLevelFiles = findLastModifiedSubdirs(@dir) |
my @subLevelFiles = findLastModifiedSubdirs(@dir) |
Line 608 if (-d $fullname) { |
|
Line 640 if (-d $fullname) { |
|
print $short_instruction; |
print $short_instruction; |
} |
} |
|
|
my $descriptions; |
if ($use_descriptions && open(DESC, "<$cvsroot/CVSROOT/descriptions")) |
if (($use_descriptions) && open(DESC, "<$cvsroot/CVSROOT/descriptions")) |
|
{ |
{ |
while (<DESC>) { |
while (<DESC>) { |
chomp; |
chomp; |
my ($dir, $description) = /(\S+)\s+(.*)/; |
my ($dir, $description) = /(\S+)\s+(.*)/; |
$descriptions{$dir} = $description; |
$descriptions{$dir} = $description; |
} |
} |
|
close(DESC); |
} |
} |
|
|
print "<p><a name=\"dirlist\"></a></p>\n"; |
print "<p><a name=\"dirlist\"></a></p>\n"; |
Line 641 if (-d $fullname) { |
|
Line 673 if (-d $fullname) { |
|
|
|
my $infocols = 0; |
my $infocols = 0; |
if ($dirtable) { |
if ($dirtable) { |
if (defined($tableBorderColor)) { |
print "<table style=\"border-width: 0"; |
|
print "; background-color: $tableBorderColor" |
# Can't this be done by defining the border for the inner table? |
if (defined $tableBorderColor); |
print |
print "\" width=\"100%\" cellspacing=\"1\" cellpadding=\"$tablepadding\">\n"; |
"<table border=\"0\" cellpadding=\"0\" width=\"100%\"><tr><td bgcolor=\"$tableBorderColor\">"; |
|
} |
|
print |
|
"<table width=\"100%\" border=\"0\" cellspacing=\"1\" cellpadding=\"$tablepadding\">\n"; |
|
$infocols++; |
$infocols++; |
printf '<tr><th align="left" bgcolor="%s">', |
printf "<tr>\n<th style=\"text-align: left; background-color: %s\">", |
$byfile ? $columnHeaderColorSorted : |
$byfile ? $columnHeaderColorSorted : |
$columnHeaderColorDefault; |
$columnHeaderColorDefault; |
|
|
Line 665 if (-d $fullname) { |
|
Line 693 if (-d $fullname) { |
|
) |
) |
); |
); |
} |
} |
print "</th>"; |
print "</th>\n"; |
|
|
# do not display the other column-headers, if we do not have any files |
# do not display the other column-headers, if we do not have any files |
# with revision information: |
# with revision information: |
if (scalar(%fileinfo)) { |
if (scalar(%fileinfo)) { |
$infocols++; |
$infocols++; |
printf '<th align="left" bgcolor="%s">', |
printf '<th style="text-align: left; background-color: %s">', |
$byrev ? $columnHeaderColorSorted : |
$byrev ? $columnHeaderColorSorted : |
$columnHeaderColorDefault; |
$columnHeaderColorDefault; |
|
|
Line 686 if (-d $fullname) { |
|
Line 714 if (-d $fullname) { |
|
) |
) |
); |
); |
} |
} |
print "</th>"; |
print "</th>\n"; |
$infocols++; |
$infocols++; |
printf '<th align="left" bgcolor="%s">', |
printf '<th style="text-align: left; background-color: %s">', |
$bydate ? $columnHeaderColorSorted : |
$bydate ? $columnHeaderColorSorted : |
$columnHeaderColorDefault; |
$columnHeaderColorDefault; |
|
|
Line 703 if (-d $fullname) { |
|
Line 731 if (-d $fullname) { |
|
) |
) |
); |
); |
} |
} |
print "</th>"; |
print "</th>\n"; |
|
|
if ($show_author) { |
if ($show_author) { |
$infocols++; |
$infocols++; |
printf '<th align="left" bgcolor="%s">', |
printf '<th style="text-align: left; background-color: %s">', |
$byauthor ? $columnHeaderColorSorted : |
$byauthor ? $columnHeaderColorSorted : |
$columnHeaderColorDefault; |
$columnHeaderColorDefault; |
|
|
Line 725 if (-d $fullname) { |
|
Line 753 if (-d $fullname) { |
|
) |
) |
); |
); |
} |
} |
print "</th>"; |
print "</th>\n"; |
} |
} |
$infocols++; |
$infocols++; |
printf '<th align="left" bgcolor="%s">', |
printf '<th style="text-align: left; background-color: %s">', |
$bylog ? $columnHeaderColorSorted : |
$bylog ? $columnHeaderColorSorted : |
$columnHeaderColorDefault; |
$columnHeaderColorDefault; |
|
|
Line 743 if (-d $fullname) { |
|
Line 771 if (-d $fullname) { |
|
) |
) |
); |
); |
} |
} |
print "</th>"; |
print "</th>\n"; |
} elsif ($use_descriptions) { |
} elsif ($use_descriptions) { |
printf '<th align="left" bgcolor="%s">', |
printf '<th style="text-align: left; background-color: s">', |
$columnHeaderColorDefault; |
$columnHeaderColorDefault; |
print "Description"; |
print "Description</th>\n"; |
$infocols++; |
$infocols++; |
} |
} |
print "</tr>\n"; |
print "</tr>\n"; |
Line 813 if (-d $fullname) { |
|
Line 841 if (-d $fullname) { |
|
($rev, $date, $log, $author, $filename) = |
($rev, $date, $log, $author, $filename) = |
@{$fileinfo{$_}} |
@{$fileinfo{$_}} |
if (defined($fileinfo{$_})); |
if (defined($fileinfo{$_})); |
printf '<tr bgcolor="%s"><td>', $tabcolors[$dirrow % 2] |
printf "<tr style=\"background-color: %s\">\n<td>", |
if $dirtable; |
$tabcolors[$dirrow % 2] if $dirtable; |
|
|
if ($_ eq '..') { |
if ($_ eq '..') { |
$url = "../$query"; |
$url = "../$query"; |
Line 823 if (-d $fullname) { |
|
Line 851 if (-d $fullname) { |
|
} else { |
} else { |
print &link($backicon, $url); |
print &link($backicon, $url); |
} |
} |
print " ", &link("Parent Directory", $url); |
print ' ', &link("Parent Directory", $url); |
} else { |
} else { |
$url = './' . urlencode($_) . "/$query"; |
$url = './' . urlencode($_) . "/$query"; |
print "<a name=\"$_\"></a>"; |
print "<a name=\"$_\"></a>"; |
Line 833 if (-d $fullname) { |
|
Line 861 if (-d $fullname) { |
|
} else { |
} else { |
print &link($diricon, $url); |
print &link($diricon, $url); |
} |
} |
print " ", &link("$_/", $url), $attic; |
print ' ', &link("$_/", $url), $attic; |
|
|
if ($_ eq "Attic") { |
if ($_ eq "Attic") { |
print " "; |
print " "; |
Line 850 if (-d $fullname) { |
|
Line 878 if (-d $fullname) { |
|
|
|
# Show last change in dir |
# Show last change in dir |
if ($filename) { |
if ($filename) { |
print "</td><td> </td><td> " |
print "</td>\n<td> </td>\n<td> " |
if ($dirtable); |
if ($dirtable); |
if ($date) { |
if ($date) { |
print " <i>", |
print " <i>", |
Line 859 if (-d $fullname) { |
|
Line 887 if (-d $fullname) { |
|
} |
} |
|
|
if ($show_author) { |
if ($show_author) { |
print "</td><td> " if ($dirtable); |
print "</td>\n<td> " if ($dirtable); |
print $author; |
print $author; |
} |
} |
print "</td><td> " if ($dirtable); |
print "</td>\n<td> " if ($dirtable); |
$filename =~ s%^[^/]+/%%; |
$filename =~ s%^[^/]+/%%; |
print "$filename/$rev"; |
print "$filename/$rev"; |
print "<br>" if ($dirtable); |
print "<br>" if ($dirtable); |
|
|
if ($log) { |
if ($log) { |
print " <font size=\"-1\">", |
print " <span style=\"font-size: smaller\">", |
&htmlify( |
&htmlify( |
substr($log, 0, $shortLogLen)); |
substr($log, 0, $shortLogLen), $allow_dir_extra); |
if (length $log > 80) { |
if (length $log > 80) { |
print "..."; |
print "..."; |
} |
} |
print "</font>"; |
print "</span>"; |
} |
} |
} else { |
} else { |
my ($dwhere) = |
my ($dwhere) = |
Line 893 if (-d $fullname) { |
|
Line 921 if (-d $fullname) { |
|
# columns, so that the vertical seperators are visible |
# columns, so that the vertical seperators are visible |
my ($cols) = $infocols; |
my ($cols) = $infocols; |
while ($cols > 1) { |
while ($cols > 1) { |
print "</td><td> "; |
print "</td>\n<td> "; |
$cols--; |
$cols--; |
} |
} |
} |
} |
} |
} |
|
|
if ($dirtable) { |
if ($dirtable) { |
print "</td></tr>\n"; |
print "</td>\n</tr>\n"; |
} else { |
} else { |
print "<br>\n"; |
print "<br>\n"; |
} |
} |
$dirrow++; |
$dirrow++; |
} elsif (s/,v$//) { |
} elsif (s/,v$//) { |
|
|
|
# Skip forbidden files now so we'll give no hint |
|
# about their existence. This should probably have |
|
# been done earlier, but it's straightforward here. |
|
next if forbidden_file("$fullname/$_"); |
|
|
$fileurl = ($attic ? "Attic/" : "") . urlencode($_); |
$fileurl = ($attic ? "Attic/" : "") . urlencode($_); |
$url = './' . $fileurl . $query; |
$url = './' . $fileurl . $query; |
my $rev = ''; |
my $rev = ''; |
Line 916 if (-d $fullname) { |
|
Line 950 if (-d $fullname) { |
|
next if (!defined($fileinfo{$_})); |
next if (!defined($fileinfo{$_})); |
($rev, $date, $log, $author) = @{$fileinfo{$_}}; |
($rev, $date, $log, $author) = @{$fileinfo{$_}}; |
$filesfound++; |
$filesfound++; |
printf '<tr bgcolor="%s"><td>', $tabcolors[$dirrow % 2] |
printf "<tr style=\"background-color: %s\">\n<td>", |
if $dirtable; |
$tabcolors[$dirrow % 2] if $dirtable; |
print "<a name=\"$_\"></a>"; |
print "<a name=\"$_\"></a>"; |
|
|
if ($nofilelinks) { |
if ($nofilelinks) { |
Line 925 if (-d $fullname) { |
|
Line 959 if (-d $fullname) { |
|
} else { |
} else { |
print &link($fileicon, $url); |
print &link($fileicon, $url); |
} |
} |
print " ", &link($_, $url), $attic; |
print ' ', &link($_, $url), $attic; |
print "</td><td> " if ($dirtable); |
print "</td>\n<td> " if ($dirtable); |
download_link($fileurl, $rev, $rev, |
download_link($fileurl, $rev, $rev, |
$defaultViewable ? "text/x-cvsweb-markup" : |
$defaultViewable ? "text/x-cvsweb-markup" : |
undef); |
undef); |
print "</td><td> " if ($dirtable); |
print "</td>\n<td> " if ($dirtable); |
|
|
if ($date) { |
if ($date) { |
print " <i>", readableTime(time() - $date, 0), |
print " <i>", readableTime(time() - $date, 0), |
"</i>"; |
"</i>"; |
} |
} |
if ($show_author) { |
if ($show_author) { |
print "</td><td> " if ($dirtable); |
print "</td>\n<td> " if ($dirtable); |
print $author; |
print $author; |
} |
} |
print "</td><td> " if ($dirtable); |
print "</td>\n<td> " if ($dirtable); |
|
|
if ($log) { |
if ($log) { |
print " <font size=\"-1\">", |
print " <span style=\"font-size: smaller\">", |
&htmlify(substr($log, 0, $shortLogLen)); |
&htmlify(substr($log, 0, $shortLogLen), $allow_dir_extra); |
if (length $log > 80) { |
if (length $log > 80) { |
print "..."; |
print "..."; |
} |
} |
print "</font>"; |
print "</span>"; |
} |
} |
print "</td>" if ($dirtable); |
print "</td>\n" if ($dirtable); |
print(($dirtable) ? "</tr>" : "<br>"); |
print(($dirtable) ? "</tr>" : "<br>"); |
$dirrow++; |
$dirrow++; |
} |
} |
Line 959 if (-d $fullname) { |
|
Line 993 if (-d $fullname) { |
|
|
|
print($dirtable ? "</table>\n" : "</menu>\n"); |
print($dirtable ? "</table>\n" : "</menu>\n"); |
|
|
if ($dirtable && defined($tableBorderColor)) { |
|
print "</td></tr></table>"; |
|
} |
|
|
|
if ($filesexists && !$filesfound) { |
if ($filesexists && !$filesfound) { |
print |
print |
"<p><b>NOTE:</b> There are $filesexists files, but none matches the current tag ($input{only_with_tag}).</p>\n"; |
"<p><b>NOTE:</b> There are $filesexists files, but none matches the current tag ($input{only_with_tag}).</p>\n"; |
Line 975 if (-d $fullname) { |
|
Line 1005 if (-d $fullname) { |
|
if (scalar %tags || $input{only_with_tag} || $edit_option_form |
if (scalar %tags || $input{only_with_tag} || $edit_option_form |
|| defined($input{"options"})) |
|| defined($input{"options"})) |
{ |
{ |
print "<hr size=\"1\" noshade>"; |
print "<hr size=\"1\" noshade>\n"; |
} |
} |
|
|
if (scalar %tags || $input{only_with_tag}) { |
if (scalar %tags || $input{only_with_tag}) { |
Line 988 if (-d $fullname) { |
|
Line 1018 if (-d $fullname) { |
|
|| $input{$var} ne $DEFAULTVALUE{$var}) |
|| $input{$var} ne $DEFAULTVALUE{$var}) |
&& $input{$var} ne "" && $var ne "only_with_tag"); |
&& $input{$var} ne "" && $var ne "only_with_tag"); |
} |
} |
print "<p>Show only files with tag:\n"; |
print "<p><label for=\"only_with_tag\" accesskey=\"T\">"; |
print "<select name=\"only_with_tag\""; |
print "Show only files with tag:</label>\n"; |
|
print "<select id=\"only_with_tag\" name=\"only_with_tag\""; |
print " onchange=\"this.form.submit()\"" if $use_java_script; |
print " onchange=\"this.form.submit()\"" if $use_java_script; |
print ">"; |
print ">"; |
print "<option value=\"\">All tags / default branch</option>\n"; |
print "<option value=\"\">All tags / default branch</option>\n"; |
Line 1001 if (-d $fullname) { |
|
Line 1032 if (-d $fullname) { |
|
">$tag</option>\n"; |
">$tag</option>\n"; |
} |
} |
print "</select>\n"; |
print "</select>\n"; |
print " Module path or alias:\n"; |
print " <label for=\"path\" accesskey=\"P\">"; |
printf "<input type=\"text\" name=\"path\" value=\"%s\" size=\"15\">\n", |
print "Module path or alias:</label>\n"; |
|
printf "<input type=\"text\" id=\"path\" name=\"path\" value=\"%s\" size=\"15\">\n", |
htmlquote($where); |
htmlquote($where); |
print "<input type=\"submit\" value=\"Go\"></p>\n"; |
print "<input type=\"submit\" value=\"Go\" accesskey=\"G\"></p>\n"; |
print "</form>\n"; |
print "</form>\n"; |
} |
} |
|
|
Line 1024 if (-d $fullname) { |
|
Line 1056 if (-d $fullname) { |
|
&link("zip archive", "./$basefile.zip$query" |
&link("zip archive", "./$basefile.zip$query" |
. ($query ? "&" : "?") . "tarball=1"); |
. ($query ? "&" : "?") . "tarball=1"); |
} |
} |
print "</div>"; |
print "</div>\n"; |
} |
} |
} |
} |
|
|
my $formwhere = $scriptwhere; |
|
$formwhere =~ s|Attic/?$|| if ($input{'hideattic'}); |
|
|
|
if ($edit_option_form || defined($input{"options"})) { |
if ($edit_option_form || defined($input{"options"})) { |
|
|
|
my $formwhere = $scriptwhere; |
|
$formwhere =~ s|Attic/?$|| if ($input{'hideattic'}); |
|
|
print "<form method=\"get\" action=\"${formwhere}\">\n"; |
print "<form method=\"get\" action=\"${formwhere}\">\n"; |
print "<input type=\"hidden\" name=\"copt\" value=\"1\">\n"; |
print "<input type=\"hidden\" name=\"copt\" value=\"1\">\n"; |
if ($cvstree ne $cvstreedefault) { |
if ($cvstree ne $cvstreedefault) { |
print |
print |
"<input type=\"hidden\" name=\"cvsroot\" value=\"$cvstree\">\n"; |
"<input type=\"hidden\" name=\"cvsroot\" value=\"$cvstree\">\n"; |
} |
} |
print "<center><table cellpadding=\"0\" cellspacing=\"0\">"; |
print "<center>\n<table cellpadding=\"0\" cellspacing=\"0\">"; |
print |
print "\n<tr style=\"background-color: $columnHeaderColorDefault\">\n"; |
"<tr bgcolor=\"$columnHeaderColorDefault\"><th colspan=\"2\">Preferences</th></tr>"; |
print "<th colspan=\"2\">Preferences</th>\n</tr>\n"; |
print "<tr><td>Sort files by <select name=\"sortby\">"; |
print "<tr>\n<td>"; |
print "<option value=\"\">File</option>"; |
print "<label for=\"sortby\" accesskey=\"F\">Sort files by "; |
|
print "</label><select id=\"sortby\" name=\"sortby\">\n"; |
|
print "<option value=\"\">File</option>\n"; |
print "<option", $bydate ? " selected" : "", |
print "<option", $bydate ? " selected" : "", |
" value=\"date\">Age</option>"; |
" value=\"date\">Age</option>\n"; |
print "<option", $byauthor ? " selected" : "", |
print "<option", $byauthor ? " selected" : "", |
" value=\"author\">Author</option>" |
" value=\"author\">Author</option>\n" |
if ($show_author); |
if ($show_author); |
print "<option", $byrev ? " selected" : "", |
print "<option", $byrev ? " selected" : "", |
" value=\"rev\">Revision</option>"; |
" value=\"rev\">Revision</option>\n"; |
print "<option", $bylog ? " selected" : "", |
print "<option", $bylog ? " selected" : "", |
" value=\"log\">Log message</option>"; |
" value=\"log\">Log message</option>\n"; |
print "</select></td>"; |
print "</select>\n</td>\n"; |
print "<td>Sort log by: "; |
print "<td><label for=\"logsort\" accesskey=\"L\">"; |
|
print "Sort log by: </label>"; |
printLogSortSelect(0); |
printLogSortSelect(0); |
print "</td></tr>"; |
print "</td>\n</tr>\n"; |
print "<tr><td>Diff format: "; |
print "<tr>\n<td><label for=\"f\" accesskey=\"D\">"; |
|
print "Diff format: </label>"; |
printDiffSelect(0); |
printDiffSelect(0); |
print "</td>"; |
print "</td>\n"; |
print "<td><label>Show Attic files: "; |
print "<td><label for=\"hideattic\" accesskey=\"A\">"; |
print "<input name=\"hideattic\" type=\"checkbox\"", |
print "Show Attic files: </label>"; |
$input{'hideattic'} ? " checked" : "", "></label></td></tr>\n"; |
print "<input id=\"hideattic\" name=\"hideattic\" type=\"checkbox\"", |
print |
$input{'hideattic'} ? " checked" : "", |
"<tr><td align=\"center\" colspan=\"2\"><input type=\"submit\" value=\"Change Options\">"; |
"></td>\n</tr>\n"; |
print "</td></tr></table></center></form>\n"; |
print "<tr>\n<td align=\"center\" colspan=\"2\">"; |
|
print "<input type=\"submit\" value=\"Change Options\" accesskey=\"C\">"; |
|
print "</td>\n</tr>\n</table>\n</center>\n</form>\n"; |
} |
} |
print &html_footer; |
html_footer(); |
} |
} |
|
|
############################### |
############################### |
# View Files |
# View Files |
############################### |
############################### |
elsif (-f $fullname . ',v') { |
elsif (-f $fullname . ',v') { |
|
|
|
if (forbidden_file($fullname)) { |
|
fatal('403 Forbidden', |
|
'Access forbidden. This file is mentioned in @ForbiddenFiles'); |
|
return; |
|
} |
|
|
if (defined($input{'rev'}) || $doCheckout) { |
if (defined($input{'rev'}) || $doCheckout) { |
&doCheckout($fullname, $input{'rev'}); |
&doCheckout($fullname, $input{'rev'}); |
gzipclose(); |
gzipclose(); |
Line 1155 elsif (-f $fullname . ',v') { |
|
Line 1201 elsif (-f $fullname . ',v') { |
|
} |
} |
} |
} |
} |
} |
&fatal("404 Not Found", "$where: no such file or directory"); |
fatal("404 Not Found", |
|
'%s: no such file or directory', |
|
$where); |
} |
} |
|
|
gzipclose(); |
gzipclose(); |
Line 1166 sub printDiffSelect($) { |
|
Line 1214 sub printDiffSelect($) { |
|
my ($use_java_script) = @_; |
my ($use_java_script) = @_; |
my $f = $input{'f'}; |
my $f = $input{'f'}; |
|
|
print '<select name="f"'; |
print '<select id="f" name="f"'; |
print ' onchange="this.form.submit()"' if $use_java_script; |
print ' onchange="this.form.submit()"' if $use_java_script; |
print '>'; |
print ">\n"; |
|
|
local $_; |
local $_; |
for (@DIFFTYPES) { |
for (@DIFFTYPES) { |
printf('<option value="%s"%s>%s</option>', $_, |
printf("<option value=\"%s\"%s>%s</option>\n", $_, |
$f eq $_ ? ' selected' : '', "\u$DIFFTYPES{$_}{'descr'}"); |
$f eq $_ ? ' selected' : '', "\u$DIFFTYPES{$_}{'descr'}"); |
} |
} |
|
|
Line 1182 sub printDiffSelect($) { |
|
Line 1230 sub printDiffSelect($) { |
|
sub printLogSortSelect($) { |
sub printLogSortSelect($) { |
my ($use_java_script) = @_; |
my ($use_java_script) = @_; |
|
|
print '<select name="logsort"'; |
print '<select id="logsort" name="logsort"'; |
print ' onchange="this.form.submit()"' if $use_java_script; |
print ' onchange="this.form.submit()"' if $use_java_script; |
print '>'; |
print ">\n"; |
|
|
local $_; |
local $_; |
for (@LOGSORTKEYS) { |
for (@LOGSORTKEYS) { |
printf('<option value="%s"%s>%s</option>', $_, |
printf("<option value=\"%s\"%s>%s</option>\n", $_, |
$logsort eq $_ ? ' selected' : '', |
$logsort eq $_ ? ' selected' : '', |
"\u$LOGSORTKEYS{$_}{'descr'}"); |
"\u$LOGSORTKEYS{$_}{'descr'}"); |
} |
} |
Line 1210 sub findLastModifiedSubdirs(@) { |
|
Line 1258 sub findLastModifiedSubdirs(@) { |
|
my ($lastmodtime) = undef; |
my ($lastmodtime) = undef; |
my $dh = do { local (*DH); }; |
my $dh = do { local (*DH); }; |
|
|
opendir($dh, $dir) || next; |
opendir($dh, $dir) or next; |
my (@filenames) = readdir($dh); |
my (@filenames) = readdir($dh); |
closedir($dh); |
closedir($dh); |
|
|
Line 1218 sub findLastModifiedSubdirs(@) { |
|
Line 1266 sub findLastModifiedSubdirs(@) { |
|
$filename = "$dirname/$filename"; |
$filename = "$dirname/$filename"; |
my ($file) = "$fullname/$filename"; |
my ($file) = "$fullname/$filename"; |
next if ($filename !~ /,v$/ || !-f $file); |
next if ($filename !~ /,v$/ || !-f $file); |
|
|
|
# Skip forbidden files. |
|
(my $f = $file) =~ s/,v$//; |
|
next if forbidden_file($f); |
|
|
$filename =~ s/,v$//; |
$filename =~ s/,v$//; |
my $modtime = -M $file; |
my $modtime = -M $file; |
|
|
Line 1271 sub htmlify($;$) { |
|
Line 1324 sub htmlify($;$) { |
|
if ($extra) { |
if ($extra) { |
|
|
# get PR #'s as link: "PR#nnnn" "PR: nnnn, ..." "PR nnnn, ..." "bin/nnnn" |
# get PR #'s as link: "PR#nnnn" "PR: nnnn, ..." "PR nnnn, ..." "bin/nnnn" |
if (defined($prcgi) && defined($re_prcategories) |
if (defined($prcgi) && defined($re_prkeyword)) |
&& defined($re_prkeyword)) |
|
{ |
{ |
my $prev; |
my $prev; |
|
|
Line 1295 sub htmlify($;$) { |
|
Line 1347 sub htmlify($;$) { |
|
$_; |
$_; |
} while ($_ ne $prev); |
} while ($_ ne $prev); |
|
|
$_ = htmlify_sub { |
if (defined($re_prcategories)) { |
s{ |
$_ = htmlify_sub { |
(\b$re_prcategories/(\d+)\b) |
s{ |
}{ |
(\b$re_prcategories/(\d+)\b) |
&link($1, sprintf($prcgi, $2)) |
}{ |
}egox; |
&link($1, sprintf($prcgi, $2)) |
} |
}egox; |
$_; |
} |
|
$_; |
|
} |
} |
} |
|
|
# get manpage specs as link: "foo.1" "foo(1)" |
# get manpage specs as link: "foo.1" "foo(1)" |
Line 1351 sub spacedHtmlText($;$) { |
|
Line 1405 sub spacedHtmlText($;$) { |
|
s/ /\001nbsp;/g; |
s/ /\001nbsp;/g; |
} |
} |
|
|
$_ = htmlify($_); |
$_ = htmlify($_, $allow_source_extra); |
|
|
# unescape |
# unescape |
y/\001/&/; |
y/\001/&/; |
Line 1388 sub revcmp($$) { |
|
Line 1442 sub revcmp($$) { |
|
return 0; |
return 0; |
} |
} |
|
|
sub fatal($$) { |
sub fatal($$@) { |
my ($errcode, $errmsg) = @_; |
my ($errcode, $format, @args) = @_; |
if ($is_mod_perl) { |
if ($is_mod_perl) { |
Apache->request->status((split (/ /, $errcode))[0]); |
Apache->request->status((split (/ /, $errcode))[0]); |
} else { |
} else { |
print "Status: $errcode\r\n"; |
print "Status: $errcode\r\n"; |
} |
} |
html_header("Error"); |
html_header("Error"); |
print "Error: $errmsg\n"; |
print "<p>Error: ", |
print &html_footer; |
sprintf($format, map(htmlquote($_), @args)), |
|
"</p>\n"; |
|
html_footer(); |
exit(1); |
exit(1); |
} |
} |
|
|
Line 1411 sub redirect($) { |
|
Line 1467 sub redirect($) { |
|
print "Location: $url\r\n"; |
print "Location: $url\r\n"; |
} |
} |
html_header("Moved"); |
html_header("Moved"); |
print "This document is located ", &link('here', $url), "\n"; |
print "<p>This document is located ", &link('here', $url), "</p>\n"; |
print &html_footer; |
html_footer(); |
exit(1); |
exit(1); |
} |
} |
|
|
Line 1526 sub scan_directives(@) { |
|
Line 1582 sub scan_directives(@) { |
|
sub openOutputFilter() { |
sub openOutputFilter() { |
return if !defined($output_filter) || $output_filter eq ''; |
return if !defined($output_filter) || $output_filter eq ''; |
|
|
open(STDOUT, "|-") && return; |
open(STDOUT, "|-") and return; |
|
|
# child of child |
# child of child |
open(STDERR, '>/dev/null'); |
open(STDERR, '>/dev/null'); |
exec($output_filter); |
exec($output_filter) or exit -1; |
|
|
exit -1; |
|
} |
} |
|
|
############################### |
############################### |
Line 1548 sub doAnnotate($$) { |
|
Line 1602 sub doAnnotate($$) { |
|
# make sure the revisions are wellformed, for security |
# make sure the revisions are wellformed, for security |
# reasons .. |
# reasons .. |
if ($rev =~ /[^\w.]/) { |
if ($rev =~ /[^\w.]/) { |
&fatal("404 Not Found", |
fatal("404 Not Found", |
"Malformed query \"$ENV{QUERY_STRING}\""); |
'Malformed query "%s"', |
|
$ENV{QUERY_STRING}); |
} |
} |
|
|
if (&forbidden_file($fullname)) { |
|
&fatal("403 Forbidden", |
|
"Access forbidden. This file is mentioned in \@ForbiddenFiles" |
|
); |
|
return; |
|
} |
|
|
|
($pathname = $where) =~ s/(Attic\/)?[^\/]*$//; |
($pathname = $where) =~ s/(Attic\/)?[^\/]*$//; |
($filename = $where) =~ s/^.*\///; |
($filename = $where) =~ s/^.*\///; |
|
|
Line 1573 sub doAnnotate($$) { |
|
Line 1621 sub doAnnotate($$) { |
|
# 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, $CMD{cvs}, @cvs_options, "server") |
$pid = open2($reader, $writer, $CMD{cvs}, @cvs_options, "server") |
|| fatal("500 Internal Error", |
or 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: |
# Root /home/kingdon/zwork/cvsroot |
# Root /home/kingdon/zwork/cvsroot |
Line 1629 sub doAnnotate($$) { |
|
Line 1677 sub doAnnotate($$) { |
|
# OK, we've sent our command to the server. Thing to do is to |
# OK, we've sent our command to the server. Thing to do is to |
# close the writer side and get all the responses. If "cvs server" |
# close the writer side and get all the responses. If "cvs server" |
# 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) or die "cannot close: $!"; |
|
|
http_header(); |
http_header(); |
|
|
navigateHeader($scriptwhere, $pathname, $filename, $rev, "annotate"); |
navigateHeader($scriptwhere, $pathname, $filename, $rev, "annotate"); |
print |
print |
"<h3 align=\"center\">Annotation of $pathname$filename, Revision $rev</h3>\n"; |
"<h3 style=\"text-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: |
Line 1648 sub doAnnotate($$) { |
|
Line 1696 sub doAnnotate($$) { |
|
my ($revprint, $usrprint); |
my ($revprint, $usrprint); |
|
|
if ($annTable) { |
if ($annTable) { |
print "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n"; |
print "<table style=\"border: none\" cellspacing=\"0\" cellpadding=\"0\">\n"; |
} else { |
} else { |
print "<pre>"; |
print "<pre>"; |
} |
} |
Line 1709 sub doAnnotate($$) { |
|
Line 1757 sub doAnnotate($$) { |
|
# CVS command line client. But for simplicity, we don't. |
# CVS command line client. But for simplicity, we don't. |
} elsif ($words[0] eq "error") { |
} elsif ($words[0] eq "error") { |
fatal("500 Internal Error", |
fatal("500 Internal Error", |
"Error occured during annotate: <b>$_</b>"); |
'Error occured during annotate: <b>%s</b>', |
|
$_); |
} |
} |
} |
} |
|
|
Line 1718 sub doAnnotate($$) { |
|
Line 1767 sub doAnnotate($$) { |
|
} else { |
} else { |
print "</pre>"; |
print "</pre>"; |
} |
} |
close($reader) || warn "cannot close: $!"; |
close($reader) or warn "cannot close: $!"; |
wait; |
wait; |
} |
} |
|
|
Line 1737 sub doCheckout($$) { |
|
Line 1786 sub doCheckout($$) { |
|
# 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 =~ /[^\w.]/) { |
&fatal("404 Not Found", |
fatal("404 Not Found", |
"Malformed query \"$ENV{QUERY_STRING}\""); |
'Malformed query "%s"', |
|
$ENV{QUERY_STRING}); |
} |
} |
|
|
if (&forbidden_file($fullname)) { |
|
&fatal("403 Forbidden", |
|
"Access forbidden. This file is mentioned in \@ForbiddenFiles" |
|
); |
|
return; |
|
} |
|
|
|
# get mimetype |
# get mimetype |
if (defined($input{"content-type"}) |
if (defined($input{"content-type"}) |
&& ($input{"content-type"} =~ /\S\/\S/)) |
&& ($input{"content-type"} =~ /\S\/\S/)) |
Line 1782 sub doCheckout($$) { |
|
Line 1825 sub doCheckout($$) { |
|
# chdir to $tmpdir before to avoid non-readable cgi-bin directories |
# chdir to $tmpdir before to avoid non-readable cgi-bin directories |
chdir($tmpdir); |
chdir($tmpdir); |
open(STDERR, ">&STDOUT"); # Redirect stderr to stdout |
open(STDERR, ">&STDOUT"); # Redirect stderr to stdout |
exec($CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', |
|
$revopt, $where); |
# work around a bug of cvs -p; expand symlinks |
|
use Cwd 'abs_path'; |
|
exec($CMD{cvs}, @cvs_options, |
|
'-d', abs_path($cvsroot), |
|
'co', '-p', |
|
$revopt, $where) or exit -1; |
} |
} |
|
|
if (eof($fh)) { |
if (eof($fh)) { |
&fatal("404 Not Found", "$where is not (any longer) pertinent"); |
fatal("404 Not Found", |
|
'%s is not (any longer) pertinent', |
|
$where); |
} |
} |
|
|
#=================================================================== |
#=================================================================== |
Line 1811 sub doCheckout($$) { |
|
Line 1861 sub doCheckout($$) { |
|
} |
} |
|
|
if ($filename ne $where) { |
if ($filename ne $where) { |
&fatal("500 Internal Error", |
fatal("500 Internal Error", |
"Unexpected output from cvs co: $cvsheader"); |
'Unexpected output from cvs co: %s', |
|
$cvsheader); |
} |
} |
$| = 1; |
$| = 1; |
|
|
Line 1837 sub cvswebMarkup($$$) { |
|
Line 1888 sub cvswebMarkup($$$) { |
|
|
|
navigateHeader($scriptwhere, $pathname, $filename, $revision, "view"); |
navigateHeader($scriptwhere, $pathname, $filename, $revision, "view"); |
print "<hr noshade>"; |
print "<hr noshade>"; |
print "<table width=\"100%\"><tr><td bgcolor=\"$markupLogColor\">"; |
print "<table width=\"100%\">\n<tr>\n<td style=\"background-color: $markupLogColor\">"; |
print "File: ", &clickablePath($where, 1); |
print "File: ", &clickablePath($where, 1); |
print " ("; |
print " ("; |
&download_link($fileurl, $revision, "download"); |
&download_link($fileurl, $revision, "download"); |
Line 1858 sub cvswebMarkup($$$) { |
|
Line 1909 sub cvswebMarkup($$$) { |
|
print "Tag: <b>", $input{only_with_tag}, "</b><br>\n" |
print "Tag: <b>", $input{only_with_tag}, "</b><br>\n" |
if $input{only_with_tag}; |
if $input{only_with_tag}; |
} |
} |
print "</td></tr></table>"; |
print "</td>\n</tr>\n</table>"; |
my $url = download_url($fileurl, $revision, $mimetype); |
my $url = download_url($fileurl, $revision, $mimetype); |
print "<hr noshade>"; |
print "<hr noshade>"; |
|
|
Line 1906 sub doDiff($$$$$$) { |
|
Line 1957 sub doDiff($$$$$$) { |
|
my ($rev1, $rev2, $sym1, $sym2, $f1, $f2); |
my ($rev1, $rev2, $sym1, $sym2, $f1, $f2); |
|
|
if (&forbidden_file($fullname)) { |
if (&forbidden_file($fullname)) { |
&fatal("403 Forbidden", |
fatal("403 Forbidden", |
"Access forbidden. This file is mentioned in \@ForbiddenFiles" |
'Access forbidden. This file is mentioned in @ForbiddenFiles'); |
); |
|
return; |
return; |
} |
} |
|
|
Line 1933 sub doDiff($$$$$$) { |
|
Line 1983 sub doDiff($$$$$$) { |
|
# 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 =~ /[^\w.]/ || $rev2 =~ /[^\w.]/) { |
&fatal("404 Not Found", |
fatal("404 Not Found", |
"Malformed query \"$ENV{QUERY_STRING}\""); |
'Malformed query "%s"', |
|
$ENV{QUERY_STRING}); |
} |
} |
|
|
# |
# |
Line 1949 sub doDiff($$$$$$) { |
|
Line 2000 sub doDiff($$$$$$) { |
|
my $difftype = $DIFFTYPES{$f}; |
my $difftype = $DIFFTYPES{$f}; |
|
|
if (!$difftype) { |
if (!$difftype) { |
fatal("400 Bad arguments", "Diff format $f not understood"); |
fatal("400 Bad arguments", |
|
'Diff format %s not understood', |
|
$f); |
} |
} |
|
|
my @difftype = @{$difftype->{'opts'}}; |
my @difftype = @{$difftype->{'opts'}}; |
Line 1981 sub doDiff($$$$$$) { |
|
Line 2034 sub doDiff($$$$$$) { |
|
if (!open($fh, "-|")) { # child |
if (!open($fh, "-|")) { # child |
open(STDERR, ">&STDOUT"); # Redirect stderr to stdout |
open(STDERR, ">&STDOUT"); # Redirect stderr to stdout |
openOutputFilter(); |
openOutputFilter(); |
exec($CMD{rcsdiff}, @difftype, "-r$rev1", "-r$rev2", $fullname); |
exec($CMD{rcsdiff}, @difftype, "-r$rev1", "-r$rev2", $fullname) or exit -1; |
} |
} |
if ($human_readable) { |
if ($human_readable) { |
http_header(); |
http_header(); |
&human_readable_diff($fh, $rev2); |
&human_readable_diff($fh, $rev2); |
|
html_footer(); |
gzipclose(); |
gzipclose(); |
exit; |
exit; |
} else { |
} else { |
Line 2070 sub getDirLogs($$@) { |
|
Line 2124 sub getDirLogs($$@) { |
|
if (!open($fh, "-|")) { # child |
if (!open($fh, "-|")) { # child |
open(STDERR, '>/dev/null'); # rlog may complain; ignore. |
open(STDERR, '>/dev/null'); # rlog may complain; ignore. |
openOutputFilter(); |
openOutputFilter(); |
exec($CMD{rlog}, @files); |
exec($CMD{rlog}, @files) or exit -1; |
} |
} |
} else { |
} else { |
|
|
if (!open($fh, "-|")) { # child |
if (!open($fh, "-|")) { # child |
open(STDERR, '>/dev/null'); # rlog may complain; ignore. |
open(STDERR, '>/dev/null'); # rlog may complain; ignore. |
openOutputFilter(); |
openOutputFilter(); |
exec($CMD{rlog}, '-r', @files); |
exec($CMD{rlog}, '-r', @files) or exit -1; |
} |
} |
} |
} |
$state = "start"; |
$state = "start"; |
Line 2135 sub getDirLogs($$@) { |
|
Line 2189 sub getDirLogs($$@) { |
|
} |
} |
|
|
if ($state eq "tags") { |
if ($state eq "tags") { |
if (/^\s+(.+):\s+([\d\.]+)\s+$/) { |
if (/^\s+([^:]+):\s+([\d\.]+)\s*$/) { |
push (@filetags, $1); |
push (@filetags, $1); |
$symrev{$1} = $2; |
$symrev{$1} = $2; |
$alltags{$1} = 1; |
$alltags{$1} = 1; |
Line 2227 sub getDirLogs($$@) { |
|
Line 2281 sub getDirLogs($$@) { |
|
$state = "log"; |
$state = "log"; |
$log = ''; |
$log = ''; |
next; |
next; |
} elsif ($rev eq '' && /^revision (.*)$/) { |
} elsif ($rev eq '' && /^revision (\d+(?:\.\d+)+).*$/) { |
$rev = $1; |
$rev = $1; # .*$ eats up the locker(lockers?) info, if any |
next; |
next; |
} else { |
} else { |
$log .= $_; |
$log .= $_; |
Line 2242 sub getDirLogs($$@) { |
|
Line 2296 sub getDirLogs($$@) { |
|
} |
} |
|
|
if ($. == 0) { |
if ($. == 0) { |
fatal("500 Internal Error", "Failed to spawn GNU rlog on <em>'" |
fatal("500 Internal Error", |
. join (", ", @files) |
'Failed to spawn GNU rlog on <em>"%s"</em>. <p>Did you set the <b>$command_path</b> in your configuration file correctly ? (Currently "%s"', |
. "'</em><p>Did you set the <b>\$command_path</b> in your configuration file correctly ? (Currently '$command_path'" |
join (", ", @files), $command_path); |
); |
|
} |
} |
close($fh); |
close($fh); |
} |
} |
Line 2274 sub readLog($;$) { |
|
Line 2327 sub readLog($;$) { |
|
if (!open($fh, "-|")) { # child |
if (!open($fh, "-|")) { # child |
if ($revision ne '') { |
if ($revision ne '') { |
openOutputFilter(); |
openOutputFilter(); |
exec($CMD{rlog}, $revision, $fullname); |
exec($CMD{rlog}, $revision, $fullname) or exit -1; |
} else { |
} else { |
openOutputFilter(); |
openOutputFilter(); |
exec($CMD{rlog}, $fullname); |
exec($CMD{rlog}, $fullname) or exit -1; |
} |
} |
} |
} |
|
|
Line 2307 sub readLog($;$) { |
|
Line 2360 sub readLog($;$) { |
|
# date: 1995/11/29 22:15:52; author: fenner; state: Exp; lines: +5 -3 |
# date: 1995/11/29 22:15:52; author: fenner; state: Exp; lines: +5 -3 |
# log info |
# log info |
# ---------------------------- |
# ---------------------------- |
|
|
|
# For a locked revision, the first line after the separator |
|
# becomes smth like |
|
# revision 9.19 locked by: vassilii; |
|
|
logentry: |
logentry: |
|
|
while (!/$LOG_FILESEPARATOR/o) { |
while (!/$LOG_FILESEPARATOR/o) { |
$_ = <$fh>; |
$_ = <$fh>; |
last logentry if (!defined($_)); # EOF |
last logentry if (!defined($_)); # EOF |
print "R:", $_ if ($verbose); |
print "R:", $_ if ($verbose); |
if (/^revision ([\d\.]+)/) { |
if (/^revision (\d+(?:\.\d+)+)/) { |
$rev = $1; |
$rev = $1; |
unshift (@allrevisions, $rev); |
unshift (@allrevisions, $rev); |
} elsif (/$LOG_FILESEPARATOR/o || /$LOG_REVSEPARATOR/o) { |
} elsif (/$LOG_FILESEPARATOR/o || /$LOG_REVSEPARATOR/o) { |
Line 2328 sub readLog($;$) { |
|
Line 2386 sub readLog($;$) { |
|
# these lines since we don't know what revision they go with |
# these lines since we don't know what revision they go with |
# any more. |
# any more. |
next logentry; |
next logentry; |
|
|
# &fatal("500 Internal Error","Error parsing RCS output: $_"); |
|
} |
} |
$_ = <$fh>; |
$_ = <$fh>; |
print "D:", $_ if ($verbose); |
print "D:", $_ if ($verbose); |
Line 2349 sub readLog($;$) { |
|
Line 2405 sub readLog($;$) { |
|
$state{$rev} = $8; |
$state{$rev} = $8; |
$difflines{$rev} = $10; |
$difflines{$rev} = $10; |
} else { |
} else { |
&fatal("500 Internal Error", |
fatal("500 Internal Error", |
"Error parsing RCS output: $_"); |
'Error parsing RCS output: %s', |
|
$_); |
} |
} |
line: |
line: |
|
|
Line 2457 sub readLog($;$) { |
|
Line 2514 sub readLog($;$) { |
|
|
|
if (!defined($onlyonbranch) || $onlybranchpoint eq "") { |
if (!defined($onlyonbranch) || $onlybranchpoint eq "") { |
fatal("404 Tag not found", |
fatal("404 Tag not found", |
"Tag $input{'only_with_tag'} not defined"); |
'Tag %s not defined', |
|
$input{'only_with_tag'}); |
} |
} |
} |
} |
|
|
Line 2516 sub printLog($;$) { |
|
Line 2574 sub printLog($;$) { |
|
$link = 1 if (!defined($link)); |
$link = 1 if (!defined($link)); |
$isDead = ($state{$_} eq "dead"); |
$isDead = ($state{$_} eq "dead"); |
|
|
|
print "<p>\n"; |
if ($link && !$isDead) { |
if ($link && !$isDead) { |
my ($filename); |
my ($filename); |
($filename = $where) =~ s/^.*\///; |
($filename = $where) =~ s/^.*\///; |
Line 2637 sub printLog($;$) { |
|
Line 2696 sub printLog($;$) { |
|
my %diffrev = (); |
my %diffrev = (); |
$diffrev{$_} = 1; |
$diffrev{$_} = 1; |
$diffrev{""} = 1; |
$diffrev{""} = 1; |
print "<br>Diff"; |
print '<br>'; |
|
my $diff = 'Diff'; |
|
|
# |
# |
# Offer diff to previous revision |
# Offer diff to previous revision |
Line 2648 sub printLog($;$) { |
|
Line 2708 sub printLog($;$) { |
|
sprintf('%s.diff?r1=%s&r2=%s%s', $scriptwhere, |
sprintf('%s.diff?r1=%s&r2=%s%s', $scriptwhere, |
$prev, $_, $barequery); |
$prev, $_, $barequery); |
|
|
print " to previous "; |
print $diff, " to previous "; |
|
$diff = ''; |
printDiffLinks($prev, $url); |
printDiffLinks($prev, $url); |
} |
} |
|
|
Line 2662 sub printLog($;$) { |
|
Line 2723 sub printLog($;$) { |
|
sprintf('%s.diff?r1=%s&r2=%s%s', $scriptwhere, $brp, |
sprintf('%s.diff?r1=%s&r2=%s%s', $scriptwhere, $brp, |
$_, $barequery); |
$_, $barequery); |
|
|
print " to branchpoint "; |
print $diff, " to branchpoint "; |
|
$diff = ''; |
printDiffLinks($brp, $url); |
printDiffLinks($brp, $url); |
} |
} |
|
|
Line 2704 sub printLog($;$) { |
|
Line 2766 sub printLog($;$) { |
|
$scriptwhere, $nextmain, $_, |
$scriptwhere, $nextmain, $_, |
$barequery); |
$barequery); |
|
|
print " next main "; |
print $diff, " next main "; |
|
$diff = ''; |
printDiffLinks($nextmain, $url); |
printDiffLinks($nextmain, $url); |
} |
} |
} |
} |
Line 2718 sub printLog($;$) { |
|
Line 2781 sub printLog($;$) { |
|
sprintf('%s.diff?r1=%s&r2=%s%s', $scriptwhere, |
sprintf('%s.diff?r1=%s&r2=%s%s', $scriptwhere, |
$input{'r1'}, $_, $barequery); |
$input{'r1'}, $_, $barequery); |
|
|
print " to selected "; |
print $diff, " to selected "; |
|
$diff = ''; |
printDiffLinks($input{'r1'}, $url); |
printDiffLinks($input{'r1'}, $url); |
} |
} |
|
|
} |
} |
print "<pre>\n"; |
print "\n</p>\n<pre>\n"; |
print &htmlify($log{$_}, 1); |
print &htmlify($log{$_}, $allow_log_extra); |
print "</pre>\n"; |
print "</pre>\n"; |
} |
} |
|
|
|
|
($upwhere = $where) =~ s|(Attic/)?[^/]+$||; |
($upwhere = $where) =~ s|(Attic/)?[^/]+$||; |
($filename = $where) =~ s|^.*/||; |
($filename = $where) =~ s|^.*/||; |
$backurl = $scriptname . "/" . urlencode($upwhere) . $query; |
$backurl = $scriptname . "/" . urlencode($upwhere) . $query; |
|
print "<p>\n "; |
print &link($backicon, "$backurl#$filename"), " <b>Up to ", |
print &link($backicon, "$backurl#$filename"), " <b>Up to ", |
&clickablePath($upwhere, 1), "</b><p>\n"; |
&clickablePath($upwhere, 1), "</b>\n</p>\n"; |
|
print "<p>\n "; |
print &link('Request diff between arbitrary revisions', '#diff'); |
print &link('Request diff between arbitrary revisions', '#diff'); |
print '<hr noshade>'; |
print "\n</p>\n<hr noshade>\n"; |
|
|
|
print "<p>\n"; |
if ($curbranch) { |
if ($curbranch) { |
print "Default branch: ", ($revsym{$curbranch} || $curbranch); |
print "Default branch: ", ($revsym{$curbranch} || $curbranch); |
} else { |
} else { |
|
|
if ($input{only_with_tag}) { |
if ($input{only_with_tag}) { |
print "Current tag: $input{only_with_tag}<br>\n"; |
print "Current tag: $input{only_with_tag}<br>\n"; |
} |
} |
|
print "</p>\n"; |
|
|
undef %nameprinted; |
undef %nameprinted; |
|
|
for (my $i = 0 ; $i <= $#revdisplayorder ; $i++) { |
for (my $i = 0 ; $i <= $#revdisplayorder ; $i++) { |
print "<hr size=\"1\" noshade>"; |
print "<hr size=\"1\" noshade>\n"; |
printLog($revdisplayorder[$i]); |
printLog($revdisplayorder[$i]); |
} |
} |
|
|
print "<hr noshade>"; |
print "<hr noshade>\n<p>\n"; |
print "<a name=\"diff\">\n"; |
print "<a name=\"diff\">\n"; |
print "This form allows you to request diff's between any two\n"; |
print "This form allows you to request diff's between any two\n"; |
print "revisions of a file. You may select a symbolic revision\n"; |
print "revisions of a file. You may select a symbolic revision\n"; |
print "name using the selection box or you may type in a numeric\n"; |
print "name using the selection box or you may type in a numeric\n"; |
print "name using the type-in text box.\n"; |
print "name using the type-in text box.\n"; |
print "</a><p>\n"; |
print "</a>\n</p>\n"; |
print |
print |
"<form method=\"get\" action=\"${scriptwhere}.diff\" name=\"diff_select\">\n"; |
"<form method=\"get\" action=\"${scriptwhere}.diff\" name=\"diff_select\">\n"; |
|
|
|
|
&& ((!defined($DEFAULTVALUE{$_}) |
&& ((!defined($DEFAULTVALUE{$_}) |
|| $input{$_} ne $DEFAULTVALUE{$_}) && $input{$_} ne "")); |
|| $input{$_} ne $DEFAULTVALUE{$_}) && $input{$_} ne "")); |
} |
} |
print "<table><tr>\n"; |
print "<table style=\"border: none\">\n<tr>\n"; |
print "<td align=\"right\">Diffs between \n"; |
print "<td align=\"right\">"; |
print "<select name=\"r1\">\n"; |
print "<label for=\"r1\" accesskey=\"1\">Diffs between </label>\n"; |
|
print "<select id=\"r1\" name=\"r1\">\n"; |
print "<option value=\"text\" selected>Use Text Field</option>\n"; |
print "<option value=\"text\" selected>Use Text Field</option>\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 |
print |
"<input type=\"text\" size=\"$inputTextSize\" name=\"tr1\" value=\"$diffrev\" onchange=\"document.diff_select.r1.selectedIndex=0\"></td>"; |
"<input type=\"text\" size=\"$inputTextSize\" name=\"tr1\" value=\"$diffrev\" onchange=\"this.form.r1.selectedIndex=0\"></td>\n"; |
print "<td><br></td></tr>\n"; |
print "<td><br></td>\n</tr>\n"; |
print "<tr><td align=\"right\">and \n"; |
print "<tr>\n<td align=\"right\">"; |
print "<select name=\"r2\">\n"; |
print "<label for=\"r2\" accesskey=\"2\">and </label>\n"; |
|
print "<select id=\"r2\" name=\"r2\">\n"; |
print "<option value=\"text\" selected>Use Text Field</option>\n"; |
print "<option value=\"text\" selected>Use Text Field</option>\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 |
print |
"<input type=\"text\" size=\"$inputTextSize\" name=\"tr2\" value=\"$diffrev\" onchange=\"document.diff_select.r2.selectedIndex=0\"></td>"; |
"<input type=\"text\" size=\"$inputTextSize\" name=\"tr2\" value=\"$diffrev\" onchange=\"this.form.r2.selectedIndex=0\"></td>\n"; |
print "<td><input type=\"submit\" value=\" Get Diffs \"></td>\n"; |
print "<td><input type=\"submit\" value=\" Get Diffs \" accesskey=\"G\"></td>\n"; |
|
print "</tr>\n</table>\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 "<form method=\"get\" action=\"$scriptwhere\">\n"; |
print "<tr><td align=\"right\">Preferred Diff type:</td>"; |
print "<table style=\"border: none\">\n"; |
|
print "<tr>\n<td align=\"right\">"; |
|
print "<label for=\"f\" accesskey=\"D\">Preferred Diff type:"; |
|
print "</label></td>\n"; |
print "<td>"; |
print "<td>"; |
printDiffSelect($use_java_script); |
printDiffSelect($use_java_script); |
print "</td><td></td></tr>\n"; |
print "</td>\n<td></td>\n</tr>\n"; |
|
|
if (@branchnames) { |
if (@branchnames) { |
print "<tr><td align=\"right\">View only Branch:</td>"; |
print "<tr>\n<td align=\"right\">"; |
|
print "<label for=\"only_with_tag\" accesskey=\"B\">"; |
|
print "View only Branch:</label></td>\n"; |
print "<td>"; |
print "<td>"; |
print "<a name=\"branch\"></a>\n"; |
print "<a name=\"branch\"></a>\n"; |
print "<select name=\"only_with_tag\""; |
print "<select id=\"only_with_tag\" name=\"only_with_tag\""; |
print " onchange=\"this.form.submit()\"" if $use_java_script; |
print " onchange=\"this.form.submit()\"" if $use_java_script; |
print ">\n"; |
print ">\n"; |
print "<option value=\"\""; |
print "<option value=\"\""; |
|
|
&& $input{"only_with_tag"} eq $_); |
&& $input{"only_with_tag"} eq $_); |
print ">${_}</option>\n"; |
print ">${_}</option>\n"; |
} |
} |
print "</select></td><td></td></tr>\n"; |
print "</select></td>\n<td></td>\n</tr>\n"; |
} |
} |
|
|
foreach (@stickyvars) { |
foreach (@stickyvars) { |
|
|
&& (!defined($DEFAULTVALUE{$_}) |
&& (!defined($DEFAULTVALUE{$_}) |
|| $input{$_} ne $DEFAULTVALUE{$_}) && $input{$_} ne ""); |
|| $input{$_} ne $DEFAULTVALUE{$_}) && $input{$_} ne ""); |
} |
} |
print "<tr><td align=\"right\">"; |
print "<tr>\n<td align=\"right\">"; |
print "<a name=\"logsort\"></a>\n"; |
print "<a name=\"logsort\"></a>\n"; |
print "Sort log by:</td>"; |
print "<label for=\"logsort\" accesskey=\"L\">Sort log by:"; |
print "<td>"; |
print "</label></td>\n<td>"; |
printLogSortSelect($use_java_script); |
printLogSortSelect($use_java_script); |
print "</td>"; |
print "</td>\n"; |
print "<td><input type=\"submit\" value=\" Set \"></td>"; |
print "<td><input type=\"submit\" value=\" Set \" accesskey=\"S\"></td>\n"; |
|
print "</tr>\n</table>\n"; |
print "</form>\n"; |
print "</form>\n"; |
print "</tr></table>"; |
html_footer(); |
print &html_footer; |
|
} |
} |
|
|
sub flush_diff_rows($$$$) { |
sub flush_diff_rows($$$$) { |
Line 2863 sub flush_diff_rows($$$$) { |
|
Line 2938 sub flush_diff_rows($$$$) { |
|
if ($state eq "PreChangeRemove") { # we just got remove-lines before |
if ($state eq "PreChangeRemove") { # we just got remove-lines before |
for ($j = 0 ; $j < $leftRow ; $j++) { |
for ($j = 0 ; $j < $leftRow ; $j++) { |
print |
print |
"<tr><td bgcolor=\"$diffcolorRemove\">@$leftColRef[$j]</td>"; |
"<tr>\n<td class=\"diff-removed\"> @$leftColRef[$j]</td>\n"; |
print |
print |
"<td bgcolor=\"$diffcolorEmpty\"> </td></tr>\n"; |
"<td class=\"diff-empty\"> </td>\n</tr>\n"; |
} |
} |
} elsif ($state eq "PreChange") { # state eq "PreChange" |
} elsif ($state eq "PreChange") { # state eq "PreChange" |
# we got removes with subsequent adds |
# we got removes with subsequent adds |
|
|
for ($j = 0 ; $j < $leftRow || $j < $rightRow ; $j++) |
for ($j = 0 ; $j < $leftRow || $j < $rightRow ; $j++) |
{ # dump out both cols |
{ # dump out both cols |
print "<tr>"; |
print "<tr>\n"; |
if ($j < $leftRow) { |
if ($j < $leftRow) { |
print |
print |
"<td bgcolor=\"$diffcolorChange\">@$leftColRef[$j]</td>"; |
"<td class=\"diff-changed\"> @$leftColRef[$j]</td>"; |
} else { |
} else { |
print |
print |
"<td bgcolor=\"$diffcolorDarkChange\"> </td>"; |
"<td class=\"diff-changed-missing\"> </td>"; |
} |
} |
|
print "\n"; |
|
|
if ($j < $rightRow) { |
if ($j < $rightRow) { |
print |
print |
"<td bgcolor=\"$diffcolorChange\">@$rightColRef[$j]</td>"; |
"<td class=\"diff-changed\"> @$rightColRef[$j]</td>"; |
} else { |
} else { |
print |
print |
"<td bgcolor=\"$diffcolorDarkChange\"> </td>"; |
"<td class=\"diff-changed-missing\"> </td>"; |
} |
} |
print "</tr>\n"; |
print "\n</tr>\n"; |
} |
} |
} |
} |
} |
} |
Line 2927 sub human_readable_diff($) { |
|
Line 3003 sub human_readable_diff($) { |
|
} |
} |
|
|
print |
print |
"<h3 align=\"center\">Diff for /$where_nd between version $rev1 and $rev2</h3>\n", |
"<h3 style=\"text-align: center\">Diff for /$where_nd between version $rev1 and $rev2</h3>\n", |
|
# Using style=\"border: none\" here breaks NS 4.x badly... |
"<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">\n", |
"<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\">\n", |
"<tr bgcolor=\"#ffffff\">\n", "<th width=\"50%\" valign=\"top\">", |
"<tr style=\"background-color: #ffffff\">\n", "<th width=\"50%\" valign=\"top\">", |
"version $rev1"; |
"version $rev1"; |
print ", $date1" if (defined($date1)); |
print ", $date1" if (defined($date1)); |
print "<br>Tag: $sym1\n" if ($sym1); |
print "<br>Tag: $sym1\n" if ($sym1); |
Line 2938 sub human_readable_diff($) { |
|
Line 3015 sub human_readable_diff($) { |
|
print "<br>Tag: $sym2\n" if ($sym1); |
print "<br>Tag: $sym2\n" if ($sym1); |
print "</th>\n"; |
print "</th>\n"; |
|
|
my $fs = "<font face=\"$difffontface\" size=\"$difffontsize\"><tt>"; |
|
my $fe = "</tt></font>"; |
|
|
|
my $leftRow = 0; |
my $leftRow = 0; |
my $rightRow = 0; |
my $rightRow = 0; |
my ($oldline, $newline, $funname, $diffcode, $rest); |
my ($oldline, $newline, $funname, $diffcode, $rest); |
|
|
# Process diff text |
# Process diff text |
# The diffrows are could make excellent use of |
|
# cascading style sheets because we've to set the |
|
# font and color for each row. anyone ...? |
|
#### |
|
|
|
# prefetch several lines |
# prefetch several lines |
my @buf = head($fh); |
my @buf = head($fh); |
Line 2963 sub human_readable_diff($) { |
|
Line 3033 sub human_readable_diff($) { |
|
($oldline, $newline, $funname) = |
($oldline, $newline, $funname) = |
$difftxt =~ /@@ \-([0-9]+).*\+([0-9]+).*@@(.*)/; |
$difftxt =~ /@@ \-([0-9]+).*\+([0-9]+).*@@(.*)/; |
$funname = htmlquote($funname); |
$funname = htmlquote($funname); |
|
$funname =~ s/\s/ /go; |
print |
print |
"<tr bgcolor=\"$diffcolorHeading\"><td width=\"50%\">"; |
"<tr class=\"diff-heading\">\n<td width=\"50%\">"; |
print |
print |
"<table width=\"100%\" border=\"1\" cellpadding=\"5\"><tr><td><b>Line $oldline</b>"; |
"<table width=\"100%\" border=\"1\" cellpadding=\"5\">\n<tr>\n<td><b>Line $oldline</b>"; |
print |
print |
" <font size=\"-1\">$funname</font></td></tr></table>"; |
" <span style=\"font-size: smaller\">$funname</span></td>\n</tr>\n</table>"; |
print "</td><td width=\"50%\">"; |
print "</td>\n<td width=\"50%\">"; |
print |
print |
"<table width=\"100%\" border=\"1\" cellpadding=\"5\"><tr><td><b>Line $newline</b>"; |
"<table width=\"100%\" border=\"1\" cellpadding=\"5\">\n<tr>\n<td><b>Line $newline</b>"; |
print |
print |
" <font size=\"-1\">$funname</font></td></tr></table>"; |
" <span style=\"font-size: smaller\">$funname</span></td>\n</tr>\n</table>\n"; |
print "</td>\n"; |
print "</td>\n"; |
$state = "dump"; |
$state = "dump"; |
$leftRow = 0; |
$leftRow = 0; |
Line 2982 sub human_readable_diff($) { |
|
Line 3053 sub human_readable_diff($) { |
|
($diffcode, $rest) = $difftxt =~ /^([-+ ])(.*)/; |
($diffcode, $rest) = $difftxt =~ /^([-+ ])(.*)/; |
$_ = spacedHtmlText($rest, $d{'tabstop'}); |
$_ = spacedHtmlText($rest, $d{'tabstop'}); |
|
|
# Add fontface, size |
|
$_ = "$fs $_$fe"; |
|
|
|
######### |
######### |
# little state machine to parse unified-diff output (Hen, zeller@think.de) |
# little state machine to parse unified-diff output (Hen, zeller@think.de) |
# in order to get some nice 'ediff'-mode output |
# in order to get some nice 'ediff'-mode output |
Line 2998 sub human_readable_diff($) { |
|
Line 3066 sub human_readable_diff($) { |
|
if ($state eq "dump") |
if ($state eq "dump") |
{ # 'change' never begins with '+': just dump out value |
{ # 'change' never begins with '+': just dump out value |
print |
print |
"<tr><td bgcolor=\"$diffcolorEmpty\"> </td><td bgcolor=\"$diffcolorAdd\">$_</td></tr>\n"; |
"<tr>\n<td class=\"diff-empty\"> </td>\n<td class=\"diff-added\"> $_</td>\n</tr>\n"; |
} else { # we got minus before |
} else { # we got minus before |
$state = "PreChange"; |
$state = "PreChange"; |
$rightCol[$rightRow++] = $_; |
$rightCol[$rightRow++] = $_; |
Line 3009 sub human_readable_diff($) { |
|
Line 3077 sub human_readable_diff($) { |
|
} else { # empty diffcode |
} else { # empty diffcode |
flush_diff_rows \@leftCol, \@rightCol, $leftRow, |
flush_diff_rows \@leftCol, \@rightCol, $leftRow, |
$rightRow; |
$rightRow; |
print "<tr><td>$_</td><td>$_</td></tr>\n"; |
print "<tr>\n<td class=\"diff-same\"> $_</td>\n<td class=\"diff-same\"> $_</td>\n</tr>\n"; |
$state = "dump"; |
$state = "dump"; |
$leftRow = 0; |
$leftRow = 0; |
$rightRow = 0; |
$rightRow = 0; |
Line 3022 sub human_readable_diff($) { |
|
Line 3090 sub human_readable_diff($) { |
|
|
|
# state is empty if we didn't have any change |
# state is empty if we didn't have any change |
if (!$state) { |
if (!$state) { |
print "<tr><td colspan=\"2\"> </td></tr>"; |
print "<tr>\n<td colspan=\"2\"> </td>\n</tr>\n"; |
print "<tr bgcolor=\"$diffcolorEmpty\">"; |
print "<tr class=\"diff-empty\">\n"; |
print |
print |
"<td colspan=\"2\" align=\"center\"><b>- No viewable change -</b></td></tr>"; |
"<td colspan=\"2\" align=\"center\"><b>- No viewable change -</b></td>\n</tr>\n"; |
} |
} |
print "</table>"; |
print "</table>\n"; |
|
|
print "<br><hr noshade width=\"100%\">\n"; |
print "<hr style=\"width: 100%\" noshade>\n"; |
|
print "<form method=\"get\" action=\"${scriptwhere}\">\n"; |
|
print "<table style=\"border: none\">\n<tr>\n<td>\n"; |
|
|
print "<table border=\"0\">"; |
|
|
|
print "<tr><td>"; |
|
|
|
# print legend |
# print legend |
print "<table border=\"1\"><tr><td>"; |
print "<table border=\"1\">\n<tr>\n<td>"; |
print "Legend:<br><table border=\"0\" cellspacing=\"0\" cellpadding=\"1\">\n"; |
print "Legend:<br><table style=\"border: none\" cellspacing=\"0\" cellpadding=\"1\">\n"; |
print |
print |
"<tr><td align=\"center\" bgcolor=\"$diffcolorRemove\">Removed from v.$rev1</td><td bgcolor=\"$diffcolorEmpty\"> </td></tr>"; |
"<tr>\n<td align=\"center\" class=\"diff-removed\">Removed from v.$rev1</td>\n<td class=\"diff-empty\"> </td>\n</tr>\n"; |
print |
print |
"<tr bgcolor=\"$diffcolorChange\"><td align=\"center\" colspan=\"2\">changed lines</td></tr>"; |
"<tr class=\"diff-changed\">\n<td align=\"center\" colspan=\"2\">changed lines</td>\n</tr>\n"; |
print |
print |
"<tr><td bgcolor=\"$diffcolorEmpty\"> </td><td align=\"center\" bgcolor=\"$diffcolorAdd\">Added in v.$rev2</td></tr>"; |
"<tr>\n<td class=\"diff-empty\"> </td>\n<td align=\"center\" class=\"diff-added\">Added in v.$rev2</td>\n</tr>\n"; |
print "</table></td></tr></table>\n"; |
print "</table>\n</td>\n</tr>\n</table>\n</td>\n<td>"; |
|
|
print "<td>"; |
|
|
|
# Print format selector |
# Print format selector |
print "<form method=\"get\" action=\"${scriptwhere}\">\n"; |
|
foreach my $var (keys %input) { |
foreach my $var (keys %input) { |
next if ($var eq "f"); |
next if ($var eq "f"); |
next |
next |
Line 3060 sub human_readable_diff($) { |
|
Line 3123 sub human_readable_diff($) { |
|
} |
} |
printDiffSelect($use_java_script); |
printDiffSelect($use_java_script); |
print "<input type=\"submit\" value=\"Show\">\n"; |
print "<input type=\"submit\" value=\"Show\">\n"; |
print "</form>\n"; |
print "</td>\n"; |
print "</td>"; |
|
|
|
print "</tr></table>"; |
print "</tr>\n</table>\n"; |
|
print "</form>\n"; |
} |
} |
|
|
sub navigateHeader($$$$$) { |
sub navigateHeader($$$$$) { |
Line 3071 sub navigateHeader($$$$$) { |
|
Line 3134 sub navigateHeader($$$$$) { |
|
$swhere = "" if ($swhere eq $scriptwhere); |
$swhere = "" if ($swhere eq $scriptwhere); |
$swhere = './' . urlencode($filename) if ($swhere eq ""); |
$swhere = './' . urlencode($filename) if ($swhere eq ""); |
|
|
|
# TODO: this should be moved into external CSS file. |
|
my $css = ''; |
|
if ($title eq 'diff') { |
|
$css = " |
|
<style type=\"text/css\"> |
|
.diff-heading { |
|
background-color: $diffcolorHeading; |
|
} |
|
.diff-same { |
|
font-family: $difffontface; |
|
font-size: smaller; |
|
} |
|
.diff-empty { |
|
background-color: $diffcolorEmpty; |
|
} |
|
.diff-added { |
|
background-color: $diffcolorAdd; |
|
font-family: $difffontface; |
|
font-size: smaller; |
|
} |
|
.diff-removed { |
|
background-color: $diffcolorRemove; |
|
font-family: $difffontface; |
|
font-size: smaller; |
|
} |
|
.diff-changed { |
|
background-color: $diffcolorChange; |
|
font-family: $difffontface; |
|
font-size: smaller; |
|
} |
|
.diff-changed-missing { |
|
background-color: $diffcolorDarkChange; |
|
} |
|
</style>"; |
|
} |
|
|
print <<EOF; |
print <<EOF; |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
$HTML_DOCTYPE |
<html> |
<html> |
<head> |
<head> |
<meta name="robots" content="nofollow"> |
<title>$path$filename - $title - $rev</title>$css |
<!-- FreeBSD-cvsweb $cvsweb_revision --> |
$HTML_META</head> |
<title>$path$filename - $title - $rev</title> |
|
</head> |
|
$body_tag_for_src |
$body_tag_for_src |
<table width="100%" border="0" cellspacing="0" cellpadding="1" bgcolor="$navigationHeaderColor"> |
<table width="100%" style="border: none; background-color: $navigationHeaderColor" cellspacing="0" cellpadding="1"> |
<tr valign="bottom"><td> |
<tr valign="bottom"><td> |
EOF |
EOF |
|
|
Line 3195 sub clickablePath($$) { |
|
Line 3292 sub clickablePath($$) { |
|
} |
} |
|
|
sub chooseCVSRoot() { |
sub chooseCVSRoot() { |
|
|
|
print "<form method=\"get\" action=\"${scriptwhere}\">\n"; |
if (2 <= @CVSROOT) { |
if (2 <= @CVSROOT) { |
my ($k); |
my ($k); |
print "<form method=\"GET\" action=\"${scriptwhere}\">\n"; |
|
foreach $k (keys %input) { |
foreach $k (keys %input) { |
print "<input type=\"hidden\" name=\"$k\" value=\"$input{$k}\">\n" |
print "<input type=\"hidden\" name=\"$k\" value=\"$input{$k}\">\n" |
if ($input{$k}) && ($k ne "cvsroot"); |
if ($input{$k}) && ($k ne "cvsroot"); |
Line 3206 sub chooseCVSRoot() { |
|
Line 3304 sub chooseCVSRoot() { |
|
# Form-Elements look wierd in Netscape if the background |
# Form-Elements look wierd in Netscape if the background |
# isn't gray and the form elements are not placed |
# isn't gray and the form elements are not placed |
# within a table ... |
# within a table ... |
print "<table><tr>"; |
print "<table style=\"border: none\">\n<tr>\n"; |
print "<td>CVS Root:</td>"; |
print "<td><label for=\"cvsroot\" accesskey=\"C\">CVS Root:</label></td>\n"; |
print "<td>\n<select name=\"cvsroot\""; |
print "<td>\n<select id=\"cvsroot\" name=\"cvsroot\""; |
print " onchange=\"this.form.submit()\"" if $use_java_script; |
print " onchange=\"this.form.submit()\"" if $use_java_script; |
print ">\n"; |
print ">\n"; |
|
|
Line 3218 sub chooseCVSRoot() { |
|
Line 3316 sub chooseCVSRoot() { |
|
print ">",($CVSROOTdescr{$k} ? $CVSROOTdescr{$k} : $k), |
print ">",($CVSROOTdescr{$k} ? $CVSROOTdescr{$k} : $k), |
"</option>\n"; |
"</option>\n"; |
} |
} |
print "</select>\n</td>"; |
print "</select>\n</td>\n<td>"; |
print "<td>"; |
|
} else { |
} else { |
|
|
# no choice -- but we need the form to select module/path, at least for Netscape |
# no choice -- but we need the form to select module/path, |
print "<form method=\"get\" action=\"${scriptwhere}\">\n"; |
# at least for Netscape |
|
print "<p>\n"; |
print "CVS Root: <b>[$cvstree]</b>"; |
print "CVS Root: <b>[$cvstree]</b>"; |
} |
} |
|
|
print " Module path or alias:\n"; |
print " <label for=\"mpath\" accesskey=\"M\">Module path or alias:"; |
print "<input type=\"text\" name=\"path\" value=\"\" size=\"15\">\n"; |
print "</label>\n"; |
print "<input type=\"submit\" value=\"Go\">"; |
print "<input type=\"text\" id=\"mpath\" name=\"path\" value=\"\" size=\"15\">\n"; |
|
print "<input type=\"submit\" value=\"Go\" accesskey=\"O\">"; |
|
|
if (2 <= @CVSROOT) { |
if (2 <= @CVSROOT) { |
print "</td></tr></table>"; |
print "</td>\n</tr>\n</table>"; |
|
} else { |
|
print "</p>"; |
} |
} |
print "</form>"; |
print "\n</form>"; |
} |
} |
|
|
sub chooseMirror() { |
sub chooseMirror() { |
my ($mirror, $moremirrors); |
|
$moremirrors = 0; |
|
|
|
# This code comes from the original BSD-cvsweb |
# This code comes from the original BSD-cvsweb |
# and may not be useful for your site; If you don't |
# and may not be useful for your site; If you don't |
# set %MIRRORS this won't show up, anyway |
# set %MIRRORS this won't show up, anyway. |
# |
scalar(%MIRRORS) or return; |
# Should perhaps exlude the current site somehow.. |
|
if (keys %MIRRORS) { |
|
print "\nThis cvsweb is mirrored in:\n"; |
|
|
|
foreach $mirror (keys %MIRRORS) { |
# Should perhaps exclude the current site somehow... |
print ", " if ($moremirrors); |
print "\n<p>\nThis CVSweb is mirrored in\n"; |
print &link(htmlquote($mirror), $MIRRORS{$mirror}); |
|
$moremirrors = 1; |
my @tmp = map(&link(htmlquote($_), $MIRRORS{$_}), |
} |
sort keys %MIRRORS); |
print "<p>\n"; |
my $tmp = pop(@tmp); |
|
|
|
if (scalar(@tmp)) { |
|
print join(', ', @tmp), ' and '; |
} |
} |
|
|
|
print "$tmp.\n</p>\n"; |
} |
} |
|
|
sub fileSortCmp() { |
sub fileSortCmp() { |
Line 3283 sub fileSortCmp() { |
|
Line 3384 sub fileSortCmp() { |
|
|
|
if ($comp == 0) { |
if ($comp == 0) { |
|
|
# Directories first, then sorted on name if no other sort critera |
# Directories first, then files under version control, |
# available. |
# then other, "rogue" files. |
my $ad = ((-d "$fullname/$a") ? "D" : "F"); |
# Sort by filename if no other criteria available. |
my $bd = ((-d "$fullname/$b") ? "D" : "F"); |
|
|
my $ad = ((-d "$fullname/$a") ? 'D' |
|
: (defined($fileinfo{$af}) ? 'F' : 'R')); |
|
my $bd = ((-d "$fullname/$b") ? 'D' |
|
: (defined($fileinfo{$bf}) ? 'F' : 'R')); |
($c = $a) =~ s|.*/||; |
($c = $a) =~ s|.*/||; |
($d = $b) =~ s|.*/||; |
($d = $b) =~ s|.*/||; |
$comp = ("$ad$c" cmp "$bd$d"); |
$comp = ("$ad$c" cmp "$bd$d"); |
Line 3346 sub download_link($$$;$) { |
|
Line 3451 sub download_link($$$;$) { |
|
# currently, the best way is to comment out the size parameters |
# currently, the best way is to comment out the size parameters |
# ($extern_window...) in cvsweb.conf. |
# ($extern_window...) in cvsweb.conf. |
if ($use_java_script) { |
if ($use_java_script) { |
my @attr = qw(resizeable scrollbars); |
my @attr = qw(resizable scrollbars); |
|
|
push @attr, qw(status toolbar) |
push @attr, qw(status toolbar) |
if (defined($mimetype) && $mimetype eq "text/html"); |
if (defined($mimetype) && $mimetype eq "text/html"); |
Line 3363 sub download_link($$$;$) { |
|
Line 3468 sub download_link($$$;$) { |
|
# the same window *twice*. |
# the same window *twice*. |
printf |
printf |
q` onclick="window.open('%s','cvs_checkout','%s');return false"`, |
q` onclick="window.open('%s','cvs_checkout','%s');return false"`, |
hrefquote($fullurl), join (',', @attr); |
hrefquote("$fullurl$barequery"), join (',', @attr); |
} |
} |
} |
} |
print "><b>$textlink</b></a>"; |
print "><b>$textlink</b></a>"; |
Line 3499 sub http_header(;$) { |
|
Line 3604 sub http_header(;$) { |
|
print "\r\n"; # Close headers |
print "\r\n"; # Close headers |
} |
} |
print |
print |
"<font size=\"-1\">Unable to find gzip binary in the <b>\$command_path</b> ($command_path) to compress output</font><br>"; |
"<span style=\"font-size: smaller\">Unable to find gzip binary in the <b>\$command_path</b> ($command_path) to compress output</span><br>"; |
} |
} |
} else { |
} else { |
|
|
Line 3515 sub html_header($) { |
|
Line 3620 sub html_header($) { |
|
my ($title) = @_; |
my ($title) = @_; |
http_header("text/html"); |
http_header("text/html"); |
print <<EOH; |
print <<EOH; |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> |
$HTML_DOCTYPE |
<html> |
<html> |
<head> |
<head> |
<meta name="robots" content="nofollow"> |
|
<title>$title</title> |
<title>$title</title> |
<!-- FreeBSD-cvsweb $cvsweb_revision --> |
$HTML_META</head> |
</head> |
|
$body_tag |
$body_tag |
$logo <h1 align="center">$title</h1> |
$logo <h1 align="center">$title</h1> |
EOH |
EOH |
} |
} |
|
|
sub html_footer() { |
sub html_footer() { |
return "<hr noshade><address>$address</address></body></html>\n"; |
print "<hr noshade>\n<address>$address</address>\n</body>\n</html>\n"; |
} |
} |
|
|
sub link_tags($) { |
sub link_tags($) { |