diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2020-10-04 18:01:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-04 18:01:09 +0100 |
commit | a1f0135dfc9d57f88245229f40e6461f636e63b1 (patch) | |
tree | 7d1b1ee455fbbaadbeccacd5c51ace6943ec2b63 | |
parent | 36dc681e8ade941aeee64bb5a8f449a4a5b31924 (diff) | |
parent | c464f123f6b7d63075ca2c463f973ea03aa47713 (diff) | |
download | libgit2-a1f0135dfc9d57f88245229f40e6461f636e63b1.tar.gz |
Merge pull request #5626 from csware/parse_bool
boolean config parsing fails in some cases with mapped values
-rw-r--r-- | src/config.c | 8 | ||||
-rw-r--r-- | tests/config/read.c | 76 |
2 files changed, 78 insertions, 6 deletions
diff --git a/src/config.c b/src/config.c index 81f010fa2..42f46e6cf 100644 --- a/src/config.c +++ b/src/config.c @@ -1227,9 +1227,6 @@ int git_config_lookup_map_value( { size_t i; - if (!value) - goto fail_parse; - for (i = 0; i < map_n; ++i) { const git_configmap *m = maps + i; @@ -1238,7 +1235,7 @@ int git_config_lookup_map_value( case GIT_CONFIGMAP_TRUE: { int bool_val; - if (git__parse_bool(&bool_val, value) == 0 && + if (git_config_parse_bool(&bool_val, value) == 0 && bool_val == (int)m->type) { *out = m->map_value; return 0; @@ -1252,7 +1249,7 @@ int git_config_lookup_map_value( break; case GIT_CONFIGMAP_STRING: - if (strcasecmp(value, m->str_match) == 0) { + if (value && strcasecmp(value, m->str_match) == 0) { *out = m->map_value; return 0; } @@ -1260,7 +1257,6 @@ int git_config_lookup_map_value( } } -fail_parse: git_error_set(GIT_ERROR_CONFIG, "failed to map '%s'", value); return -1; } diff --git a/tests/config/read.c b/tests/config/read.c index ba97302f7..109908750 100644 --- a/tests/config/read.c +++ b/tests/config/read.c @@ -928,3 +928,79 @@ void test_config_read__nosection(void) git_buf_dispose(&buf); git_config_free(cfg); } + +enum { + MAP_TRUE = 0, + MAP_FALSE = 1, + MAP_ALWAYS = 2 +}; + +static git_configmap _test_map1[] = { + {GIT_CONFIGMAP_STRING, "always", MAP_ALWAYS}, + {GIT_CONFIGMAP_FALSE, NULL, MAP_FALSE}, + {GIT_CONFIGMAP_TRUE, NULL, MAP_TRUE}, +}; + +static git_configmap _test_map2[] = { + {GIT_CONFIGMAP_INT32, NULL, 0}, +}; + +void test_config_read__get_mapped(void) +{ + git_config *cfg; + int val; + int known_good; + + cl_set_cleanup(&clean_test_config, NULL); + cl_git_mkfile("./testconfig", "[header]\n" + " key1 = 1\n" + " key2 = true\n" + " key3\n" + " key4 = always\n" + " key5 = false\n" + " key6 = 0\n" + " key7 = never\n" + " key8 = On\n" + " key9 = off\n"); + cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig")); + + // check parsing bool and string + cl_git_pass(git_config_get_mapped(&val, cfg, "header.key1", _test_map1, ARRAY_SIZE(_test_map1))); + cl_assert_equal_i(val, MAP_TRUE); + cl_git_pass(git_config_get_mapped(&val, cfg, "header.key2", _test_map1, ARRAY_SIZE(_test_map1))); + cl_assert_equal_i(val, MAP_TRUE); + cl_git_pass(git_config_get_mapped(&val, cfg, "header.key3", _test_map1, ARRAY_SIZE(_test_map1))); + cl_assert_equal_i(val, MAP_TRUE); + cl_git_pass(git_config_get_mapped(&val, cfg, "header.key8", _test_map1, ARRAY_SIZE(_test_map1))); + cl_assert_equal_i(val, MAP_TRUE); + + cl_git_pass(git_config_get_mapped(&val, cfg, "header.key4", _test_map1, ARRAY_SIZE(_test_map1))); + cl_assert_equal_i(val, MAP_ALWAYS); + + cl_git_pass(git_config_get_mapped(&val, cfg, "header.key5", _test_map1, ARRAY_SIZE(_test_map1))); + cl_assert_equal_i(val, MAP_FALSE); + cl_git_pass(git_config_get_mapped(&val, cfg, "header.key6", _test_map1, ARRAY_SIZE(_test_map1))); + cl_assert_equal_i(val, MAP_FALSE); + cl_git_pass(git_config_get_mapped(&val, cfg, "header.key9", _test_map1, ARRAY_SIZE(_test_map1))); + cl_assert_equal_i(val, MAP_FALSE); + + cl_git_fail(git_config_get_mapped(&val, cfg, "header.key7", _test_map1, ARRAY_SIZE(_test_map1))); + + // check parsing int values + cl_git_pass(git_config_get_mapped(&val, cfg, "header.key1", _test_map2, ARRAY_SIZE(_test_map2))); + cl_git_pass(git_config_get_int32(&known_good, cfg, "header.key1")); + cl_assert_equal_i(val, known_good); + cl_git_pass(git_config_get_mapped(&val, cfg, "header.key6", _test_map2, ARRAY_SIZE(_test_map2))); + cl_git_pass(git_config_get_int32(&known_good, cfg, "header.key6")); + cl_assert_equal_i(val, known_good); + + cl_git_fail(git_config_get_mapped(&val, cfg, "header.key2", _test_map2, ARRAY_SIZE(_test_map2))); + cl_git_fail(git_config_get_mapped(&val, cfg, "header.key3", _test_map2, ARRAY_SIZE(_test_map2))); + cl_git_fail(git_config_get_mapped(&val, cfg, "header.key4", _test_map2, ARRAY_SIZE(_test_map2))); + cl_git_fail(git_config_get_mapped(&val, cfg, "header.key5", _test_map2, ARRAY_SIZE(_test_map2))); + cl_git_fail(git_config_get_mapped(&val, cfg, "header.key7", _test_map2, ARRAY_SIZE(_test_map2))); + cl_git_fail(git_config_get_mapped(&val, cfg, "header.key8", _test_map2, ARRAY_SIZE(_test_map2))); + cl_git_fail(git_config_get_mapped(&val, cfg, "header.key9", _test_map2, ARRAY_SIZE(_test_map2))); + + git_config_free(cfg); +} |