]> git.ipfire.org Git - thirdparty/git.git/commitdiff
config: teach git_config_source to remember its scope
authorMatthew Rogers <mattr94@gmail.com>
Mon, 10 Feb 2020 00:30:57 +0000 (00:30 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 10 Feb 2020 18:49:10 +0000 (10:49 -0800)
There are many situations where the scope of a config command is known
beforehand, such as passing of '--local', '--file', etc. to an
invocation of git config.  However, this information is lost when moving
from builtin/config.c to /config.c.  This historically hasn't been a big
deal, but to prepare for the upcoming --show-scope option we teach
git_config_source to keep track of the source and the config machinery
to use that information to set current_parsing_scope appropriately.

Signed-off-by: Matthew Rogers <mattr94@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/config.c
config.c
config.h

index 52a904cfb1ee654e16aa5a6a038e749b6b145750..0a9778b714ce110ab8aea2833caa2fbff0988a32 100644 (file)
@@ -622,6 +622,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                        !strcmp(given_config_source.file, "-")) {
                given_config_source.file = NULL;
                given_config_source.use_stdin = 1;
+               given_config_source.scope = CONFIG_SCOPE_COMMAND;
        }
 
        if (use_global_config) {
@@ -637,6 +638,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                         */
                        die(_("$HOME not set"));
 
+               given_config_source.scope = CONFIG_SCOPE_GLOBAL;
+
                if (access_or_warn(user_config, R_OK, 0) &&
                    xdg_config && !access_or_warn(xdg_config, R_OK, 0)) {
                        given_config_source.file = xdg_config;
@@ -646,11 +649,13 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                        free(xdg_config);
                }
        }
-       else if (use_system_config)
+       else if (use_system_config) {
                given_config_source.file = git_etc_gitconfig();
-       else if (use_local_config)
+               given_config_source.scope = CONFIG_SCOPE_SYSTEM;
+       } else if (use_local_config) {
                given_config_source.file = git_pathdup("config");
-       else if (use_worktree_config) {
+               given_config_source.scope = CONFIG_SCOPE_LOCAL;
+       } else if (use_worktree_config) {
                struct worktree **worktrees = get_worktrees(0);
                if (repository_format_worktree_config)
                        given_config_source.file = git_pathdup("config.worktree");
@@ -662,13 +667,18 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                              "section in \"git help worktree\" for details"));
                else
                        given_config_source.file = git_pathdup("config");
+               given_config_source.scope = CONFIG_SCOPE_LOCAL;
                free_worktrees(worktrees);
        } else if (given_config_source.file) {
                if (!is_absolute_path(given_config_source.file) && prefix)
                        given_config_source.file =
                                prefix_filename(prefix, given_config_source.file);
+               given_config_source.scope = CONFIG_SCOPE_COMMAND;
+       } else if (given_config_source.blob) {
+               given_config_source.scope = CONFIG_SCOPE_COMMAND;
        }
 
+
        if (respect_includes_opt == -1)
                config_options.respect_includes = !given_config_source.file;
        else
index 0e2c693e7831f9e012f851737cd733e4ed924913..9b6afca21016abf36e70633ea76430ee26d3d4a9 100644 (file)
--- a/config.c
+++ b/config.c
@@ -1763,6 +1763,9 @@ int config_with_options(config_fn_t fn, void *data,
                data = &inc;
        }
 
+       if (config_source)
+               current_parsing_scope = config_source->scope;
+
        /*
         * If we have a specific filename, use it. Otherwise, follow the
         * regular lookup sequence.
index 397ba4063cc008478189f9906a4c60ccfc93a7ff..165cacb7daacdcc449d51d360a1d332d2791ba28 100644 (file)
--- a/config.h
+++ b/config.h
@@ -35,10 +35,21 @@ struct object_id;
 
 #define CONFIG_REGEX_NONE ((void *)1)
 
+enum config_scope {
+       CONFIG_SCOPE_UNKNOWN = 0,
+       CONFIG_SCOPE_SYSTEM,
+       CONFIG_SCOPE_GLOBAL,
+       CONFIG_SCOPE_LOCAL,
+       CONFIG_SCOPE_WORKTREE,
+       CONFIG_SCOPE_COMMAND,
+};
+const char *config_scope_name(enum config_scope scope);
+
 struct git_config_source {
        unsigned int use_stdin:1;
        const char *file;
        const char *blob;
+       enum config_scope scope;
 };
 
 enum config_origin_type {
@@ -294,16 +305,6 @@ int config_error_nonbool(const char *);
 
 int git_config_parse_parameter(const char *, config_fn_t fn, void *data);
 
-enum config_scope {
-       CONFIG_SCOPE_UNKNOWN = 0,
-       CONFIG_SCOPE_SYSTEM,
-       CONFIG_SCOPE_GLOBAL,
-       CONFIG_SCOPE_LOCAL,
-       CONFIG_SCOPE_WORKTREE,
-       CONFIG_SCOPE_COMMAND,
-};
-const char *config_scope_name(enum config_scope scope);
-
 enum config_scope current_config_scope(void);
 const char *current_config_origin_type(void);
 const char *current_config_name(void);