From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 33E871F463 for ; Wed, 18 Sep 2019 19:50:50 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH] config: boolean handling matches git-config(1) Date: Wed, 18 Sep 2019 19:50:50 +0000 Message-Id: <20190918195050.16553-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: 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(); -- EW