version 4.36, 2019/11/29 18:33:24 |
version 4.38, 2019/11/29 19:30:16 |
|
|
$VERSION $CheckoutMagic $MimeTypes $DEBUG |
$VERSION $CheckoutMagic $MimeTypes $DEBUG |
$config $allow_version_select |
$config $allow_version_select |
@CVSrepositories @CVSROOT %CVSROOT %CVSROOTdescr %DEFAULTVALUE %MTYPES |
@CVSrepositories @CVSROOT %CVSROOT %CVSROOTdescr %DEFAULTVALUE %MTYPES |
%DIFF_COMMANDS @DIFFTYPES %DIFFTYPES @LOGSORTKEYS %LOGSORTKEYS |
@DIFFTYPES %DIFFTYPES @LOGSORTKEYS %LOGSORTKEYS |
%alltags %fileinfo %tags @branchnames %nameprinted |
%alltags %fileinfo %tags @branchnames %nameprinted |
%symrev %revsym @allrevisions %date %author @revdisplayorder |
%symrev %revsym @allrevisions %date %author @revdisplayorder |
@revisions %state %difflines %log %branchpoint @revorder $keywordsubstitution |
@revisions %state %difflines %log %branchpoint @revorder $keywordsubstitution |
|
|
$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 |
$bylog $byfile $defaultDiffType $logsort $cvstree $cvsroot |
$bylog $byfile $defaultDiffType $logsort $cvstree $cvsroot |
$charset $output_filter %CMD $allow_compress $backicon $diricon $fileicon |
%CMD $allow_compress $backicon $diricon $fileicon |
$fullname $logo $defaulttitle $address $binfileicon $iconsdir |
$fullname $logo $defaulttitle $address $binfileicon $iconsdir |
$shortLogLen $show_author $hr_breakable $hr_ignwhite $hr_ignkeysubst |
$shortLogLen $show_author $hr_breakable $hr_ignwhite $hr_ignkeysubst |
$mime_types $allow_annotate $allow_markup $allow_mailtos |
$mime_types $allow_annotate $allow_markup $allow_mailtos |
Line 86 use Cwd qw(abs_path); |
|
Line 86 use Cwd qw(abs_path); |
|
use File::Path qw(rmtree); |
use File::Path qw(rmtree); |
use File::Spec::Functions qw(canonpath catdir catfile curdir devnull rootdir |
use File::Spec::Functions qw(canonpath catdir catfile curdir devnull rootdir |
tmpdir updir); |
tmpdir updir); |
use File::Temp qw(tempdir tempfile); |
use File::Temp qw(tempdir); |
use IPC::Run qw(); |
use IPC::Run qw(); |
use Time::Local qw(timegm); |
use Time::Local qw(timegm); |
use URI::Escape qw(uri_escape uri_unescape); |
use URI::Escape qw(uri_escape uri_unescape); |
Line 149 sub search_path($); |
|
Line 149 sub search_path($); |
|
sub getMimeType($;$); |
sub getMimeType($;$); |
sub head($;$); |
sub head($;$); |
sub scan_directives(@); |
sub scan_directives(@); |
sub openOutputFilter(); |
|
sub doAnnotate($$); |
sub doAnnotate($$); |
sub doCheckout($$$); |
sub doCheckout($$$); |
sub cvswebMarkup($$$$$$;$); |
sub cvswebMarkup($$$$$$;$); |
Line 182 sub link_tags($); |
|
Line 181 sub link_tags($); |
|
sub forbidden($); |
sub forbidden($); |
sub startproc(@); |
sub startproc(@); |
sub runproc(@); |
sub runproc(@); |
sub checkout_to_temp($$$); |
|
|
|
# Get rid of unsafe environment vars. Don't do this in the BEGIN block |
# Get rid of unsafe environment vars. Don't do this in the BEGIN block |
# (think mod_perl)... |
# (think mod_perl)... |
Line 198 $config = '/conf/cvsweb/cvsweb.conf'; |
|
Line 196 $config = '/conf/cvsweb/cvsweb.conf'; |
|
######## Configuration parameters ######### |
######## Configuration parameters ######### |
|
|
@CVSrepositories = @CVSROOT = %CVSROOT = %DEFAULTVALUE = |
@CVSrepositories = @CVSROOT = %CVSROOT = %DEFAULTVALUE = |
%MTYPES = %tags = %alltags = %fileinfo = %DIFF_COMMANDS = (); |
%MTYPES = %tags = %alltags = %fileinfo = (); |
|
|
$logo = $defaulttitle = |
$logo = $defaulttitle = |
$address = $shortLogLen = $show_author = |
$address = $shortLogLen = $show_author = |
Line 1631 sub scan_directives(@) |
|
Line 1629 sub scan_directives(@) |
|
} |
} |
|
|
|
|
sub openOutputFilter() |
|
{ |
|
return unless $output_filter; |
|
|
|
open(STDOUT, "|-") and return; |
|
|
|
# child of child |
|
open(STDERR, '>', devnull()) unless $DEBUG; |
|
exec($output_filter) or exit -1; |
|
} |
|
|
|
|
|
############################### |
############################### |
# show Annotation |
# show Annotation |
############################### |
############################### |
Line 2062 sub doDiff($$$$$$) |
|
Line 2048 sub doDiff($$$$$$) |
|
|
|
my $mimetype = getMimeType($fullname); |
my $mimetype = getMimeType($fullname); |
|
|
# |
|
# Check for per-MIME type diff commands. |
|
# |
|
my $diffcmd = undef; |
|
if (my $diffcmds = $DIFF_COMMANDS{lc($mimetype)}) { |
|
if ($f =~ /^ext(\d*)$/) { |
|
my $n = $1 || 0; |
|
$diffcmd = $diffcmds->[$n]; |
|
} |
|
} |
|
if ($diffcmd && $diffcmd->{cmd} && $diffcmd->{name}) { |
|
|
|
if ($diffcmd->{args} && ref($diffcmd->{args}) ne 'ARRAY') { |
|
fatal('500 Internal Error', |
|
'Configuration error: arguments to external diff tools must ' . |
|
'be given as array refs. See "<code>%s</code>" in ' . |
|
'<code>%%DIFF_COMMANDS</code>.', |
|
$diffcmd->{name}); |
|
} |
|
|
|
(my $cvsname = $where) =~ s/\.diff$//; |
|
|
|
# Create two temporary files with the two revisions |
|
my $temp_fn1 = checkout_to_temp($cvsroot, $cvsname, $rev1); |
|
my $temp_fn2 = checkout_to_temp($cvsroot, $cvsname, $rev2); |
|
|
|
# Execute chosen diff binary. |
|
local (*DIFF_OUT); |
|
my @cmd = ($diffcmd->{cmd}); |
|
push(@cmd, @{$diffcmd->{args}}) if $diffcmd->{args}; |
|
push(@cmd, $temp_fn1, $temp_fn2); |
|
my ($h, $err) = startproc(\@cmd, \"", '>pipe', \*DIFF_OUT); |
|
if (!$h) { |
|
unlink($temp_fn1); |
|
unlink($temp_fn2); |
|
fatal('500 Internal Error', |
|
'Diff failure (exit status %s), output: <pre>%s</pre>', |
|
$? >> 8 || -1, $err); |
|
} |
|
|
|
http_header($diffcmd->{type} || 'text/plain'); |
|
local $/ = undef; |
|
print <DIFF_OUT>; |
|
$h->finish(); |
|
unlink($temp_fn1); |
|
unlink($temp_fn2); |
|
|
|
exit; |
|
} |
|
|
|
# |
|
# Normal CVS diff. |
|
# |
|
|
|
$f = $DEFAULTVALUE{f} || 'u' if ($f =~ /^ext\d*$/); |
$f = $DEFAULTVALUE{f} || 'u' if ($f =~ /^ext\d*$/); |
my $difftype = $DIFFTYPES{$f}; |
my $difftype = $DIFFTYPES{$f}; |
if (!$difftype) { |
if (!$difftype) { |
Line 2136 sub doDiff($$$$$$) |
|
Line 2068 sub doDiff($$$$$$) |
|
my $fh = do { local (*FH); }; |
my $fh = do { local (*FH); }; |
if (!open($fh, "-|")) { # child |
if (!open($fh, "-|")) { # child |
open(STDERR, ">&STDOUT"); # Redirect stderr to stdout |
open(STDERR, ">&STDOUT"); # Redirect stderr to stdout |
openOutputFilter(); |
|
exec($CMD{rcsdiff}, @rcsdiff_options, @difftype, "-r$rev1", "-r$rev2", |
exec($CMD{rcsdiff}, @rcsdiff_options, @difftype, "-r$rev1", "-r$rev2", |
$fullname) or exit -1; |
$fullname) or exit -1; |
} |
} |
Line 2243 sub getDirLogs($$@) |
|
Line 2174 sub getDirLogs($$@) |
|
my $fh = do { local (*FH); }; |
my $fh = do { local (*FH); }; |
if (!open($fh, '-|')) { # Child |
if (!open($fh, '-|')) { # Child |
open(STDERR, '>', devnull()) unless $DEBUG; # Ignore rlog's complaints. |
open(STDERR, '>', devnull()) unless $DEBUG; # Ignore rlog's complaints. |
openOutputFilter(); |
|
if ($file_list_len && $file_list_len > 1) { |
if ($file_list_len && $file_list_len > 1) { |
while (scalar(@files) > $file_list_len) { # Process files in chunks. |
while (scalar(@files) > $file_list_len) { # Process files in chunks. |
system(@cmd, splice(@files, 0, $file_list_len)) == 0 or exit -1; |
system(@cmd, splice(@files, 0, $file_list_len)) == 0 or exit -1; |
Line 2421 sub readLog($;$) |
|
Line 2351 sub readLog($;$) |
|
|
|
my $fh = do { local (*FH); }; |
my $fh = do { local (*FH); }; |
if (!open($fh, "-|")) { # child |
if (!open($fh, "-|")) { # child |
openOutputFilter(); |
|
$revision = defined($revision) ? "-r$revision" : ''; |
$revision = defined($revision) ? "-r$revision" : ''; |
if ($revision =~ /\./) { |
if ($revision =~ /\./) { |
# Normal revision, not a branch/tag name. |
# Normal revision, not a branch/tag name. |
Line 2647 sub getDiffLinks($$$) |
|
Line 2576 sub getDiffLinks($$$) |
|
&link(htmlquote(lc($DIFFTYPES{$difftype}{descr})), "$url;f=$f")); |
&link(htmlquote(lc($DIFFTYPES{$difftype}{descr})), "$url;f=$f")); |
} |
} |
} |
} |
if (my $extdiffs = $DIFF_COMMANDS{lc($mimetype)}) { |
|
for my $i (0 .. scalar(@$extdiffs)-1) { |
|
my $extdiff = $extdiffs->[$i]; |
|
push(@links, &link(htmlquote($extdiff->{name}), "$url;f=ext$i")) |
|
if ($extdiff->{cmd} && $extdiff->{name}); |
|
} |
|
} |
|
return @links; |
return @links; |
} |
} |
|
|
Line 3641 sub http_header(;$$) |
|
Line 3563 sub http_header(;$$) |
|
{ |
{ |
my ($content_type, $moddate) = @_; |
my ($content_type, $moddate) = @_; |
$content_type ||= 'text/html'; |
$content_type ||= 'text/html'; |
|
$content_type .= '; charset="UTF-8"' if $content_type =~ /^text\//; |
|
|
$content_type .= "; charset=$charset" |
|
if ($charset && $content_type =~ m,^text/,); |
|
|
|
# Note that in the following, we explicitly join() and concatenate the |
# Note that in the following, we explicitly join() and concatenate the |
# headers instead of printing them as an array. This is because some |
# headers instead of printing them as an array. This is because some |
# systems, eg. early versions of mod_perl 2 don't quite get it if the |
# systems, eg. early versions of mod_perl 2 don't quite get it if the |
|
|
$errormsg = "'@{$_[0]}' failed: $@"; |
$errormsg = "'@{$_[0]}' failed: $@"; |
} |
} |
return ($exitcode, $errormsg); |
return ($exitcode, $errormsg); |
} |
|
|
|
# |
|
# Check out a file to a temporary file. |
|
# |
|
sub checkout_to_temp($$$) |
|
{ |
|
my ($cvsroot, $cvsname, $rev) = @_; |
|
|
|
# Pipe given cvs file into a temporary place. |
|
my ($temp_fh, $temp_fn) = tempfile('.cvsweb.XXXXXXXX', DIR => tmpdir()); |
|
|
|
my @cmd = ($CMD{cvs}, @cvs_options, '-Qd', $cvsroot, |
|
'co', '-p', "-r$rev", $cvsname); |
|
|
|
local (*DIFF_OUT); |
|
my ($h, $err) = startproc(\@cmd, \"", '>pipe', \*DIFF_OUT); |
|
if ($h) { |
|
local $/ = undef; |
|
print $temp_fh <DIFF_OUT>; |
|
$h->finish(); |
|
close($temp_fh); |
|
} else { |
|
close($temp_fh); |
|
unlink($temp_fn); |
|
fatal('500 Internal Error', |
|
'Checkout failure (exit status %s), output: <pre>%s</pre>', |
|
$? >> 8 || -1, $err); |
|
} |
|
|
|
return $temp_fn; |
|
} |
} |
|
|
# |
# |