* [PATCH 5/7] gitweb: Convert output to using indirect file handle
2010-01-13 9:34 ` [PATCH 4/7] gitweb: Optionally add "git" links in project list page John 'Warthog9' Hawley
@ 2010-01-13 9:34 ` John 'Warthog9' Hawley
2010-01-13 9:34 ` [PATCH 6/7] gitweb: add a get function to compliment print_local_time John 'Warthog9' Hawley
0 siblings, 1 reply; 11+ messages in thread
From: John 'Warthog9' Hawley @ 2010-01-13 9:34 UTC (permalink / raw)
To: git
This converts the output handling of gitweb to using an indirect
file handle. This is in preparation to add the caching layer. This
is a slight modification to the way I was originally doing it by
passing the output around. This should be a nop and this shouldn't
change the behavior of gitweb. This does leave error reporting
functions (die_error specifically) continuing to output directly
as I want to garauntee those will report their errors regardless of
what may be going on with respect to the rest of the output.
---
gitweb/gitweb.perl | 876 ++++++++++++++++++++++++++--------------------------
1 files changed, 442 insertions(+), 434 deletions(-)
diff --git a/gitweb/gitweb.perl b/gitweb/gitweb.perl
index b8f2a67..3b6bc06 100755
--- a/gitweb/gitweb.perl
+++ b/gitweb/gitweb.perl
@@ -455,6 +455,13 @@ our %feature = (
'default' => [0]},
);
+# Basic file handler for all of gitweb, there are two of them. The first
+# is the basic text/html file handler which is used for everything other
+# then the binary files, that uses a separate file handler though
+# these are both set to STDOUT for the time being.
+our $output_handler = *STDOUT;
+our $output_handler_bin = *STDOUT;
+
sub gitweb_get_feature {
my ($name) = @_;
return unless exists $feature{$name};
@@ -3091,7 +3098,7 @@ sub insert_file {
my $filename = shift;
open my $fd, '<', $filename;
- print map { to_utf8($_) } <$fd>;
+ print {$output_handler} map { to_utf8($_) } <$fd>;
close $fd;
}
@@ -3208,10 +3215,10 @@ sub git_header_html {
} else {
$content_type = 'text/html';
}
- print $cgi->header(-type=>$content_type, -charset => 'utf-8',
+ print {$output_handler} $cgi->header(-type=>$content_type, -charset => 'utf-8',
-status=> $status, -expires => $expires);
my $mod_perl_version = $ENV{'MOD_PERL'} ? " $ENV{'MOD_PERL'}" : '';
- print <<EOF;
+ print {$output_handler} <<EOF;
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
@@ -3226,16 +3233,16 @@ EOF
# the stylesheet, favicon etc urls won't work correctly with path_info
# unless we set the appropriate base URL
if ($ENV{'PATH_INFO'}) {
- print "<base href=\"".esc_url($base_url)."\" />\n";
+ print {$output_handler} "<base href=\"".esc_url($base_url)."\" />\n";
}
# print out each stylesheet that exist, providing backwards capability
# for those people who defined $stylesheet in a config file
if (defined $stylesheet) {
- print '<link rel="stylesheet" type="text/css" href="'.$stylesheet.'"/>'."\n";
+ print {$output_handler} '<link rel="stylesheet" type="text/css" href="'.$stylesheet.'"/>'."\n";
} else {
foreach my $stylesheet (@stylesheets) {
next unless $stylesheet;
- print '<link rel="stylesheet" type="text/css" href="'.$stylesheet.'"/>'."\n";
+ print {$output_handler} '<link rel="stylesheet" type="text/css" href="'.$stylesheet.'"/>'."\n";
}
}
if (defined $project) {
@@ -3254,7 +3261,7 @@ EOF
$href_params{'action'} = $type;
$link_attr{'-href'} = href(%href_params);
- print "<link ".
+ print {$output_handler} "<link ".
"rel=\"$link_attr{'-rel'}\" ".
"title=\"$link_attr{'-title'}\" ".
"href=\"$link_attr{'-href'}\" ".
@@ -3264,7 +3271,7 @@ EOF
$href_params{'extra_options'} = '--no-merges';
$link_attr{'-href'} = href(%href_params);
$link_attr{'-title'} .= ' (no merges)';
- print "<link ".
+ print {$output_handler} "<link ".
"rel=\"$link_attr{'-rel'}\" ".
"title=\"$link_attr{'-title'}\" ".
"href=\"$link_attr{'-href'}\" ".
@@ -3273,37 +3280,37 @@ EOF
}
} else {
- printf('<link rel="alternate" title="%s projects list" '.
+ printf( {$output_handler} '<link rel="alternate" title="%s projects list" '.
'href="%s" type="text/plain; charset=utf-8" />'."\n",
$site_name, href(project=>undef, action=>"project_index"));
- printf('<link rel="alternate" title="%s projects feeds" '.
+ printf( {$output_handler} '<link rel="alternate" title="%s projects feeds" '.
'href="%s" type="text/x-opml" />'."\n",
$site_name, href(project=>undef, action=>"opml"));
}
if (defined $favicon) {
- print qq(<link rel="shortcut icon" href="$favicon" type="image/png" />\n);
+ print {$output_handler} qq(<link rel="shortcut icon" href="$favicon" type="image/png" />\n);
}
- print "</head>\n" .
+ print {$output_handler} "</head>\n" .
"<body>\n";
if (-f $site_header) {
insert_file($site_header);
}
- print "<div class=\"page_header\">\n" .
+ print {$output_handler} "<div class=\"page_header\">\n" .
$cgi->a({-href => esc_url($logo_url),
-title => $logo_label},
qq(<img src="$logo" width="72" height="27" alt="git" class="logo"/>));
- print $cgi->a({-href => esc_url($home_link)}, $home_link_str) . " / ";
+ print {$output_handler} $cgi->a({-href => esc_url($home_link)}, $home_link_str) . " / ";
if (defined $project) {
- print $cgi->a({-href => href(action=>"summary")}, esc_html($project));
+ print {$output_handler} $cgi->a({-href => href(action=>"summary")}, esc_html($project));
if (defined $action) {
- print " / $action";
+ print {$output_handler} " / $action";
}
- print "\n";
+ print {$output_handler} "\n";
}
- print "</div>\n";
+ print {$output_handler} "</div>\n";
my $have_search = gitweb_check_feature('search');
if (defined $project && $have_search) {
@@ -3323,7 +3330,7 @@ EOF
if ($use_pathinfo) {
$action .= "/".esc_url($project);
}
- print $cgi->startform(-method => "get", -action => $action) .
+ print {$output_handler} $cgi->startform(-method => "get", -action => $action) .
"<div class=\"search\">\n" .
(!$use_pathinfo &&
$cgi->input({-name=>"p", -value=>$project, -type=>"hidden"}) . "\n") .
@@ -3346,11 +3353,11 @@ EOF
sub git_footer_html {
my $feed_class = 'rss_logo';
- print "<div class=\"page_footer\">\n";
+ print {$output_handler} "<div class=\"page_footer\">\n";
if (defined $project) {
my $descr = git_get_project_description($project);
if (defined $descr) {
- print "<div class=\"page_footer_text\">" . esc_html($descr) . "</div>\n";
+ print {$output_handler} "<div class=\"page_footer_text\">" . esc_html($descr) . "</div>\n";
}
my %href_params = get_feed_info();
@@ -3361,22 +3368,22 @@ sub git_footer_html {
foreach my $format qw(RSS Atom) {
$href_params{'action'} = lc($format);
- print $cgi->a({-href => href(%href_params),
+ print {$output_handler} $cgi->a({-href => href(%href_params),
-title => "$href_params{'-title'} $format feed",
-class => $feed_class}, $format)."\n";
}
} else {
- print $cgi->a({-href => href(project=>undef, action=>"opml"),
+ print {$output_handler} $cgi->a({-href => href(project=>undef, action=>"opml"),
-class => $feed_class}, "OPML") . " ";
- print $cgi->a({-href => href(project=>undef, action=>"project_index"),
+ print {$output_handler} $cgi->a({-href => href(project=>undef, action=>"project_index"),
-class => $feed_class}, "TXT") . "\n";
}
- print "</div>\n"; # class="page_footer"
+ print {$output_handler} "</div>\n"; # class="page_footer"
if (defined $t0 && gitweb_check_feature('timed')) {
- print "<div id=\"generating_info\">\n";
- print 'This page took '.
+ print {$output_handler} "<div id=\"generating_info\">\n";
+ print {$output_handler} 'This page took '.
'<span id="generating_time" class="time_span">'.
Time::HiRes::tv_interval($t0, [Time::HiRes::gettimeofday()]).
' seconds </span>'.
@@ -3385,26 +3392,26 @@ sub git_footer_html {
$number_of_git_cmds.
'</span> git commands '.
" to generate.\n";
- print "</div>\n"; # class="page_footer"
+ print {$output_handler} "</div>\n"; # class="page_footer"
}
if (-f $site_footer) {
insert_file($site_footer);
}
- print qq!<script type="text/javascript" src="$javascript"></script>\n!;
+ print {$output_handler} qq!<script type="text/javascript" src="$javascript"></script>\n!;
if ($action eq 'blame_incremental') {
- print qq!<script type="text/javascript">\n!.
+ print {$output_handler} qq!<script type="text/javascript">\n!.
qq!startBlame("!. href(action=>"blame_data", -replay=>1) .qq!",\n!.
qq! "!. href() .qq!");\n!.
qq!</script>\n!;
} elsif (gitweb_check_feature('javascript-actions')) {
- print qq!<script type="text/javascript">\n!.
+ print {$output_handler} qq!<script type="text/javascript">\n!.
qq!window.onload = fixLinks;\n!.
qq!</script>\n!;
}
- print "</body>\n" .
+ print {$output_handler} "</body>\n" .
"</html>";
}
@@ -3488,12 +3495,12 @@ sub git_print_page_nav {
$arg{$label}{'_href'} = $link;
}
- print "<div class=\"page_nav\">\n" .
+ print {$output_handler} "<div class=\"page_nav\">\n" .
(join " | ",
map { $_ eq $current ?
$_ : $cgi->a({-href => ($arg{$_}{_href} ? $arg{$_}{_href} : href(%{$arg{$_}}))}, "$_")
} @navs);
- print "<br/>\n$extra<br/>\n" .
+ print {$output_handler} "<br/>\n$extra<br/>\n" .
"</div>\n";
}
@@ -3534,7 +3541,7 @@ sub git_print_header_div {
$args{'hash'} = $hash if $hash;
$args{'hash_base'} = $hash_base if $hash_base;
- print "<div class=\"header\">\n" .
+ print {$output_handler} "<div class=\"header\">\n" .
$cgi->a({-href => href(%args), -class => "title"},
$title ? $title : $action) .
"\n</div>\n";
@@ -3543,10 +3550,10 @@ sub git_print_header_div {
sub print_local_time {
my %date = @_;
if ($date{'hour_local'} < 6) {
- printf(" (<span class=\"atnight\">%02d:%02d</span> %s)",
+ printf({$output_handler} " (<span class=\"atnight\">%02d:%02d</span> %s)",
$date{'hour_local'}, $date{'minute_local'}, $date{'tz_local'});
} else {
- printf(" (%02d:%02d %s)",
+ printf({$output_handler} " (%02d:%02d %s)",
$date{'hour_local'}, $date{'minute_local'}, $date{'tz_local'});
}
}
@@ -3559,11 +3566,11 @@ sub git_print_authorship {
my $author = $co->{'author_name'};
my %ad = parse_date($co->{'author_epoch'}, $co->{'author_tz'});
- print "<$tag class=\"author_date\">" .
+ print {$output_handler} "<$tag class=\"author_date\">" .
format_search_author($author, "author", esc_html($author)) .
" [$ad{'rfc2822'}";
- print_local_time(%ad) if ($opts{-localtime});
- print "]" . git_get_avatar($co->{'author_email'}, -pad_before => 1)
+ print {$output_handler} get_local_time(%ad) if ($opts{-localtime});
+ print {$output_handler} "]" . git_get_avatar($co->{'author_email'}, -pad_before => 1)
. "</$tag>\n";
}
@@ -3579,7 +3586,7 @@ sub git_print_authorship_rows {
@people = ('author', 'committer') unless @people;
foreach my $who (@people) {
my %wd = parse_date($co->{"${who}_epoch"}, $co->{"${who}_tz"});
- print "<tr><td>$who</td><td>" .
+ print {$output_handler} "<tr><td>$who</td><td>" .
format_search_author($co->{"${who}_name"}, $who,
esc_html($co->{"${who}_name"})) . " " .
format_search_author($co->{"${who}_email"}, $who,
@@ -3589,8 +3596,8 @@ sub git_print_authorship_rows {
"</td></tr>\n" .
"<tr>" .
"<td></td><td> $wd{'rfc2822'}";
- print_local_time(%wd);
- print "</td>" .
+ print {$output_handler} get_local_time(%wd);
+ print {$output_handler} "</td>" .
"</tr>\n";
}
}
@@ -3600,11 +3607,10 @@ sub git_print_page_path {
my $type = shift;
my $hb = shift;
-
- print "<div class=\"page_path\">";
- print $cgi->a({-href => href(action=>"tree", hash_base=>$hb),
+ print {$output_handler} "<div class=\"page_path\">";
+ print {$output_handler} $cgi->a({-href => href(action=>"tree", hash_base=>$hb),
-title => 'tree root'}, to_utf8("[$project]"));
- print " / ";
+ print {$output_handler} " / ";
if (defined $name) {
my @dirname = split '/', $name;
my $basename = pop @dirname;
@@ -3612,25 +3618,25 @@ sub git_print_page_path {
foreach my $dir (@dirname) {
$fullname .= ($fullname ? '/' : '') . $dir;
- print $cgi->a({-href => href(action=>"tree", file_name=>$fullname,
+ print {$output_handler} $cgi->a({-href => href(action=>"tree", file_name=>$fullname,
hash_base=>$hb),
-title => $fullname}, esc_path($dir));
- print " / ";
+ print {$output_handler} " / ";
}
if (defined $type && $type eq 'blob') {
- print $cgi->a({-href => href(action=>"blob_plain", file_name=>$file_name,
+ print {$output_handler} $cgi->a({-href => href(action=>"blob_plain", file_name=>$file_name,
hash_base=>$hb),
-title => $name}, esc_path($basename));
} elsif (defined $type && $type eq 'tree') {
- print $cgi->a({-href => href(action=>"tree", file_name=>$file_name,
+ print {$output_handler} $cgi->a({-href => href(action=>"tree", file_name=>$file_name,
hash_base=>$hb),
-title => $name}, esc_path($basename));
- print " / ";
+ print {$output_handler} " / ";
} else {
- print esc_path($basename);
+ print {$output_handler} esc_path($basename);
}
}
- print "<br/></div>\n";
+ print {$output_handler} "<br/></div>\n";
}
sub git_print_log {
@@ -3654,7 +3660,7 @@ sub git_print_log {
$signoff = 1;
$empty = 0;
if (! $opts{'-remove_signoff'}) {
- print "<span class=\"signoff\">" . esc_html($line) . "</span><br/>\n";
+ print {$output_handler} "<span class=\"signoff\">" . esc_html($line) . "</span><br/>\n";
next;
} else {
# remove signoff lines
@@ -3673,12 +3679,12 @@ sub git_print_log {
$empty = 0;
}
- print format_log_line_html($line) . "<br/>\n";
+ print {$output_handler} format_log_line_html($line) . "<br/>\n";
}
if ($opts{'-final_empty_line'}) {
# end with single empty line
- print "<br/>\n" unless $empty;
+ print {$output_handler} "<br/>\n" unless $empty;
}
}
@@ -3751,12 +3757,12 @@ sub git_print_tree_entry {
# the mode of the entry, list is the name of the entry, an href,
# and link is the action links of the entry.
- print "<td class=\"mode\">" . mode_str($t->{'mode'}) . "</td>\n";
+ print {$output_handler} "<td class=\"mode\">" . mode_str($t->{'mode'}) . "</td>\n";
if (exists $t->{'size'}) {
- print "<td class=\"size\">$t->{'size'}</td>\n";
+ print {$output_handler} "<td class=\"size\">$t->{'size'}</td>\n";
}
if ($t->{'type'} eq "blob") {
- print "<td class=\"list\">" .
+ print {$output_handler} "<td class=\"list\">" .
$cgi->a({-href => href(action=>"blob", hash=>$t->{'hash'},
file_name=>"$basedir$t->{'name'}", %base_key),
-class => "list"}, esc_path($t->{'name'}));
@@ -3765,71 +3771,71 @@ sub git_print_tree_entry {
if ($link_target) {
my $norm_target = normalize_link_target($link_target, $basedir);
if (defined $norm_target) {
- print " -> " .
+ print {$output_handler} " -> " .
$cgi->a({-href => href(action=>"object", hash_base=>$hash_base,
file_name=>$norm_target),
-title => $norm_target}, esc_path($link_target));
} else {
- print " -> " . esc_path($link_target);
+ print {$output_handler} " -> " . esc_path($link_target);
}
}
}
- print "</td>\n";
- print "<td class=\"link\">";
- print $cgi->a({-href => href(action=>"blob", hash=>$t->{'hash'},
+ print {$output_handler} "</td>\n";
+ print {$output_handler} "<td class=\"link\">";
+ print {$output_handler} $cgi->a({-href => href(action=>"blob", hash=>$t->{'hash'},
file_name=>"$basedir$t->{'name'}", %base_key)},
"blob");
if ($have_blame) {
- print " | " .
+ print {$output_handler} " | " .
$cgi->a({-href => href(action=>"blame", hash=>$t->{'hash'},
file_name=>"$basedir$t->{'name'}", %base_key)},
"blame");
}
if (defined $hash_base) {
- print " | " .
+ print {$output_handler} " | " .
$cgi->a({-href => href(action=>"history", hash_base=>$hash_base,
hash=>$t->{'hash'}, file_name=>"$basedir$t->{'name'}")},
"history");
}
- print " | " .
+ print {$output_handler} " | " .
$cgi->a({-href => href(action=>"blob_plain", hash_base=>$hash_base,
file_name=>"$basedir$t->{'name'}")},
"raw");
- print "</td>\n";
+ print {$output_handler} "</td>\n";
} elsif ($t->{'type'} eq "tree") {
- print "<td class=\"list\">";
- print $cgi->a({-href => href(action=>"tree", hash=>$t->{'hash'},
+ print {$output_handler} "<td class=\"list\">";
+ print {$output_handler} $cgi->a({-href => href(action=>"tree", hash=>$t->{'hash'},
file_name=>"$basedir$t->{'name'}",
%base_key)},
esc_path($t->{'name'}));
- print "</td>\n";
- print "<td class=\"link\">";
- print $cgi->a({-href => href(action=>"tree", hash=>$t->{'hash'},
+ print {$output_handler} "</td>\n";
+ print {$output_handler} "<td class=\"link\">";
+ print {$output_handler} $cgi->a({-href => href(action=>"tree", hash=>$t->{'hash'},
file_name=>"$basedir$t->{'name'}",
%base_key)},
"tree");
if (defined $hash_base) {
- print " | " .
+ print {$output_handler} " | " .
$cgi->a({-href => href(action=>"history", hash_base=>$hash_base,
file_name=>"$basedir$t->{'name'}")},
"history");
}
- print "</td>\n";
+ print {$output_handler} "</td>\n";
} else {
# unknown object: we can only present history for it
# (this includes 'commit' object, i.e. submodule support)
- print "<td class=\"list\">" .
+ print {$output_handler} "<td class=\"list\">" .
esc_path($t->{'name'}) .
"</td>\n";
- print "<td class=\"link\">";
+ print {$output_handler} "<td class=\"link\">";
if (defined $hash_base) {
- print $cgi->a({-href => href(action=>"history",
+ print {$output_handler} $cgi->a({-href => href(action=>"history",
hash_base=>$hash_base,
file_name=>"$basedir$t->{'name'}")},
"history");
}
- print "</td>\n";
+ print {$output_handler} "</td>\n";
}
}
@@ -3876,13 +3882,13 @@ sub git_difftree_body {
my ($difftree, $hash, @parents) = @_;
my ($parent) = $parents[0];
my $have_blame = gitweb_check_feature('blame');
- print "<div class=\"list_head\">\n";
+ print {$output_handler} "<div class=\"list_head\">\n";
if ($#{$difftree} > 10) {
- print(($#{$difftree} + 1) . " files changed:\n");
+ print {$output_handler} (($#{$difftree} + 1) . " files changed:\n");
}
- print "</div>\n";
+ print {$output_handler} "</div>\n";
- print "<table class=\"" .
+ print {$output_handler} "<table class=\"" .
(@parents > 1 ? "combined " : "") .
"diff_tree\">\n";
@@ -3890,11 +3896,11 @@ sub git_difftree_body {
my $has_header = @$difftree && @parents > 1 && $action eq 'commitdiff';
if ($has_header) {
# table header
- print "<thead><tr>\n" .
+ print {$output_handler} "<thead><tr>\n" .
"<th></th><th></th>\n"; # filename, patchN link
for (my $i = 0; $i < @parents; $i++) {
my $par = $parents[$i];
- print "<th>" .
+ print {$output_handler} "<th>" .
$cgi->a({-href => href(action=>"commitdiff",
hash=>$hash, hash_parent=>$par),
-title => 'commitdiff to parent number ' .
@@ -3902,7 +3908,7 @@ sub git_difftree_body {
$i+1) .
" </th>\n";
}
- print "</tr></thead>\n<tbody>\n";
+ print {$output_handler} "</tr></thead>\n<tbody>\n";
}
my $alternate = 1;
@@ -3911,9 +3917,9 @@ sub git_difftree_body {
my $diff = parsed_difftree_line($line);
if ($alternate) {
- print "<tr class=\"dark\">\n";
+ print {$output_handler} "<tr class=\"dark\">\n";
} else {
- print "<tr class=\"light\">\n";
+ print {$output_handler} "<tr class=\"light\">\n";
}
$alternate ^= 1;
@@ -3924,14 +3930,14 @@ sub git_difftree_body {
if (!is_deleted($diff)) {
# file exists in the result (child) commit
- print "<td>" .
+ print {$output_handler} "<td>" .
$cgi->a({-href => href(action=>"blob", hash=>$diff->{'to_id'},
file_name=>$diff->{'to_file'},
hash_base=>$hash),
-class => "list"}, esc_path($diff->{'to_file'})) .
"</td>\n";
} else {
- print "<td>" .
+ print {$output_handler} "<td>" .
esc_path($diff->{'to_file'}) .
"</td>\n";
}
@@ -3939,7 +3945,7 @@ sub git_difftree_body {
if ($action eq 'commitdiff') {
# link to patch
$patchno++;
- print "<td class=\"link\">" .
+ print {$output_handler} "<td class=\"link\">" .
$cgi->a({-href => "#patch$patchno"}, "patch") .
" | " .
"</td>\n";
@@ -3957,9 +3963,9 @@ sub git_difftree_body {
$not_deleted ||= ($status ne 'D');
if ($status eq 'A') {
- print "<td class=\"link\" align=\"right\"> | </td>\n";
+ print {$output_handler} "<td class=\"link\" align=\"right\"> | </td>\n";
} elsif ($status eq 'D') {
- print "<td class=\"link\">" .
+ print {$output_handler} "<td class=\"link\">" .
$cgi->a({-href => href(action=>"blob",
hash_base=>$hash,
hash=>$from_hash,
@@ -3968,11 +3974,11 @@ sub git_difftree_body {
" | </td>\n";
} else {
if ($diff->{'to_id'} eq $from_hash) {
- print "<td class=\"link nochange\">";
+ print {$output_handler} "<td class=\"link nochange\">";
} else {
- print "<td class=\"link\">";
+ print {$output_handler} "<td class=\"link\">";
}
- print $cgi->a({-href => href(action=>"blobdiff",
+ print {$output_handler} $cgi->a({-href => href(action=>"blobdiff",
hash=>$diff->{'to_id'},
hash_parent=>$from_hash,
hash_base=>$hash,
@@ -3984,24 +3990,24 @@ sub git_difftree_body {
}
}
- print "<td class=\"link\">";
+ print {$output_handler} "<td class=\"link\">";
if ($not_deleted) {
- print $cgi->a({-href => href(action=>"blob",
+ print {$output_handler} $cgi->a({-href => href(action=>"blob",
hash=>$diff->{'to_id'},
file_name=>$diff->{'to_file'},
hash_base=>$hash)},
"blob");
- print " | " if ($has_history);
+ print {$output_handler} " | " if ($has_history);
}
if ($has_history) {
- print $cgi->a({-href => href(action=>"history",
+ print {$output_handler} $cgi->a({-href => href(action=>"history",
file_name=>$diff->{'to_file'},
hash_base=>$hash)},
"history");
}
- print "</td>\n";
+ print {$output_handler} "</td>\n";
- print "</tr>\n";
+ print {$output_handler} "</tr>\n";
next; # instead of 'else' clause, to avoid extra indent
}
# else ordinary diff
@@ -4027,51 +4033,51 @@ sub git_difftree_body {
my $mode_chng = "<span class=\"file_status new\">[new $to_file_type";
$mode_chng .= " with mode: $to_mode_str" if $to_mode_str;
$mode_chng .= "]</span>";
- print "<td>";
- print $cgi->a({-href => href(action=>"blob", hash=>$diff->{'to_id'},
+ print {$output_handler} "<td>";
+ print {$output_handler} $cgi->a({-href => href(action=>"blob", hash=>$diff->{'to_id'},
hash_base=>$hash, file_name=>$diff->{'file'}),
-class => "list"}, esc_path($diff->{'file'}));
- print "</td>\n";
- print "<td>$mode_chng</td>\n";
- print "<td class=\"link\">";
+ print {$output_handler} "</td>\n";
+ print {$output_handler} "<td>$mode_chng</td>\n";
+ print {$output_handler} "<td class=\"link\">";
if ($action eq 'commitdiff') {
# link to patch
$patchno++;
- print $cgi->a({-href => "#patch$patchno"}, "patch");
- print " | ";
+ print {$output_handler} $cgi->a({-href => "#patch$patchno"}, "patch");
+ print {$output_handler} " | ";
}
- print $cgi->a({-href => href(action=>"blob", hash=>$diff->{'to_id'},
+ print {$output_handler} $cgi->a({-href => href(action=>"blob", hash=>$diff->{'to_id'},
hash_base=>$hash, file_name=>$diff->{'file'})},
"blob");
- print "</td>\n";
+ print {$output_handler} "</td>\n";
} elsif ($diff->{'status'} eq "D") { # deleted
my $mode_chng = "<span class=\"file_status deleted\">[deleted $from_file_type]</span>";
- print "<td>";
- print $cgi->a({-href => href(action=>"blob", hash=>$diff->{'from_id'},
+ print {$output_handler} "<td>";
+ print {$output_handler} $cgi->a({-href => href(action=>"blob", hash=>$diff->{'from_id'},
hash_base=>$parent, file_name=>$diff->{'file'}),
-class => "list"}, esc_path($diff->{'file'}));
- print "</td>\n";
- print "<td>$mode_chng</td>\n";
- print "<td class=\"link\">";
+ print {$output_handler} "</td>\n";
+ print {$output_handler} "<td>$mode_chng</td>\n";
+ print {$output_handler} "<td class=\"link\">";
if ($action eq 'commitdiff') {
# link to patch
$patchno++;
- print $cgi->a({-href => "#patch$patchno"}, "patch");
- print " | ";
+ print {$output_handler} $cgi->a({-href => "#patch$patchno"}, "patch");
+ print {$output_handler} " | ";
}
- print $cgi->a({-href => href(action=>"blob", hash=>$diff->{'from_id'},
+ print {$output_handler} $cgi->a({-href => href(action=>"blob", hash=>$diff->{'from_id'},
hash_base=>$parent, file_name=>$diff->{'file'})},
"blob") . " | ";
if ($have_blame) {
- print $cgi->a({-href => href(action=>"blame", hash_base=>$parent,
+ print {$output_handler} $cgi->a({-href => href(action=>"blame", hash_base=>$parent,
file_name=>$diff->{'file'})},
"blame") . " | ";
}
- print $cgi->a({-href => href(action=>"history", hash_base=>$parent,
+ print {$output_handler} $cgi->a({-href => href(action=>"history", hash_base=>$parent,
file_name=>$diff->{'file'})},
"history");
- print "</td>\n";
+ print {$output_handler} "</td>\n";
} elsif ($diff->{'status'} eq "M" || $diff->{'status'} eq "T") { # modified, or type changed
my $mode_chnge = "";
@@ -4089,39 +4095,39 @@ sub git_difftree_body {
}
$mode_chnge .= "]</span>\n";
}
- print "<td>";
- print $cgi->a({-href => href(action=>"blob", hash=>$diff->{'to_id'},
+ print {$output_handler} "<td>";
+ print {$output_handler} $cgi->a({-href => href(action=>"blob", hash=>$diff->{'to_id'},
hash_base=>$hash, file_name=>$diff->{'file'}),
-class => "list"}, esc_path($diff->{'file'}));
- print "</td>\n";
- print "<td>$mode_chnge</td>\n";
- print "<td class=\"link\">";
+ print {$output_handler} "</td>\n";
+ print {$output_handler} "<td>$mode_chnge</td>\n";
+ print {$output_handler} "<td class=\"link\">";
if ($action eq 'commitdiff') {
# link to patch
$patchno++;
- print $cgi->a({-href => "#patch$patchno"}, "patch") .
+ print {$output_handler} $cgi->a({-href => "#patch$patchno"}, "patch") .
" | ";
} elsif ($diff->{'to_id'} ne $diff->{'from_id'}) {
# "commit" view and modified file (not onlu mode changed)
- print $cgi->a({-href => href(action=>"blobdiff",
+ print {$output_handler} $cgi->a({-href => href(action=>"blobdiff",
hash=>$diff->{'to_id'}, hash_parent=>$diff->{'from_id'},
hash_base=>$hash, hash_parent_base=>$parent,
file_name=>$diff->{'file'})},
"diff") .
" | ";
}
- print $cgi->a({-href => href(action=>"blob", hash=>$diff->{'to_id'},
+ print {$output_handler} $cgi->a({-href => href(action=>"blob", hash=>$diff->{'to_id'},
hash_base=>$hash, file_name=>$diff->{'file'})},
"blob") . " | ";
if ($have_blame) {
- print $cgi->a({-href => href(action=>"blame", hash_base=>$hash,
+ print {$output_handler} $cgi->a({-href => href(action=>"blame", hash_base=>$hash,
file_name=>$diff->{'file'})},
"blame") . " | ";
}
- print $cgi->a({-href => href(action=>"history", hash_base=>$hash,
+ print {$output_handler} $cgi->a({-href => href(action=>"history", hash_base=>$hash,
file_name=>$diff->{'file'})},
"history");
- print "</td>\n";
+ print {$output_handler} "</td>\n";
} elsif ($diff->{'status'} eq "R" || $diff->{'status'} eq "C") { # renamed or copied
my %status_name = ('R' => 'moved', 'C' => 'copied');
@@ -4131,7 +4137,7 @@ sub git_difftree_body {
# mode also for directories, so we cannot use $to_mode_str
$mode_chng = sprintf(", mode: %04o", $to_mode_oct & 0777);
}
- print "<td>" .
+ print {$output_handler} "<td>" .
$cgi->a({-href => href(action=>"blob", hash_base=>$hash,
hash=>$diff->{'to_id'}, file_name=>$diff->{'to_file'}),
-class => "list"}, esc_path($diff->{'to_file'})) . "</td>\n" .
@@ -4144,35 +4150,35 @@ sub git_difftree_body {
if ($action eq 'commitdiff') {
# link to patch
$patchno++;
- print $cgi->a({-href => "#patch$patchno"}, "patch") .
+ print {$output_handler} $cgi->a({-href => "#patch$patchno"}, "patch") .
" | ";
} elsif ($diff->{'to_id'} ne $diff->{'from_id'}) {
# "commit" view and modified file (not only pure rename or copy)
- print $cgi->a({-href => href(action=>"blobdiff",
+ print {$output_handler} $cgi->a({-href => href(action=>"blobdiff",
hash=>$diff->{'to_id'}, hash_parent=>$diff->{'from_id'},
hash_base=>$hash, hash_parent_base=>$parent,
file_name=>$diff->{'to_file'}, file_parent=>$diff->{'from_file'})},
"diff") .
" | ";
}
- print $cgi->a({-href => href(action=>"blob", hash=>$diff->{'to_id'},
+ print {$output_handler} $cgi->a({-href => href(action=>"blob", hash=>$diff->{'to_id'},
hash_base=>$parent, file_name=>$diff->{'to_file'})},
"blob") . " | ";
if ($have_blame) {
- print $cgi->a({-href => href(action=>"blame", hash_base=>$hash,
+ print {$output_handler} $cgi->a({-href => href(action=>"blame", hash_base=>$hash,
file_name=>$diff->{'to_file'})},
"blame") . " | ";
}
- print $cgi->a({-href => href(action=>"history", hash_base=>$hash,
+ print {$output_handler} $cgi->a({-href => href(action=>"history", hash_base=>$hash,
file_name=>$diff->{'to_file'})},
"history");
- print "</td>\n";
+ print {$output_handler} "</td>\n";
} # we should not encounter Unmerged (U) or Unknown (X) status
- print "</tr>\n";
+ print {$output_handler} "</tr>\n";
}
- print "</tbody>" if $has_header;
- print "</table>\n";
+ print {$output_handler} "</tbody>" if $has_header;
+ print {$output_handler} "</table>\n";
}
sub git_patchset_body {
@@ -4187,7 +4193,7 @@ sub git_patchset_body {
my $to_name;
my (%from, %to);
- print "<div class=\"patchset\">\n";
+ print {$output_handler} "<div class=\"patchset\">\n";
# skip to first patch
while ($patch_line = <$fd>) {
@@ -4215,7 +4221,7 @@ sub git_patchset_body {
# and parse raw git-diff line if needed
if (is_patch_split($diffinfo, { 'to_file' => $to_name })) {
# this is continuation of a split patch
- print "<div class=\"patch cont\">\n";
+ print {$output_handler} "<div class=\"patch cont\">\n";
} else {
# advance raw git-diff output if needed
$patch_idx++ if defined $diffinfo;
@@ -4227,7 +4233,7 @@ sub git_patchset_body {
# find which patch (using pathname of result) we are at now;
if ($is_combined) {
while ($to_name ne $diffinfo->{'to_file'}) {
- print "<div class=\"patch\" id=\"patch". ($patch_idx+1) ."\">\n" .
+ print {$output_handler} "<div class=\"patch\" id=\"patch". ($patch_idx+1) ."\">\n" .
format_diff_cc_simplified($diffinfo, @hash_parents) .
"</div>\n"; # class="patch"
@@ -4244,7 +4250,7 @@ sub git_patchset_body {
# this is first patch for raw difftree line with $patch_idx index
# we index @$difftree array from 0, but number patches from 1
- print "<div class=\"patch\" id=\"patch". ($patch_idx+1) ."\">\n";
+ print {$output_handler} "<div class=\"patch\" id=\"patch". ($patch_idx+1) ."\">\n";
}
# git diff header
@@ -4252,25 +4258,25 @@ sub git_patchset_body {
#assert($patch_line !~ m!$/$!) if DEBUG; # is chomp-ed
$patch_number++;
# print "git diff" header
- print format_git_diff_header_line($patch_line, $diffinfo,
+ print {$output_handler} format_git_diff_header_line($patch_line, $diffinfo,
\%from, \%to);
# print extended diff header
- print "<div class=\"diff extended_header\">\n";
+ print {$output_handler} "<div class=\"diff extended_header\">\n";
EXTENDED_HEADER:
while ($patch_line = <$fd>) {
chomp $patch_line;
last EXTENDED_HEADER if ($patch_line =~ m/^--- |^diff /);
- print format_extended_diff_header_line($patch_line, $diffinfo,
+ print {$output_handler} format_extended_diff_header_line($patch_line, $diffinfo,
\%from, \%to);
}
- print "</div>\n"; # class="diff extended_header"
+ print {$output_handler} "</div>\n"; # class="diff extended_header"
# from-file/to-file diff header
if (! $patch_line) {
- print "</div>\n"; # class="patch"
+ print {$output_handler} "</div>\n"; # class="patch"
last PATCH;
}
next PATCH if ($patch_line =~ m/^diff /);
@@ -4281,7 +4287,7 @@ sub git_patchset_body {
chomp $patch_line;
#assert($patch_line =~ m/^\+\+\+/) if DEBUG;
- print format_diff_from_to_header($last_patch_line, $patch_line,
+ print {$output_handler} format_diff_from_to_header($last_patch_line, $patch_line,
$diffinfo, \%from, \%to,
@hash_parents);
@@ -4292,11 +4298,11 @@ sub git_patchset_body {
next PATCH if ($patch_line =~ m/^diff /);
- print format_diff_line($patch_line, \%from, \%to);
+ print {$output_handler} format_diff_line($patch_line, \%from, \%to);
}
} continue {
- print "</div>\n"; # class="patch"
+ print {$output_handler} "</div>\n"; # class="patch"
}
# for compact combined (--cc) format, with chunk and patch simpliciaction
@@ -4308,7 +4314,7 @@ sub git_patchset_body {
$diffinfo = parsed_difftree_line($difftree->[$patch_idx]);
# generate anchor for "patch" links in difftree / whatchanged part
- print "<div class=\"patch\" id=\"patch". ($patch_idx+1) ."\">\n" .
+ print {$output_handler} "<div class=\"patch\" id=\"patch". ($patch_idx+1) ."\">\n" .
format_diff_cc_simplified($diffinfo, @hash_parents) .
"</div>\n"; # class="patch"
@@ -4317,13 +4323,13 @@ sub git_patchset_body {
if ($patch_number == 0) {
if (@hash_parents > 1) {
- print "<div class=\"diff nodifferences\">Trivial merge</div>\n";
+ print {$output_handler} "<div class=\"diff nodifferences\">Trivial merge</div>\n";
} else {
- print "<div class=\"diff nodifferences\">No differences found</div>\n";
+ print {$output_handler} "<div class=\"diff nodifferences\">No differences found</div>\n";
}
}
- print "</div>\n"; # class="patchset"
+ print {$output_handler} "</div>\n"; # class="patchset"
}
# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
@@ -4376,9 +4382,9 @@ sub print_sort_th {
$header ||= ucfirst($name);
if ($order eq $name) {
- print "<th>$header</th>\n";
+ print {$output_handler} "<th>$header</th>\n";
} else {
- print "<th>" .
+ print {$output_handler} "<th>" .
$cgi->a({-href => href(-replay=>1, order=>$name),
-class => "header"}, $header) .
"</th>\n";
@@ -4418,20 +4424,20 @@ sub git_project_list_body {
}
}
my $cloud = git_populate_project_tagcloud(\%ctags);
- print git_show_project_tagcloud($cloud, 64);
+ print {$output_handler} git_show_project_tagcloud($cloud, 64);
}
- print "<table class=\"project_list\">\n";
+ print {$output_handler} "<table class=\"project_list\">\n";
unless ($no_header) {
- print "<tr>\n";
+ print {$output_handler} "<tr>\n";
if ($check_forks) {
- print "<th></th>\n";
+ print {$output_handler} "<th></th>\n";
}
- print_sort_th('project', $order, 'Project');
- print_sort_th('descr', $order, 'Description');
- print_sort_th('owner', $order, 'Owner');
- print_sort_th('age', $order, 'Last Change');
- print "<th></th>\n" . # for links
+ print {$output_handler} get_sort_th('project', $order, 'Project');
+ print {$output_handler} get_sort_th('descr', $order, 'Description');
+ print {$output_handler} get_sort_th('owner', $order, 'Owner');
+ print {$output_handler} get_sort_th('age', $order, 'Last Change');
+ print {$output_handler} "<th></th>\n" . # for links
"</tr>\n";
}
my $alternate = 1;
@@ -4451,26 +4457,26 @@ sub git_project_list_body {
}
if ($alternate) {
- print "<tr class=\"dark\">\n";
+ print {$output_handler} "<tr class=\"dark\">\n";
} else {
- print "<tr class=\"light\">\n";
+ print {$output_handler} "<tr class=\"light\">\n";
}
$alternate ^= 1;
if ($check_forks) {
- print "<td>";
+ print {$output_handler} "<td>";
if ($pr->{'forks'}) {
- print "<!-- $pr->{'forks'} -->\n";
- print $cgi->a({-href => href(project=>$pr->{'path'}, action=>"forks")}, "+");
+ print {$output_handler} "<!-- $pr->{'forks'} -->\n";
+ print {$output_handler} $cgi->a({-href => href(project=>$pr->{'path'}, action=>"forks")}, "+");
}
- print "</td>\n";
+ print {$output_handler} "</td>\n";
}
- print "<td>" . $cgi->a({-href => href(project=>$pr->{'path'}, action=>"summary"),
- -class => "list"}, esc_html($pr->{'path'})) . "</td>\n" .
+ print {$output_handler} "<td>" . $cgi->a({-href => href(project=>$pr->{'path'}, action=>"summary"),
+ -class => "list"}, esc_html($pr->{'path'})) ."</td>\n".
"<td>" . $cgi->a({-href => href(project=>$pr->{'path'}, action=>"summary"),
-class => "list", -title => $pr->{'descr_long'}},
esc_html($pr->{'descr'})) . "</td>\n" .
"<td><i>" . chop_and_escape_str($pr->{'owner'}, 15) . "</i></td>\n";
- print "<td class=\"". age_class($pr->{'age'}) . "\">" .
+ print {$output_handler} "<td class=\"". age_class($pr->{'age'}) . "\">" .
(defined $pr->{'age_string'} ? $pr->{'age_string'} : "No commits") . "</td>\n" .
"<td class=\"link\">" .
$cgi->a({-href => href(project=>$pr->{'path'}, action=>"summary")}, "summary") . " | " .
@@ -4486,14 +4492,14 @@ sub git_project_list_body {
"</tr>\n";
}
if (defined $extra) {
- print "<tr>\n";
+ print {$output_handler} "<tr>\n";
if ($check_forks) {
- print "<td></td>\n";
+ print {$output_handler} "<td></td>\n";
}
- print "<td colspan=\"5\">$extra</td>\n" .
+ print {$output_handler} "<td colspan=\"5\">$extra</td>\n" .
"</tr>\n";
}
- print "</table>\n";
+ print {$output_handler} "</table>\n";
}
sub git_log_body {
@@ -4513,7 +4519,7 @@ sub git_log_body {
"<span class=\"age\">$co{'age_string'}</span>" .
esc_html($co{'title'}) . $ref,
$commit);
- print "<div class=\"title_text\">\n" .
+ print {$output_handler} "<div class=\"title_text\">\n" .
"<div class=\"log_link\">\n" .
$cgi->a({-href => href(action=>"commit", hash=>$commit)}, "commit") .
" | " .
@@ -4523,16 +4529,16 @@ sub git_log_body {
"<br/>\n" .
"</div>\n";
git_print_authorship(\%co, -tag => 'span');
- print "<br/>\n</div>\n";
+ print {$output_handler} "<br/>\n</div>\n";
- print "<div class=\"log_body\">\n";
+ print {$output_handler} "<div class=\"log_body\">\n";
git_print_log($co{'comment'}, -final_empty_line=> 1);
- print "</div>\n";
+ print {$output_handler} "</div>\n";
}
if ($extra) {
- print "<div class=\"page_nav\">\n";
- print "$extra\n";
- print "</div>\n";
+ print {$output_handler} "<div class=\"page_nav\">\n";
+ print {$output_handler} "$extra\n";
+ print {$output_handler} "</div>\n";
}
}
@@ -4543,41 +4549,41 @@ sub git_shortlog_body {
$from = 0 unless defined $from;
$to = $#{$commitlist} if (!defined $to || $#{$commitlist} < $to);
- print "<table class=\"shortlog\">\n";
+ print {$output_handler} "<table class=\"shortlog\">\n";
my $alternate = 1;
for (my $i = $from; $i <= $to; $i++) {
my %co = %{$commitlist->[$i]};
my $commit = $co{'id'};
my $ref = format_ref_marker($refs, $commit);
if ($alternate) {
- print "<tr class=\"dark\">\n";
+ print {$output_handler} "<tr class=\"dark\">\n";
} else {
- print "<tr class=\"light\">\n";
+ print {$output_handler} "<tr class=\"light\">\n";
}
$alternate ^= 1;
# git_summary() used print "<td><i>$co{'age_string'}</i></td>\n" .
- print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
+ print {$output_handler} "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
format_author_html('td', \%co, 10) . "<td>";
- print format_subject_html($co{'title'}, $co{'title_short'},
+ print {$output_handler} format_subject_html($co{'title'}, $co{'title_short'},
href(action=>"commit", hash=>$commit), $ref);
- print "</td>\n" .
+ print {$output_handler} "</td>\n" .
"<td class=\"link\">" .
$cgi->a({-href => href(action=>"commit", hash=>$commit)}, "commit") . " | " .
$cgi->a({-href => href(action=>"commitdiff", hash=>$commit)}, "commitdiff") . " | " .
$cgi->a({-href => href(action=>"tree", hash=>$commit, hash_base=>$commit)}, "tree");
my $snapshot_links = format_snapshot_links($commit);
if (defined $snapshot_links) {
- print " | " . $snapshot_links;
+ print {$output_handler} " | " . $snapshot_links;
}
- print "</td>\n" .
+ print {$output_handler} "</td>\n" .
"</tr>\n";
}
if (defined $extra) {
- print "<tr>\n" .
+ print {$output_handler} "<tr>\n" .
"<td colspan=\"4\">$extra</td>\n" .
"</tr>\n";
}
- print "</table>\n";
+ print {$output_handler} "</table>\n";
}
sub git_history_body {
@@ -4588,7 +4594,7 @@ sub git_history_body {
$from = 0 unless defined $from;
$to = $#{$commitlist} unless (defined $to && $to <= $#{$commitlist});
- print "<table class=\"history\">\n";
+ print {$output_handler} "<table class=\"history\">\n";
my $alternate = 1;
for (my $i = $from; $i <= $to; $i++) {
my %co = %{$commitlist->[$i]};
@@ -4600,18 +4606,18 @@ sub git_history_body {
my $ref = format_ref_marker($refs, $commit);
if ($alternate) {
- print "<tr class=\"dark\">\n";
+ print {$output_handler} "<tr class=\"dark\">\n";
} else {
- print "<tr class=\"light\">\n";
+ print {$output_handler} "<tr class=\"light\">\n";
}
$alternate ^= 1;
- print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
+ print {$output_handler} "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
# shortlog: format_author_html('td', \%co, 10)
format_author_html('td', \%co, 15, 3) . "<td>";
# originally git_history used chop_str($co{'title'}, 50)
- print format_subject_html($co{'title'}, $co{'title_short'},
+ print {$output_handler} format_subject_html($co{'title'}, $co{'title_short'},
href(action=>"commit", hash=>$commit), $ref);
- print "</td>\n" .
+ print {$output_handler} "</td>\n" .
"<td class=\"link\">" .
$cgi->a({-href => href(action=>$ftype, hash_base=>$commit, file_name=>$file_name)}, $ftype) . " | " .
$cgi->a({-href => href(action=>"commitdiff", hash=>$commit)}, "commitdiff");
@@ -4621,7 +4627,7 @@ sub git_history_body {
my $blob_parent = git_get_hash_by_path($commit, $file_name);
if (defined $blob_current && defined $blob_parent &&
$blob_current ne $blob_parent) {
- print " | " .
+ print {$output_handler} " | " .
$cgi->a({-href => href(action=>"blobdiff",
hash=>$blob_current, hash_parent=>$blob_parent,
hash_base=>$hash_base, hash_parent_base=>$commit,
@@ -4629,15 +4635,15 @@ sub git_history_body {
"diff to current");
}
}
- print "</td>\n" .
+ print {$output_handler} "</td>\n" .
"</tr>\n";
}
if (defined $extra) {
- print "<tr>\n" .
+ print {$output_handler} "<tr>\n" .
"<td colspan=\"4\">$extra</td>\n" .
"</tr>\n";
}
- print "</table>\n";
+ print {$output_handler} "</table>\n";
}
sub git_tags_body {
@@ -4646,7 +4652,7 @@ sub git_tags_body {
$from = 0 unless defined $from;
$to = $#{$taglist} if (!defined $to || $#{$taglist} < $to);
- print "<table class=\"tags\">\n";
+ print {$output_handler} "<table class=\"tags\">\n";
my $alternate = 1;
for (my $i = $from; $i <= $to; $i++) {
my $entry = $taglist->[$i];
@@ -4657,50 +4663,50 @@ sub git_tags_body {
$comment_short = chop_str($comment, 30, 5);
}
if ($alternate) {
- print "<tr class=\"dark\">\n";
+ print {$output_handler} "<tr class=\"dark\">\n";
} else {
- print "<tr class=\"light\">\n";
+ print {$output_handler} "<tr class=\"light\">\n";
}
$alternate ^= 1;
if (defined $tag{'age'}) {
- print "<td><i>$tag{'age'}</i></td>\n";
+ print {$output_handler} "<td><i>$tag{'age'}</i></td>\n";
} else {
- print "<td></td>\n";
+ print {$output_handler} "<td></td>\n";
}
- print "<td>" .
+ print {$output_handler} "<td>" .
$cgi->a({-href => href(action=>$tag{'reftype'}, hash=>$tag{'refid'}),
-class => "list name"}, esc_html($tag{'name'})) .
"</td>\n" .
"<td>";
if (defined $comment) {
- print format_subject_html($comment, $comment_short,
+ print {$output_handler} format_subject_html($comment, $comment_short,
href(action=>"tag", hash=>$tag{'id'}));
}
- print "</td>\n" .
+ print {$output_handler} "</td>\n" .
"<td class=\"selflink\">";
if ($tag{'type'} eq "tag") {
- print $cgi->a({-href => href(action=>"tag", hash=>$tag{'id'})}, "tag");
+ print {$output_handler} $cgi->a({-href => href(action=>"tag", hash=>$tag{'id'})}, "tag");
} else {
- print " ";
+ print {$output_handler} " ";
}
- print "</td>\n" .
+ print {$output_handler} "</td>\n" .
"<td class=\"link\">" . " | " .
$cgi->a({-href => href(action=>$tag{'reftype'}, hash=>$tag{'refid'})}, $tag{'reftype'});
if ($tag{'reftype'} eq "commit") {
- print " | " . $cgi->a({-href => href(action=>"shortlog", hash=>$tag{'fullname'})}, "shortlog") .
+ print {$output_handler} " | " . $cgi->a({-href => href(action=>"shortlog", hash=>$tag{'fullname'})}, "shortlog") .
" | " . $cgi->a({-href => href(action=>"log", hash=>$tag{'fullname'})}, "log");
} elsif ($tag{'reftype'} eq "blob") {
- print " | " . $cgi->a({-href => href(action=>"blob_plain", hash=>$tag{'refid'})}, "raw");
+ print {$output_handler} " | " . $cgi->a({-href => href(action=>"blob_plain", hash=>$tag{'refid'})}, "raw");
}
- print "</td>\n" .
+ print {$output_handler} "</td>\n" .
"</tr>";
}
if (defined $extra) {
- print "<tr>\n" .
+ print {$output_handler} "<tr>\n" .
"<td colspan=\"5\">$extra</td>\n" .
"</tr>\n";
}
- print "</table>\n";
+ print {$output_handler} "</table>\n";
}
sub git_heads_body {
@@ -4709,19 +4715,19 @@ sub git_heads_body {
$from = 0 unless defined $from;
$to = $#{$headlist} if (!defined $to || $#{$headlist} < $to);
- print "<table class=\"heads\">\n";
+ print {$output_handler} "<table class=\"heads\">\n";
my $alternate = 1;
for (my $i = $from; $i <= $to; $i++) {
my $entry = $headlist->[$i];
my %ref = %$entry;
my $curr = $ref{'id'} eq $head;
if ($alternate) {
- print "<tr class=\"dark\">\n";
+ print {$output_handler} "<tr class=\"dark\">\n";
} else {
- print "<tr class=\"light\">\n";
+ print {$output_handler} "<tr class=\"light\">\n";
}
$alternate ^= 1;
- print "<td><i>$ref{'age'}</i></td>\n" .
+ print {$output_handler} "<td><i>$ref{'age'}</i></td>\n" .
($curr ? "<td class=\"current_head\">" : "<td>") .
$cgi->a({-href => href(action=>"shortlog", hash=>$ref{'fullname'}),
-class => "list name"},esc_html($ref{'name'})) .
@@ -4734,11 +4740,11 @@ sub git_heads_body {
"</tr>";
}
if (defined $extra) {
- print "<tr>\n" .
+ print {$output_handler} "<tr>\n" .
"<td colspan=\"3\">$extra</td>\n" .
"</tr>\n";
}
- print "</table>\n";
+ print {$output_handler} "</table>\n";
}
sub git_search_grep_body {
@@ -4746,7 +4752,7 @@ sub git_search_grep_body {
$from = 0 unless defined $from;
$to = $#{$commitlist} if (!defined $to || $#{$commitlist} < $to);
- print "<table class=\"commit_search\">\n";
+ print {$output_handler} "<table class=\"commit_search\">\n";
my $alternate = 1;
for (my $i = $from; $i <= $to; $i++) {
my %co = %{$commitlist->[$i]};
@@ -4755,12 +4761,12 @@ sub git_search_grep_body {
}
my $commit = $co{'id'};
if ($alternate) {
- print "<tr class=\"dark\">\n";
+ print {$output_handler} "<tr class=\"dark\">\n";
} else {
- print "<tr class=\"light\">\n";
+ print {$output_handler} "<tr class=\"light\">\n";
}
$alternate ^= 1;
- print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
+ print {$output_handler} "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
format_author_html('td', \%co, 15, 5) .
"<td>" .
$cgi->a({-href => href(action=>"commit", hash=>$co{'id'}),
@@ -4780,25 +4786,25 @@ sub git_search_grep_body {
$match = esc_html($match);
$trail = esc_html($trail);
- print "$lead<span class=\"match\">$match</span>$trail<br />";
+ print {$output_handler} "$lead<span class=\"match\">$match</span>$trail<br />";
}
}
- print "</td>\n" .
+ print {$output_handler} "</td>\n" .
"<td class=\"link\">" .
$cgi->a({-href => href(action=>"commit", hash=>$co{'id'})}, "commit") .
" | " .
$cgi->a({-href => href(action=>"commitdiff", hash=>$co{'id'})}, "commitdiff") .
" | " .
$cgi->a({-href => href(action=>"tree", hash=>$co{'tree'}, hash_base=>$co{'id'})}, "tree");
- print "</td>\n" .
+ print {$output_handler} "</td>\n" .
"</tr>\n";
}
if (defined $extra) {
- print "<tr>\n" .
+ print {$output_handler} "<tr>\n" .
"<td colspan=\"3\">$extra</td>\n" .
"</tr>\n";
}
- print "</table>\n";
+ print {$output_handler} "</table>\n";
}
## ======================================================================
@@ -4818,11 +4824,11 @@ sub git_project_list {
git_header_html();
if (-f $home_text) {
- print "<div class=\"index_include\">\n";
+ print {$output_handler} "<div class=\"index_include\">\n";
insert_file($home_text);
- print "</div>\n";
+ print {$output_handler} "</div>\n";
}
- print $cgi->startform(-method => "get") .
+ print {$output_handler} $cgi->startform(-method => "get") .
"<p class=\"projsearch\">Search:\n" .
$cgi->textfield(-name => "s", -value => $searchtext) . "\n" .
"</p>" .
@@ -4852,7 +4858,7 @@ sub git_forks {
sub git_project_index {
my @projects = git_get_projects_list($project);
- print $cgi->header(
+ print {$output_handler} $cgi->header(
-type => 'text/plain',
-charset => 'utf-8',
-content_disposition => 'inline; filename="index.aux"');
@@ -4869,7 +4875,7 @@ sub git_project_index {
$path =~ s/ /\+/g;
$owner =~ s/ /\+/g;
- print "$path $owner\n";
+ print {$output_handler} "$path $owner\n";
}
}
@@ -4896,12 +4902,12 @@ sub git_summary {
git_header_html();
git_print_page_nav('summary','', $head);
- print "<div class=\"title\"> </div>\n";
- print "<table class=\"projects_list\">\n" .
+ print {$output_handler} "<div class=\"title\"> </div>\n";
+ print {$output_handler} "<table class=\"projects_list\">\n" .
"<tr id=\"metadata_desc\"><td>description</td><td>" . esc_html($descr) . "</td></tr>\n" .
"<tr id=\"metadata_owner\"><td>owner</td><td>" . esc_html($owner) . "</td></tr>\n";
if (defined $cd{'rfc2822'}) {
- print "<tr id=\"metadata_lchange\"><td>last change</td><td>$cd{'rfc2822'}</td></tr>\n";
+ print {$output_handler} "<tr id=\"metadata_lchange\"><td>last change</td><td>$cd{'rfc2822'}</td></tr>\n";
}
# use per project git URL list in $projectroot/$project/cloneurl
@@ -4911,7 +4917,7 @@ sub git_summary {
@url_list = map { "$_/$project" } @git_base_url_list unless @url_list;
foreach my $git_url (@url_list) {
next unless $git_url;
- print "<tr class=\"metadata_url\"><td>$url_tag</td><td>$git_url</td></tr>\n";
+ print {$output_handler} "<tr class=\"metadata_url\"><td>$url_tag</td><td>$git_url</td></tr>\n";
$url_tag = "";
}
@@ -4920,23 +4926,23 @@ sub git_summary {
if ($show_ctags) {
my $ctags = git_get_project_ctags($project);
my $cloud = git_populate_project_tagcloud($ctags);
- print "<tr id=\"metadata_ctags\"><td>Content tags:<br />";
- print "</td>\n<td>" unless %$ctags;
- print "<form action=\"$show_ctags\" method=\"post\"><input type=\"hidden\" name=\"p\" value=\"$project\" />Add: <input type=\"text\" name=\"t\" size=\"8\" /></form>";
- print "</td>\n<td>" if %$ctags;
- print git_show_project_tagcloud($cloud, 48);
- print "</td></tr>";
+ print {$output_handler} "<tr id=\"metadata_ctags\"><td>Content tags:<br />";
+ print {$output_handler} "</td>\n<td>" unless %$ctags;
+ print {$output_handler} "<form action=\"$show_ctags\" method=\"post\"><input type=\"hidden\" name=\"p\" value=\"$project\" />Add: <input type=\"text\" name=\"t\" size=\"8\" /></form>";
+ print {$output_handler} "</td>\n<td>" if %$ctags;
+ print {$output_handler} git_show_project_tagcloud($cloud, 48);
+ print {$output_handler} "</td></tr>";
}
- print "</table>\n";
+ print {$output_handler} "</table>\n";
# If XSS prevention is on, we don't include README.html.
# TODO: Allow a readme in some safe format.
if (!$prevent_xss && -s "$projectroot/$project/README.html") {
- print "<div class=\"title\">readme</div>\n" .
+ print {$output_handler} "<div class=\"title\">readme</div>\n" .
"<div class=\"readme\">\n";
insert_file("$projectroot/$project/README.html");
- print "\n</div>\n"; # class="readme"
+ print {$output_handler} "\n</div>\n"; # class="readme"
}
# we need to request one more than 16 (0..15) to check if
@@ -4985,7 +4991,7 @@ sub git_tag {
}
git_print_header_div('commit', esc_html($tag{'name'}), $hash);
- print "<div class=\"title_text\">\n" .
+ print {$output_handler} "<div class=\"title_text\">\n" .
"<table class=\"object_header\">\n" .
"<tr>\n" .
"<td>object</td>\n" .
@@ -4997,15 +5003,15 @@ sub git_tag {
if (defined($tag{'author'})) {
git_print_authorship_rows(\%tag, 'author');
}
- print "</table>\n\n" .
+ print {$output_handler} "</table>\n\n" .
"</div>\n";
- print "<div class=\"page_body\">";
+ print {$output_handler} "<div class=\"page_body\">";
my $comment = $tag{'comment'};
foreach my $line (@$comment) {
chomp $line;
- print esc_html($line, -nbsp=>1) . "<br/>\n";
+ print {$output_handler} esc_html($line, -nbsp=>1) . "<br/>\n";
}
- print "</div>\n";
+ print {$output_handler} "</div>\n";
git_footer_html();
}
@@ -5056,21 +5062,23 @@ sub git_blame_common {
# incremental blame data returns early
if ($format eq 'data') {
- print $cgi->header(
+ print {$output_handler} $cgi->header(
-type=>"text/plain", -charset => "utf-8",
-status=> "200 OK");
local $| = 1; # output autoflush
- print while <$fd>;
+ while (<$fd>) {
+ print {$output_handler} $_;
+ }
close $fd
- or print "ERROR $!\n";
+ or die_error(500, "ERROR $!\n");
- print 'END';
+ print {$output_handler} 'END';
if (defined $t0 && gitweb_check_feature('timed')) {
- print ' '.
+ print {$output_handler} ' '.
Time::HiRes::tv_interval($t0, [Time::HiRes::gettimeofday()]).
' '.$number_of_git_cmds;
}
- print "\n";
+ print {$output_handler} "\n";
return;
}
@@ -5103,20 +5111,20 @@ sub git_blame_common {
# page body
if ($format eq 'incremental') {
- print "<noscript>\n<div class=\"error\"><center><b>\n".
+ print {$output_handler} "<noscript>\n<div class=\"error\"><center><b>\n".
"This page requires JavaScript to run.\n Use ".
$cgi->a({-href => href(action=>'blame',javascript=>0,-replay=>1)},
'this page').
" instead.\n".
"</b></center></div>\n</noscript>\n";
- print qq!<div id="progress_bar" style="width: 100%; background-color: yellow"></div>\n!;
+ print {$output_handler} qq!<div id="progress_bar" style="width: 100%; background-color: yellow"></div>\n!;
}
- print qq!<div class="page_body">\n!;
- print qq!<div id="progress_info">... / ...</div>\n!
+ print {$output_handler} qq!<div class="page_body">\n!;
+ print {$output_handler} qq!<div id="progress_info">... / ...</div>\n!
if ($format eq 'incremental');
- print qq!<table id="blame_table" class="blame" width="100%">\n!.
+ print {$output_handler} qq!<table id="blame_table" class="blame" width="100%">\n!.
#qq!<col width="5.5em" /><col width="2.5em" /><col width="*" />\n!.
qq!<thead>\n!.
qq!<tr><th>Commit</th><th>Line</th><th>Data</th></tr>\n!.
@@ -5137,12 +5145,12 @@ sub git_blame_common {
chomp $line;
$linenr++;
- print qq!<tr id="l$linenr" class="$color_class">!.
+ print {$output_handler} qq!<tr id="l$linenr" class="$color_class">!.
qq!<td class="sha1"><a href=""> </a></td>!.
qq!<td class="linenr">!.
qq!<a class="linenr" href="">$linenr</a></td>!;
- print qq!<td class="pre">! . esc_html($line) . "</td>\n";
- print qq!</tr>\n!;
+ print {$output_handler} qq!<td class="pre">! . esc_html($line) . "</td>\n";
+ print {$output_handler} qq!</tr>\n!;
}
} else { # porcelain, i.e. ordinary blame
@@ -5183,25 +5191,25 @@ sub git_blame_common {
$tr_class .= ' boundary' if (exists $meta->{'boundary'});
$tr_class .= ' no-previous' if ($meta->{'nprevious'} == 0);
$tr_class .= ' multiple-previous' if ($meta->{'nprevious'} > 1);
- print "<tr id=\"l$lineno\" class=\"$tr_class\">\n";
+ print {$output_handler} "<tr id=\"l$lineno\" class=\"$tr_class\">\n";
if ($group_size) {
- print "<td class=\"sha1\"";
- print " title=\"". esc_html($author) . ", $date\"";
- print " rowspan=\"$group_size\"" if ($group_size > 1);
- print ">";
- print $cgi->a({-href => href(action=>"commit",
+ print {$output_handler} "<td class=\"sha1\"";
+ print {$output_handler} " title=\"". esc_html($author) . ", $date\"";
+ print {$output_handler} " rowspan=\"$group_size\"" if ($group_size > 1);
+ print {$output_handler} ">";
+ print {$output_handler} $cgi->a({-href => href(action=>"commit",
hash=>$full_rev,
file_name=>$file_name)},
esc_html($short_rev));
if ($group_size >= 2) {
my @author_initials = ($author =~ /\b([[:upper:]])\B/g);
if (@author_initials) {
- print "<br />" .
+ print {$output_handler} "<br />" .
esc_html(join('', @author_initials));
# or join('.', ...)
}
}
- print "</td>\n";
+ print {$output_handler} "</td>\n";
}
# 'previous' <sha1 of parent commit> <filename at commit>
if (exists $meta->{'previous'} &&
@@ -5218,23 +5226,23 @@ sub git_blame_common {
my $blamed = href(action => 'blame',
file_name => $linenr_filename,
hash_base => $linenr_commit);
- print "<td class=\"linenr\">";
- print $cgi->a({ -href => "$blamed#l$orig_lineno",
+ print {$output_handler} "<td class=\"linenr\">";
+ print {$output_handler} $cgi->a({ -href => "$blamed#l$orig_lineno",
-class => "linenr" },
esc_html($lineno));
- print "</td>";
- print "<td class=\"pre\">" . esc_html($data) . "</td>\n";
- print "</tr>\n";
+ print {$output_handler} "</td>";
+ print {$output_handler} "<td class=\"pre\">" . esc_html($data) . "</td>\n";
+ print {$output_handler} "</tr>\n";
} # end while
}
# footer
- print "</tbody>\n".
+ print {$output_handler} "</tbody>\n".
"</table>\n"; # class="blame"
- print "</div>\n"; # class="blame_body"
+ print {$output_handler} "</div>\n"; # class="blame_body"
close $fd
- or print "Reading blob failed\n";
+ or print {$output_handler} "Reading blob failed\n";
git_footer_html();
}
@@ -5317,16 +5325,17 @@ sub git_blob_plain {
my $sandbox = $prevent_xss &&
$type !~ m!^(?:text/plain|image/(?:gif|png|jpeg))$!;
- print $cgi->header(
+ print {$output_handler} $cgi->header(
-type => $type,
-expires => $expires,
-content_disposition =>
($sandbox ? 'attachment' : 'inline')
. '; filename="' . $save_as . '"');
local $/ = undef;
- binmode STDOUT, ':raw';
- print <$fd>;
- binmode STDOUT, ':utf8'; # as set at the beginning of gitweb.cgi
+
+ binmode $output_handler_bin, ':raw';
+ print {$output_handler_bin} <$fd>;
+ binmode $output_handler_bin, ':utf8'; # as set at the beginning of gitweb.cgi
close $fd;
}
@@ -5385,18 +5394,18 @@ sub git_blob {
git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav);
git_print_header_div('commit', esc_html($co{'title'}), $hash_base);
} else {
- print "<div class=\"page_nav\">\n" .
+ print {$output_handler} "<div class=\"page_nav\">\n" .
"<br/><br/></div>\n" .
"<div class=\"title\">$hash</div>\n";
}
git_print_page_path($file_name, "blob", $hash_base);
- print "<div class=\"page_body\">\n";
+ print {$output_handler} "<div class=\"page_body\">\n";
if ($mimetype =~ m!^image/!) {
- print qq!<img type="$mimetype"!;
+ print {$output_handler} qq!<img type="$mimetype"!;
if ($file_name) {
- print qq! alt="$file_name" title="$file_name"!;
+ print {$output_handler} qq! alt="$file_name" title="$file_name"!;
}
- print qq! src="! .
+ print {$output_handler} qq! src="! .
href(action=>"blob_plain", hash=>$hash,
hash_base=>$hash_base, file_name=>$file_name) .
qq!" />\n!;
@@ -5406,14 +5415,14 @@ sub git_blob {
chomp $line;
$nr++;
$line = untabify($line);
- printf "<div class=\"pre\"><a id=\"l%i\" href=\"" . href(-replay => 1)
+ printf {$output_handler} "<div class=\"pre\"><a id=\"l%i\" href=\"" . href(-replay => 1)
. "#l%i\" class=\"linenr\">%4i</a> %s</div>\n",
$nr, $nr, $nr, esc_html($line, -nbsp=>1);
}
}
close $fd
- or print "Reading blob failed.\n";
- print "</div>";
+ or print {$output_handler} "Reading blob failed.\n";
+ print {$output_handler} "</div>";
git_footer_html();
}
@@ -5468,9 +5477,9 @@ sub git_tree {
git_print_header_div('commit', esc_html($co{'title'}) . $ref, $hash_base);
} else {
undef $hash_base;
- print "<div class=\"page_nav\">\n";
- print "<br/><br/></div>\n";
- print "<div class=\"title\">$hash</div>\n";
+ print {$output_handler} "<div class=\"page_nav\">\n";
+ print {$output_handler} "<br/><br/></div>\n";
+ print {$output_handler} "<div class=\"title\">$hash</div>\n";
}
if (defined $file_name) {
$basedir = $file_name;
@@ -5479,16 +5488,16 @@ sub git_tree {
}
git_print_page_path($file_name, 'tree', $hash_base);
}
- print "<div class=\"page_body\">\n";
- print "<table class=\"tree\">\n";
+ print {$output_handler} "<div class=\"page_body\">\n";
+ print {$output_handler} "<table class=\"tree\">\n";
my $alternate = 1;
# '..' (top directory) link if possible
if (defined $hash_base &&
defined $file_name && $file_name =~ m![^/]+$!) {
if ($alternate) {
- print "<tr class=\"dark\">\n";
+ print {$output_handler} "<tr class=\"dark\">\n";
} else {
- print "<tr class=\"light\">\n";
+ print {$output_handler} "<tr class=\"light\">\n";
}
$alternate ^= 1;
@@ -5496,33 +5505,33 @@ sub git_tree {
$up =~ s!/?[^/]+$!!;
undef $up unless $up;
# based on git_print_tree_entry
- print '<td class="mode">' . mode_str('040000') . "</td>\n";
- print '<td class="size"> </td>'."\n" if $show_sizes;
- print '<td class="list">';
- print $cgi->a({-href => href(action=>"tree",
+ print {$output_handler} '<td class="mode">' . mode_str('040000') . "</td>\n";
+ print {$output_handler} '<td class="size"> </td>'."\n" if $show_sizes;
+ print {$output_handler} '<td class="list">';
+ print {$output_handler} $cgi->a({-href => href(action=>"tree",
hash_base=>$hash_base,
file_name=>$up)},
"..");
- print "</td>\n";
- print "<td class=\"link\"></td>\n";
+ print {$output_handler} "</td>\n";
+ print {$output_handler} "<td class=\"link\"></td>\n";
- print "</tr>\n";
+ print {$output_handler} "</tr>\n";
}
foreach my $line (@entries) {
my %t = parse_ls_tree_line($line, -z => 1, -l => $show_sizes);
if ($alternate) {
- print "<tr class=\"dark\">\n";
+ print {$output_handler} "<tr class=\"dark\">\n";
} else {
- print "<tr class=\"light\">\n";
+ print {$output_handler} "<tr class=\"light\">\n";
}
$alternate ^= 1;
git_print_tree_entry(\%t, $basedir, $hash_base, $have_blame);
- print "</tr>\n";
+ print {$output_handler} "</tr>\n";
}
- print "</table>\n" .
+ print {$output_handler} "</table>\n" .
"</div>";
git_footer_html();
}
@@ -5599,16 +5608,16 @@ sub git_snapshot {
}
$filename =~ s/(["\\])/\\$1/g;
- print $cgi->header(
+ print {$output_handler} $cgi->header(
-type => $known_snapshot_formats{$format}{'type'},
-content_disposition => 'inline; filename="' . $filename . '"',
-status => '200 OK');
open my $fd, "-|", $cmd
or die_error(500, "Execute git-archive failed");
- binmode STDOUT, ':raw';
- print <$fd>;
- binmode STDOUT, ':utf8'; # as set at the beginning of gitweb.cgi
+ binmode $output_handler_bin, ':raw';
+ print {$output_handler_bin} <$fd>;
+ binmode $output_handler_bin, ':utf8'; # as set at the beginning of gitweb.cgi
close $fd;
}
@@ -5759,11 +5768,11 @@ sub git_commit {
} else {
git_print_header_div('tree', esc_html($co{'title'}) . $ref, $co{'tree'}, $hash);
}
- print "<div class=\"title_text\">\n" .
+ print {$output_handler} "<div class=\"title_text\">\n" .
"<table class=\"object_header\">\n";
git_print_authorship_rows(\%co);
- print "<tr><td>commit</td><td class=\"sha1\">$co{'id'}</td></tr>\n";
- print "<tr>" .
+ print {$output_handler} "<tr><td>commit</td><td class=\"sha1\">$co{'id'}</td></tr>\n";
+ print {$output_handler} "<tr>" .
"<td>tree</td>" .
"<td class=\"sha1\">" .
$cgi->a({-href => href(action=>"tree", hash=>$co{'tree'}, hash_base=>$hash),
@@ -5774,13 +5783,13 @@ sub git_commit {
"tree");
my $snapshot_links = format_snapshot_links($hash);
if (defined $snapshot_links) {
- print " | " . $snapshot_links;
+ print {$output_handler} " | " . $snapshot_links;
}
- print "</td>" .
+ print {$output_handler} "</td>" .
"</tr>\n";
foreach my $par (@$parents) {
- print "<tr>" .
+ print {$output_handler} "<tr>" .
"<td>parent</td>" .
"<td class=\"sha1\">" .
$cgi->a({-href => href(action=>"commit", hash=>$par),
@@ -5793,12 +5802,12 @@ sub git_commit {
"</td>" .
"</tr>\n";
}
- print "</table>".
+ print {$output_handler} "</table>".
"</div>\n";
- print "<div class=\"page_body\">\n";
+ print {$output_handler} "<div class=\"page_body\">\n";
git_print_log($co{'comment'});
- print "</div>\n";
+ print {$output_handler} "</div>\n";
git_difftree_body(\@difftree, $hash, @$parents);
@@ -5846,7 +5855,7 @@ sub git_object {
die_error(400, "Not enough information to find object");
}
- print $cgi->redirect(-uri => href(action=>$type, -full=>1,
+ print {$output_handler} $cgi->redirect(-uri => href(action=>$type, -full=>1,
hash=>$hash, hash_base=>$hash_base,
file_name=>$file_name),
-status => '302 Found');
@@ -5937,23 +5946,23 @@ sub git_blobdiff {
git_print_page_nav('','', $hash_base,$co{'tree'},$hash_base, $formats_nav);
git_print_header_div('commit', esc_html($co{'title'}), $hash_base);
} else {
- print "<div class=\"page_nav\"><br/>$formats_nav<br/></div>\n";
- print "<div class=\"title\">$hash vs $hash_parent</div>\n";
+ print {$output_handler} "<div class=\"page_nav\"><br/>$formats_nav<br/></div>\n";
+ print {$output_handler} "<div class=\"title\">$hash vs $hash_parent</div>\n";
}
if (defined $file_name) {
git_print_page_path($file_name, "blob", $hash_base);
} else {
- print "<div class=\"page_path\"></div>\n";
+ print {$output_handler} "<div class=\"page_path\"></div>\n";
}
} elsif ($format eq 'plain') {
- print $cgi->header(
+ print {$output_handler} $cgi->header(
-type => 'text/plain',
-charset => 'utf-8',
-expires => $expires,
-content_disposition => 'inline; filename="' . "$file_name" . '.patch"');
- print "X-Git-Url: " . $cgi->self_url() . "\n\n";
+ print {$output_handler} "X-Git-Url: " . $cgi->self_url() . "\n\n";
} else {
die_error(400, "Unknown blobdiff format");
@@ -5961,12 +5970,12 @@ sub git_blobdiff {
# patch
if ($format eq 'html') {
- print "<div class=\"page_body\">\n";
+ print {$output_handler} "<div class=\"page_body\">\n";
git_patchset_body($fd, [ \%diffinfo ], $hash_base, $hash_parent_base);
close $fd;
- print "</div>\n"; # class="page_body"
+ print {$output_handler} "</div>\n"; # class="page_body"
git_footer_html();
} else {
@@ -5974,12 +5983,12 @@ sub git_blobdiff {
$line =~ s!a/($hash|$hash_parent)!'a/'.esc_path($diffinfo{'from_file'})!eg;
$line =~ s!b/($hash|$hash_parent)!'b/'.esc_path($diffinfo{'to_file'})!eg;
- print $line;
+ print {$output_handler} $line;
last if $line =~ m!^\+\+\+!;
}
local $/ = undef;
- print <$fd>;
+ print {$output_handler} <$fd>;
close $fd;
}
}
@@ -6142,16 +6151,16 @@ sub git_commitdiff {
git_header_html(undef, $expires);
git_print_page_nav('commitdiff','', $hash,$co{'tree'},$hash, $formats_nav);
git_print_header_div('commit', esc_html($co{'title'}) . $ref, $hash);
- print "<div class=\"title_text\">\n" .
+ print {$output_handler} "<div class=\"title_text\">\n" .
"<table class=\"object_header\">\n";
git_print_authorship_rows(\%co);
- print "</table>".
+ print {$output_handler} "</table>".
"</div>\n";
- print "<div class=\"page_body\">\n";
+ print {$output_handler} "<div class=\"page_body\">\n";
if (@{$co{'comment'}} > 1) {
- print "<div class=\"log\">\n";
+ print {$output_handler} "<div class=\"log\">\n";
git_print_log($co{'comment'}, -final_empty_line=> 1, -remove_title => 1);
- print "</div>\n"; # class="log"
+ print {$output_handler} "</div>\n"; # class="log"
}
} elsif ($format eq 'plain') {
@@ -6159,27 +6168,27 @@ sub git_commitdiff {
my $tagname = git_get_rev_name_tags($hash);
my $filename = basename($project) . "-$hash.patch";
- print $cgi->header(
+ print {$output_handler} $cgi->header(
-type => 'text/plain',
-charset => 'utf-8',
-expires => $expires,
-content_disposition => 'inline; filename="' . "$filename" . '"');
my %ad = parse_date($co{'author_epoch'}, $co{'author_tz'});
- print "From: " . to_utf8($co{'author'}) . "\n";
- print "Date: $ad{'rfc2822'} ($ad{'tz_local'})\n";
- print "Subject: " . to_utf8($co{'title'}) . "\n";
+ print {$output_handler} "From: " . to_utf8($co{'author'}) . "\n";
+ print {$output_handler} "Date: $ad{'rfc2822'} ($ad{'tz_local'})\n";
+ print {$output_handler} "Subject: " . to_utf8($co{'title'}) . "\n";
- print "X-Git-Tag: $tagname\n" if $tagname;
- print "X-Git-Url: " . $cgi->self_url() . "\n\n";
+ print {$output_handler} "X-Git-Tag: $tagname\n" if $tagname;
+ print {$output_handler} "X-Git-Url: " . $cgi->self_url() . "\n\n";
foreach my $line (@{$co{'comment'}}) {
- print to_utf8($line) . "\n";
+ print {$output_handler} to_utf8($line) . "\n";
}
- print "---\n\n";
+ print {$output_handler} "---\n\n";
} elsif ($format eq 'patch') {
my $filename = basename($project) . "-$hash.patch";
- print $cgi->header(
+ print {$output_handler} $cgi->header(
-type => 'text/plain',
-charset => 'utf-8',
-expires => $expires,
@@ -6192,24 +6201,24 @@ sub git_commitdiff {
$hash_parent eq '-c' || $hash_parent eq '--cc';
git_difftree_body(\@difftree, $hash,
$use_parents ? @{$co{'parents'}} : $hash_parent);
- print "<br/>\n";
+ print {$output_handler} "<br/>\n";
git_patchset_body($fd, \@difftree, $hash,
$use_parents ? @{$co{'parents'}} : $hash_parent);
close $fd;
- print "</div>\n"; # class="page_body"
+ print {$output_handler} "</div>\n"; # class="page_body"
git_footer_html();
} elsif ($format eq 'plain') {
local $/ = undef;
- print <$fd>;
+ print {$output_handler} <$fd>;
close $fd
- or print "Reading git-diff-tree failed\n";
+ or print {$output_handler} "Reading git-diff-tree failed\n";
} elsif ($format eq 'patch') {
local $/ = undef;
- print <$fd>;
+ print {$output_handler} <$fd>;
close $fd
- or print "Reading git-format-patch failed\n";
+ or print {$output_handler} "Reading git-format-patch failed\n";
}
}
@@ -6312,7 +6321,7 @@ sub git_search {
git_print_page_nav('','', $hash,$co{'tree'},$hash);
git_print_header_div('commit', esc_html($co{'title'}), $hash);
- print "<table class=\"pickaxe search\">\n";
+ print {$output_handler} "<table class=\"pickaxe search\">\n";
my $alternate = 1;
local $/ = "\n";
open my $fd, '-|', git_cmd(), '--no-pager', 'log', @diff_opts,
@@ -6328,24 +6337,24 @@ sub git_search {
if (defined $set{'commit'}) {
# finish previous commit
if (%co) {
- print "</td>\n" .
+ print {$output_handler} "</td>\n" .
"<td class=\"link\">" .
$cgi->a({-href => href(action=>"commit", hash=>$co{'id'})}, "commit") .
" | " .
$cgi->a({-href => href(action=>"tree", hash=>$co{'tree'}, hash_base=>$co{'id'})}, "tree");
- print "</td>\n" .
+ print {$output_handler} "</td>\n" .
"</tr>\n";
}
if ($alternate) {
- print "<tr class=\"dark\">\n";
+ print {$output_handler} "<tr class=\"dark\">\n";
} else {
- print "<tr class=\"light\">\n";
+ print {$output_handler} "<tr class=\"light\">\n";
}
$alternate ^= 1;
%co = parse_commit($set{'commit'});
my $author = chop_and_escape_str($co{'author_name'}, 15, 5);
- print "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
+ print {$output_handler} "<td title=\"$co{'age_string_age'}\"><i>$co{'age_string_date'}</i></td>\n" .
"<td><i>$author</i></td>\n" .
"<td>" .
$cgi->a({-href => href(action=>"commit", hash=>$co{'id'}),
@@ -6354,7 +6363,7 @@ sub git_search {
} elsif (defined $set{'to_id'}) {
next if ($set{'to_id'} =~ m/^0{40}$/);
- print $cgi->a({-href => href(action=>"blob", hash_base=>$co{'id'},
+ print {$output_handler} $cgi->a({-href => href(action=>"blob", hash_base=>$co{'id'},
hash=>$set{'to_id'}, file_name=>$set{'to_file'}),
-class => "list"},
"<span class=\"match\">" . esc_path($set{'file'}) . "</span>") .
@@ -6365,23 +6374,23 @@ sub git_search {
# finish last commit (warning: repetition!)
if (%co) {
- print "</td>\n" .
+ print {$output_handler} "</td>\n" .
"<td class=\"link\">" .
$cgi->a({-href => href(action=>"commit", hash=>$co{'id'})}, "commit") .
" | " .
$cgi->a({-href => href(action=>"tree", hash=>$co{'tree'}, hash_base=>$co{'id'})}, "tree");
- print "</td>\n" .
+ print {$output_handler} "</td>\n" .
"</tr>\n";
}
- print "</table>\n";
+ print {$output_handler} "</table>\n";
}
if ($searchtype eq 'grep') {
git_print_page_nav('','', $hash,$co{'tree'},$hash);
git_print_header_div('commit', esc_html($co{'title'}), $hash);
- print "<table class=\"grep_search\">\n";
+ print {$output_handler} "<table class=\"grep_search\">\n";
my $alternate = 1;
my $matches = 0;
local $/ = "\n";
@@ -6400,21 +6409,21 @@ sub git_search {
(undef, $file, $lno, $ltext) = split(/:/, $line, 4);
}
if ($file ne $lastfile) {
- $lastfile and print "</td></tr>\n";
+ $lastfile and print {$output_handler} "</td></tr>\n";
if ($alternate++) {
- print "<tr class=\"dark\">\n";
+ print {$output_handler} "<tr class=\"dark\">\n";
} else {
- print "<tr class=\"light\">\n";
+ print {$output_handler} "<tr class=\"light\">\n";
}
- print "<td class=\"list\">".
+ print {$output_handler} "<td class=\"list\">".
$cgi->a({-href => href(action=>"blob", hash=>$co{'hash'},
file_name=>"$file"),
-class => "list"}, esc_path($file));
- print "</td><td>\n";
+ print {$output_handler} "</td><td>\n";
$lastfile = $file;
}
if ($binary) {
- print "<div class=\"binary\">Binary file</div>\n";
+ print {$output_handler} "<div class=\"binary\">Binary file</div>\n";
} else {
$ltext = untabify($ltext);
if ($ltext =~ m/^(.*)($search_regexp)(.*)$/i) {
@@ -6426,7 +6435,7 @@ sub git_search {
} else {
$ltext = esc_html($ltext, -nbsp=>1);
}
- print "<div class=\"pre\">" .
+ print {$output_handler} "<div class=\"pre\">" .
$cgi->a({-href => href(action=>"blob", hash=>$co{'hash'},
file_name=>"$file").'#l'.$lno,
-class => "linenr"}, sprintf('%4i', $lno))
@@ -6434,16 +6443,16 @@ sub git_search {
}
}
if ($lastfile) {
- print "</td></tr>\n";
+ print {$output_handler} "</td></tr>\n";
if ($matches > 1000) {
- print "<div class=\"diff nodifferences\">Too many matches, listing trimmed</div>\n";
+ print {$output_handler} "<div class=\"diff nodifferences\">Too many matches, listing trimmed</div>\n";
}
} else {
- print "<div class=\"diff nodifferences\">No matches found</div>\n";
+ print {$output_handler} "<div class=\"diff nodifferences\">No matches found</div>\n";
}
close $fd;
- print "</table>\n";
+ print {$output_handler} "</table>\n";
}
git_footer_html();
}
@@ -6451,7 +6460,7 @@ sub git_search {
sub git_search_help {
git_header_html();
git_print_page_nav('','', $hash,$hash,$hash);
- print <<EOT;
+ print {$output_handler} <<EOT;
<p><strong>Pattern</strong> is by default a normal string that is matched precisely (but without
regard to case, except in the case of pickaxe). However, when you check the <em>re</em> checkbox,
the pattern entered is recognized as the POSIX extended
@@ -6463,7 +6472,7 @@ insensitive).</p>
EOT
my $have_grep = gitweb_check_feature('grep');
if ($have_grep) {
- print <<EOT;
+ print {$output_handler} <<EOT;
<dt><b>grep</b></dt>
<dd>All files in the currently selected tree (HEAD unless you are explicitly browsing
a different one) are searched for the given pattern. On large trees, this search can take
@@ -6472,7 +6481,7 @@ due to git-grep peculiarity, currently if regexp mode is turned off, the matches
case-sensitive.</dd>
EOT
}
- print <<EOT;
+ print {$output_handler} <<EOT;
<dt><b>author</b></dt>
<dd>Name and e-mail of the change author and date of birth of the patch will be scanned for the given pattern.</dd>
<dt><b>committer</b></dt>
@@ -6480,7 +6489,7 @@ EOT
EOT
my $have_pickaxe = gitweb_check_feature('pickaxe');
if ($have_pickaxe) {
- print <<EOT;
+ print {$output_handler} <<EOT;
<dt><b>pickaxe</b></dt>
<dd>All commits that caused the string to appear or disappear from any file (changes that
added, removed or "modified" the string) will be listed. This search can take a while and
@@ -6488,7 +6497,7 @@ takes a lot of strain on the server, so please use it wisely. Note that since yo
interested even in changes just changing the case as well, this search is case sensitive.</dd>
EOT
}
- print "</dl>\n";
+ print {$output_handler} "</dl>\n";
git_footer_html();
}
@@ -6535,7 +6544,7 @@ sub git_feed {
$since = Time::ParseDate::parsedate($if_modified, GMT => 1);
}
if (defined $since && $latest_epoch <= $since) {
- print $cgi->header(
+ print {$output_handler} $cgi->header(
-type => $content_type,
-charset => 'utf-8',
-last_modified => $latest_date{'rfc2822'},
@@ -6543,12 +6552,12 @@ sub git_feed {
return;
}
}
- print $cgi->header(
+ print {$output_handler} $cgi->header(
-type => $content_type,
-charset => 'utf-8',
-last_modified => $latest_date{'rfc2822'});
} else {
- print $cgi->header(
+ print {$output_handler} $cgi->header(
-type => $content_type,
-charset => 'utf-8');
}
@@ -6592,13 +6601,13 @@ sub git_feed {
} else {
$alt_url = href(-full=>1, action=>"summary");
}
- print qq!<?xml version="1.0" encoding="utf-8"?>\n!;
+ print {$output_handler} qq!<?xml version="1.0" encoding="utf-8"?>\n!;
if ($format eq 'rss') {
- print <<XML;
+ print {$output_handler} <<XML;
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
XML
- print "<title>$title</title>\n" .
+ print {$output_handler} "<title>$title</title>\n" .
"<link>$alt_url</link>\n" .
"<description>$descr</description>\n" .
"<language>en</language>\n" .
@@ -6608,22 +6617,22 @@ XML
# prefer the logo to the favicon, since RSS
# doesn't allow both
my $img = esc_url($logo || $favicon);
- print "<image>\n" .
+ print {$output_handler} "<image>\n" .
"<url>$img</url>\n" .
"<title>$title</title>\n" .
"<link>$alt_url</link>\n" .
"</image>\n";
}
if (%latest_date) {
- print "<pubDate>$latest_date{'rfc2822'}</pubDate>\n";
- print "<lastBuildDate>$latest_date{'rfc2822'}</lastBuildDate>\n";
+ print {$output_handler} "<pubDate>$latest_date{'rfc2822'}</pubDate>\n";
+ print {$output_handler} "<lastBuildDate>$latest_date{'rfc2822'}</lastBuildDate>\n";
}
- print "<generator>gitweb v.$version/$git_version</generator>\n";
+ print {$output_handler} "<generator>gitweb v.$version/$git_version</generator>\n";
} elsif ($format eq 'atom') {
- print <<XML;
+ print {$output_handler} <<XML;
<feed xmlns="http://www.w3.org/2005/Atom">
XML
- print "<title>$title</title>\n" .
+ print {$output_handler} "<title>$title</title>\n" .
"<subtitle>$descr</subtitle>\n" .
'<link rel="alternate" type="text/html" href="' .
$alt_url . '" />' . "\n" .
@@ -6633,19 +6642,19 @@ XML
# use project owner for feed author
"<author><name>$owner</name></author>\n";
if (defined $favicon) {
- print "<icon>" . esc_url($favicon) . "</icon>\n";
+ print {$output_handler} "<icon>" . esc_url($favicon) . "</icon>\n";
}
if (defined $logo_url) {
# not twice as wide as tall: 72 x 27 pixels
- print "<logo>" . esc_url($logo) . "</logo>\n";
+ print {$output_handler} "<logo>" . esc_url($logo) . "</logo>\n";
}
if (! %latest_date) {
# dummy date to keep the feed valid until commits trickle in:
- print "<updated>1970-01-01T00:00:00Z</updated>\n";
+ print {$output_handler} "<updated>1970-01-01T00:00:00Z</updated>\n";
} else {
- print "<updated>$latest_date{'iso-8601'}</updated>\n";
+ print {$output_handler} "<updated>$latest_date{'iso-8601'}</updated>\n";
}
- print "<generator version='$version/$git_version'>gitweb</generator>\n";
+ print {$output_handler} "<generator version='$version/$git_version'>gitweb</generator>\n";
}
# contents
@@ -6670,7 +6679,7 @@ XML
# print element (entry, item)
my $co_url = href(-full=>1, action=>"commitdiff", hash=>$commit);
if ($format eq 'rss') {
- print "<item>\n" .
+ print {$output_handler} "<item>\n" .
"<title>" . esc_html($co{'title'}) . "</title>\n" .
"<author>" . esc_html($co{'author'}) . "</author>\n" .
"<pubDate>$cd{'rfc2822'}</pubDate>\n" .
@@ -6680,22 +6689,22 @@ XML
"<content:encoded>" .
"<![CDATA[\n";
} elsif ($format eq 'atom') {
- print "<entry>\n" .
+ print {$output_handler} "<entry>\n" .
"<title type=\"html\">" . esc_html($co{'title'}) . "</title>\n" .
"<updated>$cd{'iso-8601'}</updated>\n" .
"<author>\n" .
" <name>" . esc_html($co{'author_name'}) . "</name>\n";
if ($co{'author_email'}) {
- print " <email>" . esc_html($co{'author_email'}) . "</email>\n";
+ print {$output_handler} " <email>" . esc_html($co{'author_email'}) . "</email>\n";
}
- print "</author>\n" .
+ print {$output_handler} "</author>\n" .
# use committer for contributor
"<contributor>\n" .
" <name>" . esc_html($co{'committer_name'}) . "</name>\n";
if ($co{'committer_email'}) {
- print " <email>" . esc_html($co{'committer_email'}) . "</email>\n";
+ print {$output_handler} " <email>" . esc_html($co{'committer_email'}) . "</email>\n";
}
- print "</contributor>\n" .
+ print {$output_handler} "</contributor>\n" .
"<published>$cd{'iso-8601'}</published>\n" .
"<link rel=\"alternate\" type=\"text/html\" href=\"$co_url\" />\n" .
"<id>$co_url</id>\n" .
@@ -6703,19 +6712,19 @@ XML
"<div xmlns=\"http://www.w3.org/1999/xhtml\">\n";
}
my $comment = $co{'comment'};
- print "<pre>\n";
+ print {$output_handler} "<pre>\n";
foreach my $line (@$comment) {
$line = esc_html($line);
- print "$line\n";
+ print {$output_handler} "$line\n";
}
- print "</pre><ul>\n";
+ print {$output_handler} "</pre><ul>\n";
foreach my $difftree_line (@difftree) {
my %difftree = parse_difftree_raw_line($difftree_line);
next if !$difftree{'from_id'};
my $file = $difftree{'file'} || $difftree{'to_file'};
- print "<li>" .
+ print {$output_handler} "<li>" .
"[" .
$cgi->a({-href => href(-full=>1, action=>"blobdiff",
hash=>$difftree{'to_id'}, hash_parent=>$difftree{'from_id'},
@@ -6723,26 +6732,26 @@ XML
file_name=>$file, file_parent=>$difftree{'from_file'}),
-title => "diff"}, 'D');
if ($have_blame) {
- print $cgi->a({-href => href(-full=>1, action=>"blame",
+ print {$output_handler} $cgi->a({-href => href(-full=>1, action=>"blame",
file_name=>$file, hash_base=>$commit),
-title => "blame"}, 'B');
}
# if this is not a feed of a file history
if (!defined $file_name || $file_name ne $file) {
- print $cgi->a({-href => href(-full=>1, action=>"history",
+ print {$output_handler} $cgi->a({-href => href(-full=>1, action=>"history",
file_name=>$file, hash=>$commit),
-title => "history"}, 'H');
}
$file = esc_path($file);
- print "] ".
+ print {$output_handler} "] ".
"$file</li>\n";
}
if ($format eq 'rss') {
- print "</ul>]]>\n" .
+ print {$output_handler} "</ul>]]>\n" .
"</content:encoded>\n" .
"</item>\n";
} elsif ($format eq 'atom') {
- print "</ul>\n</div>\n" .
+ print {$output_handler} "</ul>\n</div>\n" .
"</content>\n" .
"</entry>\n";
}
@@ -6750,9 +6759,9 @@ XML
# end of feed
if ($format eq 'rss') {
- print "</channel>\n</rss>\n";
+ print {$output_handler} "</channel>\n</rss>\n";
} elsif ($format eq 'atom') {
- print "</feed>\n";
+ print {$output_handler} "</feed>\n";
}
}
@@ -6766,13 +6775,12 @@ sub git_atom {
sub git_opml {
my @list = git_get_projects_list();
-
- print $cgi->header(
+ print {$output_handler} $cgi->header(
-type => 'text/xml',
-charset => 'utf-8',
-content_disposition => 'inline; filename="opml.xml"');
- print <<XML;
+ print {$output_handler} <<XML;
<?xml version="1.0" encoding="utf-8"?>
<opml version="1.0">
<head>
@@ -6797,9 +6805,9 @@ XML
my $path = esc_html(chop_str($proj{'path'}, 25, 5));
my $rss = href('project' => $proj{'path'}, 'action' => 'rss', -full => 1);
my $html = href('project' => $proj{'path'}, 'action' => 'summary', -full => 1);
- print "<outline type=\"rss\" text=\"$path\" title=\"$path\" xmlUrl=\"$rss\" htmlUrl=\"$html\"/>\n";
+ print {$output_handler} "<outline type=\"rss\" text=\"$path\" title=\"$path\" xmlUrl=\"$rss\" htmlUrl=\"$html\"/>\n";
}
- print <<XML;
+ print {$output_handler} <<XML;
</outline>
</body>
</opml>
--
1.6.5.2
^ permalink raw reply related [flat|nested] 11+ messages in thread