зеркало из https://github.com/microsoft/git.git
config: convert multi_replace to flags
We will extend the flexibility of the config API. Before doing so, let's take an existing 'int multi_replace' parameter and replace it with a new 'unsigned flags' parameter that can take multiple options as a bit field. Update all callers that specified multi_replace to now specify the CONFIG_FLAGS_MULTI_REPLACE flag. To add more clarity, extend the documentation of git_config_set_multivar_in_file() including a clear labeling of its arguments. Other config API methods in config.h require only a change of the final parameter from 'int' to 'unsigned'. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
faefdd61ec
Коммит
504ee1290e
|
@ -829,10 +829,10 @@ int cmd_branch(int argc, const char **argv, const char *prefix)
|
|||
die(_("Branch '%s' has no upstream information"), branch->name);
|
||||
|
||||
strbuf_addf(&buf, "branch.%s.remote", branch->name);
|
||||
git_config_set_multivar(buf.buf, NULL, NULL, 1);
|
||||
git_config_set_multivar(buf.buf, NULL, NULL, CONFIG_FLAGS_MULTI_REPLACE);
|
||||
strbuf_reset(&buf);
|
||||
strbuf_addf(&buf, "branch.%s.merge", branch->name);
|
||||
git_config_set_multivar(buf.buf, NULL, NULL, 1);
|
||||
git_config_set_multivar(buf.buf, NULL, NULL, CONFIG_FLAGS_MULTI_REPLACE);
|
||||
strbuf_release(&buf);
|
||||
} else if (argc > 0 && argc <= 2) {
|
||||
if (filter.kind != FILTER_REFS_BRANCHES)
|
||||
|
|
|
@ -844,7 +844,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
|
|||
value = normalize_value(argv[0], argv[1]);
|
||||
UNLEAK(value);
|
||||
return git_config_set_multivar_in_file_gently(given_config_source.file,
|
||||
argv[0], value, argv[2], 1);
|
||||
argv[0], value, argv[2],
|
||||
CONFIG_FLAGS_MULTI_REPLACE);
|
||||
}
|
||||
else if (actions == ACTION_GET) {
|
||||
check_argc(argc, 1, 2);
|
||||
|
@ -880,7 +881,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
|
|||
check_write();
|
||||
check_argc(argc, 1, 2);
|
||||
return git_config_set_multivar_in_file_gently(given_config_source.file,
|
||||
argv[0], NULL, argv[1], 1);
|
||||
argv[0], NULL, argv[1],
|
||||
CONFIG_FLAGS_MULTI_REPLACE);
|
||||
}
|
||||
else if (actions == ACTION_RENAME_SECTION) {
|
||||
int ret;
|
||||
|
|
|
@ -712,7 +712,7 @@ static int mv(int argc, const char **argv)
|
|||
|
||||
strbuf_reset(&buf);
|
||||
strbuf_addf(&buf, "remote.%s.fetch", rename.new_name);
|
||||
git_config_set_multivar(buf.buf, NULL, NULL, 1);
|
||||
git_config_set_multivar(buf.buf, NULL, NULL, CONFIG_FLAGS_MULTI_REPLACE);
|
||||
strbuf_addf(&old_remote_context, ":refs/remotes/%s/", rename.old_name);
|
||||
for (i = 0; i < oldremote->fetch.raw_nr; i++) {
|
||||
char *ptr;
|
||||
|
@ -1491,7 +1491,8 @@ static int update(int argc, const char **argv)
|
|||
|
||||
static int remove_all_fetch_refspecs(const char *key)
|
||||
{
|
||||
return git_config_set_multivar_gently(key, NULL, NULL, 1);
|
||||
return git_config_set_multivar_gently(key, NULL, NULL,
|
||||
CONFIG_FLAGS_MULTI_REPLACE);
|
||||
}
|
||||
|
||||
static void add_branches(struct remote *remote, const char **branches,
|
||||
|
@ -1686,7 +1687,8 @@ static int set_url(int argc, const char **argv)
|
|||
if (!delete_mode)
|
||||
git_config_set_multivar(name_buf.buf, newurl, oldurl, 0);
|
||||
else
|
||||
git_config_set_multivar(name_buf.buf, NULL, oldurl, 1);
|
||||
git_config_set_multivar(name_buf.buf, NULL, oldurl,
|
||||
CONFIG_FLAGS_MULTI_REPLACE);
|
||||
out:
|
||||
strbuf_release(&name_buf);
|
||||
return 0;
|
||||
|
|
24
config.c
24
config.c
|
@ -2729,9 +2729,9 @@ void git_config_set(const char *key, const char *value)
|
|||
* if value_regex!=NULL, disregard key/value pairs where value does not match.
|
||||
* if value_regex==CONFIG_REGEX_NONE, do not match any existing values
|
||||
* (only add a new one)
|
||||
* if multi_replace==0, nothing, or only one matching key/value is replaced,
|
||||
* else all matching key/values (regardless how many) are removed,
|
||||
* before the new pair is written.
|
||||
* if flags contains the CONFIG_FLAGS_MULTI_REPLACE flag, all matching
|
||||
* key/values are removed before a single new pair is written. If the
|
||||
* flag is not present, then replace only the first match.
|
||||
*
|
||||
* Returns 0 on success.
|
||||
*
|
||||
|
@ -2752,7 +2752,7 @@ void git_config_set(const char *key, const char *value)
|
|||
int git_config_set_multivar_in_file_gently(const char *config_filename,
|
||||
const char *key, const char *value,
|
||||
const char *value_regex,
|
||||
int multi_replace)
|
||||
unsigned flags)
|
||||
{
|
||||
int fd = -1, in_fd = -1;
|
||||
int ret;
|
||||
|
@ -2769,7 +2769,7 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
|
|||
if (ret)
|
||||
goto out_free;
|
||||
|
||||
store.multi_replace = multi_replace;
|
||||
store.multi_replace = (flags & CONFIG_FLAGS_MULTI_REPLACE) != 0;
|
||||
|
||||
if (!config_filename)
|
||||
config_filename = filename_buf = git_pathdup("config");
|
||||
|
@ -2858,7 +2858,7 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
|
|||
|
||||
/* if nothing to unset, or too many matches, error out */
|
||||
if ((store.seen_nr == 0 && value == NULL) ||
|
||||
(store.seen_nr > 1 && multi_replace == 0)) {
|
||||
(store.seen_nr > 1 && !store.multi_replace)) {
|
||||
ret = CONFIG_NOTHING_SET;
|
||||
goto out_free;
|
||||
}
|
||||
|
@ -2997,10 +2997,10 @@ write_err_out:
|
|||
|
||||
void git_config_set_multivar_in_file(const char *config_filename,
|
||||
const char *key, const char *value,
|
||||
const char *value_regex, int multi_replace)
|
||||
const char *value_regex, unsigned flags)
|
||||
{
|
||||
if (!git_config_set_multivar_in_file_gently(config_filename, key, value,
|
||||
value_regex, multi_replace))
|
||||
value_regex, flags))
|
||||
return;
|
||||
if (value)
|
||||
die(_("could not set '%s' to '%s'"), key, value);
|
||||
|
@ -3009,17 +3009,17 @@ void git_config_set_multivar_in_file(const char *config_filename,
|
|||
}
|
||||
|
||||
int git_config_set_multivar_gently(const char *key, const char *value,
|
||||
const char *value_regex, int multi_replace)
|
||||
const char *value_regex, unsigned flags)
|
||||
{
|
||||
return git_config_set_multivar_in_file_gently(NULL, key, value, value_regex,
|
||||
multi_replace);
|
||||
flags);
|
||||
}
|
||||
|
||||
void git_config_set_multivar(const char *key, const char *value,
|
||||
const char *value_regex, int multi_replace)
|
||||
const char *value_regex, unsigned flags)
|
||||
{
|
||||
git_config_set_multivar_in_file(NULL, key, value, value_regex,
|
||||
multi_replace);
|
||||
flags);
|
||||
}
|
||||
|
||||
static int section_name_match (const char *buf, const char *name)
|
||||
|
|
29
config.h
29
config.h
|
@ -256,9 +256,22 @@ void git_config_set(const char *, const char *);
|
|||
|
||||
int git_config_parse_key(const char *, char **, size_t *);
|
||||
int git_config_key_is_valid(const char *key);
|
||||
int git_config_set_multivar_gently(const char *, const char *, const char *, int);
|
||||
void git_config_set_multivar(const char *, const char *, const char *, int);
|
||||
int git_config_set_multivar_in_file_gently(const char *, const char *, const char *, const char *, int);
|
||||
|
||||
/*
|
||||
* The following macros specify flag bits that alter the behavior
|
||||
* of the git_config_set_multivar*() methods.
|
||||
*/
|
||||
|
||||
/*
|
||||
* When CONFIG_FLAGS_MULTI_REPLACE is specified, all matching key/values
|
||||
* are removed before a single new pair is written. If the flag is not
|
||||
* present, then set operations replace only the first match.
|
||||
*/
|
||||
#define CONFIG_FLAGS_MULTI_REPLACE (1 << 0)
|
||||
|
||||
int git_config_set_multivar_gently(const char *, const char *, const char *, unsigned);
|
||||
void git_config_set_multivar(const char *, const char *, const char *, unsigned);
|
||||
int git_config_set_multivar_in_file_gently(const char *, const char *, const char *, const char *, unsigned);
|
||||
|
||||
/**
|
||||
* takes four parameters:
|
||||
|
@ -276,13 +289,15 @@ int git_config_set_multivar_in_file_gently(const char *, const char *, const cha
|
|||
* - the value regex, as a string. It will disregard key/value pairs where value
|
||||
* does not match.
|
||||
*
|
||||
* - a multi_replace value, as an int. If value is equal to zero, nothing or only
|
||||
* one matching key/value is replaced, else all matching key/values (regardless
|
||||
* how many) are removed, before the new pair is written.
|
||||
* - a flags value with bits corresponding to the CONFIG_FLAG_* macros.
|
||||
*
|
||||
* It returns 0 on success.
|
||||
*/
|
||||
void git_config_set_multivar_in_file(const char *, const char *, const char *, const char *, int);
|
||||
void git_config_set_multivar_in_file(const char *config_filename,
|
||||
const char *key,
|
||||
const char *value,
|
||||
const char *value_regex,
|
||||
unsigned flags);
|
||||
|
||||
/**
|
||||
* rename or remove sections in the config file
|
||||
|
|
Загрузка…
Ссылка в новой задаче