Make git_config_with_options() to use a configset to feed values
in the callback function. This change gives us the power to filter
variables we feed to the callback using custom constraints.

A slight behaviour change, git_config_int() loses the ability to
print the file name of the invalid variable while dying.

Helped-by: Matthieu Moy <matthieu....@imag.fr>
Signed-off-by: Tanay Abhra <tanay...@gmail.com>
---
 config.c               | 21 +++++++++++++++++++--
 t/t1300-repo-config.sh |  2 +-
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/config.c b/config.c
index cb474b2..09cf009 100644
--- a/config.c
+++ b/config.c
@@ -1214,7 +1214,7 @@ int git_config_early(config_fn_t fn, void *data, const 
char *repo_config)
        return ret == 0 ? found : ret;
 }
 
-int git_config_with_options(config_fn_t fn, void *data,
+static int git_config_with_options_raw(config_fn_t fn, void *data,
                            struct git_config_source *config_source,
                            int respect_includes)
 {
@@ -1247,9 +1247,26 @@ int git_config_with_options(config_fn_t fn, void *data,
        return ret;
 }
 
+static int config_set_callback(const char *key, const char *value, void *cb);
+
+int git_config_with_options(config_fn_t fn, void *data,
+                           struct git_config_source *config_source,
+                           int respect_includes)
+{
+       int ret;
+       struct config_set options_config;
+       git_configset_init(&options_config);
+       ret = git_config_with_options_raw(config_set_callback, &options_config,
+                                         config_source, respect_includes);
+       if (ret >= 0)
+               configset_iter(&options_config, fn, data);
+       git_configset_clear(&options_config);
+       return ret;
+}
+
 static void git_config_raw(config_fn_t fn, void *data)
 {
-       if (git_config_with_options(fn, data, NULL, 1) < 0)
+       if (git_config_with_options_raw(fn, data, NULL, 1) < 0)
                /*
                 * git_config_with_options() normally returns only
                 * positive values, as most errors are fatal, and
diff --git a/t/t1300-repo-config.sh b/t/t1300-repo-config.sh
index 938fc8b..ce5ea01 100755
--- a/t/t1300-repo-config.sh
+++ b/t/t1300-repo-config.sh
@@ -678,7 +678,7 @@ test_expect_success 'invalid unit' '
        git config aninvalid.unit >actual &&
        test_cmp expect actual &&
        cat >expect <<-\EOF
-       fatal: bad numeric config value '\''1auto'\'' for 
'\''aninvalid.unit'\'' in .git/config: invalid unit
+       fatal: bad numeric config value '\''1auto'\'' for 
'\''aninvalid.unit'\'': invalid unit
        EOF
        test_must_fail git config --int --get aninvalid.unit 2>actual &&
        test_i18ncmp expect actual
-- 
1.9.0.GIT

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to