+\t(help)
EOM
}
}
@@ -253,7 +292,7 @@ possible to have multiple root commits when merging independent histories.
Every commit references one top-level tree object.
EOM
- delete($ctx->{env}->{'qspawn.wcb'})->($ctx->html_done($x));
+ delete($ctx->{-wcb})->($ctx->html_done($x));
}
sub stream_patch_parse_hdr { # {parse_hdr} for Qspawn
@@ -283,7 +322,7 @@ sub show_patch ($$) {
qw(format-patch -1 --stdout -C),
"--signature=git format-patch -1 --stdout -C $oid", $oid);
my $qsp = PublicInbox::Qspawn->new(\@cmd);
- $ctx->{env}->{'qspawn.wcb'} = delete $ctx->{-wcb};
+ $ctx->{env}->{'qspawn.wcb'} = $ctx->{-wcb};
$ctx->{patch_oid} = $oid;
$qsp->psgi_return($ctx->{env}, undef, \&stream_patch_parse_hdr, $ctx);
}
@@ -304,12 +343,12 @@ sub show_commit ($$) {
my $e = { GIT_DIR => $git->{git_dir} };
my $qsp = PublicInbox::Qspawn->new($cmd, $e, { -C => "$ctx->{-tmp}" });
$qsp->{qsp_err} = \($ctx->{-qsp_err} = '');
- $ctx->{env}->{'qspawn.wcb'} = delete $ctx->{-wcb};
+ $ctx->{env}->{'qspawn.wcb'} = $ctx->{-wcb};
$ctx->{git} = $git;
$qsp->psgi_qx($ctx->{env}, undef, \&show_commit_start, $ctx);
}
-sub show_other ($$) {
+sub show_other ($$) { # just in case...
my ($ctx, $res) = @_;
my ($git, $oid, $type, $size) = @$res;
$size > $MAX_SIZE and return html_page($ctx, 200,
@@ -333,9 +372,13 @@ sub show_tree_result ($$) {
my $pfx = $qp->{b};
$$bref = "tree $ctx->{tree_oid}";
if (defined $pfx) {
- my $x = ascii_html($pfx);
- $pfx .= '/';
- $$bref .= qq( path: $x\n);
+ if ($pfx eq '') {
+ $$bref .= " (root)\n";
+ } else {
+ my $x = ascii_html($pfx);
+ $pfx .= '/';
+ $$bref .= qq( path: $x\n);
+ }
} else {
$pfx = '';
$$bref .= qq[ (path unknown)\n];
@@ -393,6 +436,42 @@ sub show_tree ($$) {
$qsp->psgi_qx($ctx->{env}, undef, \&show_tree_result, $ctx);
}
+# returns seconds offset from git TZ offset
+sub tz_adj ($) {
+ my ($tz) = @_; # e.g "-0700"
+ $tz = int($tz);
+ my $mm = $tz < 0 ? -$tz : $tz;
+ $mm = int($mm / 100) * 60 + ($mm % 100);
+ $mm = $tz < 0 ? -$mm : $mm;
+ ($mm * 60);
+}
+
+sub show_tag_result { # git->cat_async callback
+ my ($bref, $oid, $type, $size, $ctx) = @_;
+ utf8::decode($$bref);
+ my $l = PublicInbox::Linkify->new;
+ $$bref = $l->to_html($$bref);
+ $$bref =~ s!^object ([a-f0-9]+)!object $1!;
+
+ $$bref =~ s/^(tagger .*> )([0-9]+) ([\-+]?[0-9]+)/$1.strftime(
+ '%Y-%m-%d %H:%M:%S', gmtime($2 + tz_adj($3)))." $3"/sme;
+ # TODO: download link
+ html_page($ctx, 200, '', $$bref, '
', dbg_log($ctx));
+}
+
+sub show_tag ($$) {
+ my ($ctx, $res) = @_;
+ my ($git, $oid) = @$res;
+ $ctx->{git} = $git;
+ if ($ctx->{env}->{'pi-httpd.async'}) {
+ ibx_async_cat($ctx, $oid, \&show_tag_result, $ctx);
+ } else { # synchronous (generic PSGI)
+ $git->cat_async($oid, \&show_tag_result, $ctx);
+ $git->cat_async_wait;
+ }
+}
+
# user_cb for SolverGit, called as: user_cb->($result_or_error, $uarg)
sub solve_result {
my ($res, $ctx) = @_;
@@ -403,6 +482,7 @@ sub solve_result {
my ($git, $oid, $type, $size, $di) = @$res;
return show_commit($ctx, $res) if $type eq 'commit';
return show_tree($ctx, $res) if $type eq 'tree';
+ return show_tag($ctx, $res) if $type eq 'tag';
return show_other($ctx, $res) if $type ne 'blob';
my $path = to_filename($di->{path_b} // $hints->{path_b} // 'blob');
my $raw_link = "(raw)";
@@ -484,6 +564,7 @@ sub show ($$;$) {
open $ctx->{lh}, '+>>', "$ctx->{-tmp}/solve.log" or die "open: $!";
my $solver = PublicInbox::SolverGit->new($ctx->{ibx},
\&solve_result, $ctx);
+ $solver->{gits} //= [ $ctx->{git} ];
$solver->{tmp} = $ctx->{-tmp}; # share tmpdir
# PSGI server will call this immediately and give us a callback (-wcb)
sub {