diff options
author | Jeff King <peff@peff.net> | 2016-05-19 01:44:23 +0300 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-05-27 20:45:40 +0300 |
commit | 9acc5911119ec0209877fbaa0a1e68aa714c191e (patch) | |
tree | 9a5bb0455b12bfd3e6fb3fdf4a6c0aca1af0992c /t/helper | |
parent | 0d44a2dacc84fb7dcb5d684800e976f3b3c76d00 (diff) |
config: add a notion of "scope"
A config callback passed to git_config() doesn't know very
much about the context in which it sees a variable. It can
ask whether the variable comes from a file, and get the file
name. But without analyzing the filename (which is hard to
do accurately), it cannot tell whether it is in system-level
config, user-level config, or repo-specific config.
Generally this doesn't matter; the point of not passing this
to the callback is that it should treat the config the same
no matter where it comes from. But some programs, like
upload-pack, are a special case: we should be able to run
them in an untrusted repository, which means we cannot use
any "dangerous" config from the repository config file (but
it is OK to use it from system or user config).
This patch teaches the config code to record the "scope" of
each variable, and make it available inside config
callbacks, similar to how we give access to the filename.
The scope is the starting source for a particular parsing
operation, and remains the same even if we include other
files (so a .git/config which includes another file will
remain CONFIG_SCOPE_REPO, as it would be similarly
untrusted).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 't/helper')
-rw-r--r-- | t/helper/test-config.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/t/helper/test-config.c b/t/helper/test-config.c index 3605ef8ee6..509aeef400 100644 --- a/t/helper/test-config.c +++ b/t/helper/test-config.c @@ -35,6 +35,21 @@ * */ +static const char *scope_name(enum config_scope scope) +{ + switch (scope) { + case CONFIG_SCOPE_SYSTEM: + return "system"; + case CONFIG_SCOPE_GLOBAL: + return "global"; + case CONFIG_SCOPE_REPO: + return "repo"; + case CONFIG_SCOPE_CMDLINE: + return "cmdline"; + default: + return "unknown"; + } +} static int iterate_cb(const char *var, const char *value, void *data) { static int nr; @@ -46,6 +61,7 @@ static int iterate_cb(const char *var, const char *value, void *data) printf("value=%s\n", value ? value : "(null)"); printf("origin=%s\n", current_config_origin_type()); printf("name=%s\n", current_config_name()); + printf("scope=%s\n", scope_name(current_config_scope())); return 0; } |