зеркало из https://github.com/microsoft/git.git
config: teach git_config_source to remember its scope
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>
This commit is contained in:
Родитель
5c105a842e
Коммит
e37efa40e1
|
@ -622,6 +622,7 @@ int cmd_config(int argc, const char **argv, const char *prefix)
|
||||||
!strcmp(given_config_source.file, "-")) {
|
!strcmp(given_config_source.file, "-")) {
|
||||||
given_config_source.file = NULL;
|
given_config_source.file = NULL;
|
||||||
given_config_source.use_stdin = 1;
|
given_config_source.use_stdin = 1;
|
||||||
|
given_config_source.scope = CONFIG_SCOPE_COMMAND;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (use_global_config) {
|
if (use_global_config) {
|
||||||
|
@ -637,6 +638,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
|
||||||
*/
|
*/
|
||||||
die(_("$HOME not set"));
|
die(_("$HOME not set"));
|
||||||
|
|
||||||
|
given_config_source.scope = CONFIG_SCOPE_GLOBAL;
|
||||||
|
|
||||||
if (access_or_warn(user_config, R_OK, 0) &&
|
if (access_or_warn(user_config, R_OK, 0) &&
|
||||||
xdg_config && !access_or_warn(xdg_config, R_OK, 0)) {
|
xdg_config && !access_or_warn(xdg_config, R_OK, 0)) {
|
||||||
given_config_source.file = xdg_config;
|
given_config_source.file = xdg_config;
|
||||||
|
@ -646,11 +649,13 @@ int cmd_config(int argc, const char **argv, const char *prefix)
|
||||||
free(xdg_config);
|
free(xdg_config);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (use_system_config)
|
else if (use_system_config) {
|
||||||
given_config_source.file = git_etc_gitconfig();
|
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");
|
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);
|
struct worktree **worktrees = get_worktrees(0);
|
||||||
if (repository_format_worktree_config)
|
if (repository_format_worktree_config)
|
||||||
given_config_source.file = git_pathdup("config.worktree");
|
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"));
|
"section in \"git help worktree\" for details"));
|
||||||
else
|
else
|
||||||
given_config_source.file = git_pathdup("config");
|
given_config_source.file = git_pathdup("config");
|
||||||
|
given_config_source.scope = CONFIG_SCOPE_LOCAL;
|
||||||
free_worktrees(worktrees);
|
free_worktrees(worktrees);
|
||||||
} else if (given_config_source.file) {
|
} else if (given_config_source.file) {
|
||||||
if (!is_absolute_path(given_config_source.file) && prefix)
|
if (!is_absolute_path(given_config_source.file) && prefix)
|
||||||
given_config_source.file =
|
given_config_source.file =
|
||||||
prefix_filename(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)
|
if (respect_includes_opt == -1)
|
||||||
config_options.respect_includes = !given_config_source.file;
|
config_options.respect_includes = !given_config_source.file;
|
||||||
else
|
else
|
||||||
|
|
3
config.c
3
config.c
|
@ -1763,6 +1763,9 @@ int config_with_options(config_fn_t fn, void *data,
|
||||||
data = &inc;
|
data = &inc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (config_source)
|
||||||
|
current_parsing_scope = config_source->scope;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we have a specific filename, use it. Otherwise, follow the
|
* If we have a specific filename, use it. Otherwise, follow the
|
||||||
* regular lookup sequence.
|
* regular lookup sequence.
|
||||||
|
|
21
config.h
21
config.h
|
@ -35,10 +35,21 @@ struct object_id;
|
||||||
|
|
||||||
#define CONFIG_REGEX_NONE ((void *)1)
|
#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 {
|
struct git_config_source {
|
||||||
unsigned int use_stdin:1;
|
unsigned int use_stdin:1;
|
||||||
const char *file;
|
const char *file;
|
||||||
const char *blob;
|
const char *blob;
|
||||||
|
enum config_scope scope;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum config_origin_type {
|
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);
|
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);
|
enum config_scope current_config_scope(void);
|
||||||
const char *current_config_origin_type(void);
|
const char *current_config_origin_type(void);
|
||||||
const char *current_config_name(void);
|
const char *current_config_name(void);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче