From 41a555ebab603d492440e97c8ddd889617cc51f0 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 18 Sep 2019 19:50:50 +0000 Subject: config: boolean handling matches git-config(1) We need to handle arbitrary integers and case-insensitive variations of human words to match git-config(1) behavior, since that's what users would expect given we use config files parseable by git-config(1). --- lib/PublicInbox/Config.pm | 17 +++++++++++++---- t/config.t | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/lib/PublicInbox/Config.pm b/lib/PublicInbox/Config.pm index 01a01c62..ef277c40 100644 --- a/lib/PublicInbox/Config.pm +++ b/lib/PublicInbox/Config.pm @@ -366,6 +366,17 @@ sub _fill_code_repo { $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 @@ sub _fill { 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 b7a4ceb6..a4e76150 100644 --- a/t/config.t +++ b/t/config.t @@ -190,4 +190,24 @@ for my $s (@valid) { '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(); -- cgit v1.2.3-24-ge0c7