]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Config.pm
config: use inbox names to map inboxes <-> coderepos
[public-inbox.git] / lib / PublicInbox / Config.pm
index ad8b8e9dc18cdecb87e44a6aa1fe81ed20692f03..cdf06d850e764c7e46f312043414b0fda12df904 100644 (file)
@@ -46,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);
@@ -227,7 +226,6 @@ sub cgit_repo_merge ($$$) {
                        $rel =~ s!/?\.git\z!!;
        }
        $self->{"coderepo.$rel.dir"} //= $path;
-       $self->{"coderepo.$rel.cgiturl"} //= _array($rel);
 }
 
 sub is_git_dir ($) {
@@ -277,6 +275,7 @@ sub scan_projects_coderepo ($$$) {
 
 sub parse_cgitrc {
        my ($self, $cgitrc, $nesting) = @_;
+       $cgitrc //= $self->{'publicinbox.cgitrc'} // return;
        if ($nesting == 0) {
                # defaults:
                my %s = map { $_ => 1 } qw(/cgit.css /cgit.png
@@ -325,6 +324,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;
@@ -343,7 +344,7 @@ sub fill_code_repo {
                $git->{cgit_url} = $cgits = _array($cgits);
                $self->{"$pfx.cgiturl"} = $cgits;
        }
-
+       $git->{nick} = $nick;
        $git;
 }
 
@@ -386,6 +387,7 @@ sub repo_objs {
        my ($self, $ibxish) = @_;
        my $ibx_code_repos = $ibxish->{coderepo} // return;
        $ibxish->{-repo_objs} // do {
+               parse_cgitrc($self, undef, 0);
                my $code_repos = $self->{-code_repos};
                my @repo_objs;
                for my $nick (@$ibx_code_repos) {
@@ -402,7 +404,10 @@ sub repo_objs {
                        push @repo_objs, $repo if $repo;
                }
                if (scalar @repo_objs) {
-                       $ibxish ->{-repo_objs} = \@repo_objs;
+                       for (@repo_objs) {
+                               push @{$_->{ibx_names}}, $ibxish->{name};
+                       }
+                       $ibxish->{-repo_objs} = \@repo_objs;
                } else {
                        delete $ibxish->{coderepo};
                }
@@ -526,7 +531,7 @@ sub _fill_ei ($$) {
 }
 
 sub urlmatch {
-       my ($self, $key, $url) = @_;
+       my ($self, $key, $url, $try_git) = @_;
        state $urlmatch_broken; # requires git 1.8.5
        return if $urlmatch_broken;
        my $file = $self->{'-f'} // default_file();
@@ -535,13 +540,20 @@ sub urlmatch {
        my $fh = popen_rd($cmd);
        local $/ = "\0";
        my $val = <$fh>;
-       if (close($fh)) {
-               chomp($val);
-               $val;
-       } else {
-               $urlmatch_broken = 1 if (($? >> 8) != 1);
-               undef;
+       if (!close($fh)) {
+               undef $val;
+               if (($? >> 8) != 1) {
+                       $urlmatch_broken = 1;
+               } elsif ($try_git) { # n.b. this takes cwd into account
+                       $cmd = [qw(git config -z --get-urlmatch), $key, $url];
+                       $fh = popen_rd($cmd);
+                       $val = <$fh>;
+                       close($fh) or undef($val);
+               }
        }
+       $? = 0; # don't influence lei exit status
+       chomp $val if defined $val;
+       $val;
 }
 
 sub json {