=================================================================== RCS file: /cvs/cvsweb/cvsweb.cgi,v retrieving revision 1.1.1.10 retrieving revision 1.1.1.11 diff -u -p -r1.1.1.10 -r1.1.1.11 --- cvsweb/cvsweb.cgi 2000/10/07 07:50:18 1.1.1.10 +++ cvsweb/cvsweb.cgi 2000/10/20 15:54:58 1.1.1.11 @@ -43,7 +43,7 @@ # SUCH DAMAGE. # # $zId: cvsweb.cgi,v 1.103 2000/09/20 17:02:29 jumager Exp $ -# $kId: cvsweb.cgi,v 1.33 2000/10/07 07:44:12 knu Exp $ +# $kId: cvsweb.cgi,v 1.37 2000/10/20 15:46:01 knu Exp $ # ### @@ -52,6 +52,7 @@ use strict; use vars qw ( $config $allow_version_select $verbose %CVSROOT %CVSROOTdescr %MIRRORS %DEFAULTVALUE %ICONS %MTYPES + @DIFFTYPES %DIFFTYPES @LOGSORTKEYS %LOGSORTKEYS %alltags @tabcolors %fileinfo %tags @branchnames %nameprinted %symrev %revsym @allrevisions %date %author @revdisplayorder @revisions %state %difflines %log %branchpoint @revorder @@ -59,9 +60,9 @@ use vars qw ( $checkoutMagic $doCheckout $scriptname $scriptwhere $where $pathinfo $Browser $nofilelinks $maycompress @stickyvars %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 - $bylog $byfile $hr_default $logsort $cvstree $cvsroot + $bylog $byfile $defaultDiffType $logsort $cvstree $cvsroot $mimetype $defaultTextPlain $defaultViewable $allow_compress $GZIPBIN $backicon $diricon $fileicon $fullname $newname $cvstreedefault $body_tag $body_tag_for_src @@ -74,7 +75,7 @@ use vars qw ( $difffontsize $inputTextSize $mime_types $allow_annotate $allow_markup $use_java_script $open_extern_window $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 $tabstop $state $annTable $sel $curbranch @HideModules $module $use_descriptions %descriptions @mytz $dwhere $moddate @@ -83,7 +84,10 @@ use vars qw ( ); sub printDiffSelect($); +sub printDiffLinks($$); +sub printLogSortSelect($); sub findLastModifiedSubdirs(@); +sub htmlify_sub(&$); sub htmlify($;$); sub spacedHtmlText($;$); sub link($$); @@ -116,6 +120,8 @@ sub download_url($$;$); sub download_link($$$;$); sub toggleQuery($$); sub urlencode($); +sub htmlquote($); +sub htmlunquote($); sub http_header(;$); sub html_header($); sub html_footer(); @@ -156,13 +162,56 @@ $diffcolorChange = $diffcolorAdd = $diffcolorDarkChang $difffontsize = $inputTextSize = $mime_types = $allow_annotate = $allow_markup = $use_java_script = $open_extern_window = $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 = $tabstop = $use_moddate = $moddate = $gzip_open = undef; $LOG_FILESEPARATOR = q/^={77}$/; $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 ##### use Time::Local; @@ -196,12 +245,13 @@ $is_mod_perl = defined($ENV{MOD_PERL}); # per file, so disable the link at the icon # in this case: $Browser = $ENV{HTTP_USER_AGENT}; +$is_links = ($Browser =~ m`^Links `); $is_lynx = ($Browser =~ m`^Lynx/`i); $is_w3m = ($Browser =~ m`^w3m/`i); $is_msie = ($Browser =~ m`MSIE`); $is_mozilla3 = ($Browser =~ m`^Mozilla/[3-9]`); -$is_textbased = ($is_lynx || $is_w3m); +$is_textbased = ($is_links || $is_lynx || $is_w3m); $nofilelinks = $is_textbased; @@ -293,9 +343,9 @@ foreach (@stickyvars) { } # is there any query ? if (@barequery) { - $barequery = join('&', @barequery); + $barequery = join('&', @barequery); $query = "?$barequery"; - $barequery = "&$barequery"; + $barequery = "&$barequery"; } else { $query = ""; @@ -325,7 +375,7 @@ else { $byfile = 1; } -$hr_default = $input{'f'} eq 'h'; +$defaultDiffType = $input{'f'}; $logsort = $input{'logsort'}; @@ -353,7 +403,8 @@ foreach $k (keys %ICONS) { no strict 'refs'; my ($itxt,$ipath,$iwidth,$iheight) = @{$ICONS{$k}}; if ($ipath) { - ${"${k}icon"} = "\"$itxt\""; + ${"${k}icon"} = sprintf('%s', + htmlquote($ipath), htmlquote($itxt), $iwidth, $iheight) } else { ${"${k}icon"} = $itxt; @@ -479,57 +530,63 @@ elsif (-d $fullname) { } print "\n"; $infocols++; - print ""; # do not display the other column-headers, if we do not have any files # with revision information: if (scalar(%fileinfo)) { $infocols++; - print ""; $infocols++; - print ""; if ($show_author) { $infocols++; - print ""; } $infocols++; - print ""; } elsif ($use_descriptions) { - print "
"; - print "" if (!$byfile); - print "File"; - print "" if (!$byfile); + printf '
', + $byfile ? $columnHeaderColorSorted : $columnHeaderColorDefault; + if ($byfile) { + print 'File'; + } else { + print &link('File', sprintf('./%s#dirlist', + &toggleQuery("sortby", "file"))); + } print ""; - print "" if (!$byrev); - print "Rev."; - print "" if (!$byrev); + printf '', + $byrev ? $columnHeaderColorSorted : $columnHeaderColorDefault; + if ($byrev) { + print 'Rev.'; + } else { + print &link('Rev.', sprintf('./%s#dirlist', + &toggleQuery("sortby", "rev"))); + } print ""; - print "" if (!$bydate); - print "Age"; - print "" if (!$bydate); + printf '', + $bydate ? $columnHeaderColorSorted : $columnHeaderColorDefault; + if ($bydate) { + print 'Age'; + } else { + print &link('Age', sprintf('./%s#dirlist', + &toggleQuery("sortby", "date"))); + } print ""; - print "" if (!$byauthor); - print "Author"; - print "" if (!$byauthor); + printf '', + $byauthor ? $columnHeaderColorSorted : $columnHeaderColorDefault; + if ($byauthor) { + print 'Author'; + } else { + print &link('Author', sprintf('./%s#dirlist', + &toggleQuery("sortby", "author"))); + } print ""; - print "" if (!$bylog); - print "Last log entry"; - print "" if (!$bylog); + printf '', + $bylog ? $columnHeaderColorSorted : $columnHeaderColorDefault; + if ($bylog) { + print 'Last log entry'; + } else { + print &link('Last log entry', sprintf('./%s#dirlist', + &toggleQuery("sortby", "log"))); + } print ""; + printf '', $columnHeaderColorDefault; print "Description"; $infocols++; } @@ -554,9 +611,9 @@ elsif (-d $fullname) { closedir($dh); } - my $hideAtticToggleLink = "[Hide]" if (!$input{'hideattic'}); + my $hideAtticToggleLink = $input{'hideattic'} ? '' : + &link('[Hide]', sprintf('./%s#dirlist', + &toggleQuery ("hideattic"))); # Sort without the Attic/ pathname. # place directories first @@ -594,38 +651,38 @@ elsif (-d $fullname) { next if ($_ eq '..' && $where eq '/'); my ($rev,$date,$log,$author,$filename) = @{$fileinfo{$_}} if (defined($fileinfo{$_})); - print "
" if ($dirtable); + printf '
', $tabcolors[$dirrow % 2] if $dirtable; if ($_ eq '..') { - $url = "../" . $query; + $url = "../$query"; if ($nofilelinks) { print $backicon; } else { - print &link($backicon,$url); + print &link($backicon, $url); } - print " ", &link("Previous Directory",$url); + print " ", &link("Previous Directory", $url); } else { - $url = urlencode($_) . '/' . $query; + $url = urlencode($_) . "/$query"; print ""; if ($nofilelinks) { print $diricon; } else { - print &link($diricon,$url); + print &link($diricon, $url); } - print " ", &link($_ . "/", $url), $attic; + print " ", &link("$_/", $url), $attic; if ($_ eq "Attic") { - print "  [Don't hide]"; + print "  "; + print &link("[Don't hide]", sprintf('./%s#dirlist', + &toggleQuery ("hideattic"))); } } # Show last change in dir if ($filename) { print "  " if ($dirtable); if ($date) { - print " " . readableTime(time() - $date,0) . ""; + print " ", readableTime(time() - $date,0), ""; } if ($show_author) { print " " if ($dirtable); @@ -636,8 +693,8 @@ elsif (-d $fullname) { print "$filename/$rev"; print "
" if ($dirtable); if ($log) { - print " " - . &htmlify(substr($log,0,$shortLogLen)); + print " ", + &htmlify(substr($log,0,$shortLogLen)); if (length $log > 80) { print "..."; } @@ -647,7 +704,7 @@ elsif (-d $fullname) { else { my ($dwhere) = ($where ne "/" ? $where : "") . $_; if ($use_descriptions && defined $descriptions{$dwhere}) { - print "
 " if $dirtable; + print " " if $dirtable; print $descriptions{$dwhere}; } elsif ($dirtable && $infocols > 1) { # close the row with the appropriate number of @@ -678,7 +735,7 @@ elsif (-d $fullname) { next if (!defined($fileinfo{$_})); ($rev,$date,$log,$author) = @{$fileinfo{$_}}; $filesfound++; - print "
" if ($dirtable); + printf '
', $tabcolors[$dirrow % 2] if $dirtable; print ""; if ($nofilelinks) { print $fileicon; @@ -689,11 +746,11 @@ elsif (-d $fullname) { print " ", &link($_, $url), $attic; print " " if ($dirtable); download_link($fileurl, - $rev, $rev, - $defaultViewable ? "text/x-cvsweb-markup" : undef); + $rev, $rev, + $defaultViewable ? "text/x-cvsweb-markup" : undef); print " " if ($dirtable); if ($date) { - print " " . readableTime(time() - $date,0) . ""; + print " ", readableTime(time() - $date,0), ""; } if ($show_author) { print " " if ($dirtable); @@ -701,7 +758,7 @@ elsif (-d $fullname) { } print " " if ($dirtable); if ($log) { - print " " . &htmlify(substr($log,0,$shortLogLen)); + print " ", &htmlify(substr($log,0,$shortLogLen)); if (length $log > 80) { print "..."; } @@ -716,7 +773,7 @@ elsif (-d $fullname) { if ($dirtable && defined($tableBorderColor)) { print "
"; } - print "". ($dirtable == 1) ? "" : "" . "\n"; + print( $dirtable == 1 ? "\n" : "\n" ); if ($filesexists && !$filesfound) { print "

NOTE: There are $filesexists files, but none matches the current tag ($input{only_with_tag})\n"; @@ -774,12 +831,9 @@ elsif (-d $fullname) { print "Revision"; print "Log message"; print ""; - print "revisions by: \n"; - print ""; + print "Sort log by: "; + printLogSortSelect(0); + print ""; print "Diff format: "; printDiffSelect(0); print ""; @@ -873,18 +927,43 @@ gzipclose(); sub printDiffSelect($) { my ($use_java_script) = @_; - my ($f) = $input{'f'}; - print "'; + + local $_; + for (@DIFFTYPES) { + printf('


"; print "
"; print "File: ", &clickablePath($where, 1); - print " "; - &download_link(urlencode($fileurl), $revision, "(download)"); + print " ("; + &download_link($fileurl, $revision, "download"); + print ")"; if (!$defaultTextPlain) { - print " "; - &download_link(urlencode($fileurl), $revision, "(as text)", + print " ("; + &download_link($fileurl, $revision, "as text", "text/plain"); + print ")"; } print "
\n"; if ($show_log_in_markup) { @@ -1424,10 +1563,10 @@ sub cvswebMarkup($$$) { my $url = download_url($fileurl, $revision, $mimetype); print "
"; if ($mimetype =~ /^image/) { - print "
"; + printf '
', htmlquote("$url$barequery"); } elsif ($mimetype =~ m%^application/pdf%) { - print "
"; + printf '
', htmlquote("$url$barequery"); } else { print "
";
@@ -1458,7 +1597,7 @@ sub viewable($) {
 sub doDiff($$$$$$) {
 	my($fullname, $r1, $tr1, $r2, $tr2, $f) = @_;
         my $fh = do {local(*FH);};
-	my ($rev1, $rev2, $sym1, $sym2, @difftype, $diffname, $f1, $f2);
+	my ($rev1, $rev2, $sym1, $sym2, $f1, $f2);
 
 	if ($r1 =~ /([^:]+)(:(.+))?/) {
 	    $rev1 = $1;
@@ -1492,36 +1631,18 @@ sub doDiff($$$$$$) {
 	    ($rev1, $sym1) = ($rev2, $sym2);
 	    ($rev2, $sym2) = ($tmp1, $tmp2);
 	}
-	my $human_readable = 0;
-	if ($f eq 'c') {
-	    @difftype = qw{-c};
-	    $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 {
+	my $difftype = $DIFFTYPES{$f};
+
+	if (!$difftype) {
 	    fatal ("400 Bad arguments", "Diff format $f not understood");
 	}
 
+	my @difftype       = @{$difftype->{'opts'}};
+	my $human_readable = $difftype->{'colored'};
+
 	# apply special options
 	if ($showfunc) {
-	    push @difftype, '-p' if $f =~ /^[cHhu]$/;
+	    push @difftype, '-p' if $f ne 's';
 
 	    my($re1, $re2);
 
@@ -1583,14 +1704,14 @@ sub doDiff($$$$$$) {
 		s|$cvsroot/||o;
 		if ($sym1) {
 		    chop;
-		    $_ .= " " . $sym1 . "\n";
+		    $_ .= " $sym1\n";
 		}
 	    }
 	    elsif (m|^$f2 $cvsroot|o) {
 		s|$cvsroot/||o;
 		if ($sym2) {
 		    chop;
-		    $_ .= " " . $sym2 . "\n";
+		    $_ .= " $sym2\n";
 		}
 	    }
 	    print $_;
@@ -1712,9 +1833,9 @@ again:
 		# End of a log entry.
 		my $revbranch;
 		($revbranch = $rev) =~ s/\.\d+$//;
-		print "$filename $rev Wanted: $revwanted "
-		    . "Revbranch: $revbranch Branch: $branch "
-		    . "Branchpoint: $branchpoint\n" if ($verbose);
+		print "$filename $rev Wanted: $revwanted ",
+		  "Revbranch: $revbranch Branch: $branch ",
+		    "Branchpoint: $branchpoint\n" if ($verbose);
 		if (!defined($revwanted) && defined($branch)
 		    && $branch eq $revbranch || !defined($tag)) {
 		    print "File revision $rev found for branch $branch\n"
@@ -1752,7 +1873,7 @@ again:
 		next;
 	    }
 	    else {
-		$log = $log . $_;
+		$log .= $_;
 	    }
 	}
 	if (/$LOG_FILESEPARATOR/o) {
@@ -1995,6 +2116,20 @@ 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($;$) {
 	my ($link, $br, $brp);
 	($_,$link) = @_;
@@ -2023,29 +2158,40 @@ sub printLog($;$) {
 	    }
 	    print "\n Revision ";
 	    &download_link($fileurl, $_, $_,
-		$defaultViewable ? "text/x-cvsweb-markup" : undef);
+			   $defaultViewable ? "text/x-cvsweb-markup" : undef);
 	    if ($defaultViewable) {
-		print " / ";
-		&download_link($fileurl, $_, "(download)", $mimetype);
+		print " / (";
+		&download_link($fileurl, $_, "download", $mimetype);
+		print ")";
 	    }
 	    if (not $defaultTextPlain) {
-		print " / ";
-		&download_link($fileurl, $_, "(as text)",
-			   "text/plain");
+		print " / (";
+		&download_link($fileurl, $_, "as text", "text/plain");
+		print ")";
 	    }
 	    if (!$defaultViewable) {
-		print " / ";
-		&download_link($fileurl, $_, "(view)", "text/x-cvsweb-markup");
+		print " / (";
+		&download_link($fileurl, $_, "view", "text/x-cvsweb-markup");
+		print ")";
 	    }
 	    if ($allow_annotate) {
-		print " - ";
-		print "annotate";
+		print " - ";
+		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
 	    if ($allow_version_select) {
 		if ((!defined($input{"r1"}) || $input{"r1"} ne $_)) {
-		    print " - [select for diffs]\n";
+		    print " - ";
+		    print &link('[select for diffs]',
+				sprintf('%s?r1=%s%s',
+					$scriptwhere,
+					$_,
+					$barequery));
 		}
 		else {
 		    print " - [selected]";
@@ -2060,13 +2206,13 @@ sub printLog($;$) {
 	}
 	if (defined @mytz) {
 	    my ($est) = $mytz[(localtime($date{$_}))[8]];
-	    print ", " . scalar localtime($date{$_}) . " $est (";
+	    print ", ", scalar localtime($date{$_}), " $est (";
 	} else {
-	    print ", " . scalar gmtime($date{$_}) . " UTC (";
+	    print ", ", scalar gmtime($date{$_}), " UTC (";
 	}
-	print readableTime(time() - $date{$_},1) . " ago)";
+	print readableTime(time() - $date{$_},1), " ago)";
 	print " by ";
-	print "" . $author{$_} . "\n";
+	print "", $author{$_}, "\n";
 	print "
Branch: ",$link?link_tags($revsym{$br}):$revsym{$br},"\n" if ($revsym{$br}); print "
CVS Tags: ",$link?link_tags($revsym{$_}):$revsym{$_},"" @@ -2100,23 +2246,28 @@ sub printLog($;$) { # Offer diff to previous revision if ($prev) { $diffrev{$prev} = 1; - print " to previous $prev\n"; - if (!$hr_default) { # offer a human readable version if not default - print "(colored)\n"; - } + + my $url = sprintf('%s.diff?r1=%s&r2=%s%s', + $scriptwhere, + $prev, + $_, + $barequery); + + print " to previous "; + printDiffLinks($prev, $url); } # # Plus, if it's on a branch, and it's not a vendor branch, # offer a diff with the branch point. if ($revsym{$brp} && !/^1\.1\.1\.\d+$/ && !defined($diffrev{$brp})) { - print " to branchpoint $brp\n"; - if (!$hr_default) { # offer a human readable version if not default - print "(colored)\n"; - } + my $url = sprintf('%s.diff?r1=%s&r2=%s%s', + $scriptwhere, + $brp, + $_, + $barequery); + + print " to branchpoint "; + printDiffLinks($brp, $url); } # # Plus, if it's on a branch, and it's not a vendor branch, @@ -2141,29 +2292,30 @@ sub printLog($;$) { } if (!defined($diffrev{$nextmain})) { $diffrev{$nextmain} = 1; - print " next main $nextmain\n"; - if (!$hr_default) { # offer a human readable version if not default - print "(colored)\n"; - } + + my $url = sprintf('%s.diff?r1=%s&r2=%s%s', + $scriptwhere, + $nextmain, + $_, + $barequery); + + print " next main "; + printDiffLinks($nextmain, $url); } } # Plus if user has selected only r1, then present a link # to make a diff to that revision if (defined($input{"r1"}) && !defined($diffrev{$input{"r1"}})) { $diffrev{$input{"r1"}} = 1; - print " to selected $input{'r1'}\n"; - if (!$hr_default) { # offer a human readable version if not default - print "(colored)\n"; - } + my $url = sprintf('%s.diff?r1=%s&r2=%s%s', + $scriptwhere, + $input{'r1'}, + $_, + $barequery); + + print " to selected "; + printDiffLinks($input{'r1'}, $url); } } print "
\n";
@@ -2182,11 +2334,10 @@ sub doLog($) {
         ($filename = $where) =~ s|^.*/||;
         $backurl = $scriptname . "/" . urlencode($upwhere) . $query;
 	print &link($backicon, "$backurl#$filename"),
-              " Up to ", &clickablePath($upwhere, 1), "

\n"; - print <Request diff between arbitrary revisions -


-EOF + " Up to ", &clickablePath($upwhere, 1), "

\n"; + print &link('Request diff between arbitrary revisions', '#diff'); + print '


'; + if ($curbranch) { print "Default branch: ", ($revsym{$curbranch} || $curbranch); } @@ -2214,7 +2365,7 @@ EOF print "

\n"; print "

\n"; foreach (@stickyvars) { - print "\n" + printf('', $_, $input{$_}) if (defined($input{$_}) && ((!defined($DEFAULTVALUE{$_}) || $input{$_} ne $DEFAULTVALUE{$_}) @@ -2244,8 +2395,8 @@ EOF print "
\n"; print ""; print "\n"; - print ""; - print ""; + print "\n"; if (@branchnames) { @@ -2280,13 +2431,9 @@ EOF print ""; - print ""; + print ""; print ""; print "\n"; print "
Preferred Diff type:"; + print "
Preferred Diff type:"; printDiffSelect($use_java_script); print "
"; print "\n"; print "Sort log by:"; + printLogSortSelect($use_java_script); + print "
"; @@ -2356,17 +2503,16 @@ sub human_readable_diff($){ $date2 = $r2d; } - print "

Diff for /$where_nd between version $rev1 and $rev2

\n"; - - print "\n"; - print "\n"; - print "
"; - print "version $rev1"; + print "

Diff for /$where_nd between version $rev1 and $rev2

\n", + "\n", + "\n", + "\n"; - print "\n", + "\n"; @@ -2491,12 +2637,12 @@ sub navigateHeader($$$$$) { $swhere = urlencode($filename) if ($swhere eq ""); print "<\!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">"; print "\n\n"; - print ''; + print ''; print "\n$path$filename - $title - $rev\n"; print "$body_tag_for_src\n"; print "
", + "version $rev1"; print ", $date1" if (defined($date1)); print "
Tag: $sym1\n" if ($sym1); - print "
"; - print "version $rev2"; + print "", + "version $rev2"; print ", $date2" if (defined($date2)); print "
Tag: $sym2\n" if ($sym1); print "
"; print ""; @@ -2507,10 +2653,10 @@ sub navigateHeader($$$$$) { sub plural_write($$) { my ($num,$text) = @_; if ($num != 1) { - $text = $text . "s"; + $text .= "s"; } if ($num > 0) { - return $num . " " . $text; + return join(' ', $num, $text); } else { return ""; @@ -2554,7 +2700,7 @@ sub readableTime($$) { my $resttime = plural_write(int ($rest / $break), $desc{$break}); if ($resttime) { - $retval = $retval . ", " . $resttime; + $retval .= ", $resttime"; } } @@ -2578,24 +2724,26 @@ sub clickablePath($$) { $retval = "[$cvstree]"; } else { - $retval = $retval . " [$cvstree]"; + $retval .= ' ' . &link("[$cvstree]", sprintf('%s/%s#dirlist', + $scriptname, + $query)); my $wherepath = ''; my ($lastslash) = $pathname =~ m|/$|; foreach (split(/\//, $pathname)) { - $retval = $retval . " / "; - $wherepath = $wherepath . '/' . $_; + $retval .= " / "; + $wherepath .= "/$_"; my ($last) = "$wherepath/" eq "/$pathname" || $wherepath eq "/$pathname"; if ($clickLast || !$last) { - $retval = $retval . "$_"; + $retval .= &link($_, join('', + $scriptname, + urlencode($wherepath), + (!$last || $lastslash ? '/' : ''), + $query, + (!$last || $lastslash ? "#dirlist" : ""))); } else { # do not make a link to the current dir - $retval = $retval . $_; + $retval .= $_; } } } @@ -2627,8 +2775,7 @@ sub chooseCVSRoot() { foreach $k (@foo) { print "\n"; + print ">", ($CVSROOTdescr{$k} ? $CVSROOTdescr{$k} : $k), "\n"; } print "\n"; print ""; @@ -2652,7 +2799,7 @@ sub chooseMirror() { print "\nThis cvsweb is mirrored in:\n"; foreach $mirror (keys %MIRRORS) { print ", " if ($moremirrors); - print qq($mirror\n); + print &link(htmlquote($mirror),$MIRRORS{$mirror}); $moremirrors = 1; } print "

\n"; @@ -2695,32 +2842,28 @@ sub download_url($$;$) { $revision =~ s/\b0\.//; - if (defined($checkout_magic) + if (defined($checkoutMagic) && (!defined($mimetype) || $mimetype ne "text/x-cvsweb-markup")) { - my ($path); - ($path = $where) =~ s|/[^/]*$|/|; + my $path = $where; + $path =~ s|/[^/]*$|/|; $url = "$scriptname/$checkoutMagic/${path}$url"; } $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 # selected revision sub download_link($$$;$) { - my ($url,$revision,$textlink,$mimetype) = @_; - my ($fullurl) = download_url($url,$revision,$mimetype); - my ($paren) = $textlink =~ /^\(/; - $textlink =~ s/^\(// if ($paren); - $textlink =~ s/\)$// if ($paren); - print "(" if ($paren); - print "$textlink"; - print ")" if ($paren); } # Returns a Query string with the @@ -2771,7 +2919,7 @@ sub toggleQuery($$) { my ($value) = defined($vars{$var}) ? $vars{$var} : ""; my ($default) = defined($DEFAULTVALUE{$var}) ? $DEFAULTVALUE{$var} : ""; if ($value ne $default) { - $newquery .= "&" if ($newquery ne ""); + $newquery .= "&" if ($newquery ne ""); $newquery .= urlencode($var) . "=" . urlencode($value); } } @@ -2782,12 +2930,38 @@ sub toggleQuery($$) { } sub urlencode($) { - my ($in) = @_; - my ($out); - ($out = $in) =~ s/([\000-+{-\377])/sprintf("%%%02x", ord($1))/ge; - return $out; + local($_) = @_; + + s/[\000-+{-\377]/sprintf("%%%02x", ord($&))/ge; + + + $_; } +sub htmlquote($) { + local($_) = @_; + + # Special Characters; RFC 1866 + s/&/&/g; + s/\"/"/g; + s//>/g; + + $_; +} + +sub htmlunquote($) { + local($_) = @_; + + # Special Characters; RFC 1866 + s/"/\"/g; + s/<//g; + s/&/&/g; + + $_; +} + sub http_header(;$) { my $content_type = shift || "text/html"; if (defined($moddate)) { @@ -2795,7 +2969,7 @@ sub http_header(;$) { Apache->request->header_out("Last-Modified" => scalar gmtime($moddate) . " GMT"); } else { - print "Last-Modified: " . scalar gmtime($moddate) . " GMT\r\n"; + print "Last-Modified: ", scalar gmtime($moddate), " GMT\r\n"; } } if ($is_mod_perl) { @@ -2846,7 +3020,7 @@ sub http_header(;$) { sub html_header($) { my ($title) = @_; - my $version = '$zRevision: 1.103 $ $kRevision: 1.33 $'; #' + my $version = '$zRevision: 1.103 $ $kRevision: 1.37 $'; #' http_header(); print <$sym"; + $ret .= &link($sym, $fileurl . toggleQuery('only_with_tag',$sym)); } - return $ret."\n"; + return "$ret\n"; } #

"; - print "$backicon"; + print &link($backicon, "$swhere$query#rev$rev"); print " Return to ", &link("$filename","$swhere$query#rev$rev")," CVS log"; print " $fileicon