about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--examples/public-inbox-config12
-rw-r--r--lib/PublicInbox/Config.pm24
-rw-r--r--t/config.t20
3 files changed, 53 insertions, 3 deletions
diff --git a/examples/public-inbox-config b/examples/public-inbox-config
new file mode 100644
index 00000000..9e781d63
--- /dev/null
+++ b/examples/public-inbox-config
@@ -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
diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm
index 4078585a..d91c28a9 100644
--- a/lib/PublicInbox/Config.pm
+++ b/lib/PublicInbox/Config.pm
@@ -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;
 }
 
diff --git a/t/config.t b/t/config.t
index 7dddd2e8..3ff7b370 100644
--- a/t/config.t
+++ b/t/config.t
@@ -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();