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 56BA31F51E for ; Sat, 8 Oct 2022 08:24:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=80x24.org; s=selector1; t=1665217489; bh=qjGaa4suiikEPhRA+SiyUsiCIOPkU9obcTOg6hxDX7I=; h=From:To:Subject:Date:In-Reply-To:References:From; b=D4aRD6/fDEV/WZd8h/vYvX7wi8uCfwgl1jLMSWGBlnhTFFi9eCk+AHAsSmMnBfg2J b6KD+E4oQ28XOr1NFtWY2S2tmll25Mx5OvTPaDqD7s0ojPa6wVhSiP0ZiwhKbcPwAu 3ixy/HX4yXwie+MSzgxUzx+BFOPtVOG1A03bzf1w= From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 2/5] www_coderepo: wire up snapshots from summary Date: Sat, 8 Oct 2022 08:24:45 +0000 Message-Id: <20221008082448.9856-3-e@80x24.org> In-Reply-To: <20221008082448.9856-1-e@80x24.org> References: <20221008082448.9856-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: This also ensures we won't waste CPU cycles on snapshots which aren't configured if somebody attempts them by guessing URLs. --- Documentation/public-inbox-config.pod | 4 ++++ lib/PublicInbox/Config.pm | 2 ++ lib/PublicInbox/RepoSnapshot.pm | 4 +++- lib/PublicInbox/WwwCoderepo.pm | 25 +++++++++++++++++++++++-- t/solver_git.t | 6 ++++++ 5 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Documentation/public-inbox-config.pod b/Documentation/public-inbox-config.pod index e926a27b..d175d2d7 100644 --- a/Documentation/public-inbox-config.pod +++ b/Documentation/public-inbox-config.pod @@ -265,6 +265,10 @@ The URL of the cgit instance associated with the coderepo. Default: none +=item coderepo.snapshots + +See C in L + =item publicinbox.cgitrc A path to a L file. "repo.url" directives in the cgitrc diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 5cdf182e..a430cd5c 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -325,6 +325,8 @@ sub parse_cgitrc { } elsif (m!\A(?:css|favicon|logo|repo\.logo)=(/.+)\z!) { # absolute paths for static files via PublicInbox::Cgit $self->{-cgit_static}->{$1} = 1; + } elsif (s!\Asnapshots=\s*!!) { + $self->{'coderepo.snapshots'} = $_; } } cgit_repo_merge($self, $repo->{dir}, $repo) if $repo; diff --git a/lib/PublicInbox/RepoSnapshot.pm b/lib/PublicInbox/RepoSnapshot.pm index 460340e6..826392a8 100644 --- a/lib/PublicInbox/RepoSnapshot.pm +++ b/lib/PublicInbox/RepoSnapshot.pm @@ -72,10 +72,12 @@ sub ver_check { # git->check_async callback sub srv { my ($ctx, $fn) = @_; return if $fn =~ /["\s]/s; - $fn =~ s/\.($SUFFIX)\z//o or return; + my $fmt = $ctx->{wcr}->{snapshots}; # TODO per-repo snapshots + $fn =~ s/\.($SUFFIX)\z//o and $fmt->{$1} or return; $ctx->{snap_fmt} = $1; my $pfx = $ctx->{git}->local_nick // return; $pfx =~ s/(?:\.git)?\z/-/; + ($pfx) = ($pfx =~ m!([^/]+)\z!); substr($fn, 0, length($pfx)) eq $pfx or return; $ctx->{snap_pfx} = $fn; my $v = $ctx->{snap_ver} = substr($fn, length($pfx), length($fn)); diff --git a/lib/PublicInbox/WwwCoderepo.pm b/lib/PublicInbox/WwwCoderepo.pm index d491bba2..01ed562b 100644 --- a/lib/PublicInbox/WwwCoderepo.pm +++ b/lib/PublicInbox/WwwCoderepo.pm @@ -12,6 +12,7 @@ use PublicInbox::Git; use PublicInbox::GitAsyncCat; use PublicInbox::WwwStream; use PublicInbox::Hval qw(ascii_html); +use PublicInbox::RepoSnapshot; my $EACH_REF = "git for-each-ref --sort=-creatordate --format='%(HEAD)%00". join('%00', map { "%($_)" } @@ -40,6 +41,11 @@ sub new { my ($cls, $pi_cfg) = @_; my $self = bless { pi_cfg => $pi_cfg }, $cls; prepare_coderepos($self); + $self->{snapshots} = do { + my $s = $pi_cfg->{'coderepo.snapshots'} // ''; + $s eq 'all' ? \%PublicInbox::RepoSnapshot::FMT_TYPES : + +{ map { $_ => 1 } split(/\s+/, $s) }; + }; $self->{$_} = 10 for qw(summary_branches summary_tags); $self->{$_} = 10 for qw(summary_log); $self; @@ -111,13 +117,28 @@ EOM "%(refname:short) %(subject) (%(creatordate:short))'\n"; @r = split(/^/sm, shift(@x) // ''); $last = pop(@r) if scalar(@r) > $ctx->{wcr}->{summary_tags}; + my @s = sort keys %{$ctx->{wcr}->{snapshots}}; + my $n; + if (@s) { + $n = $ctx->{git}->local_nick // die "BUG: $ctx->{git_dir} nick"; + $n =~ s/\.git\z/-/; + ($n) = ($n =~ m!([^/]+)\z!); + $n = ascii_html($n); + } for (@r) { my (undef, $oid, $ref, $s, $cd) = split(/\0/); utf8::decode($_) for ($ref, $s); chomp $cd; my $align = length($ref) < 12 ? ' ' x (12 - length($ref)) : ''; print $zfh "", ascii_html($ref), - "$align ", ascii_html($s), " ($cd)\n"; + "$align ", ascii_html($s), " ($cd)"; + if (@s) { + my $v = $ref; + $v =~ s/\A[vV]//; + print $zfh "\t", join(' ', map { + qq{$_} } @s); + } + print $zfh "\n"; } print $zfh "# no tags yet...\n" if !@r; print $zfh "...\n" if $last; @@ -186,7 +207,7 @@ sub srv { # endpoint called by PublicInbox::WWW # snapshots: if ($path_info =~ m!\A/(.+?)/snapshot/([^/]+)\z! and ($ctx->{git} = $self->{"\0$1"})) { - require PublicInbox::RepoSnapshot; + $ctx->{wcr} = $self; return PublicInbox::RepoSnapshot::srv($ctx, $2) // r(404); } diff --git a/t/solver_git.t b/t/solver_git.t index 71b9554a..d8942747 100644 --- a/t/solver_git.t +++ b/t/solver_git.t @@ -247,6 +247,8 @@ SKIP: { my $cfgpath = "$tmpdir/httpd-config"; open my $cfgfh, '>', $cfgpath or die; print $cfgfh <{-primary_address} inboxdir = $ibx->{inboxdir} @@ -351,6 +353,10 @@ EOF $fn = 'public-inbox-1.0.2.tar.gz'; $res = $cb->(GET("/public-inbox/snapshot/$fn")); is($res->code, 404, '404 on non-existent tag'); + + $fn = 'public-inbox-1.0.0.tar.bz2'; + $res = $cb->(GET("/public-inbox/snapshot/$fn")); + is($res->code, 404, '404 on unconfigured snapshot format'); }; test_psgi(sub { $www->call(@_) }, $client); my $env = { PI_CONFIG => $cfgpath, TMPDIR => $tmpdir };