Skip to content

Commit

Permalink
config: convert multi_replace to flags
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
derrickstolee authored and gitster committed Nov 25, 2020
1 parent faefdd6 commit 504ee12
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 26 deletions.
4 changes: 2 additions & 2 deletions builtin/branch.c
Expand Up @@ -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)
Expand Down
6 changes: 4 additions & 2 deletions builtin/config.c
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down
8 changes: 5 additions & 3 deletions builtin/remote.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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;
Expand Down
24 changes: 12 additions & 12 deletions config.c
Expand Up @@ -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.
*
Expand All @@ -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;
Expand All @@ -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");
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -2997,10 +2997,10 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,

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);
Expand All @@ -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)
Expand Down
29 changes: 22 additions & 7 deletions config.h
Expand Up @@ -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:
Expand All @@ -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
Expand Down

0 comments on commit 504ee12

Please sign in to comment.