lib/PublicInbox/Config.pm | 17 +++++++++++++---- t/config.t | 20 ++++++++++++++++++++ diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 01a01c62b9f3b8e6eae60be54ac70b03be3bd14d..ef277c40a55e14c9719a07ecf9546e9c94edd4ef 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -366,6 +366,17 @@ $git; } +sub _git_config_bool ($) { + my ($val) = @_; + if ($val =~ /\A(?:false|no|off|[\-\+]?(?:0x)?0+)\z/i) { + 0; + } elsif ($val =~ /\A(?:true|yes|on|[\-\+]?(?:0x)?[0-9]+)\z/i) { + 1; + } else { + undef; + } +} + sub _fill { my ($self, $pfx) = @_; my $ibx = {}; @@ -379,10 +390,8 @@ } foreach my $k (qw(obfuscate)) { my $v = $self->{"$pfx.$k"}; defined $v or next; - if ($v =~ /\A(?:false|no|off|0)\z/) { - $ibx->{$k} = 0; - } elsif ($v =~ /\A(?:true|yes|on|1)\z/) { - $ibx->{$k} = 1; + if (defined(my $bval = _git_config_bool($v))) { + $ibx->{$k} = $bval; } else { warn "Ignoring $pfx.$k=$v in config, not boolean\n"; } diff --git a/t/config.t b/t/config.t index b7a4ceb62e030d1efbd31c4ad53e7b0eec548cf6..a4e761500455bfd306c44d3efa626987fc550bbb 100644 --- a/t/config.t +++ b/t/config.t @@ -190,4 +190,24 @@ is($t1->{-repo_objs}->[0], $t2->{-repo_objs}->[0], 'inboxes share ::Git object'); } +{ + my $check_git = !!$ENV{CHECK_GIT_BOOL}; + for my $t (qw(TRUE true yes on 1 +1 -1 13 0x1 0x12 0X5)) { + is(PublicInbox::Config::_git_config_bool($t), 1, "$t is true"); + if ($check_git) { + is(`git -c test.val=$t config --bool test.val`, + "true\n", "$t matches git-config behavior"); + } + } + for my $f (qw(FALSE false no off 0 +0 +000 00 0x00 0X0)) { + is(PublicInbox::Config::_git_config_bool($f), 0, "$f is false"); + if ($check_git) { + is(`git -c test.val=$f config --bool test.val`, + "false\n", "$f matches git-config behavior"); + } + } + is(PublicInbox::Config::_git_config_bool('bogus'), undef, + 'bogus is undef'); +} + done_testing();