version 3.28, 2000/09/30 18:27:16 |
version 3.35, 2000/10/10 21:14:05 |
|
|
$checkoutMagic $doCheckout $scriptname $scriptwhere |
$checkoutMagic $doCheckout $scriptname $scriptwhere |
$where $pathinfo $Browser $nofilelinks $maycompress @stickyvars |
$where $pathinfo $Browser $nofilelinks $maycompress @stickyvars |
%funcline_regexp $is_mod_perl |
%funcline_regexp $is_mod_perl |
$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 $hr_default $logsort $cvstree $cvsroot |
$bylog $byfile $hr_default $logsort $cvstree $cvsroot |
$mimetype $defaultTextPlain $defaultViewable $allow_compress |
$mimetype $defaultTextPlain $defaultViewable $allow_compress |
|
|
$difffontsize $inputTextSize $mime_types $allow_annotate |
$difffontsize $inputTextSize $mime_types $allow_annotate |
$allow_markup $use_java_script $open_extern_window |
$allow_markup $use_java_script $open_extern_window |
$extern_window_width $extern_window_height $edit_option_form |
$extern_window_width $extern_window_height $edit_option_form |
$checkout_magic $show_subdir_lastmod $show_log_in_markup $v |
$show_subdir_lastmod $show_log_in_markup $v |
$navigationHeaderColor $tableBorderColor $markupLogColor |
$navigationHeaderColor $tableBorderColor $markupLogColor |
$tabstop $state $annTable $sel $curbranch @HideModules |
$tabstop $state $annTable $sel $curbranch @HideModules |
$module $use_descriptions %descriptions @mytz $dwhere $moddate |
$module $use_descriptions %descriptions @mytz $dwhere $moddate |
$use_moddate $has_zlib $gzip_open |
$use_moddate $has_zlib $gzip_open |
|
$LOG_FILESEPARATOR $LOG_REVSEPARATOR |
); |
); |
|
|
sub printDiffSelect($); |
sub printDiffSelect($); |
Line 115 sub download_url($$;$); |
|
Line 116 sub download_url($$;$); |
|
sub download_link($$$;$); |
sub download_link($$$;$); |
sub toggleQuery($$); |
sub toggleQuery($$); |
sub urlencode($); |
sub urlencode($); |
|
sub htmlquote($); |
sub http_header(;$); |
sub http_header(;$); |
sub html_header($); |
sub html_header($); |
sub html_footer(); |
sub html_footer(); |
Line 155 $diffcolorChange = $diffcolorAdd = $diffcolorDarkChang |
|
Line 157 $diffcolorChange = $diffcolorAdd = $diffcolorDarkChang |
|
$difffontsize = $inputTextSize = $mime_types = $allow_annotate = |
$difffontsize = $inputTextSize = $mime_types = $allow_annotate = |
$allow_markup = $use_java_script = $open_extern_window = |
$allow_markup = $use_java_script = $open_extern_window = |
$extern_window_width = $extern_window_height = $edit_option_form = |
$extern_window_width = $extern_window_height = $edit_option_form = |
$checkout_magic = $show_subdir_lastmod = $show_log_in_markup = $v = |
$show_subdir_lastmod = $show_log_in_markup = $v = |
$navigationHeaderColor = $tableBorderColor = $markupLogColor = |
$navigationHeaderColor = $tableBorderColor = $markupLogColor = |
$tabstop = $use_moddate = $moddate = $gzip_open = undef; |
$tabstop = $use_moddate = $moddate = $gzip_open = undef; |
|
|
|
$LOG_FILESEPARATOR = q/^={77}$/; |
|
$LOG_REVSEPARATOR = q/^-{28}$/; |
|
|
##### End of configuration variables ##### |
##### End of configuration variables ##### |
|
|
use Time::Local; |
use Time::Local; |
Line 192 $is_mod_perl = defined($ENV{MOD_PERL}); |
|
Line 197 $is_mod_perl = defined($ENV{MOD_PERL}); |
|
# per file, so disable the link at the icon |
# per file, so disable the link at the icon |
# in this case: |
# in this case: |
$Browser = $ENV{HTTP_USER_AGENT}; |
$Browser = $ENV{HTTP_USER_AGENT}; |
|
$is_links = ($Browser =~ m`^Links `); |
$is_lynx = ($Browser =~ m`^Lynx/`i); |
$is_lynx = ($Browser =~ m`^Lynx/`i); |
$is_w3m = ($Browser =~ m`^w3m/`i); |
$is_w3m = ($Browser =~ m`^w3m/`i); |
$is_msie = ($Browser =~ m`MSIE`); |
$is_msie = ($Browser =~ m`MSIE`); |
$is_mozilla3 = ($Browser =~ m`^Mozilla/[3-9]`); |
$is_mozilla3 = ($Browser =~ m`^Mozilla/[3-9]`); |
|
|
$is_textbased = ($is_lynx || $is_w3m); |
$is_textbased = ($is_links || $is_lynx || $is_w3m); |
|
|
$nofilelinks = $is_textbased; |
$nofilelinks = $is_textbased; |
|
|
Line 279 foreach (keys %DEFAULTVALUE) |
|
Line 285 foreach (keys %DEFAULTVALUE) |
|
} |
} |
|
|
$barequery = ""; |
$barequery = ""; |
|
my @barequery; |
foreach (@stickyvars) { |
foreach (@stickyvars) { |
# construct a query string with the sticky non default parameters set |
# construct a query string with the sticky non default parameters set |
if (defined($input{$_}) && $input{$_} ne '' && |
if (defined($input{$_}) && $input{$_} ne '' && |
!(defined($DEFAULTVALUE{$_}) && $input{$_} eq $DEFAULTVALUE{$_})) { |
!(defined($DEFAULTVALUE{$_}) && $input{$_} eq $DEFAULTVALUE{$_})) { |
if ($barequery) { |
push @barequery, join('=', urlencode($_), urlencode($input{$_})); |
$barequery = $barequery . "&"; |
|
} |
|
my $thisval = urlencode($_) . "=" . urlencode($input{$_}); |
|
$barequery .= $thisval; |
|
} |
} |
} |
} |
# is there any query ? |
# is there any query ? |
if ($barequery) { |
if (@barequery) { |
|
$barequery = join('&', @barequery); |
$query = "?$barequery"; |
$query = "?$barequery"; |
$barequery = "&" . $barequery; |
$barequery = "&$barequery"; |
} |
} |
else { |
else { |
$query = ""; |
$query = ""; |
} |
} |
|
undef @barequery; |
|
|
# get actual parameters |
# get actual parameters |
$sortby = $input{"sortby"}; |
$sortby = $input{"sortby"}; |
Line 345 if ($input{'cvsroot'} && $CVSROOT{$input{'cvsroot'}}) |
|
Line 350 if ($input{'cvsroot'} && $CVSROOT{$input{'cvsroot'}}) |
|
$cvsroot = $CVSROOT{$cvstree}; |
$cvsroot = $CVSROOT{$cvstree}; |
|
|
# create icons out of description |
# create icons out of description |
foreach my $k (keys %ICONS) { |
my $k; |
|
foreach $k (keys %ICONS) { |
no strict 'refs'; |
no strict 'refs'; |
my ($itxt,$ipath,$iwidth,$iheight) = @{$ICONS{$k}}; |
my ($itxt,$ipath,$iwidth,$iheight) = @{$ICONS{$k}}; |
if ($ipath) { |
if ($ipath) { |
${"${k}icon"} = "<IMG SRC=\"$ipath\" ALT=\"$itxt\" BORDER=\"0\" WIDTH=\"$iwidth\" HEIGHT=\"$iheight\">"; |
${"${k}icon"} = sprintf('<IMG SRC="%s" ALT="%s" BORDER="0" WIDTH="%d" HEIGHT="%d">', |
|
htmlquote($ipath), htmlquote($itxt), $iwidth, $iheight) |
} |
} |
else { |
else { |
${"${k}icon"} = $itxt; |
${"${k}icon"} = $itxt; |
} |
} |
} |
} |
|
undef $k; |
|
|
my $config_cvstree = "$config-$cvstree"; |
my $config_cvstree = "$config-$cvstree"; |
|
|
Line 365 if (-f $config_cvstree) { |
|
Line 373 if (-f $config_cvstree) { |
|
sprintf('Error in loading configuration file: %s<BR><BR>%s<BR>', |
sprintf('Error in loading configuration file: %s<BR><BR>%s<BR>', |
$config_cvstree, &htmlify($@))); |
$config_cvstree, &htmlify($@))); |
} |
} |
|
undef $config_cvstree; |
|
|
$prcategories = '(?:' . join('|', @prcategories) . ')'; |
$prcategories = '(?:' . join('|', @prcategories) . ')'; |
$prcgi .= '%s' if defined($prcgi) && $prcgi !~ /%s/; |
$prcgi .= '%s' if defined($prcgi) && $prcgi !~ /%s/; |
Line 476 elsif (-d $fullname) { |
|
Line 485 elsif (-d $fullname) { |
|
print "<tr><th align=left bgcolor=\"" . (($byfile) ? |
print "<tr><th align=left bgcolor=\"" . (($byfile) ? |
$columnHeaderColorSorted : |
$columnHeaderColorSorted : |
$columnHeaderColorDefault) . "\">"; |
$columnHeaderColorDefault) . "\">"; |
print "<a href=\"./" . &toggleQuery("sortby","file") . |
if ($byfile) { |
"#dirlist\">" if (!$byfile); |
print 'File'; |
print "File"; |
} else { |
print "</a>" if (!$byfile); |
print &link('File', sprintf('./%s#dirlist', |
|
&toggleQuery("sortby", "file"))); |
|
} |
print "</th>"; |
print "</th>"; |
# 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: |
Line 488 elsif (-d $fullname) { |
|
Line 499 elsif (-d $fullname) { |
|
print "<th align=left bgcolor=\"" . (($byrev) ? |
print "<th align=left bgcolor=\"" . (($byrev) ? |
$columnHeaderColorSorted : |
$columnHeaderColorSorted : |
$columnHeaderColorDefault) . "\">"; |
$columnHeaderColorDefault) . "\">"; |
print "<a href=\"./" . &toggleQuery ("sortby","rev") . |
if ($byrev) { |
"#dirlist\">" if (!$byrev); |
print 'Rev.'; |
print "Rev."; |
} else { |
print "</a>" if (!$byrev); |
print &link('Rev.', sprintf('./%s#dirlist', |
|
&toggleQuery("sortby", "rev"))); |
|
} |
print "</th>"; |
print "</th>"; |
$infocols++; |
$infocols++; |
print "<th align=left bgcolor=\"" . (($bydate) ? |
print "<th align=left bgcolor=\"" . (($bydate) ? |
$columnHeaderColorSorted : |
$columnHeaderColorSorted : |
$columnHeaderColorDefault) . "\">"; |
$columnHeaderColorDefault) . "\">"; |
print "<a href=\"./" . &toggleQuery ("sortby","date") . |
if ($bydate) { |
"#dirlist\">" if (!$bydate); |
print 'Age'; |
print "Age"; |
} else { |
print "</a>" if (!$bydate); |
print &link('Age', sprintf('./%s#dirlist', |
|
&toggleQuery("sortby", "date"))); |
|
} |
print "</th>"; |
print "</th>"; |
if ($show_author) { |
if ($show_author) { |
$infocols++; |
$infocols++; |
print "<th align=left bgcolor=\"" . (($byauthor) ? |
print "<th align=left bgcolor=\"" . (($byauthor) ? |
$columnHeaderColorSorted : |
$columnHeaderColorSorted : |
$columnHeaderColorDefault) . "\">"; |
$columnHeaderColorDefault) . "\">"; |
print "<a href=\"./" . &toggleQuery ("sortby","author") . |
if ($byauthor) { |
"#dirlist\">" if (!$byauthor); |
print 'Author'; |
print "Author"; |
} else { |
print "</a>" if (!$byauthor); |
print &link('Author', sprintf('./%s#dirlist', |
|
&toggleQuery("sortby", "author"))); |
|
} |
print "</th>"; |
print "</th>"; |
} |
} |
$infocols++; |
$infocols++; |
print "<th align=left bgcolor=\"" . (($bylog) ? |
print "<th align=left bgcolor=\"" . (($bylog) ? |
$columnHeaderColorSorted : |
$columnHeaderColorSorted : |
$columnHeaderColorDefault) . "\">"; |
$columnHeaderColorDefault) . "\">"; |
print "<a href=\"./", toggleQuery("sortby","log"), "#dirlist\">" if (!$bylog); |
if ($bylog) { |
print "Last log entry"; |
print 'Last log entry'; |
print "</a>" if (!$bylog); |
} else { |
|
print &link('Last log entry', sprintf('./%s#dirlist', |
|
&toggleQuery("sortby", "log"))); |
|
} |
print "</th>"; |
print "</th>"; |
} |
} |
elsif ($use_descriptions) { |
elsif ($use_descriptions) { |
Line 548 elsif (-d $fullname) { |
|
Line 568 elsif (-d $fullname) { |
|
closedir($dh); |
closedir($dh); |
} |
} |
|
|
my $hideAtticToggleLink = "<a href=\"./" . |
my $hideAtticToggleLink = $input{'hideattic'} ? '' : |
&toggleQuery ("hideattic") . |
&link('[Hide]', sprintf('./%s#dirlist', |
"#dirlist\">[Hide]</a>" if (!$input{'hideattic'}); |
&toggleQuery ("hideattic"))); |
|
|
# Sort without the Attic/ pathname. |
# Sort without the Attic/ pathname. |
# place directories first |
# place directories first |
Line 595 elsif (-d $fullname) { |
|
Line 615 elsif (-d $fullname) { |
|
print $backicon; |
print $backicon; |
} |
} |
else { |
else { |
print &link($backicon,$url); |
print &link($backicon, $url); |
} |
} |
print " ", &link("Previous Directory",$url); |
print " ", &link("Previous Directory", $url); |
} |
} |
else { |
else { |
$url = urlencode($_) . '/' . $query; |
$url = urlencode($_) . '/' . $query; |
Line 606 elsif (-d $fullname) { |
|
Line 626 elsif (-d $fullname) { |
|
print $diricon; |
print $diricon; |
} |
} |
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 " <a href=\"./" . |
print " "; |
&toggleQuery ("hideattic") . |
print &link("[Don't hide]", sprintf('./%s#dirlist', |
"#dirlist\">[Don't hide]</a>"; |
&toggleQuery ("hideattic"))); |
} |
} |
} |
} |
# Show last change in dir |
# Show last change in dir |
Line 683 elsif (-d $fullname) { |
|
Line 703 elsif (-d $fullname) { |
|
print " ", &link($_, $url), $attic; |
print " ", &link($_, $url), $attic; |
print "</td><td> " if ($dirtable); |
print "</td><td> " if ($dirtable); |
download_link($fileurl, |
download_link($fileurl, |
$rev, $rev, |
$rev, $rev, |
$defaultViewable ? "text/x-cvsweb-markup" : undef); |
$defaultViewable ? "text/x-cvsweb-markup" : undef); |
print "</td><td> " if ($dirtable); |
print "</td><td> " if ($dirtable); |
if ($date) { |
if ($date) { |
print " <i>" . readableTime(time() - $date,0) . "</i>"; |
print " <i>" . readableTime(time() - $date,0) . "</i>"; |
Line 914 sub findLastModifiedSubdirs(@) { |
|
Line 934 sub findLastModifiedSubdirs(@) { |
|
} |
} |
|
|
sub htmlify($;$) { |
sub htmlify($;$) { |
my($string, $extra) = @_; |
(local $_, my $extra) = @_; |
|
|
# Special Characters; RFC 1866 |
$_ = htmlquote($_); |
$string =~ s/&/&/g; |
|
$string =~ s/\"/"/g; |
|
$string =~ s/</</g; |
|
$string =~ s/>/>/g; |
|
|
|
# get URL's as link .. |
# get URL's as link |
$string =~ s`(http|ftp|https)(://[-a-zA-Z0-9%.~:_/]+)([?&]([-a-zA-Z0-9%.~:_]+)=([-a-zA-Z0-9%.~:_])+)*`<A HREF="$1$2$3">$1$2$3</A>`g; # ` |
s`(http|ftp|https)(://[-a-zA-Z0-9%.~:_/]+)([?&]([-a-zA-Z0-9%.~:_]+)=([-a-zA-Z0-9%.~:_])+)*`&link("$1$2$3", "$1$2$3")`ge; # ` |
# get e-mails as link |
# get e-mails as link |
$string =~ s`([-a-zA-Z0-9_.]+@([-a-zA-Z0-9]+\.)+[A-Za-z]{2,4})`<A HREF="mailto:$1">$1</A>`g; # ` |
s`[-a-zA-Z0-9_.]+@([-a-zA-Z0-9]+\.)+[A-Za-z]{2,4}`&link($&, "mailto:$&")`ge; # ` |
|
|
if ($extra) { |
if ($extra) { |
# get PR #'s as link .. |
# get PR #'s as link: "PR#nnnn" "PR: nnnn, ..." "PR nnnn, ..." "bin/nnnn" |
if (defined($prcgi)) { |
if (defined($prcgi)) { |
1 while $string =~ s`\b(pr[:#]?\s*(?:#?\d+[,\s]\s*)*#?)(\d+)\b`$1 . &link($2, sprintf($prcgi, $2))`ie; # ` |
1 while s`\b(pr[:#]?\s*(?:#?\d+[,\s]\s*)*#?)(\d+)\b`$1 . &link($2, sprintf($prcgi, $2))`ie; # `; |
$string =~ s`\b${prcategories}/(\d+)\b`&link($&, sprintf($prcgi, $1))`igeo; # ` |
s`\b${prcategories}/(\d+)\b`&link($&, sprintf($prcgi, $1))`igeo; # `; |
} |
} |
|
|
# get manpage specs as link .. |
# get manpage specs as link: "foo.1" "foo(1)" |
if (defined($mancgi)) { |
if (defined($mancgi)) { |
$string =~ s`\b([a-zA-Z]\w+)\(([0-9n])\)\B`&link($&, sprintf($mancgi, $2, $1))`ge; # ` |
s`\b([a-zA-Z]\w+)(?:\(([0-9n])\)\B|\.([0-9n])\b)`&link($&, sprintf($mancgi, $2 ne '' ? $2 : $3, $1))`ge; # `x; |
} |
} |
} |
} |
|
|
return $string; |
$_; |
} |
} |
|
|
sub spacedHtmlText($;$) { |
sub spacedHtmlText($;$) { |
Line 976 sub spacedHtmlText($;$) { |
|
Line 992 sub spacedHtmlText($;$) { |
|
sub link($$) { |
sub link($$) { |
my($name, $where) = @_; |
my($name, $where) = @_; |
|
|
return "<A HREF=\"$where\">$name</A>\n"; |
sprintf '<A HREF="%s">%s</A>', htmlquote($where), $name; |
} |
} |
|
|
sub revcmp($$) { |
sub revcmp($$) { |
Line 1024 sub redirect($) { |
|
Line 1040 sub redirect($) { |
|
print "Location: $url\r\n"; |
print "Location: $url\r\n"; |
} |
} |
html_header("Moved"); |
html_header("Moved"); |
print "This document is located <A HREF=$url>here</A>.\n"; |
print "This document is located ", &link('here', $url), "\n"; |
print &html_footer; |
print &html_footer; |
exit(1); |
exit(1); |
} |
} |
Line 1141 sub doAnnotate($$) { |
|
Line 1157 sub doAnnotate($$) { |
|
($pathname = $where) =~ s/(Attic\/)?[^\/]*$//; |
($pathname = $where) =~ s/(Attic\/)?[^\/]*$//; |
($filename = $where) =~ s/^.*\///; |
($filename = $where) =~ s/^.*\///; |
|
|
http_header(); |
|
|
|
navigateHeader($scriptwhere,$pathname,$filename,$rev, "annotate"); |
|
print "<h3 align=center>Annotation of $pathname$filename, Revision $rev</h3>\n"; |
|
|
|
# this seems to be necessary |
# this seems to be necessary |
$| = 1; $| = 0; # Flush |
$| = 1; $| = 0; # Flush |
|
|
Line 1155 sub doAnnotate($$) { |
|
Line 1166 sub doAnnotate($$) { |
|
# the public domain. |
# the public domain. |
# we could abandon the use of rlog, rcsdiff and co using |
# we could abandon the use of rlog, rcsdiff and co using |
# the cvsserver in a similiar way one day (..after rewrite) |
# the cvsserver in a similiar way one day (..after rewrite) |
$pid = open2($reader, $writer, "cvs server") || fatal ("500 Internal Error", |
$pid = open2($reader, $writer, "cvs -Rl server") || fatal ("500 Internal Error", |
"Fatal Error - unable to open cvs for annotation"); |
"Fatal Error - unable to open cvs for annotation"); |
|
|
# OK, first send the request to the server. A simplified example is: |
# OK, first send the request to the server. A simplified example is: |
Line 1207 sub doAnnotate($$) { |
|
Line 1218 sub doAnnotate($$) { |
|
# were nicer about buffering, then we could just leave it open, I think. |
# were nicer about buffering, then we could just leave it open, I think. |
close ($writer) || die "cannot close: $!"; |
close ($writer) || die "cannot close: $!"; |
|
|
|
http_header(); |
|
|
|
navigateHeader($scriptwhere,$pathname,$filename,$rev, "annotate"); |
|
print "<h3 align=center>Annotation of $pathname$filename, Revision $rev</h3>\n"; |
|
|
# Ready to get the responses from the server. |
# Ready to get the responses from the server. |
# For example: |
# For example: |
# E Annotations for foo/xx |
# E Annotations for foo/xx |
Line 1239 sub doAnnotate($$) { |
|
Line 1255 sub doAnnotate($$) { |
|
} |
} |
elsif ($words[0] eq "M") { |
elsif ($words[0] eq "M") { |
$lineNr++; |
$lineNr++; |
my $lrev = substr ($_, 2, 13); |
(my $lrev = substr($_, 2, 13)) =~ y/ //d; |
my $lusr = substr ($_, 16, 9); |
(my $lusr = substr($_, 16, 9)) =~ y/ //d; |
my $line = substr ($_, 36); |
my $line = substr($_, 36); |
|
my $isCurrentRev = ($rev eq $lrev); |
# we should parse the date here .. |
# we should parse the date here .. |
if ($lrev eq $oldLrev) { |
if ($lrev eq $oldLrev) { |
$revprint = " "; |
$revprint = sprintf('%-8s', ''); |
} |
} |
else { |
else { |
$revprint = $lrev; $oldLusr = ""; |
$revprint = sprintf('%-8s', $lrev); |
$revprint =~ s`^(\S+)`<a href="${scriptwhere}${barequery}#rev$1">$1</A>`; # ` |
$revprint =~ s`\S+`&link($&, "$scriptwhere$barequery#rev$&")`e; # ` |
|
$oldLusr = ''; |
} |
} |
if ($lusr eq $oldLusr) { |
if ($lusr eq $oldLusr) { |
$usrprint = " "; |
$usrprint = ''; |
} |
} |
else { |
else { |
$usrprint = $lusr; |
$usrprint = $lusr; |
} |
} |
$oldLrev = $lrev; |
$oldLrev = $lrev; |
$oldLusr = $lusr; |
$oldLusr = $lusr; |
# is there a less timeconsuming way to strip spaces ? |
|
($lrev = $lrev) =~ s/\s+//g; |
|
my $isCurrentRev = ($rev eq $lrev); |
|
|
|
print "<b>" if ($isCurrentRev); |
# Set bold for text-based browsers only - graphical |
printf ("%8s%s%8s %4d:", $revprint, ($isCurrentRev ? "|" : " "), $usrprint, $lineNr); |
# browsers show bold fonts a bit wider than regular fonts, |
|
# so it looks irregular. |
|
print "<b>" if ($isCurrentRev && $is_textbased); |
|
|
|
printf "%s%s %-8s %4d:", |
|
$revprint, |
|
$isCurrentRev ? '!' : ' ', |
|
$usrprint, |
|
$lineNr; |
print spacedHtmlText($line, $d{'tabstop'}); |
print spacedHtmlText($line, $d{'tabstop'}); |
print "</b>" if ($isCurrentRev); |
|
|
print "</b>" if ($isCurrentRev && $is_textbased); |
} |
} |
elsif ($words[0] eq "ok") { |
elsif ($words[0] eq "ok") { |
# We could complain about any text received after this, like the |
# We could complain about any text received after this, like the |
Line 1389 sub cvswebMarkup($$$) { |
|
Line 1413 sub cvswebMarkup($$$) { |
|
print "<HR noshade>"; |
print "<HR noshade>"; |
print "<table width=\"100%\"><tr><td bgcolor=\"$markupLogColor\">"; |
print "<table width=\"100%\"><tr><td bgcolor=\"$markupLogColor\">"; |
print "File: ", &clickablePath($where, 1); |
print "File: ", &clickablePath($where, 1); |
print " "; |
print " ("; |
&download_link(urlencode($fileurl), $revision, "(download)"); |
&download_link($fileurl, $revision, "download"); |
|
print ")"; |
if (!$defaultTextPlain) { |
if (!$defaultTextPlain) { |
print " "; |
print " ("; |
&download_link(urlencode($fileurl), $revision, "(as text)", |
&download_link($fileurl, $revision, "as text", |
"text/plain"); |
"text/plain"); |
|
print ")"; |
} |
} |
print "<BR>\n"; |
print "<BR>\n"; |
if ($show_log_in_markup) { |
if ($show_log_in_markup) { |
Line 1410 sub cvswebMarkup($$$) { |
|
Line 1436 sub cvswebMarkup($$$) { |
|
my $url = download_url($fileurl, $revision, $mimetype); |
my $url = download_url($fileurl, $revision, $mimetype); |
print "<HR noshade>"; |
print "<HR noshade>"; |
if ($mimetype =~ /^image/) { |
if ($mimetype =~ /^image/) { |
print "<IMG SRC=\"$url$barequery\"><BR>"; |
printf '<IMG SRC="%s"><BR>', htmlquote("$url$barequery"); |
} |
} |
elsif ($mimetype =~ m%^application/pdf%) { |
elsif ($mimetype =~ m%^application/pdf%) { |
print "<EMBED SRC=\"$url$barequery\" WIDTH=\"100%\"><BR>"; |
printf '<EMBED SRC="%s" WIDTH="100%"><BR>', htmlquote("$url$barequery"); |
} |
} |
else { |
else { |
print "<PRE>"; |
print "<PRE>"; |
|
|
$state = "head"; |
$state = "head"; |
goto again; |
goto again; |
} |
} |
if ($state eq "head" && /^----------------------------$/) { |
if ($state eq "head" && /$LOG_REVSEPARATOR/o) { |
$state = "log"; |
$state = "log"; |
$rev = undef; |
$rev = undef; |
$date = undef; |
$date = undef; |
|
|
next; |
next; |
} |
} |
if ($state eq "log") { |
if ($state eq "log") { |
if (/^----------------------------$/ |
if (/$LOG_REVSEPARATOR/o || /$LOG_FILESEPARATOR/o) { |
|| /^=============================/) { |
|
# End of a log entry. |
# End of a log entry. |
my $revbranch; |
my $revbranch; |
($revbranch = $rev) =~ s/\.\d+$//; |
($revbranch = $rev) =~ s/\.\d+$//; |
|
|
$log = $log . $_; |
$log = $log . $_; |
} |
} |
} |
} |
if (/^===============/) { |
if (/$LOG_FILESEPARATOR/o) { |
$state = "start"; |
$state = "start"; |
next; |
next; |
} |
} |
Line 1816 sub readLog($;$) { |
|
Line 1841 sub readLog($;$) { |
|
# log info |
# log info |
# ---------------------------- |
# ---------------------------- |
logentry: |
logentry: |
while (!/^=========/) { |
while (!/$LOG_FILESEPARATOR/o) { |
$_ = <$fh>; |
$_ = <$fh>; |
last logentry if (!defined($_)); # EOF |
last logentry if (!defined($_)); # EOF |
print "R:", $_ if ($verbose); |
print "R:", $_ if ($verbose); |
Line 1824 sub readLog($;$) { |
|
Line 1849 sub readLog($;$) { |
|
$rev = $1; |
$rev = $1; |
unshift(@allrevisions,$rev); |
unshift(@allrevisions,$rev); |
} |
} |
elsif (/^========/ || /^----------------------------$/) { |
elsif (/$LOG_FILESEPARATOR/o || /$LOG_REVSEPARATOR/o) { |
next logentry; |
next logentry; |
} |
} |
else { |
else { |
Line 1858 sub readLog($;$) { |
|
Line 1883 sub readLog($;$) { |
|
while (<$fh>) { |
while (<$fh>) { |
print "L:", $_ if ($verbose); |
print "L:", $_ if ($verbose); |
next line if (/^branches:\s/); |
next line if (/^branches:\s/); |
last line if (/^----------------------------$/ || /^=========/); |
last line if (/$LOG_FILESEPARATOR/o || /$LOG_REVSEPARATOR/o); |
$log{$rev} .= $_; |
$log{$rev} .= $_; |
} |
} |
print "E:", $_ if ($verbose); |
print "E:", $_ if ($verbose); |
Line 2010 sub printLog($;$) { |
|
Line 2035 sub printLog($;$) { |
|
} |
} |
print "\n Revision "; |
print "\n Revision "; |
&download_link($fileurl, $_, $_, |
&download_link($fileurl, $_, $_, |
$defaultViewable ? "text/x-cvsweb-markup" : undef); |
$defaultViewable ? "text/x-cvsweb-markup" : undef); |
if ($defaultViewable) { |
if ($defaultViewable) { |
print " / "; |
print " / ("; |
&download_link($fileurl, $_, "(download)", $mimetype); |
&download_link($fileurl, $_, "download", $mimetype); |
|
print ")"; |
} |
} |
if (not $defaultTextPlain) { |
if (not $defaultTextPlain) { |
print " / "; |
print " / ("; |
&download_link($fileurl, $_, "(as text)", |
&download_link($fileurl, $_, "as text", "text/plain"); |
"text/plain"); |
print ")"; |
} |
} |
if (!$defaultViewable) { |
if (!$defaultViewable) { |
print " / "; |
print " / ("; |
&download_link($fileurl, $_, "(view)", "text/x-cvsweb-markup"); |
&download_link($fileurl, $_, "view", "text/x-cvsweb-markup"); |
|
print ")"; |
} |
} |
if ($allow_annotate) { |
if ($allow_annotate) { |
print " - <a href=\"" . $scriptname . "/" . urlencode($where) . "?annotate=$_$barequery\">"; |
print " - "; |
print "annotate</a>"; |
print &link('annotate', |
|
sprintf('%s/%s?annotate=%s%s', |
|
$scriptname, |
|
urlencode($where), |
|
$_, |
|
$barequery)); |
} |
} |
# Plus a select link if enabled, and this version isn't selected |
# Plus a select link if enabled, and this version isn't selected |
if ($allow_version_select) { |
if ($allow_version_select) { |
if ((!defined($input{"r1"}) || $input{"r1"} ne $_)) { |
if ((!defined($input{"r1"}) || $input{"r1"} ne $_)) { |
print " - <A HREF=\"${scriptwhere}?r1=$_$barequery" . |
print " - "; |
"\">[select for diffs]</A>\n"; |
print &link('[select for diffs]', |
|
sprintf('%s?r1=%s%s', |
|
$scriptwhere, |
|
$_, |
|
$barequery)); |
} |
} |
else { |
else { |
print " - <b>[selected]</b>"; |
print " - <b>[selected]</b>"; |
Line 2087 sub printLog($;$) { |
|
Line 2123 sub printLog($;$) { |
|
# Offer diff to previous revision |
# Offer diff to previous revision |
if ($prev) { |
if ($prev) { |
$diffrev{$prev} = 1; |
$diffrev{$prev} = 1; |
print " to previous <A HREF=\"${scriptwhere}.diff?r1=$prev"; |
|
print "&r2=$_" . $barequery . "\">$prev</A>\n"; |
my $url = sprintf('%s.diff?r1=%s&r2=%s%s', |
|
$scriptwhere, |
|
$prev, |
|
$_, |
|
$barequery); |
|
|
|
print " to previous "; |
|
print &link($prev, $url); |
if (!$hr_default) { # offer a human readable version if not default |
if (!$hr_default) { # offer a human readable version if not default |
print "(<A HREF=\"${scriptwhere}.diff?r1=$prev"; |
print &link('colored', "$url&f=h"); |
print "&r2=$_" . $barequery . "&f=h\">colored</A>)\n"; |
|
} |
} |
} |
} |
# |
# |
# Plus, if it's on a branch, and it's not a vendor branch, |
# Plus, if it's on a branch, and it's not a vendor branch, |
# offer a diff with the branch point. |
# offer a diff with the branch point. |
if ($revsym{$brp} && !/^1\.1\.1\.\d+$/ && !defined($diffrev{$brp})) { |
if ($revsym{$brp} && !/^1\.1\.1\.\d+$/ && !defined($diffrev{$brp})) { |
print " to branchpoint <A HREF=\"${scriptwhere}.diff?r1=$brp"; |
my $url = sprintf('%s.diff?r1=%s&r2=%s%s', |
print "&r2=$_" . $barequery . "\">$brp</A>\n"; |
$scriptwhere, |
|
$brp, |
|
$_, |
|
$barequery); |
|
|
|
print " to branchpoint "; |
|
print &link($brp, $url); |
if (!$hr_default) { # offer a human readable version if not default |
if (!$hr_default) { # offer a human readable version if not default |
print "(<A HREF=\"${scriptwhere}.diff?r1=$brp"; |
print &link('colored', "$url&f=h"); |
print "&r2=$_" . $barequery . "&f=h\">colored</A>)\n"; |
|
} |
} |
} |
} |
# |
# |
Line 2128 sub printLog($;$) { |
|
Line 2175 sub printLog($;$) { |
|
} |
} |
if (!defined($diffrev{$nextmain})) { |
if (!defined($diffrev{$nextmain})) { |
$diffrev{$nextmain} = 1; |
$diffrev{$nextmain} = 1; |
print " next main <A HREF=\"${scriptwhere}.diff?r1=$nextmain"; |
|
print "&r2=$_" . $barequery . |
my $url = sprintf('%s.diff?r1=%s&r2=%s%s', |
"\">$nextmain</A>\n"; |
$scriptwhere, |
|
$nextmain, |
|
$_, |
|
$barequery); |
|
|
|
print " next main "; |
|
print &link($nextmain, $url); |
if (!$hr_default) { # offer a human readable version if not default |
if (!$hr_default) { # offer a human readable version if not default |
print "(<A HREF=\"${scriptwhere}.diff?r1=$nextmain"; |
print &link('colored', "$url&f=h"); |
print "&r2=$_" . $barequery . |
|
"&f=h\">colored</A>)\n"; |
|
} |
} |
} |
} |
} |
} |
Line 2142 sub printLog($;$) { |
|
Line 2193 sub printLog($;$) { |
|
# to make a diff to that revision |
# to make a diff to that revision |
if (defined($input{"r1"}) && !defined($diffrev{$input{"r1"}})) { |
if (defined($input{"r1"}) && !defined($diffrev{$input{"r1"}})) { |
$diffrev{$input{"r1"}} = 1; |
$diffrev{$input{"r1"}} = 1; |
print " to selected <A HREF=\"${scriptwhere}.diff?" |
|
. "r1=$input{'r1'}&r2=$_" . $barequery |
|
. "\">$input{'r1'}</A>\n"; |
|
if (!$hr_default) { # offer a human readable version if not default |
|
print "(<A HREF=\"${scriptwhere}.diff?r1=$input{'r1'}"; |
|
print "&r2=$_" . $barequery . |
|
"&f=h\">colored</A>)\n"; |
|
|
|
|
my $url = sprintf('%s.diff?r1=%s&r2=%s%s', |
|
$scriptwhere, |
|
$input{'r1'}, |
|
$_, |
|
$barequery); |
|
|
|
print " to selected "; |
|
print &link($input{'r1'}, $url); |
|
if (!$hr_default) { # offer a human readable version if not default |
|
print &link('colored', "$url&f=h"); |
} |
} |
} |
} |
} |
} |
|
|
($filename = $where) =~ s|^.*/||; |
($filename = $where) =~ s|^.*/||; |
$backurl = $scriptname . "/" . urlencode($upwhere) . $query; |
$backurl = $scriptname . "/" . urlencode($upwhere) . $query; |
print &link($backicon, "$backurl#$filename"), |
print &link($backicon, "$backurl#$filename"), |
" <b>Up to ", &clickablePath($upwhere, 1), "</b><p>\n"; |
" <b>Up to ", &clickablePath($upwhere, 1), "</b><p>\n"; |
print <<EOF; |
print &link('Request diff between arbitrary revisions', '#diff'); |
<A HREF="#diff">Request diff between arbitrary revisions</A> |
print '<HR NOSHADE>'; |
<HR NOSHADE> |
|
EOF |
|
if ($curbranch) { |
if ($curbranch) { |
print "Default branch: ", ($revsym{$curbranch} || $curbranch); |
print "Default branch: ", ($revsym{$curbranch} || $curbranch); |
} |
} |
|
|
print "</A><P>\n"; |
print "</A><P>\n"; |
print "<FORM METHOD=\"GET\" ACTION=\"${scriptwhere}.diff\" NAME=\"diff_select\">\n"; |
print "<FORM METHOD=\"GET\" ACTION=\"${scriptwhere}.diff\" NAME=\"diff_select\">\n"; |
foreach (@stickyvars) { |
foreach (@stickyvars) { |
print "<INPUT TYPE=HIDDEN NAME=\"$_\" VALUE=\"$input{$_}\">\n" |
printf('<INPUT TYPE=HIDDEN NAME="%s" VALUE="%s">', $_, $input{$_}) |
if (defined($input{$_}) |
if (defined($input{$_}) |
&& ((!defined($DEFAULTVALUE{$_}) |
&& ((!defined($DEFAULTVALUE{$_}) |
|| $input{$_} ne $DEFAULTVALUE{$_}) |
|| $input{$_} ne $DEFAULTVALUE{$_}) |
Line 2483 sub navigateHeader($$$$$) { |
|
Line 2536 sub navigateHeader($$$$$) { |
|
print "$body_tag_for_src\n"; |
print "$body_tag_for_src\n"; |
print "<table width=\"100%\" border=0 cellspacing=0 cellpadding=1 bgcolor=\"$navigationHeaderColor\">"; |
print "<table width=\"100%\" border=0 cellspacing=0 cellpadding=1 bgcolor=\"$navigationHeaderColor\">"; |
print "<tr valign=bottom><td>"; |
print "<tr valign=bottom><td>"; |
print "<a href=\"$swhere$query#rev$rev\">$backicon"; |
print &link($backicon, "$swhere$query#rev$rev"); |
print "</a> <b>Return to ", &link("$filename","$swhere$query#rev$rev")," CVS log"; |
print "</a> <b>Return to ", &link("$filename","$swhere$query#rev$rev")," CVS log"; |
print "</b> $fileicon</td>"; |
print "</b> $fileicon</td>"; |
|
|
Line 2565 sub clickablePath($$) { |
|
Line 2618 sub clickablePath($$) { |
|
$retval = "[$cvstree]"; |
$retval = "[$cvstree]"; |
} |
} |
else { |
else { |
$retval = $retval . " <a href=\"${scriptname}/${query}#dirlist\">[$cvstree]</a>"; |
$retval .= ' ' . &link("[$cvstree]", sprintf('%s/%s#dirlist', |
|
$scriptname, |
|
$query)); |
my $wherepath = ''; |
my $wherepath = ''; |
my ($lastslash) = $pathname =~ m|/$|; |
my ($lastslash) = $pathname =~ m|/$|; |
foreach (split(/\//, $pathname)) { |
foreach (split(/\//, $pathname)) { |
Line 2574 sub clickablePath($$) { |
|
Line 2629 sub clickablePath($$) { |
|
my ($last) = "$wherepath/" eq "/$pathname" |
my ($last) = "$wherepath/" eq "/$pathname" |
|| $wherepath eq "/$pathname"; |
|| $wherepath eq "/$pathname"; |
if ($clickLast || !$last) { |
if ($clickLast || !$last) { |
$retval = $retval . "<a href=\"${scriptname}" |
$retval .= &link($_, join('', |
. urlencode($wherepath) |
$scriptname, |
. (!$last || $lastslash ? '/' : '') |
urlencode($wherepath), |
. ${query} |
(!$last || $lastslash ? '/' : ''), |
. (!$last || $lastslash ? "#dirlist" : "") |
$query, |
. "\">$_</a>"; |
(!$last || $lastslash ? "#dirlist" : ""))); |
} |
} |
else { # do not make a link to the current dir |
else { # do not make a link to the current dir |
$retval = $retval . $_; |
$retval .= $_; |
} |
} |
} |
} |
} |
} |
Line 2639 sub chooseMirror() { |
|
Line 2694 sub chooseMirror() { |
|
print "\nThis cvsweb is mirrored in:\n"; |
print "\nThis cvsweb is mirrored in:\n"; |
foreach $mirror (keys %MIRRORS) { |
foreach $mirror (keys %MIRRORS) { |
print ", " if ($moremirrors); |
print ", " if ($moremirrors); |
print qq(<a href="$MIRRORS{$mirror}">$mirror</A>\n); |
print &link(htmlquote($mirror),$MIRRORS{$mirror}); |
$moremirrors = 1; |
$moremirrors = 1; |
} |
} |
print "<p>\n"; |
print "<p>\n"; |
Line 2682 sub download_url($$;$) { |
|
Line 2737 sub download_url($$;$) { |
|
|
|
$revision =~ s/\b0\.//; |
$revision =~ s/\b0\.//; |
|
|
if (defined($checkout_magic) |
if (defined($checkoutMagic) |
&& (!defined($mimetype) || $mimetype ne "text/x-cvsweb-markup")) { |
&& (!defined($mimetype) || $mimetype ne "text/x-cvsweb-markup")) { |
my ($path); |
my $path = $where; |
($path = $where) =~ s|/[^/]*$|/|; |
$path =~ s|/[^/]*$|/|; |
$url = "$scriptname/$checkoutMagic/${path}$url"; |
$url = "$scriptname/$checkoutMagic/${path}$url"; |
} |
} |
$url .= "?rev=$revision"; |
$url .= "?rev=$revision"; |
$url .= "&content-type=$mimetype" if (defined($mimetype)); |
$url .= '&content-type=' . urlencode($mimetype) if (defined($mimetype)); |
|
|
return $url; |
$url; |
} |
} |
|
|
# Presents a link to download the |
# Presents a link to download the |
# selected revision |
# selected revision |
sub download_link($$$;$) { |
sub download_link($$$;$) { |
my ($url,$revision,$textlink,$mimetype) = @_; |
my ($url, $revision, $textlink, $mimetype) = @_; |
my ($fullurl) = download_url($url,$revision,$mimetype); |
my ($fullurl) = download_url($url, $revision, $mimetype); |
my ($paren) = $textlink =~ /^\(/; |
|
$textlink =~ s/^\(// if ($paren); |
printf '<A HREF="%s"', htmlquote("$fullurl$barequery"); |
$textlink =~ s/\)$// if ($paren); |
|
print "(" if ($paren); |
|
print "<A HREF=\"$fullurl"; |
|
print $barequery; |
|
print "\""; |
|
if ($open_extern_window && (!defined($mimetype) || $mimetype ne "text/x-cvsweb-markup")) { |
if ($open_extern_window && (!defined($mimetype) || $mimetype ne "text/x-cvsweb-markup")) { |
print " target=\"cvs_checkout\""; |
print ' target="cvs_checkout"'; |
# we should have |
# we should have |
# 'if (document.cvswin==null) document.cvswin=window.open(...' |
# 'if (document.cvswin==null) document.cvswin=window.open(...' |
# in order to allow the user to resize the window; otherwise |
# in order to allow the user to resize the window; otherwise |
Line 2726 sub download_link($$$;$) { |
|
Line 2777 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) { |
print " onClick=\"window.open('$fullurl','cvs_checkout',"; |
my @attr = qw(resizeable scrollbars); |
print "'resizeable,scrollbars"; |
|
print ",status,toolbar" if (defined($mimetype) |
push @attr, qw(status toolbar) |
&& $mimetype eq "text/html"); |
if (defined($mimetype) && $mimetype eq "text/html"); |
print ",width=$extern_window_width" if (defined($extern_window_width)); |
|
print ",height=$extern_window_height" if (defined($extern_window_height)); |
push @attr, "width=$extern_window_width" |
print"');\""; |
if (defined($extern_window_width)); |
|
|
|
push @attr, "height=$extern_window_height" |
|
if (defined($extern_window_height)); |
|
|
|
printf q` onClick="window.open('%s','cvs_checkout','%s');"`, |
|
htmlquote($fullurl), join(',', @attr); |
} |
} |
} |
} |
print "><b>$textlink</b></A>"; |
print "><b>$textlink</b></A>"; |
print ")" if ($paren); |
|
} |
} |
|
|
# Returns a Query string with the |
# Returns a Query string with the |
Line 2758 sub toggleQuery($$) { |
|
Line 2814 sub toggleQuery($$) { |
|
my ($value) = defined($vars{$var}) ? $vars{$var} : ""; |
my ($value) = defined($vars{$var}) ? $vars{$var} : ""; |
my ($default) = defined($DEFAULTVALUE{$var}) ? $DEFAULTVALUE{$var} : ""; |
my ($default) = defined($DEFAULTVALUE{$var}) ? $DEFAULTVALUE{$var} : ""; |
if ($value ne $default) { |
if ($value ne $default) { |
$newquery .= "&" if ($newquery ne ""); |
$newquery .= "&" if ($newquery ne ""); |
$newquery .= urlencode($var) . "=" . urlencode($value); |
$newquery .= urlencode($var) . "=" . urlencode($value); |
} |
} |
} |
} |
Line 2769 sub toggleQuery($$) { |
|
Line 2825 sub toggleQuery($$) { |
|
} |
} |
|
|
sub urlencode($) { |
sub urlencode($) { |
my ($in) = @_; |
local($_) = @_; |
my ($out); |
|
($out = $in) =~ s/([\000-+{-\377])/sprintf("%%%02x", ord($1))/ge; |
s/[\000-+{-\377]/sprintf("%%%02x", ord($&))/ge; |
return $out; |
|
|
|
|
$_; |
} |
} |
|
|
|
sub htmlquote($) { |
|
local($_) = @_; |
|
|
|
# Special Characters; RFC 1866 |
|
s/&/&/g; |
|
s/\"/"/g; |
|
s/</</g; |
|
s/>/>/g; |
|
|
|
$_; |
|
} |
|
|
sub http_header(;$) { |
sub http_header(;$) { |
my $content_type = shift || "text/html"; |
my $content_type = shift || "text/html"; |
if (defined($moddate)) { |
if (defined($moddate)) { |
Line 2861 sub link_tags($) { |
|
Line 2931 sub link_tags($) { |
|
|
|
foreach my $sym (split(", ", $tags)) { |
foreach my $sym (split(", ", $tags)) { |
$ret .= ",\n" if ($ret ne ""); |
$ret .= ",\n" if ($ret ne ""); |
$ret .= "<A HREF=\"$fileurl" |
$ret .= &link($sym, $fileurl . toggleQuery('only_with_tag',$sym)); |
. toggleQuery('only_with_tag',$sym) . "\">$sym</A>"; |
|
} |
} |
return $ret."\n"; |
return "$ret\n"; |
} |
} |
|
|
# |
# |