From: Eric Wong Date: Mon, 10 Oct 2022 21:34:22 +0000 (+0000) Subject: www: viewvcs: display annotated tags as discreet objects X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=commitdiff_plain;h=771ec3e170aebcb9c0f3aa29a9b62040ba50f050 www: viewvcs: display annotated tags as discreet objects This emphasizes annotated tags as their own object type in the web UI while being able to link to the existing show_commit() linkification and dfblob: search. --- diff --git a/lib/PublicInbox/ViewVCS.pm b/lib/PublicInbox/ViewVCS.pm index 86bae7d6..02e98768 100644 --- a/lib/PublicInbox/ViewVCS.pm +++ b/lib/PublicInbox/ViewVCS.pm @@ -26,6 +26,7 @@ use PublicInbox::View; use PublicInbox::Eml; use Text::Wrap qw(wrap); use PublicInbox::Hval qw(ascii_html to_filename prurl); +use POSIX qw(strftime); my $hl = eval { require PublicInbox::HlMod; PublicInbox::HlMod->new; @@ -337,7 +338,7 @@ sub show_commit ($$) { $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, @@ -421,6 +422,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) = @_; @@ -431,6 +468,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)"; diff --git a/xt/solver.t b/xt/solver.t index cd894edd..40a5f81f 100644 --- a/xt/solver.t +++ b/xt/solver.t @@ -29,6 +29,7 @@ my $todo = { '6aa8857a11/s/?b=protocol.c', '96f1c7f/s/', # TODO: b=contrib/completion/git-completion.bash 'b76f2c0/s/?b=po/zh_CN.po', + 'c2f3bf071ee90b01f2d629921bb04c4f798f02fa/s/', # tag ], };