This was originally a pull request to the git-for-windows repository [https://github.com/git-for-windows/git/pull/2399]. It adds a new option --show-scope which would allow a user to see what scope a given configuration value has (sytem, local, global, etc.). changes since v2: * Redid commit messages for content/clarity * Minor fixes around using --show-scope with a single value (format_config) Matthew Rogers (4): config: fix typo in variable name config: refine config scope enum config: clarify meaning of command line scoping config: add '--show-scope' to print the scope of a config value Documentation/git-config.txt | 15 +++++--- builtin/config.c | 66 ++++++++++++++++++++++++++++++------ config.c | 15 ++++---- config.h | 19 ++++++----- remote.c | 3 +- submodule-config.c | 4 ++- t/helper/test-config.c | 10 ++++-- t/t1300-config.sh | 58 +++++++++++++++++++++++++++++++ t/t1308-config-set.sh | 2 +- upload-pack.c | 3 +- 10 files changed, 158 insertions(+), 37 deletions(-) base-commit: 232378479ee6c66206d47a9be175e3a39682aea6 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-478%2FROGERSM94%2Fadd-config-flags-v3 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-478/ROGERSM94/add-config-flags-v3 Pull-Request: https://github.com/gitgitgadget/git/pull/478 Range-diff vs v2: 1: b40480f03a = 1: f5a81a4d25 config: fix typo in variable name 2: e8e05f3940 ! 2: f06f9291b7 config: fix config scope enum @@ -1,14 +1,21 @@ Author: Matthew Rogers <mattr94@xxxxxxxxx> - config: fix config scope enum + config: refine config scope enum Previously when iterating through git config variables, worktree config and local config were both considered "CONFIG_SCOPE_REPO". This was never a problem before as no one had needed to differentiate between the - two cases. + two cases, but future functionality may care whether or not the config + options come from a worktree or from the repository's actual local + config file. For example, the planned feature to add a '--show-scope' + to config to allow a user to see which scope listed config options come + from would confuse users if it just printed 'repo' rather than 'local' + or 'worktree' as the documentation would lead them to expect. As well + as the additional benefit of making the implementation look more like + how the documentation describes the interface. - Additionally we rename what was CONFIG_SCOPE_REPO to CONFIG_SCOPE_LOCAL - to reflect its new, more specific meaning. + To accomplish this we split out what was previously considered repo + scope to be local and worktree. The clients of 'current_config_scope()' who cared about CONFIG_SCOPE_REPO are also modified to similarly care about @@ -82,6 +89,19 @@ return "cmdline"; default: + diff --git a/t/t1308-config-set.sh b/t/t1308-config-set.sh + --- a/t/t1308-config-set.sh + +++ b/t/t1308-config-set.sh +@@ + value=from-cmdline + origin=command line + name= +- scope=cmdline ++ scope=command + EOF + GIT_CONFIG_PARAMETERS=$cmdline_config test-tool config iterate >actual && + test_cmp expect actual + diff --git a/upload-pack.c b/upload-pack.c --- a/upload-pack.c +++ b/upload-pack.c 3: 8225273546 ! 3: 97b8a7641d config: clarify meaning of command line scoping @@ -3,11 +3,13 @@ config: clarify meaning of command line scoping CONFIG_SCOPE_CMDLINE is generally used in the code to refer to config - values passed in via the -c option. This is a little bit too specific - as there are other methods to pass config values so that the last for a - single command (namely --file and --blob). As the "visibility" of config - values passed by these situations is common, we unify them as having a - scope of "command" rather than "command line". + values passed in via the -c option. Options passed in using this + mechanism share similar scoping characteristics with the --file and + --blob options of the 'config' command, namely that they are only in use + for that single invocation of git, and that they supersede the normal + system/global/local hierarchy. This patch introduces + CONFIG_SCOPE_COMMAND to reflect this new idea, which also makes + CONFIG_SCOPE_CMDLINE redundant. Signed-off-by: Matthew Rogers <mattr94@xxxxxxxxx> 4: 92ce9b7824 ! 4: 61ff3c64b5 config: add '--show-scope' to print the scope of a config value @@ -76,7 +76,8 @@ strbuf_addch(buf, term); } -+static const char *scope_to_string(enum config_scope scope) { ++static const char *scope_to_string(enum config_scope scope) ++{ + switch (scope) { + case CONFIG_SCOPE_LOCAL: + return "local"; @@ -95,7 +96,8 @@ + } +} + -+static void show_config_scope(struct strbuf *buf) { ++static void show_config_scope(struct strbuf *buf) ++{ + const char term = end_nul ? '\0' : '\t'; + const char *scope = scope_to_string(current_config_scope()); + @@ -121,19 +123,10 @@ static int format_config(struct strbuf *buf, const char *key_, const char *value_) { + if (show_scope) -+ show_config_origin(buf); ++ show_config_scope(buf); if (show_origin) show_config_origin(buf); if (show_keys) -@@ - int nongit = !startup_info->have_repository; - char *value; - -+ -+ - given_config_source.file = xstrdup_or_null(getenv(CONFIG_ENVIRONMENT)); - - argc = parse_options(argc, argv, prefix, builtin_config_options, @@ !strcmp(given_config_source.file, "-")) { given_config_source.file = NULL; @@ -286,11 +279,8 @@ + case CONFIG_SCOPE_SUBMODULE: + return "submodule"; case CONFIG_SCOPE_COMMAND: -- return "command"; -+ return "cmdline"; + return "command"; default: - return "unknown"; - } diff --git a/t/t1300-config.sh b/t/t1300-config.sh --- a/t/t1300-config.sh @@ -333,6 +323,14 @@ + test_cmp expect output +' + ++test_expect_success '--show-scope getting a single value' ' ++ cat >expect <<-\EOF && ++ local true ++ EOF ++ git config --show-scope --get user.local >output && ++ test_cmp expect output ++' ++ +test_expect_success '--show-scope with --show-origin' ' + cat >expect <<-EOF && + global file:$HOME/.gitconfig user.global=true -- gitgitgadget