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};
$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};
}
}
}
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);
}
}
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}) {
}
}
+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;
# 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);
[ "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 {
}
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"] ];
}
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 ($$) { [] }