%s ',
$config_cvstree, &htmlify($@)));
}
undef $config_cvstree;
-$re_prcategories = '(?:' . join('|', @prcategories) . ')' if @prcategories;
-$re_prkeyword = quotemeta($prkeyword) if defined($prkeyword);
+$prcategories = '(?:' . join('|', @prcategories) . ')';
$prcgi .= '%s' if defined($prcgi) && $prcgi !~ /%s/;
-$fullname = "$cvsroot/$where";
+$fullname = $cvsroot . '/' . $where;
$mimetype = &getMimeTypeFromSuffix ($fullname);
$defaultTextPlain = ($mimetype eq "text/plain");
$defaultViewable = $allow_markup && viewable($mimetype);
-my $rewrite = 0;
-
-if ($pathinfo =~ m|//|) {
- $pathinfo =~ y|/|/|s;
- $rewrite = 1;
+# search for GZIP if compression allowed
+# We've to find out if the GZIP-binary exists .. otherwise
+# ge get an Internal Server Error if we try to pipe the
+# output through the nonexistent gzip ..
+# any more elegant ways to prevent this are welcome!
+if ($allow_compress && $maycompress && !$has_zlib) {
+ foreach (split(/:/, $ENV{PATH})) {
+ if (-x "$_/gzip") {
+ $GZIPBIN = "$_/gzip";
+ last;
+ }
+ }
}
-if (-d $fullname && $pathinfo !~ m|/$|) {
- $pathinfo .= '/';
- $rewrite = 1;
+if (-d $fullname) {
+ #
+ # ensure, that directories always end with (exactly) one '/'
+ # to allow relative URL's. If they're not, make a redirect.
+ ##
+ if (!($pathinfo =~ m|/$|) || ($pathinfo =~ m |/{2,}$|)) {
+ redirect ($scriptwhere . '/' . $query);
+ }
+ else {
+ $where .= '/';
+ $scriptwhere .= '/';
+ }
}
-if (!-d $fullname && $pathinfo =~ m|/$|) {
- chop $pathinfo;
- $rewrite = 1;
-}
-
-if ($rewrite) {
- redirect($scriptname . urlencode($pathinfo) . $query);
-}
-
-undef $rewrite;
-
if (!-d $cvsroot) {
&fatal("500 Internal Error",'$CVSROOT not found!
The server on which the CVS tree lives is probably down. Please try again in a few minutes.');
}
@@ -507,58 +471,10 @@ $module = $1;
if ($module && &forbidden_module($module)) {
&fatal("403 Forbidden", "Access to $where forbidden.");
}
-
-#
-# Handle tarball downloads before any headers are output.
-#
-if ($input{tarball}) {
- &fatal("403 Forbidden", "Downloading tarballs is prohibited.")
- unless $allow_tar;
- my($module) = ($where =~ m,^/?(.*),); # untaint
- $module =~ s,/[^/]*$,,;
- my($basedir) = ($module =~ m,([^/]+)$,);
-
- if ($basedir eq '' || $module eq '') {
- &fatal("500 Internal Error", "You cannot download the top level directory.");
- }
-
- my $tmpdir = "/tmp/.cvsweb.$$." . int(time);
-
- mkdir($tmpdir, 0700)
- or &fatal("500 Internal Error", "Unable to make temporary directory: $!");
-
- my $fatal = '';
-
- while (1) {
- my $tag = (exists $input{only_with_tag} && length $input{only_with_tag})
- ? $input{only_with_tag} : "HEAD";
-
- system $CMD{cvs}, @cvs_options, '-Qd', $cvsroot, 'export', '-r', $tag, '-d', "$tmpdir/$basedir", $module
- and $fatal = "500 Internal Error","cvs co failure: $!: $module"
- && last;
-
- $| = 1; # Essential to get the buffering right.
-
- print "Content-type: application/x-gzip\r\n\r\n";
-
- system "$CMD{tar} @tar_options -cf - -C $tmpdir $basedir | $CMD{gzip} @gzip_options -c"
- and $fatal = "500 Internal Error","tar zc failure: $!: $basedir"
- && last;
-
- last;
- }
-
- system $CMD{rm}, '-rf', $tmpdir if -d $tmpdir;
-
- &fatal($fatal) if $fatal;
-
- exit;
-}
-
##############################
# View a directory
###############################
-if (-d $fullname) {
+elsif (-d $fullname) {
my $dh = do {local(*DH);};
opendir($dh, $fullname) || &fatal("404 Not Found","$where: $!");
my @dir = readdir($dh);
@@ -893,27 +809,9 @@ if (-d $fullname) {
">$tag\n";
}
print "\n";
- print " Module path or alias:\n";
- printf "\n", htmlquote($where);
print "\n";
print "\n";
}
-
- if ($allow_tar) {
- my($basefile) = ($where =~ m,(?:.*/)?([^/]+),);
-
- if (defined($basefile) && $basefile ne '') {
- print "
\n",
- "
",
- &link("Download this directory in tarball",
- # Mangle the filename so browsers show a reasonable
- # filename to download.
- "$basefile.tar.gz$query".
- ($query ? "&" : "?")."tarball=1"),
- "
";
- }
- }
-
my $formwhere = $scriptwhere;
$formwhere =~ s|Attic/?$|| if ($input{'hideattic'});
@@ -997,7 +895,7 @@ if (-d $fullname) {
# The file has been removed and is in the Attic.
# Send a redirect pointing to the file in the Attic.
(my $newplace = $scriptwhere) =~ s|/([^/]+)$|/Attic/$1|;
- redirect("$newplace$query");
+ &redirect($newplace);
exit;
}
elsif (0 && (my @files = &safeglob($fullname . ",v"))) {
@@ -1011,13 +909,13 @@ if (-d $fullname) {
my $fh = do {local(*FH);};
my ($xtra, $module);
# Assume it's a module name with a potential path following it.
- $xtra = (($module = $where) =~ s|/.*||) ? $& : '';
+ $xtra = $& if (($module = $where) =~ s|/.*||);
# Is there an indexed version of modules?
- if (open($fh, "< $cvsroot/CVSROOT/modules")) {
+ if (open($fh, "$cvsroot/CVSROOT/modules")) {
while (<$fh>) {
if (/^(\S+)\s+(\S+)/o && $module eq $1
- && -d "$cvsroot/$2" && $module ne $2) {
- redirect("$scriptname/$2$xtra$query");
+ && -d "${cvsroot}/$2" && $module ne $2) {
+ &redirect($scriptname . '/' . $2 . $xtra);
}
}
}
@@ -1138,7 +1036,7 @@ sub htmlify($;$) {
if ($extra) {
# get PR #'s as link: "PR#nnnn" "PR: nnnn, ..." "PR nnnn, ..." "bin/nnnn"
- if (defined($prcgi) && defined($re_prcategories) && defined($re_prkeyword)) {
+ if (defined($prcgi)) {
my $prev;
do {
@@ -1146,7 +1044,7 @@ sub htmlify($;$) {
$_ = htmlify_sub {
s{
- (\b$re_prkeyword[:\#]?\s*
+ (\bPR[:\#]?\s*
(?:
\#?
\d+[,\s]\s*
@@ -1154,16 +1052,16 @@ sub htmlify($;$) {
\#?)
(\d+)\b
}{
- $1 . &link($2, sprintf($prcgi, $2))
+ $1 . &link($2, sprintf($prcgi, $2)) . $3
}egix;
} $_;
} while ($_ ne $prev);
$_ = htmlify_sub {
s{
- (\b$re_prcategories/(\d+)\b)
+ (\b$prcategories/(\d+)\b)
}{
- &link($1, sprintf($prcgi, $2))
+ &link($1, sprintf($prcgi, $2)) . $3
}egox;
} $_;
}
@@ -1172,7 +1070,7 @@ sub htmlify($;$) {
if (defined($mancgi)) {
$_ = htmlify_sub {
s{
- (\b([a-zA-Z][\w.]+)
+ (\b([a-zA-Z][\w_.]+)
(?:
\( ([0-9n]) \)\B
|
@@ -1180,7 +1078,7 @@ sub htmlify($;$) {
)
)
}{
- &link($1, sprintf($mancgi, defined($3) ? $3 : $4, $2))
+ &link($1, sprintf($mancgi, $3 ne '' ? $3 : $4, $2)) . $5
}egx;
} $_;
}
@@ -1220,9 +1118,9 @@ sub spacedHtmlText($;$) {
}
sub link($$) {
- my($name, $url) = @_;
+ my($name, $where) = @_;
- sprintf '%s', hrefquote($url), $name;
+ sprintf '%s', htmlquote($where), $name;
}
sub revcmp($$) {
@@ -1304,17 +1202,6 @@ sub safeglob($) {
@results;
}
-sub search_path($) {
- my($command) = @_;
- my $d;
-
- for $d (split(/:/, $command_path)) {
- return "$d/$command" if -x "$d/$command";
- }
-
- $command;
-}
-
sub getMimeTypeFromSuffix($) {
my ($fullname) = @_;
my ($mimetype, $suffix);
@@ -1388,7 +1275,7 @@ sub doAnnotate($$) {
my $reader = do {local(*FH);};
my $writer = do {local(*FH);};
- # make sure the revisions are wellformed, for security
+ # make sure the revisions a wellformed, for security
# reasons ..
if ($rev =~ /[^\w.]/) {
&fatal("404 Not Found",
@@ -1407,8 +1294,8 @@ sub doAnnotate($$) {
# the public domain.
# we could abandon the use of rlog, rcsdiff and co using
# the cvsserver in a similiar way one day (..after rewrite)
- $pid = open2($reader, $writer, "cvs", @cvs_options, "server")
- || fatal ("500 Internal Error", "Fatal Error - unable to open cvs for annotation");
+ $pid = open2($reader, $writer, "cvs -Rl server") || fatal ("500 Internal Error",
+ "Fatal Error - unable to open cvs for annotation");
# OK, first send the request to the server. A simplified example is:
# Root /home/kingdon/zwork/cvsroot
@@ -1599,14 +1486,9 @@ sub doCheckout($$) {
#
# Safely for a child process to read from.
if (! open($fh, "-|")) { # child
- open(STDERR, ">&STDOUT"); # Redirect stderr to stdout
- exec($CMD{cvs}, @cvs_options, '-d', $cvsroot, 'co', '-p', $revopt, $where);
+ open(STDERR, ">&STDOUT"); # Redirect stderr to stdout
+ exec("cvs", "-Rld", $cvsroot, "co", "-p", $revopt, $where);
}
-
- if (eof($fh)) {
- &fatal("404 Not Found",
- "$where is not (any longer) pertinent");
- }
#===================================================================
#Checking out squid/src/ftp.c
#RCS: /usr/src/CVS/squid/src/ftp.c,v
@@ -1626,7 +1508,12 @@ sub doCheckout($$) {
}
if ($filename ne $where) {
&fatal("500 Internal Error",
- "Unexpected output from cvs co: $cvsheader");
+ "Unexpected output from cvs co: $cvsheader"
+ . "
Check whether the directory $cvsroot/CVSROOT exists "
+ . "and the script has write-access to the CVSROOT/history "
+ . "file if it exists."
+ . " The script needs to place lock files in the "
+ . "directory the file is in as well.");
}
$| = 1;
@@ -1677,12 +1564,12 @@ sub cvswebMarkup($$$) {
my $url = download_url($fileurl, $revision, $mimetype);
print "