From 33cef7f24d3ddedc4cd79ee88b0bba6ed1aab4c9 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Sat, 2 Jul 2016 21:50:28 +0000 Subject: config: introduce each_inbox for iteration This fills in the internal lookup hashes and simplifies callers. --- lib/PublicInbox/Config.pm | 18 ++++++++++++++---- lib/PublicInbox/ExtMsg.pm | 32 +++++++++++++++++--------------- lib/PublicInbox/NNTPD.pm | 21 +++++++++------------ 3 files changed, 40 insertions(+), 31 deletions(-) (limited to 'lib/PublicInbox') diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index ddb4f6b1..d34d11ad 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -50,11 +50,21 @@ sub lookup { _fill($self, $pfx); } -sub lookup_name { +sub lookup_name ($$) { my ($self, $name) = @_; - my $rv = $self->{-by_name}->{$name}; - return $rv if $rv; - $rv = _fill($self, "publicinbox.$name") or return; + $self->{-by_name}->{$name} || _fill($self, "publicinbox.$name"); +} + +sub each_inbox { + my ($self, $cb) = @_; + my %seen; + foreach my $k (keys %$self) { + $k =~ /\Apublicinbox\.([A-Z0-9a-z-]+)\.mainrepo\z/ or next; + next if $seen{$1}; + $seen{$1} = 1; + my $ibx = lookup_name($self, $1) or next; + $cb->($ibx); + } } sub lookup_newsgroup { diff --git a/lib/PublicInbox/ExtMsg.pm b/lib/PublicInbox/ExtMsg.pm index 4b9e025c..73bd4b17 100644 --- a/lib/PublicInbox/ExtMsg.pm +++ b/lib/PublicInbox/ExtMsg.pm @@ -30,19 +30,16 @@ sub ext_msg { eval { require PublicInbox::Search }; my $have_xap = $@ ? 0 : 1; - my (@nox, @ibx); + my (@nox, @ibx, @found); - foreach my $k (keys %$pi_config) { - $k =~ /\Apublicinbox\.([A-Z0-9a-z-]+)\.url\z/ or next; - my $name = $1; - next if $name eq $cur->{name}; - my $other = $pi_config->lookup_name($name) or next; - next unless $other->base_url; + $pi_config->each_inbox(sub { + my ($other) = @_; + return if $other->{name} eq $cur->{name} || !$other->base_url; my $s = $other->search; if (!$s) { push @nox, $other; - next; + return; } # try to find the URL with Xapian to avoid forking @@ -50,17 +47,22 @@ sub ext_msg { if ($@) { # xapian not configured properly for this repo push @nox, $other; - next; + return; } # maybe we found it! - return r302($other, $mid) if defined $doc_id; + if (defined $doc_id) { + 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; + } + }); - # 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; - } + # TODO: multiple hits + return r302($found[0], $mid) if @found; # Xapian not installed or configured for some repos, # do a full MID check: diff --git a/lib/PublicInbox/NNTPD.pm b/lib/PublicInbox/NNTPD.pm index 50d022be..a67811bc 100644 --- a/lib/PublicInbox/NNTPD.pm +++ b/lib/PublicInbox/NNTPD.pm @@ -23,21 +23,18 @@ sub refresh_groups () { my $pi_config = PublicInbox::Config->new; my $new = {}; my @list; - foreach my $k (keys %$pi_config) { - $k =~ /\Apublicinbox\.([^\.]+)\.mainrepo\z/ or next; - my $name = $1; - my $git_dir = $pi_config->{$k}; - my $ngname = $pi_config->{"publicinbox.$name.newsgroup"}; - next unless defined $ngname; - next if ($ngname eq ''); # disabled - my $ng = $pi_config->lookup_newsgroup($ngname) or next; - - # Only valid if msgmap and search works - if ($ng->nntp_usable) { + $pi_config->each_inbox(sub { + my ($ng) = @_; + my $ngname = $ng->{newsgroup} or next; + if (ref $ngname) { + warn 'multiple newsgroups not supported: '. + join(', ', @$ngname). "\n"; + } elsif ($ng->nntp_usable) { + # Only valid if msgmap and search works $new->{$ngname} = $ng; push @list, $ng; } - } + }); @list = sort { $a->{newsgroup} cmp $b->{newsgroup} } @list; $self->{grouplist} = \@list; # this will destroy old groups that got deleted -- cgit v1.2.3-24-ge0c7