]> Sergey Matveev's repositories - public-inbox.git/commitdiff
config: revamp API and implement lookup
authorEric Wong <normalperson@yhbt.net>
Thu, 27 Mar 2014 19:38:06 +0000 (19:38 +0000)
committerEric Wong <e@80x24.org>
Fri, 28 Mar 2014 02:35:21 +0000 (02:35 +0000)
examples/public-inbox-config [new file with mode: 0644]
lib/PublicInbox/Config.pm
t/config.t

diff --git a/examples/public-inbox-config b/examples/public-inbox-config
new file mode 100644 (file)
index 0000000..9e781d6
--- /dev/null
@@ -0,0 +1,12 @@
+# this usually in ~/.public-inbox/config and parseable with git-config(1)
+# update t/config.t if changing this, that test relies on this
+[publicinbox "test"]
+       address = test@public-inbox.org
+       mainrepo = /home/pi/test-main.git
+       failrepo = /home/pi/test-fail.git
+       description = test box, occasionally reset
+[publicinbox "bugs"]
+       address = bugs@public-inbox.org
+       mainrepo = /home/pi/bugs-main.git
+       failrepo = /home/pi/bugs-fail.git
+       description = development discussion
index 4078585a0e28186fa51e4acb4f79aca56b5e706c..d91c28a91ab15e014e9db0e45b38091fe5bb8517 100644 (file)
@@ -1,9 +1,11 @@
 # Copyright (C) 2014, Eric Wong <normalperson@yhbt.net> and all contributors
 # License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
 package PublicInbox::Config;
+use strict;
+use warnings;
 
 # returns key-value pairs of config directives in a hash
-sub dump {
+sub new {
        my ($class, $file) = @_;
 
        local $ENV{GIT_CONFIG} = $file;
@@ -12,6 +14,26 @@ sub dump {
        $? == 0 or die "git config -l failed: $?\n";
        chomp @cfg;
        my %rv = map { split(/=/, $_, 2) } @cfg;
+       bless \%rv, $class;
+}
+
+sub lookup {
+       my ($self, $recipient) = @_;
+       my $addr = lc($recipient);
+       my $pfx;
+
+       foreach my $k (keys %$self) {
+               $k =~ /\A(publicinbox\.[A-Z0-9a-z-]+)\.address\z/ or next;
+               (lc($self->{$k}) eq $addr) or next;
+               $pfx = $1;
+               last;
+       }
+
+       defined $pfx or return;
+
+       my %rv = map {
+               $_ => $self->{"$pfx.$_"}
+       } (qw(mainrepo failrepo description address));
        \%rv;
 }
 
index 7dddd2e8edd0ef9af37defad97be164aed76586b..3ff7b3706c54672ea7fa63cbfd6c9d42311af191 100644 (file)
@@ -8,16 +8,32 @@ use File::Temp qw/tempdir/;
 my $tmpdir = tempdir(CLEANUP => 1);
 
 {
-       is(system(qw(git init --bare), $tmpdir), 0, "git init successful");
+       is(system(qw(git init -q --bare), $tmpdir), 0, "git init successful");
        {
                local $ENV{GIT_DIR} = $tmpdir;
                is(system(qw(git config foo.bar hihi)), 0, "set config");
        }
 
-       my $tmp = PublicInbox::Config->dump("$tmpdir/config");
+       my $tmp = PublicInbox::Config->new("$tmpdir/config");
 
        is("hihi", $tmp->{"foo.bar"}, "config read correctly");
        is("true", $tmp->{"core.bare"}, "used --bare repo");
 }
 
+{
+       my $f = "examples/public-inbox-config";
+       ok(-r $f, "$f is readable");
+
+       my $cfg = PublicInbox::Config->new($f);
+       is_deeply($cfg->lookup('bugs@public-inbox.org'), {
+               'failrepo' => '/home/pi/bugs-fail.git',
+               'mainrepo' => '/home/pi/bugs-main.git',
+               'address' => 'bugs@public-inbox.org',
+               'description' => 'development discussion'
+       }, "lookup matches expected output");
+
+       is($cfg->lookup('blah@example.com'), undef,
+               "non-existent lookup returns undef");
+}
+
 done_testing();