]> Sergey Matveev's repositories - public-inbox.git/commitdiff
config: introduce each_inbox for iteration
authorEric Wong <e@80x24.org>
Sat, 2 Jul 2016 21:50:28 +0000 (21:50 +0000)
committerEric Wong <e@80x24.org>
Sat, 2 Jul 2016 21:52:28 +0000 (21:52 +0000)
This fills in the internal lookup hashes and simplifies
callers.

lib/PublicInbox/Config.pm
lib/PublicInbox/ExtMsg.pm
lib/PublicInbox/NNTPD.pm

index ddb4f6b1e95fe2af6a326c45d5025c64549b2918..d34d11ad5cee2a3ef1d4334e8dc94b044b4e5e85 100644 (file)
@@ -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 {
index 4b9e025c1f542ade295fc148a260f6826a774bf7..73bd4b17fe9c983d632f9e70b1b0bef1f64866b4 100644 (file)
@@ -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:
index 50d022be4ae2142ca3bcb39c378c70c8ab349f04..a67811bc9bd458a6eb958c71513ac3d3f23fce7c 100644 (file)
@@ -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