From 67e53d0875a7efcb958fb9680ea87216adaf06cc Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 27 Mar 2014 19:38:06 +0000 Subject: [PATCH] config: revamp API and implement lookup --- examples/public-inbox-config | 12 ++++++++++++ lib/PublicInbox/Config.pm | 24 +++++++++++++++++++++++- t/config.t | 20 ++++++++++++++++++-- 3 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 examples/public-inbox-config 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 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(); -- 2.44.0