]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Config.pm
www_coderepo: wire up snapshots from summary
[public-inbox.git] / lib / PublicInbox / Config.pm
index 41117ac535d49678020bdddb4f5e79092794defa..a430cd5ccd2106d886bd7d8feda0b72acb8e7904 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 2014-2021 all contributors <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 #
 # Used throughout the project for reading configuration
@@ -13,6 +13,7 @@ use v5.10.1;
 use PublicInbox::Inbox;
 use PublicInbox::Spawn qw(popen_rd);
 our $LD_PRELOAD = $ENV{LD_PRELOAD}; # only valid at startup
+our $DEDUPE; # set to {} to dedupe or clear cache
 
 sub _array ($) { ref($_[0]) eq 'ARRAY' ? $_[0] : [ $_[0] ] }
 
@@ -22,11 +23,17 @@ sub new {
        my ($class, $file, $errfh) = @_;
        $file //= default_file();
        my $self;
+       my $set_dedupe;
        if (ref($file) eq 'SCALAR') { # used by some tests
                open my $fh, '<', $file or die;  # PerlIO::scalar
                $self = config_fh_parse($fh, "\n", '=');
                bless $self, $class;
        } else {
+               if (-f $file && $DEDUPE) {
+                       $file = rel2abs_collapsed($file);
+                       $self = $DEDUPE->{$file} and return $self;
+                       $set_dedupe = 1;
+               }
                $self = git_config_dump($class, $file, $errfh);
                $self->{'-f'} = $file;
        }
@@ -39,7 +46,6 @@ sub new {
        $self->{-no_obfuscate} = {};
        $self->{-limiters} = {};
        $self->{-code_repos} = {}; # nick => PublicInbox::Git object
-       $self->{-cgitrc_unparsed} = $self->{'publicinbox.cgitrc'};
 
        if (my $no = delete $self->{'publicinbox.noobfuscate'}) {
                $no = _array($no);
@@ -62,7 +68,7 @@ sub new {
        if (my $css = delete $self->{'publicinbox.css'}) {
                $self->{css} = _array($css);
        }
-
+       $DEDUPE->{$file} = $self if $set_dedupe;
        $self;
 }
 
@@ -270,6 +276,7 @@ sub scan_projects_coderepo ($$$) {
 
 sub parse_cgitrc {
        my ($self, $cgitrc, $nesting) = @_;
+       $cgitrc //= $self->{'publicinbox.cgitrc'};
        if ($nesting == 0) {
                # defaults:
                my %s = map { $_ => 1 } qw(/cgit.css /cgit.png
@@ -318,6 +325,8 @@ sub parse_cgitrc {
                } elsif (m!\A(?:css|favicon|logo|repo\.logo)=(/.+)\z!) {
                        # absolute paths for static files via PublicInbox::Cgit
                        $self->{-cgit_static}->{$1} = 1;
+               } elsif (s!\Asnapshots=\s*!!) {
+                       $self->{'coderepo.snapshots'} = $_;
                }
        }
        cgit_repo_merge($self, $repo->{dir}, $repo) if $repo;
@@ -336,7 +345,7 @@ sub fill_code_repo {
                $git->{cgit_url} = $cgits = _array($cgits);
                $self->{"$pfx.cgiturl"} = $cgits;
        }
-
+       $git->{nick} = $nick;
        $git;
 }
 
@@ -377,8 +386,8 @@ sub get_1 {
 
 sub repo_objs {
        my ($self, $ibxish) = @_;
-       my $ibx_code_repos = $ibxish->{coderepo} or return;
-       $ibxish->{-repo_objs} //= do {
+       my $ibx_code_repos = $ibxish->{coderepo} // return;
+       $ibxish->{-repo_objs} // do {
                my $code_repos = $self->{-code_repos};
                my @repo_objs;
                for my $nick (@$ibx_code_repos) {
@@ -395,10 +404,9 @@ sub repo_objs {
                        push @repo_objs, $repo if $repo;
                }
                if (scalar @repo_objs) {
-                       \@repo_objs;
+                       $ibxish->{-repo_objs} = \@repo_objs;
                } else {
                        delete $ibxish->{coderepo};
-                       undef;
                }
        }
 }
@@ -435,7 +443,8 @@ sub _fill_ibx {
        # more things to encourage decentralization
        for my $k (qw(address altid nntpmirror imapmirror
                        coderepo hide listid url
-                       infourl watchheader nntpserver imapserver)) {
+                       infourl watchheader
+                       nntpserver imapserver pop3server)) {
                my $v = $self->{"$pfx.$k"} // next;
                $ibx->{$k} = _array($v);
        }