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.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 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 3D84F1FADE for ; Wed, 25 Dec 2019 07:51:08 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 18/30] config: each_inbox: pass user arg to callback Date: Wed, 25 Dec 2019 07:50:52 +0000 Message-Id: <20191225075104.22184-19-e@80x24.org> In-Reply-To: <20191225075104.22184-1-e@80x24.org> References: <20191225075104.22184-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Another place where we can replace anonymous subs with named subs by passing a user-supplied arg. --- lib/PublicInbox/Cgit.pm | 2 +- lib/PublicInbox/Config.pm | 11 ++++---- lib/PublicInbox/ExtMsg.pm | 48 ++++++++++++++++++++--------------- lib/PublicInbox/NewsWWW.pm | 16 +++++++----- lib/PublicInbox/WwwListing.pm | 37 ++++++++++++++++----------- 5 files changed, 65 insertions(+), 49 deletions(-) diff --git a/lib/PublicInbox/Cgit.pm b/lib/PublicInbox/Cgit.pm index d225a38b..e6cb6cbc 100644 --- a/lib/PublicInbox/Cgit.pm +++ b/lib/PublicInbox/Cgit.pm @@ -62,7 +62,7 @@ sub new { pi_config => $pi_config, }, $class; - $pi_config->each_inbox(sub {}); # fill in -code_repos mapped to inboxes + $pi_config->fill_all; # fill in -code_repos mapped to inboxes # some cgit repos may not be mapped to inboxes, so ensure those exist: my $code_repos = $pi_config->{-code_repos}; diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index bdde3dbc..8ecf549d 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -63,12 +63,13 @@ sub new { $self; } -sub _fill_all ($) { each_inbox($_[0], sub {}) } +sub noop {} +sub fill_all ($) { each_inbox($_[0], \&noop) } sub _lookup_fill ($$$) { my ($self, $cache, $key) = @_; $self->{$cache}->{$key} // do { - _fill_all($self); + fill_all($self); $self->{$cache}->{$key}; } } @@ -89,12 +90,12 @@ sub lookup_name ($$) { } sub each_inbox { - my ($self, $cb) = @_; + my ($self, $cb, $arg) = @_; # may auto-vivify if config file is non-existent: foreach my $section (@{$self->{-section_order}}) { next if $section !~ m!\Apublicinbox\.([^/]+)\z!; my $ibx = lookup_name($self, $1) or next; - $cb->($ibx); + $cb->($ibx, $arg); } } @@ -417,7 +418,7 @@ sub _fill { if ($ibx->{obfuscate}) { $ibx->{-no_obfuscate} = $self->{-no_obfuscate}; $ibx->{-no_obfuscate_re} = $self->{-no_obfuscate_re}; - _fill_all($self); # noop to populate -no_obfuscate + fill_all($self); # noop to populate -no_obfuscate } if (my $ibx_code_repos = $ibx->{coderepo}) { diff --git a/lib/PublicInbox/ExtMsg.pm b/lib/PublicInbox/ExtMsg.pm index 47f00b5e..0138d373 100644 --- a/lib/PublicInbox/ExtMsg.pm +++ b/lib/PublicInbox/ExtMsg.pm @@ -74,33 +74,39 @@ sub search_partial ($$) { } } +sub ext_msg_i { + my ($other, $arg) = @_; + my ($cur, $mid, $ibxs, $found) = @$arg; + + return if $other->{name} eq $cur->{name} || !$other->base_url; + + my $mm = $other->mm or return; + + # try to find the URL with Msgmap to avoid forking + my $num = $mm->num_for($mid); + if (defined $num) { + push @$found, $other; + } else { + # no point in trying the fork fallback if we + # know Xapian is up-to-date but missing the + # message in the current repo + push @$ibxs, $other; + } +} + sub ext_msg { my ($ctx) = @_; my $cur = $ctx->{-inbox}; my $mid = $ctx->{mid}; eval { require PublicInbox::Msgmap }; - my (@ibx, @found); - - $ctx->{www}->{pi_config}->each_inbox(sub { - my ($other) = @_; - return if $other->{name} eq $cur->{name} || !$other->base_url; - - my $mm = $other->mm or return; - - # try to find the URL with Msgmap to avoid forking - my $num = $mm->num_for($mid); - if (defined $num) { - push @found, $other; - } else { - # no point in trying the fork fallback if we - # know Xapian is up-to-date but missing the - # message in the current repo - push @ibx, $other; - } - }); + my $ibxs = []; + my $found = []; + my $arg = [ $cur, $mid, $ibxs, $found ]; + + $ctx->{www}->{pi_config}->each_inbox(\&ext_msg_i, $arg); - return exact($ctx, \@found, $mid) if @found; + return exact($ctx, $found, $mid) if @$found; # fall back to partial MID matching my @partial; @@ -114,7 +120,7 @@ sub ext_msg { # can't find a partial match in current inbox, try the others: if (!$n_partial && length($mid) >= $MIN_PARTIAL_LEN) { - foreach my $ibx (@ibx) { + foreach my $ibx (@$ibxs) { $srch = $ibx->search or next; $mids = search_partial($srch, $mid) or next; $n_partial += scalar(@$mids); diff --git a/lib/PublicInbox/NewsWWW.pm b/lib/PublicInbox/NewsWWW.pm index 80bb4886..ee11a089 100644 --- a/lib/PublicInbox/NewsWWW.pm +++ b/lib/PublicInbox/NewsWWW.pm @@ -24,16 +24,19 @@ sub redirect ($$) { [ "Redirecting to $url\n" ] ] } -sub try_inbox ($$) { - my ($ibx, $mid) = @_; +sub try_inbox { + my ($ibx, $arg) = @_; + return if scalar(@$arg) > 1; + # do not pass $env since HTTP_HOST may differ my $url = $ibx->base_url or return; + my ($mid) = @$arg; eval { $ibx->mm->num_for($mid) } or return; # 302 since the same message may show up on # multiple inboxes and inboxes can be added/reordered - redirect(302, $url .= mid_escape($mid) . '/'); + $arg->[1] = redirect(302, $url .= mid_escape($mid) . '/'); } sub call { @@ -70,10 +73,9 @@ sub call { } foreach my $mid (@try) { - $pi_config->each_inbox(sub { - $res ||= try_inbox($_[0], $mid); - }); - last if defined $res; + my $arg = [ $mid ]; + $pi_config->each_inbox(\&try_inbox, $arg); + defined($res = $arg->[1]) and last; } $res || [ 404, [qw(Content-Type text/plain)], ["404 Not Found\n"] ]; } diff --git a/lib/PublicInbox/WwwListing.pm b/lib/PublicInbox/WwwListing.pm index bcb968af..28716668 100644 --- a/lib/PublicInbox/WwwListing.pm +++ b/lib/PublicInbox/WwwListing.pm @@ -16,29 +16,36 @@ require Digest::SHA; require File::Spec; *try_cat = \&PublicInbox::Inbox::try_cat; +sub list_all_i { + my ($ibx, $arg) = @_; + my ($list, $hide_key) = @$arg; + push @$list, $ibx unless $ibx->{-hide}->{$hide_key}; +} + sub list_all ($$$) { my ($self, $env, $hide_key) = @_; - my @list; - $self->{pi_config}->each_inbox(sub { - my ($ibx) = @_; - push @list, $ibx unless $ibx->{-hide}->{$hide_key}; - }); - \@list; + my $list = []; + $self->{pi_config}->each_inbox(\&list_all_i, [ $list, $hide_key ]); + \$list; +} + +sub list_match_domain_i { + my ($ibx, $arg) = @_; + my ($list, $hide_key, $re) = @$arg; + if (!$ibx->{-hide}->{$hide_key} && $ibx->{url} =~ $re) { + push @$list, $ibx; + } } sub list_match_domain ($$$) { my ($self, $env, $hide_key) = @_; - my @list; + my $list = []; my $host = $env->{HTTP_HOST} // $env->{SERVER_NAME}; $host =~ s/:[0-9]+\z//; - my $re = qr!\A(?:https?:)?//\Q$host\E(?::[0-9]+)?/!i; - $self->{pi_config}->each_inbox(sub { - my ($ibx) = @_; - if (!$ibx->{-hide}->{$hide_key} && $ibx->{url} =~ $re) { - push @list, $ibx; - } - }); - \@list; + my $arg = [ $list, $hide_key, + qr!\A(?:https?:)?//\Q$host\E(?::[0-9]+)?/!i ]; + $self->{pi_config}->each_inbox(\&list_match_domain_i, $arg); + $list; } sub list_404 ($$) { [] }