From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.2 required=3.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id EF99C1F523 for ; Mon, 10 Oct 2022 21:34:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1665437663; bh=MfPRiuGYRu9k0ImIlZ26tdqs0yfC2jGZGpnTo5GF2as=; h=From:To:Subject:Date:In-Reply-To:References:From; b=5fl99L3rASVjaG0TWIbluYMYHC2csM9dwpZBMIkxYTJMfpek633/6HGIPI9CZRebM tjDI9IN5fJYtkO3srXcjbR5U1I7/8NgVHzg5ZIxShSSi/0v09lvYKJKLMIpH6buyi4 k7QLykqSP51rMOv22y5LIna+J8k6qxpZyXOwQMuA= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 3/3] www: viewvcs: display annotated tags as discreet objects Date: Mon, 10 Oct 2022 21:34:22 +0000 Message-Id: <20221010213422.23048-4-e@80x24.org> In-Reply-To: <20221010213422.23048-1-e@80x24.org> References: <20221010213422.23048-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: 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. --- lib/PublicInbox/ViewVCS.pm | 40 +++++++++++++++++++++++++++++++++++++- xt/solver.t | 1 + 2 files changed, 40 insertions(+), 1 deletion(-) 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 ], };