]> Sergey Matveev's repositories - public-inbox.git/commitdiff
config: boolean handling matches git-config(1)
authorEric Wong <e@80x24.org>
Wed, 18 Sep 2019 19:50:50 +0000 (19:50 +0000)
committerEric Wong <e@80x24.org>
Wed, 18 Sep 2019 19:51:37 +0000 (19:51 +0000)
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
t/config.t

index 01a01c62b9f3b8e6eae60be54ac70b03be3bd14d..ef277c40a55e14c9719a07ecf9546e9c94edd4ef 100644 (file)
@@ -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";
                }
index b7a4ceb62e030d1efbd31c4ad53e7b0eec548cf6..a4e761500455bfd306c44d3efa626987fc550bbb 100644 (file)
@@ -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();