about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/PublicInbox/Cgit.pm2
-rw-r--r--lib/PublicInbox/Config.pm11
-rw-r--r--lib/PublicInbox/ExtMsg.pm48
-rw-r--r--lib/PublicInbox/NewsWWW.pm16
-rw-r--r--lib/PublicInbox/WwwListing.pm37
5 files changed, 65 insertions, 49 deletions
diff --git a/lib/PublicInbox/Cgit.pm b/lib/PublicInbox/Cgit.pm
index 68da9178..ab4065bd 100644
--- a/lib/PublicInbox/Cgit.pm
+++ b/lib/PublicInbox/Cgit.pm
@@ -63,7 +63,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 e19ae8a1..7995b315 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 ($$) { [] }