version 3.35, 2000/10/10 21:14:05 |
version 3.39, 2000/11/04 15:32:17 |
|
|
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
# SUCH DAMAGE. |
# SUCH DAMAGE. |
# |
# |
# $zId: cvsweb.cgi,v 1.103 2000/09/20 17:02:29 jumager Exp $ |
# $zId: cvsweb.cgi,v 1.104 2000/11/01 22:05:12 hnordstrom Exp $ |
# $Id$ |
# $Id$ |
# |
# |
### |
### |
|
|
use vars qw ( |
use vars qw ( |
$config $allow_version_select $verbose |
$config $allow_version_select $verbose |
%CVSROOT %CVSROOTdescr %MIRRORS %DEFAULTVALUE %ICONS %MTYPES |
%CVSROOT %CVSROOTdescr %MIRRORS %DEFAULTVALUE %ICONS %MTYPES |
|
@DIFFTYPES %DIFFTYPES @LOGSORTKEYS %LOGSORTKEYS |
%alltags @tabcolors %fileinfo %tags @branchnames %nameprinted |
%alltags @tabcolors %fileinfo %tags @branchnames %nameprinted |
%symrev %revsym @allrevisions %date %author @revdisplayorder |
%symrev %revsym @allrevisions %date %author @revdisplayorder |
@revisions %state %difflines %log %branchpoint @revorder |
@revisions %state %difflines %log %branchpoint @revorder |
|
|
%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 |
$bylog $byfile $hr_default $logsort $cvstree $cvsroot |
$bylog $byfile $defaultDiffType $logsort $cvstree $cvsroot |
$mimetype $defaultTextPlain $defaultViewable $allow_compress |
$mimetype $defaultTextPlain $defaultViewable $allow_compress |
$GZIPBIN $backicon $diricon $fileicon $fullname $newname |
$GZIPBIN $backicon $diricon $fileicon $fullname $newname |
$cvstreedefault $body_tag $body_tag_for_src |
$cvstreedefault $body_tag $body_tag_for_src |
|
|
); |
); |
|
|
sub printDiffSelect($); |
sub printDiffSelect($); |
|
sub printDiffLinks($$); |
|
sub printLogSortSelect($); |
sub findLastModifiedSubdirs(@); |
sub findLastModifiedSubdirs(@); |
|
sub htmlify_sub(&$); |
sub htmlify($;$); |
sub htmlify($;$); |
sub spacedHtmlText($;$); |
sub spacedHtmlText($;$); |
sub link($$); |
sub link($$); |
Line 117 sub download_link($$$;$); |
|
Line 121 sub download_link($$$;$); |
|
sub toggleQuery($$); |
sub toggleQuery($$); |
sub urlencode($); |
sub urlencode($); |
sub htmlquote($); |
sub htmlquote($); |
|
sub htmlunquote($); |
sub http_header(;$); |
sub http_header(;$); |
sub html_header($); |
sub html_header($); |
sub html_footer(); |
sub html_footer(); |
Line 164 $tabstop = $use_moddate = $moddate = $gzip_open = unde |
|
Line 169 $tabstop = $use_moddate = $moddate = $gzip_open = unde |
|
$LOG_FILESEPARATOR = q/^={77}$/; |
$LOG_FILESEPARATOR = q/^={77}$/; |
$LOG_REVSEPARATOR = q/^-{28}$/; |
$LOG_REVSEPARATOR = q/^-{28}$/; |
|
|
|
@DIFFTYPES = qw(h H u c s); |
|
@DIFFTYPES{@DIFFTYPES} = ( |
|
{ |
|
'descr' => 'colored', |
|
'opts' => [ '-u' ], |
|
'colored' => 1, |
|
}, |
|
{ |
|
'descr' => 'long colored', |
|
'opts' => [ '--unified=15' ], |
|
'colored' => 1, |
|
}, |
|
{ |
|
'descr' => 'unified', |
|
'opts' => [ '-u' ], |
|
'colored' => 0, |
|
}, |
|
{ |
|
'descr' => 'context', |
|
'opts' => [ '-c' ], |
|
'colored' => 0, |
|
}, |
|
{ |
|
'descr' => 'side by side', |
|
'opts' => [ '--side-by-side', '--width=164' ], |
|
'colored' => 0, |
|
}, |
|
); |
|
|
|
@LOGSORTKEYS = qw(cvs date rev); |
|
@LOGSORTKEYS{@LOGSORTKEYS} = ( |
|
{ |
|
'descr' => 'Not sorted', |
|
}, |
|
{ |
|
'descr' => 'Commit date', |
|
}, |
|
{ |
|
'descr' => 'Revision', |
|
}, |
|
); |
|
|
|
|
##### End of configuration variables ##### |
##### End of configuration variables ##### |
|
|
use Time::Local; |
use Time::Local; |
|
|
$byfile = 1; |
$byfile = 1; |
} |
} |
|
|
$hr_default = $input{'f'} eq 'h'; |
$defaultDiffType = $input{'f'}; |
|
|
$logsort = $input{'logsort'}; |
$logsort = $input{'logsort'}; |
|
|
Line 482 elsif (-d $fullname) { |
|
Line 530 elsif (-d $fullname) { |
|
} |
} |
print "<table width=\"100%\" border=0 cellspacing=1 cellpadding=$tablepadding>\n"; |
print "<table width=\"100%\" border=0 cellspacing=1 cellpadding=$tablepadding>\n"; |
$infocols++; |
$infocols++; |
print "<tr><th align=left bgcolor=\"" . (($byfile) ? |
printf '<tr><th align=left bgcolor="%s">', |
$columnHeaderColorSorted : |
$byfile ? $columnHeaderColorSorted : $columnHeaderColorDefault; |
$columnHeaderColorDefault) . "\">"; |
|
if ($byfile) { |
if ($byfile) { |
print 'File'; |
print 'File'; |
} else { |
} else { |
Line 496 elsif (-d $fullname) { |
|
Line 543 elsif (-d $fullname) { |
|
# with revision information: |
# with revision information: |
if (scalar(%fileinfo)) { |
if (scalar(%fileinfo)) { |
$infocols++; |
$infocols++; |
print "<th align=left bgcolor=\"" . (($byrev) ? |
printf '<th align=left bgcolor="%s">', |
$columnHeaderColorSorted : |
$byrev ? $columnHeaderColorSorted : $columnHeaderColorDefault; |
$columnHeaderColorDefault) . "\">"; |
|
if ($byrev) { |
if ($byrev) { |
print 'Rev.'; |
print 'Rev.'; |
} else { |
} else { |
Line 507 elsif (-d $fullname) { |
|
Line 553 elsif (-d $fullname) { |
|
} |
} |
print "</th>"; |
print "</th>"; |
$infocols++; |
$infocols++; |
print "<th align=left bgcolor=\"" . (($bydate) ? |
printf '<th align=left bgcolor="%s">', |
$columnHeaderColorSorted : |
$bydate ? $columnHeaderColorSorted : $columnHeaderColorDefault; |
$columnHeaderColorDefault) . "\">"; |
|
if ($bydate) { |
if ($bydate) { |
print 'Age'; |
print 'Age'; |
} else { |
} else { |
print &link('Age', sprintf('./%s#dirlist', |
print &link('Age', sprintf('./%s#dirlist', |
&toggleQuery("sortby", "date"))); |
&toggleQuery("sortby", "date"))); |
} |
} |
print "</th>"; |
print "</th>"; |
if ($show_author) { |
if ($show_author) { |
$infocols++; |
$infocols++; |
print "<th align=left bgcolor=\"" . (($byauthor) ? |
printf '<th align=left bgcolor="%s">', |
$columnHeaderColorSorted : |
$byauthor ? $columnHeaderColorSorted : $columnHeaderColorDefault; |
$columnHeaderColorDefault) . "\">"; |
|
if ($byauthor) { |
if ($byauthor) { |
print 'Author'; |
print 'Author'; |
} else { |
} else { |
Line 531 elsif (-d $fullname) { |
|
Line 575 elsif (-d $fullname) { |
|
print "</th>"; |
print "</th>"; |
} |
} |
$infocols++; |
$infocols++; |
print "<th align=left bgcolor=\"" . (($bylog) ? |
printf '<th align=left bgcolor="%s">', |
$columnHeaderColorSorted : |
$bylog ? $columnHeaderColorSorted : $columnHeaderColorDefault; |
$columnHeaderColorDefault) . "\">"; |
|
if ($bylog) { |
if ($bylog) { |
print 'Last log entry'; |
print 'Last log entry'; |
} else { |
} else { |
print &link('Last log entry', sprintf('./%s#dirlist', |
print &link('Last log entry', sprintf('./%s#dirlist', |
&toggleQuery("sortby", "log"))); |
&toggleQuery("sortby", "log"))); |
} |
} |
print "</th>"; |
print "</th>"; |
} |
} |
elsif ($use_descriptions) { |
elsif ($use_descriptions) { |
print "<th align=left bgcolor=\"". $columnHeaderColorDefault . "\">"; |
printf '<th align=left bgcolor="%s">', $columnHeaderColorDefault; |
print "Description"; |
print "Description"; |
$infocols++; |
$infocols++; |
} |
} |
Line 608 elsif (-d $fullname) { |
|
Line 651 elsif (-d $fullname) { |
|
next if ($_ eq '..' && $where eq '/'); |
next if ($_ eq '..' && $where eq '/'); |
my ($rev,$date,$log,$author,$filename) = @{$fileinfo{$_}} |
my ($rev,$date,$log,$author,$filename) = @{$fileinfo{$_}} |
if (defined($fileinfo{$_})); |
if (defined($fileinfo{$_})); |
print "<tr bgcolor=\"" . @tabcolors[$dirrow%2] . "\"><td>" if ($dirtable); |
printf '<tr bgcolor="%s"><td>', $tabcolors[$dirrow % 2] if $dirtable; |
if ($_ eq '..') { |
if ($_ eq '..') { |
$url = "../" . $query; |
$url = "../$query"; |
if ($nofilelinks) { |
if ($nofilelinks) { |
print $backicon; |
print $backicon; |
} |
} |
Line 620 elsif (-d $fullname) { |
|
Line 663 elsif (-d $fullname) { |
|
print " ", &link("Previous Directory", $url); |
print " ", &link("Previous Directory", $url); |
} |
} |
else { |
else { |
$url = urlencode($_) . '/' . $query; |
$url = urlencode($_) . "/$query"; |
print "<A NAME=\"$_\"></A>"; |
print "<A NAME=\"$_\"></A>"; |
if ($nofilelinks) { |
if ($nofilelinks) { |
print $diricon; |
print $diricon; |
Line 639 elsif (-d $fullname) { |
|
Line 682 elsif (-d $fullname) { |
|
if ($filename) { |
if ($filename) { |
print "</td><td> </td><td> " if ($dirtable); |
print "</td><td> </td><td> " if ($dirtable); |
if ($date) { |
if ($date) { |
print " <i>" . readableTime(time() - $date,0) . "</i>"; |
print " <i>", readableTime(time() - $date,0), "</i>"; |
} |
} |
if ($show_author) { |
if ($show_author) { |
print "</td><td> " if ($dirtable); |
print "</td><td> " if ($dirtable); |
Line 650 elsif (-d $fullname) { |
|
Line 693 elsif (-d $fullname) { |
|
print "$filename/$rev"; |
print "$filename/$rev"; |
print "<BR>" if ($dirtable); |
print "<BR>" if ($dirtable); |
if ($log) { |
if ($log) { |
print " <font size=-1>" |
print " <font size=-1>", |
. &htmlify(substr($log,0,$shortLogLen)); |
&htmlify(substr($log,0,$shortLogLen)); |
if (length $log > 80) { |
if (length $log > 80) { |
print "..."; |
print "..."; |
} |
} |
Line 661 elsif (-d $fullname) { |
|
Line 704 elsif (-d $fullname) { |
|
else { |
else { |
my ($dwhere) = ($where ne "/" ? $where : "") . $_; |
my ($dwhere) = ($where ne "/" ? $where : "") . $_; |
if ($use_descriptions && defined $descriptions{$dwhere}) { |
if ($use_descriptions && defined $descriptions{$dwhere}) { |
print "<TD COLSPAN=" . ($infocols-1) . "> " if $dirtable; |
print "<TD COLSPAN=", ($infocols-1), "> " if $dirtable; |
print $descriptions{$dwhere}; |
print $descriptions{$dwhere}; |
} elsif ($dirtable && $infocols > 1) { |
} elsif ($dirtable && $infocols > 1) { |
# close the row with the appropriate number of |
# close the row with the appropriate number of |
Line 692 elsif (-d $fullname) { |
|
Line 735 elsif (-d $fullname) { |
|
next if (!defined($fileinfo{$_})); |
next if (!defined($fileinfo{$_})); |
($rev,$date,$log,$author) = @{$fileinfo{$_}}; |
($rev,$date,$log,$author) = @{$fileinfo{$_}}; |
$filesfound++; |
$filesfound++; |
print "<tr bgcolor=\"" . @tabcolors[$dirrow%2] . "\"><td>" if ($dirtable); |
printf '<tr bgcolor="%s"><td>', $tabcolors[$dirrow % 2] if $dirtable; |
print "<A NAME=\"$_\"></A>"; |
print "<A NAME=\"$_\"></A>"; |
if ($nofilelinks) { |
if ($nofilelinks) { |
print $fileicon; |
print $fileicon; |
Line 707 elsif (-d $fullname) { |
|
Line 750 elsif (-d $fullname) { |
|
$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>"; |
} |
} |
if ($show_author) { |
if ($show_author) { |
print "</td><td> " if ($dirtable); |
print "</td><td> " if ($dirtable); |
Line 715 elsif (-d $fullname) { |
|
Line 758 elsif (-d $fullname) { |
|
} |
} |
print "</td><td> " if ($dirtable); |
print "</td><td> " if ($dirtable); |
if ($log) { |
if ($log) { |
print " <font size=-1>" . &htmlify(substr($log,0,$shortLogLen)); |
print " <font size=-1>", &htmlify(substr($log,0,$shortLogLen)); |
if (length $log > 80) { |
if (length $log > 80) { |
print "..."; |
print "..."; |
} |
} |
Line 730 elsif (-d $fullname) { |
|
Line 773 elsif (-d $fullname) { |
|
if ($dirtable && defined($tableBorderColor)) { |
if ($dirtable && defined($tableBorderColor)) { |
print "</td></tr></table>"; |
print "</td></tr></table>"; |
} |
} |
print "". ($dirtable == 1) ? "</table>" : "</menu>" . "\n"; |
print( $dirtable == 1 ? "</table>\n" : "</menu>\n" ); |
|
|
if ($filesexists && !$filesfound) { |
if ($filesexists && !$filesfound) { |
print "<P><B>NOTE:</B> There are $filesexists files, but none matches the current tag ($input{only_with_tag})\n"; |
print "<P><B>NOTE:</B> There are $filesexists files, but none matches the current tag ($input{only_with_tag})\n"; |
Line 788 elsif (-d $fullname) { |
|
Line 831 elsif (-d $fullname) { |
|
print "<OPTION",$byrev ? " SELECTED" : ""," VALUE=rev>Revision"; |
print "<OPTION",$byrev ? " SELECTED" : ""," VALUE=rev>Revision"; |
print "<OPTION",$bylog ? " SELECTED" : ""," VALUE=log>Log message"; |
print "<OPTION",$bylog ? " SELECTED" : ""," VALUE=log>Log message"; |
print "</SELECT></td>"; |
print "</SELECT></td>"; |
print "<td>revisions by: \n"; |
print "<td>Sort log by: "; |
print "<SELECT NAME=logsort>\n"; |
printLogSortSelect(0); |
print "<OPTION VALUE=cvs",$logsort eq "cvs" ? " SELECTED" : "", ">Not sorted"; |
print "</td></tr>"; |
print "<OPTION VALUE=date",$logsort eq "date" ? " SELECTED" : "", ">Commit date"; |
|
print "<OPTION VALUE=rev",$logsort eq "rev" ? " SELECTED" : "", ">Revision"; |
|
print "</SELECT></td></tr>"; |
|
print "<tr><td>Diff format: "; |
print "<tr><td>Diff format: "; |
printDiffSelect(0); |
printDiffSelect(0); |
print "</td>"; |
print "</td>"; |
|
|
|
|
sub printDiffSelect($) { |
sub printDiffSelect($) { |
my ($use_java_script) = @_; |
my ($use_java_script) = @_; |
my ($f) = $input{'f'}; |
my $f = $input{'f'}; |
print "<SELECT NAME=\"f\""; |
|
print " onchange=\"submit()\"" if ($use_java_script); |
print '<SELECT NAME="f"'; |
print ">\n"; |
print ' onchange="submit()"' if $use_java_script; |
print "<OPTION VALUE=h",$f eq "h" ? " SELECTED" : "", ">Colored Diff"; |
print '>'; |
print "<OPTION VALUE=H",$f eq "H" ? " SELECTED" : "", ">Long Colored Diff"; |
|
print "<OPTION VALUE=u",$f eq "u" ? " SELECTED" : "", ">Unidiff"; |
local $_; |
print "<OPTION VALUE=c",$f eq "c" ? " SELECTED" : "", ">Context Diff"; |
for (@DIFFTYPES) { |
print "<OPTION VALUE=s",$f eq "s" ? " SELECTED" : "", ">Side by Side"; |
printf('<OPTION VALUE="%s"%s>%s', |
|
$_, |
|
$f eq $_ ? ' SELECTED' : '', |
|
"\u$DIFFTYPES{$_}{'descr'}" |
|
); |
|
} |
|
|
print "</SELECT>"; |
print "</SELECT>"; |
} |
} |
|
|
|
sub printLogSortSelect($) { |
|
my ($use_java_script) = @_; |
|
|
|
print '<SELECT NAME="logsort"'; |
|
print ' onchange="submit()"' if $use_java_script; |
|
print '>'; |
|
|
|
local $_; |
|
for (@LOGSORTKEYS) { |
|
printf('<OPTION VALUE="%s"%s>%s', |
|
$_, |
|
$logsort eq $_ ? ' SELECTED' : '', |
|
"\u$LOGSORTKEYS{$_}{'descr'}" |
|
); |
|
} |
|
|
|
print "</SELECT>"; |
|
} |
|
|
sub findLastModifiedSubdirs(@) { |
sub findLastModifiedSubdirs(@) { |
my (@dirs) = @_; |
my (@dirs) = @_; |
my ($dirname, @files); |
my ($dirname, @files); |
Line 933 sub findLastModifiedSubdirs(@) { |
|
Line 998 sub findLastModifiedSubdirs(@) { |
|
return @files; |
return @files; |
} |
} |
|
|
|
sub htmlify_sub(&$) { |
|
(my $proc, local $_) = @_; |
|
local @_ = split(m`(<a [^>]+>[^<]*</a>)`i); |
|
my $linked; |
|
my $result = ''; |
|
|
|
while (($_, $linked) = splice(@_, 0, 2)) { |
|
&$proc(); |
|
$result .= $_ if defined($_); |
|
$result .= $linked if defined($linked); |
|
} |
|
|
|
$result; |
|
} |
|
|
sub htmlify($;$) { |
sub htmlify($;$) { |
(local $_, my $extra) = @_; |
(local $_, my $extra) = @_; |
|
|
$_ = htmlquote($_); |
$_ = htmlquote($_); |
|
|
# get URL's as link |
# get URL's as link |
s`(http|ftp|https)(://[-a-zA-Z0-9%.~:_/]+)([?&]([-a-zA-Z0-9%.~:_]+)=([-a-zA-Z0-9%.~:_])+)*`&link("$1$2$3", "$1$2$3")`ge; # ` |
s{ |
# get e-mails as link |
(http|ftp|https)://\S+ |
s`[-a-zA-Z0-9_.]+@([-a-zA-Z0-9]+\.)+[A-Za-z]{2,4}`&link($&, "mailto:$&")`ge; # ` |
}{ |
|
&link($&, htmlunquote($&)) |
|
}egx; |
|
|
if ($extra) { |
# get e-mails as link |
# get PR #'s as link: "PR#nnnn" "PR: nnnn, ..." "PR nnnn, ..." "bin/nnnn" |
$_ = htmlify_sub { |
if (defined($prcgi)) { |
s< |
1 while s`\b(pr[:#]?\s*(?:#?\d+[,\s]\s*)*#?)(\d+)\b`$1 . &link($2, sprintf($prcgi, $2))`ie; # `; |
[\w+=\-.!]+@[\w\-]+(\.[\w\-]+)+ |
s`\b${prcategories}/(\d+)\b`&link($&, sprintf($prcgi, $1))`igeo; # `; |
>< |
} |
&link($&, "mailto:$&") |
|
>egix; |
|
} $_; |
|
|
# get manpage specs as link: "foo.1" "foo(1)" |
if ($extra) { |
if (defined($mancgi)) { |
# get PR #'s as link: "PR#nnnn" "PR: nnnn, ..." "PR nnnn, ..." "bin/nnnn" |
s`\b([a-zA-Z]\w+)(?:\(([0-9n])\)\B|\.([0-9n])\b)`&link($&, sprintf($mancgi, $2 ne '' ? $2 : $3, $1))`ge; # `x; |
if (defined($prcgi)) { |
} |
my $prev; |
|
|
|
do { |
|
$prev = $_; |
|
|
|
$_ = htmlify_sub { |
|
s{ |
|
(\bPR[:\#]?\s* |
|
(?: |
|
\#? |
|
\d+[,\s]\s* |
|
)* |
|
\#?) |
|
(\d+)\b |
|
}{ |
|
$1 . &link($2, sprintf($prcgi, $2)) . $3 |
|
}egix; |
|
} $_; |
|
} while ($_ ne $prev); |
|
|
|
$_ = htmlify_sub { |
|
s{ |
|
(\b$prcategories/(\d+)\b) |
|
}{ |
|
&link($1, sprintf($prcgi, $2)) . $3 |
|
}egox; |
|
} $_; |
} |
} |
|
|
$_; |
# get manpage specs as link: "foo.1" "foo(1)" |
|
if (defined($mancgi)) { |
|
$_ = htmlify_sub { |
|
s{ |
|
(\b([a-zA-Z][\w_.]+) |
|
(?: |
|
\( ([0-9n]) \)\B |
|
| |
|
\.([0-9n])\b |
|
) |
|
) |
|
}{ |
|
&link($1, sprintf($mancgi, $3 ne '' ? $3 : $4, $2)) . $5 |
|
}egx; |
|
} $_; |
|
} |
|
} |
|
|
|
$_; |
} |
} |
|
|
sub spacedHtmlText($;$) { |
sub spacedHtmlText($;$) { |
Line 1066 sub safeglob($) { |
|
Line 1194 sub safeglob($) { |
|
$glob =~ s/{([^}]+)}/($t = $1) =~ s-,-|-g; "($t)"/eg; |
$glob =~ s/{([^}]+)}/($t = $1) =~ s-,-|-g; "($t)"/eg; |
foreach (readdir($dh)) { |
foreach (readdir($dh)) { |
if (/^${glob}$/) { |
if (/^${glob}$/) { |
push(@results, $dirname . "/" .$_); |
push(@results, "$dirname/" .$_); |
} |
} |
} |
} |
} |
} |
Line 1265 sub doAnnotate($$) { |
|
Line 1393 sub doAnnotate($$) { |
|
} |
} |
else { |
else { |
$revprint = sprintf('%-8s', $lrev); |
$revprint = sprintf('%-8s', $lrev); |
$revprint =~ s`\S+`&link($&, "$scriptwhere$barequery#rev$&")`e; # ` |
$revprint =~ s`\S+`&link($&, "$scriptwhere$query#rev$&")`e; # ` |
$oldLusr = ''; |
$oldLusr = ''; |
} |
} |
if ($lusr eq $oldLusr) { |
if ($lusr eq $oldLusr) { |
Line 1296 sub doAnnotate($$) { |
|
Line 1424 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", "Error occured during annotate: <b>$_</b>"); |
fatal("500 Internal Error", "Error occured during annotate: <b>$_</b>"); |
} |
} |
} |
} |
if ($annTable) { |
if ($annTable) { |
Line 1470 sub viewable($) { |
|
Line 1598 sub viewable($) { |
|
sub doDiff($$$$$$) { |
sub doDiff($$$$$$) { |
my($fullname, $r1, $tr1, $r2, $tr2, $f) = @_; |
my($fullname, $r1, $tr1, $r2, $tr2, $f) = @_; |
my $fh = do {local(*FH);}; |
my $fh = do {local(*FH);}; |
my ($rev1, $rev2, $sym1, $sym2, @difftype, $diffname, $f1, $f2); |
my ($rev1, $rev2, $sym1, $sym2, $f1, $f2); |
|
|
if ($r1 =~ /([^:]+)(:(.+))?/) { |
if ($r1 =~ /([^:]+)(:(.+))?/) { |
$rev1 = $1; |
$rev1 = $1; |
Line 1504 sub doDiff($$$$$$) { |
|
Line 1632 sub doDiff($$$$$$) { |
|
($rev1, $sym1) = ($rev2, $sym2); |
($rev1, $sym1) = ($rev2, $sym2); |
($rev2, $sym2) = ($tmp1, $tmp2); |
($rev2, $sym2) = ($tmp1, $tmp2); |
} |
} |
my $human_readable = 0; |
my $difftype = $DIFFTYPES{$f}; |
if ($f eq 'c') { |
|
@difftype = qw{-c}; |
if (!$difftype) { |
$diffname = "Context diff"; |
|
} |
|
elsif ($f eq 's') { |
|
@difftype = qw{--side-by-side --width=164}; |
|
$diffname = "Side by Side"; |
|
} |
|
elsif ($f eq 'H') { |
|
$human_readable = 1; |
|
@difftype = qw{--unified=15}; |
|
$diffname = "Long Human readable"; |
|
} |
|
elsif ($f eq 'h') { |
|
@difftype =qw{-u}; |
|
$human_readable = 1; |
|
$diffname = "Human readable"; |
|
} |
|
elsif ($f eq 'u') { |
|
@difftype = qw{-u}; |
|
$diffname = "Unidiff"; |
|
} |
|
else { |
|
fatal ("400 Bad arguments", "Diff format $f not understood"); |
fatal ("400 Bad arguments", "Diff format $f not understood"); |
} |
} |
|
|
|
my @difftype = @{$difftype->{'opts'}}; |
|
my $human_readable = $difftype->{'colored'}; |
|
|
# apply special options |
# apply special options |
if ($showfunc) { |
if ($showfunc) { |
push @difftype, '-p' if $f =~ /^[cHhu]$/; |
push @difftype, '-p' if $f ne 's'; |
|
|
my($re1, $re2); |
my($re1, $re2); |
|
|
Line 1595 sub doDiff($$$$$$) { |
|
Line 1705 sub doDiff($$$$$$) { |
|
s|$cvsroot/||o; |
s|$cvsroot/||o; |
if ($sym1) { |
if ($sym1) { |
chop; |
chop; |
$_ .= " " . $sym1 . "\n"; |
$_ .= " $sym1\n"; |
} |
} |
} |
} |
elsif (m|^$f2 $cvsroot|o) { |
elsif (m|^$f2 $cvsroot|o) { |
s|$cvsroot/||o; |
s|$cvsroot/||o; |
if ($sym2) { |
if ($sym2) { |
chop; |
chop; |
$_ .= " " . $sym2 . "\n"; |
$_ .= " $sym2\n"; |
} |
} |
} |
} |
print $_; |
print $_; |
|
|
if ($state eq "tags" && /^\S/) { |
if ($state eq "tags" && /^\S/) { |
if (defined($tag) && (defined($symrev{$tag}) || $tag eq "HEAD")) { |
if (defined($tag) && (defined($symrev{$tag}) || $tag eq "HEAD")) { |
$revwanted = $tag eq "HEAD" ? $symrev{"MAIN"} : $symrev{$tag}; |
$revwanted = $tag eq "HEAD" ? $symrev{"MAIN"} : $symrev{$tag}; |
($branch = $revwanted) =~ s/\b0\.//; |
($branch = $revwanted) =~ s/\.0\././; |
($branchpoint = $branch) =~ s/\.?\d+$//; |
($branchpoint = $branch) =~ s/\.?\d+$//; |
$revwanted = undef if ($revwanted ne $branch); |
$revwanted = undef if ($revwanted ne $branch); |
} |
} |
|
|
# End of a log entry. |
# End of a log entry. |
my $revbranch; |
my $revbranch; |
($revbranch = $rev) =~ s/\.\d+$//; |
($revbranch = $rev) =~ s/\.\d+$//; |
print "$filename $rev Wanted: $revwanted " |
print "$filename $rev Wanted: $revwanted ", |
. "Revbranch: $revbranch Branch: $branch " |
"Revbranch: $revbranch Branch: $branch ", |
. "Branchpoint: $branchpoint\n" if ($verbose); |
"Branchpoint: $branchpoint\n" if ($verbose); |
if (!defined($revwanted) && defined($branch) |
if (!defined($revwanted) && defined($branch) |
&& $branch eq $revbranch || !defined($tag)) { |
&& $branch eq $revbranch || !defined($tag)) { |
print "File revision $rev found for branch $branch\n" |
print "File revision $rev found for branch $branch\n" |
|
|
next; |
next; |
} |
} |
else { |
else { |
$log = $log . $_; |
$log .= $_; |
} |
} |
} |
} |
if (/$LOG_FILESEPARATOR/o) { |
if (/$LOG_FILESEPARATOR/o) { |
Line 1924 sub readLog($;$) { |
|
Line 2034 sub readLog($;$) { |
|
|
|
foreach (reverse sort keys %symrev) { |
foreach (reverse sort keys %symrev) { |
$rev = $symrev{$_}; |
$rev = $symrev{$_}; |
if ($rev =~ /^((.*)\.)?\b0\.(\d+)$/) { |
if ($rev =~ /^((.*)\.)0\.(\d+)$/) { |
push(@branchnames, $_); |
push(@branchnames, $_); |
# |
# |
# A revision number of A.B.0.D really translates into |
# A revision number of A.B.0.D really translates into |
Line 1937 sub readLog($;$) { |
|
Line 2047 sub readLog($;$) { |
|
# with the branch number 0.A, with the exception that |
# with the branch number 0.A, with the exception that |
# it has no head to translate to if there is nothing on |
# it has no head to translate to if there is nothing on |
# the branch, but I guess this can never happen? |
# the branch, but I guess this can never happen? |
# (the code below gracefully forgets about the branch |
|
# if it should happen) |
|
# |
# |
|
# Since some stupid people actually import/check in |
|
# files with version 0.X we assume that the above cannot |
|
# happen, and regard 0.X(.*) as a revision and not a branch. |
|
# |
$head = defined($2) ? $2 : ""; |
$head = defined($2) ? $2 : ""; |
$branch = $3; |
$branch = $3; |
$branchrev = $head . ($head ne "" ? "." : "") . $branch; |
$branchrev = $head . ($head ne "" ? "." : "") . $branch; |
Line 1969 sub readLog($;$) { |
|
Line 2081 sub readLog($;$) { |
|
my ($onlyonbranch, $onlybranchpoint); |
my ($onlyonbranch, $onlybranchpoint); |
if ($onlyonbranch = $input{'only_with_tag'}) { |
if ($onlyonbranch = $input{'only_with_tag'}) { |
$onlyonbranch = $symrev{$onlyonbranch}; |
$onlyonbranch = $symrev{$onlyonbranch}; |
if ($onlyonbranch =~ s/\b0\.//) { |
if ($onlyonbranch =~ s/\.0\././) { |
($onlybranchpoint = $onlyonbranch) =~ s/\.\d+$//; |
($onlybranchpoint = $onlyonbranch) =~ s/\.\d+$//; |
} |
} |
else { |
else { |
Line 2007 sub readLog($;$) { |
|
Line 2119 sub readLog($;$) { |
|
|
|
} |
} |
|
|
|
sub printDiffLinks($$) { |
|
my($text, $url) = @_; |
|
my @extra; |
|
|
|
local $_; |
|
for ($DIFFTYPES{$defaultDiffType}{'colored'} ? qw(u) : qw(h)) { |
|
my $f = $_ eq $defaultDiffType ? '' : $_; |
|
|
|
push @extra, &link(lc $DIFFTYPES{$_}{'descr'}, "$url&f=$f"); |
|
} |
|
|
|
print &link($text, $url), ' (', join(', ', @extra), ')'; |
|
} |
|
|
sub printLog($;$) { |
sub printLog($;$) { |
my ($link, $br, $brp); |
my ($link, $br, $brp); |
($_,$link) = @_; |
($_,$link) = @_; |
Line 2083 sub printLog($;$) { |
|
Line 2209 sub printLog($;$) { |
|
} |
} |
if (defined @mytz) { |
if (defined @mytz) { |
my ($est) = $mytz[(localtime($date{$_}))[8]]; |
my ($est) = $mytz[(localtime($date{$_}))[8]]; |
print ", <i>" . scalar localtime($date{$_}) . " $est</i> ("; |
print ", <i>", scalar localtime($date{$_}), " $est</i> ("; |
} else { |
} else { |
print ", <i>" . scalar gmtime($date{$_}) . " UTC</i> ("; |
print ", <i>", scalar gmtime($date{$_}), " UTC</i> ("; |
} |
} |
print readableTime(time() - $date{$_},1) . " ago)"; |
print readableTime(time() - $date{$_},1), " ago)"; |
print " by "; |
print " by "; |
print "<i>" . $author{$_} . "</i>\n"; |
print "<i>", $author{$_}, "</i>\n"; |
print "<BR>Branch: <b>",$link?link_tags($revsym{$br}):$revsym{$br},"</b>\n" |
print "<BR>Branch: <b>",$link?link_tags($revsym{$br}):$revsym{$br},"</b>\n" |
if ($revsym{$br}); |
if ($revsym{$br}); |
print "<BR>CVS Tags: <b>",$link?link_tags($revsym{$_}):$revsym{$_},"</b>" |
print "<BR>CVS Tags: <b>",$link?link_tags($revsym{$_}):$revsym{$_},"</b>" |
Line 2131 sub printLog($;$) { |
|
Line 2257 sub printLog($;$) { |
|
$barequery); |
$barequery); |
|
|
print " to previous "; |
print " to previous "; |
print &link($prev, $url); |
printDiffLinks($prev, $url); |
if (!$hr_default) { # offer a human readable version if not default |
|
print &link('colored', "$url&f=h"); |
|
} |
|
} |
} |
# |
# |
# 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, |
Line 2147 sub printLog($;$) { |
|
Line 2270 sub printLog($;$) { |
|
$barequery); |
$barequery); |
|
|
print " to branchpoint "; |
print " to branchpoint "; |
print &link($brp, $url); |
printDiffLinks($brp, $url); |
if (!$hr_default) { # offer a human readable version if not default |
|
print &link('colored', "$url&f=h"); |
|
} |
|
} |
} |
# |
# |
# 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, |
Line 2183 sub printLog($;$) { |
|
Line 2303 sub printLog($;$) { |
|
$barequery); |
$barequery); |
|
|
print " next main "; |
print " next main "; |
print &link($nextmain, $url); |
printDiffLinks($nextmain, $url); |
if (!$hr_default) { # offer a human readable version if not default |
|
print &link('colored', "$url&f=h"); |
|
} |
|
} |
} |
} |
} |
# Plus if user has selected only r1, then present a link |
# Plus if user has selected only r1, then present a link |
Line 2201 sub printLog($;$) { |
|
Line 2318 sub printLog($;$) { |
|
$barequery); |
$barequery); |
|
|
print " to selected "; |
print " to selected "; |
print &link($input{'r1'}, $url); |
printDiffLinks($input{'r1'}, $url); |
if (!$hr_default) { # offer a human readable version if not default |
|
print &link('colored', "$url&f=h"); |
|
} |
|
} |
} |
} |
} |
print "<PRE>\n"; |
print "<PRE>\n"; |
|
|
print "<HR noshade>\n"; |
print "<HR noshade>\n"; |
print "<TABLE>"; |
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 "<TR><TD align=right>Preferred Diff type:</TD>"; |
print "<TD>"; |
print "<TD>"; |
printDiffSelect($use_java_script); |
printDiffSelect($use_java_script); |
print "</TD><TD></TD></TR>\n"; |
print "</TD><TD></TD></TR>\n"; |
if (@branchnames) { |
if (@branchnames) { |
|
|
print "<TR><TD align=right>"; |
print "<TR><TD align=right>"; |
print "<A name=logsort></A>\n"; |
print "<A name=logsort></A>\n"; |
print "Sort log by:</TD>"; |
print "Sort log by:</TD>"; |
print "<TD><SELECT NAME=\"logsort\""; |
print "<TD>"; |
print " onchange=\"submit()\"" if ($use_java_script); |
printLogSortSelect($use_java_script); |
print ">\n"; |
print "</TD>"; |
print "<OPTION VALUE=cvs",$logsort eq "cvs" ? " SELECTED" : "", ">Not sorted"; |
|
print "<OPTION VALUE=date",$logsort eq "date" ? " SELECTED" : "", ">Commit date"; |
|
print "<OPTION VALUE=rev",$logsort eq "rev" ? " SELECTED" : "", ">Revision"; |
|
print "</SELECT></TD>"; |
|
print "<TD><INPUT TYPE=SUBMIT VALUE=\" Set \"></TD>"; |
print "<TD><INPUT TYPE=SUBMIT VALUE=\" Set \"></TD>"; |
print "</FORM>\n"; |
print "</FORM>\n"; |
print "</TR></TABLE>"; |
print "</TR></TABLE>"; |
Line 2396 sub human_readable_diff($){ |
|
Line 2506 sub human_readable_diff($){ |
|
$date2 = $r2d; |
$date2 = $r2d; |
} |
} |
|
|
print "<h3 align=center>Diff for /$where_nd between version $rev1 and $rev2</h3>\n"; |
print "<h3 align=center>Diff for /$where_nd between version $rev1 and $rev2</h3>\n", |
|
"<table border=0 cellspacing=0 cellpadding=0 width=\"100%\">\n", |
print "<table border=0 cellspacing=0 cellpadding=0 width=\"100%\">\n"; |
"<tr bgcolor=\"#ffffff\">\n", |
print "<tr bgcolor=\"#ffffff\">\n"; |
"<th width=\"50%\" valign=TOP>", |
print "<th width=\"50%\" valign=TOP>"; |
"version $rev1"; |
print "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); |
print "</th>\n"; |
print "</th>\n", |
print "<th width=\"50%\" valign=TOP>"; |
"<th width=\"50%\" valign=TOP>", |
print "version $rev2"; |
"version $rev2"; |
print ", $date2" if (defined($date2)); |
print ", $date2" if (defined($date2)); |
print "<br>Tag: $sym2\n" if ($sym1); |
print "<br>Tag: $sym2\n" if ($sym1); |
print "</th>\n"; |
print "</th>\n"; |
Line 2531 sub navigateHeader($$$$$) { |
|
Line 2640 sub navigateHeader($$$$$) { |
|
$swhere = urlencode($filename) if ($swhere eq ""); |
$swhere = urlencode($filename) if ($swhere eq ""); |
print "<\!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"; |
print "<\!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"; |
print "<HTML>\n<HEAD>\n"; |
print "<HTML>\n<HEAD>\n"; |
print '<!-- CVSweb $zRevision: 1.103 $ $Revision$ -->'; |
print '<!-- CVSweb $zRevision: 1.104 $ $Revision$ -->'; |
print "\n<TITLE>$path$filename - $title - $rev</TITLE></HEAD>\n"; |
print "\n<TITLE>$path$filename - $title - $rev</TITLE></HEAD>\n"; |
print "$body_tag_for_src\n"; |
print "$body_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\">"; |
Line 2547 sub navigateHeader($$$$$) { |
|
Line 2656 sub navigateHeader($$$$$) { |
|
sub plural_write($$) { |
sub plural_write($$) { |
my ($num,$text) = @_; |
my ($num,$text) = @_; |
if ($num != 1) { |
if ($num != 1) { |
$text = $text . "s"; |
$text .= "s"; |
} |
} |
if ($num > 0) { |
if ($num > 0) { |
return $num . " " . $text; |
return join(' ', $num, $text); |
} |
} |
else { |
else { |
return ""; |
return ""; |
Line 2594 sub readableTime($$) { |
|
Line 2703 sub readableTime($$) { |
|
my $resttime = plural_write(int ($rest / $break), |
my $resttime = plural_write(int ($rest / $break), |
$desc{$break}); |
$desc{$break}); |
if ($resttime) { |
if ($resttime) { |
$retval = $retval . ", " . $resttime; |
$retval .= ", $resttime"; |
} |
} |
} |
} |
|
|
Line 2624 sub clickablePath($$) { |
|
Line 2733 sub clickablePath($$) { |
|
my $wherepath = ''; |
my $wherepath = ''; |
my ($lastslash) = $pathname =~ m|/$|; |
my ($lastslash) = $pathname =~ m|/$|; |
foreach (split(/\//, $pathname)) { |
foreach (split(/\//, $pathname)) { |
$retval = $retval . " / "; |
$retval .= " / "; |
$wherepath = $wherepath . '/' . $_; |
$wherepath .= "/$_"; |
my ($last) = "$wherepath/" eq "/$pathname" |
my ($last) = "$wherepath/" eq "/$pathname" |
|| $wherepath eq "/$pathname"; |
|| $wherepath eq "/$pathname"; |
if ($clickLast || !$last) { |
if ($clickLast || !$last) { |
Line 2669 sub chooseCVSRoot() { |
|
Line 2778 sub chooseCVSRoot() { |
|
foreach $k (@foo) { |
foreach $k (@foo) { |
print "<option value=\"$k\""; |
print "<option value=\"$k\""; |
print " selected" if ($k eq $cvstree); |
print " selected" if ($k eq $cvstree); |
print ">" . ($CVSROOTdescr{$k} ? $CVSROOTdescr{$k} : |
print ">", ($CVSROOTdescr{$k} ? $CVSROOTdescr{$k} : $k), "</option>\n"; |
$k). "</option>\n"; |
|
} |
} |
print "</select>\n</td>"; |
print "</select>\n</td>"; |
print "<td><input type=submit value=\"Go\"></td>"; |
print "<td><input type=submit value=\"Go\"></td>"; |
Line 2735 sub fileSortCmp() { |
|
Line 2843 sub fileSortCmp() { |
|
sub download_url($$;$) { |
sub download_url($$;$) { |
my ($url,$revision,$mimetype) = @_; |
my ($url,$revision,$mimetype) = @_; |
|
|
$revision =~ s/\b0\.//; |
$revision =~ s/\.0\././; |
|
|
if (defined($checkoutMagic) |
if (defined($checkoutMagic) |
&& (!defined($mimetype) || $mimetype ne "text/x-cvsweb-markup")) { |
&& (!defined($mimetype) || $mimetype ne "text/x-cvsweb-markup")) { |
Line 2845 sub htmlquote($) { |
|
Line 2953 sub htmlquote($) { |
|
$_; |
$_; |
} |
} |
|
|
|
sub htmlunquote($) { |
|
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 2852 sub http_header(;$) { |
|
Line 2972 sub http_header(;$) { |
|
Apache->request->header_out("Last-Modified" => scalar gmtime($moddate) . " GMT"); |
Apache->request->header_out("Last-Modified" => scalar gmtime($moddate) . " GMT"); |
} |
} |
else { |
else { |
print "Last-Modified: " . scalar gmtime($moddate) . " GMT\r\n"; |
print "Last-Modified: ", scalar gmtime($moddate), " GMT\r\n"; |
} |
} |
} |
} |
if ($is_mod_perl) { |
if ($is_mod_perl) { |
Line 2903 sub http_header(;$) { |
|
Line 3023 sub http_header(;$) { |
|
|
|
sub html_header($) { |
sub html_header($) { |
my ($title) = @_; |
my ($title) = @_; |
my $version = '$zRevision: 1.103 $ $Revision$'; #' |
my $version = '$zRevision: 1.104 $ $Revision$'; #' |
http_header(); |
http_header(); |
print <<EOH; |
print <<EOH; |
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" |
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN" |