]> git.ipfire.org Git - thirdparty/git.git/commitdiff
config: convert multi_replace to flags
authorDerrick Stolee <dstolee@microsoft.com>
Wed, 25 Nov 2020 22:12:49 +0000 (22:12 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Nov 2020 22:43:47 +0000 (14:43 -0800)
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>
builtin/branch.c
builtin/config.c
builtin/remote.c
config.c
config.h

index efb30b882069446e82b69256d6b768c4c795608e..173b736dff492acc2ac09e040bdf382f3434023a 100644 (file)
@@ -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)
index 963d65fd3fc13c9859b57a6008419469a7f63498..7c15c5d743b0f569bb9489681b619c376fa4c110 100644 (file)
@@ -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;
index c1b211b2721c93375b0cc8232bd96db3cdd6ed64..d11a5589e49dcc9ea06663c422154855f9ad529b 100644 (file)
@@ -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;
index 2bdff4457be7d5b1e1fd5f6acb558ac41b946a8c..b5e8ab13b3fe7165c0672a0362e383afc9abfa63 100644 (file)
--- a/config.c
+++ b/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)
index 91cdfbfb414fdcc7835a3a467ea680b5780a74c8..84fdf223c87547bc101248bdeb02cff2d9e59524 100644 (file)
--- a/config.h
+++ b/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