about summary refs log tree commit homepage
path: root/lib/PublicInbox
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2016-07-02 21:50:28 +0000
committerEric Wong <e@80x24.org>2016-07-02 21:52:28 +0000
commit33cef7f24d3ddedc4cd79ee88b0bba6ed1aab4c9 (patch)
tree007d880f75e3d9ad06e732e098c2fa7d8b6fb72b /lib/PublicInbox
parentdb07ffcc3243a19ff5b6edf7f3bfc19cb7460df0 (diff)
downloadpublic-inbox-33cef7f24d3ddedc4cd79ee88b0bba6ed1aab4c9.tar.gz
This fills in the internal lookup hashes and simplifies
callers.
Diffstat (limited to 'lib/PublicInbox')
-rw-r--r--lib/PublicInbox/Config.pm18
-rw-r--r--lib/PublicInbox/ExtMsg.pm32
-rw-r--r--lib/PublicInbox/NNTPD.pm21
3 files changed, 40 insertions, 31 deletions
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