]> Sergey Matveev's repositories - public-inbox.git/commitdiff
config: lazy-load coderepos, support extindex
authorEric Wong <e@80x24.org>
Wed, 17 Mar 2021 07:02:16 +0000 (23:02 -0800)
committerEric Wong <e@80x24.org>
Wed, 17 Mar 2021 19:03:13 +0000 (19:03 +0000)
Extsearch objects are duck-types of Inbox objects, and
are capable of supporting code repos all the same.

lib/PublicInbox/Config.pm
lib/PublicInbox/View.pm
lib/PublicInbox/WWW.pm
lib/PublicInbox/WwwStream.pm
lib/PublicInbox/WwwText.pm
t/config.t

index 113975dd9e2816b7e32366df030423eabecad3d9..1037c88495b92d05f012c3e85908ec5b1aaf451b 100644 (file)
@@ -355,6 +355,12 @@ sub _fill_code_repo {
        $git;
 }
 
+sub get_all {
+       my ($self, $key) = @_;
+       my $v = $self->{$key} // return;
+       _array($v);
+}
+
 sub git_bool {
        my ($val) = $_[-1]; # $_[0] may be $self, or $val
        if ($val =~ /\A(?:false|no|off|[\-\+]?(?:0x)?0+)\z/i) {
@@ -384,6 +390,34 @@ sub _one_val {
        $v->[-1];
 }
 
+sub repo_objs {
+       my ($self, $ibxish) = @_;
+       my $ibx_code_repos = $ibxish->{coderepo} or return;
+       $ibxish->{-repo_objs} //= do {
+               my $code_repos = $self->{-code_repos};
+               my @repo_objs;
+               for my $nick (@$ibx_code_repos) {
+                       my @parts = split(m!/!, $nick);
+                       for (@parts) {
+                               @parts = () unless valid_foo_name($_);
+                       }
+                       unless (@parts) {
+                               warn "invalid coderepo name: `$nick'\n";
+                               next;
+                       }
+                       my $repo = $code_repos->{$nick} //=
+                                               _fill_code_repo($self, $nick);
+                       push @repo_objs, $repo if $repo;
+               }
+               if (scalar @repo_objs) {
+                       \@repo_objs;
+               } else {
+                       delete $ibxish->{coderepo};
+                       undef;
+               }
+       }
+}
+
 sub _fill_ibx {
        my ($self, $name) = @_;
        my $pfx = "publicinbox.$name";
@@ -467,20 +501,6 @@ sub _fill_ibx {
                $ibx->{-no_obfuscate_re} = $self->{-no_obfuscate_re};
                fill_all($self); # noop to populate -no_obfuscate
        }
-       if (my $ibx_code_repos = $ibx->{coderepo}) {
-               my $code_repos = $self->{-code_repos};
-               my $repo_objs = $ibx->{-repo_objs} = [];
-               foreach my $nick (@$ibx_code_repos) {
-                       my @parts = split(m!/!, $nick);
-                       my $valid = 0;
-                       $valid += valid_foo_name($_) foreach (@parts);
-                       $valid == scalar(@parts) or next;
-
-                       my $repo = $code_repos->{$nick} //=
-                                               _fill_code_repo($self, $nick);
-                       push @$repo_objs, $repo if $repo;
-               }
-       }
        if (my $es = ALL($self)) {
                require PublicInbox::Isearch;
                $ibx->{isrch} = PublicInbox::Isearch->new($ibx, $es);
index eee6ae33ea9f97a2f300f21afe18e3bd4f972f8e..f4f6da1128cb7591c971baa6483a73deea52c16e 100644 (file)
@@ -591,8 +591,9 @@ sub add_text_body { # callback for each_part
                $diff = 1;
                delete $ctx->{-long_path};
                my $spfx;
-               if ($ibx->{-repo_objs}) {
-                       if (index($upfx, '//') >= 0) { # absolute URL (Atom feeds)
+               # absolute URL (Atom feeds)
+               if ($ibx->{coderepo}) {
+                       if (index($upfx, '//') >= 0) {
                                $spfx = $upfx;
                                $spfx =~ s!/([^/]*)/\z!/!;
                        } else {
index 500021d422698eef27c41fea84065453d0eaec43..456692a3a7391f0bf7f330d1bcb2190f5b2b43e2 100644 (file)
@@ -309,7 +309,7 @@ sub get_text {
 sub get_vcs_object ($$$;$) {
        my ($ctx, $inbox, $oid, $filename) = @_;
        my $r404 = invalid_inbox($ctx, $inbox);
-       return $r404 if $r404;
+       return $r404 if $r404 || !$ctx->{www}->{pi_cfg}->repo_objs($ctx->{ibx});
        require PublicInbox::ViewVCS;
        PublicInbox::ViewVCS::show($ctx, $oid, $filename);
 }
index 1178a3c976615e64a53093055acf41b314218430..be9e762e6e334d575899864db4fc30ac89226a17 100644 (file)
@@ -84,7 +84,7 @@ sub coderepos ($) {
        my $upfx = ($ctx->{-upfx} // ''). '../';
        my @ret;
        for my $cr_name (@$cr) {
-               my $urls = $cfg->{"coderepo.$cr_name.cgiturl"} // next;
+               my $urls = $cfg->get_all("coderepo.$cr_name.cgiturl") // next;
                $ret[0] //= <<EOF;
 code repositories for the project(s) associated with this inbox:
 EOF
index 9f46c6a603a7c495ee3fcae343185528fa97f4b6..76a95a6b640c879083b5010458a803dee4f815a7 100644 (file)
@@ -191,7 +191,7 @@ EOF
 EOF
                my $pi_cfg = $ctx->{www}->{pi_cfg};
                for my $cr_name (@$cr) {
-                       my $urls = $pi_cfg->{"coderepo.$cr_name.cgiturl"};
+                       my $urls = $pi_cfg->get_all("coderepo.$cr_name.cgiturl");
                        my $path = "/path/to/$cr_name";
                        $cr_name = dq_escape($cr_name);
 
index 06a105c1ce24b3ca566cc5e0809915b2de0c540b..73527ec2699bc84efe567d595ed121ece23216e8 100644 (file)
@@ -212,7 +212,7 @@ EOF
        my $cfg = PublicInbox::Config->new(\$str);
        my $t1 = $cfg->lookup_name('test1');
        my $t2 = $cfg->lookup_name('test2');
-       is($t1->{-repo_objs}->[0], $t2->{-repo_objs}->[0],
+       is($cfg->repo_objs($t1)->[0], $cfg->repo_objs($t2)->[0],
                'inboxes share ::Git object');
 }