It's how git-config works, so our `git config --list' parser
must be able to handle it.  Fortunately this doesn't seem to
incur a measurable overhead when parsing a config with 50k
inboxes.
---
 lib/PublicInbox/Config.pm |  5 ++++-
 t/config.t                | 19 +++++++++++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm
index 0a6b210f..f6236d84 100644
--- a/lib/PublicInbox/Config.pm
+++ b/lib/PublicInbox/Config.pm
@@ -151,8 +151,11 @@ sub config_fh_parse ($$$) {
        local $/ = $rs;
        while (defined($line = <$fh>)) { # perf critical with giant configs
                $i = index($line, $fs);
+               # $i may be -1 if $fs not found and it's a key-only entry
+               # (meaning boolean true).  Either way the -1 will drop the
+               # $rs either from $k or $v.
                $k = substr($line, 0, $i);
-               $v = substr($line, $i + 1, -1); # chop off $fs
+               $v = $i >= 0 ? substr($line, $i + 1, -1) : 1;
                $section = substr($k, 0, rindex($k, '.'));
                $seen{$section} //= push(@section_order, $section);
 
diff --git a/t/config.t b/t/config.t
index 80f214cd..8a27a920 100644
--- a/t/config.t
+++ b/t/config.t
@@ -7,6 +7,25 @@ use_ok 'PublicInbox';
 ok(defined(eval('$PublicInbox::VERSION')), 'VERSION defined');
 use_ok 'PublicInbox::Config';
 my ($tmpdir, $for_destroy) = tmpdir();
+use autodie qw(open close);
+my $validate_git_behavior = $ENV{TEST_VALIDATE_GIT_BEHAVIOR};
+
+{
+       my $f = "$tmpdir/bool_config";
+       open my $fh, '>', $f;
+       print $fh <<EOM;
+[imap]
+       debug
+       port = 2
+EOM
+       close $fh;
+       my $cfg = PublicInbox::Config->git_config_dump($f);
+       $validate_git_behavior and
+               is(xqx([qw(git config -f), $f, qw(--bool imap.debug)]),
+                       "true\n", 'git handles key-only as truth');
+       ok($cfg->git_bool($cfg->{'imap.debug'}), 'key-only value handled');
+       is($cfg->{'imap.port'}, 2, 'normal k=v read after key-only');
+}
 
 {
        PublicInbox::Import::init_bare($tmpdir);

Reply via email to