]> git.ipfire.org Git - thirdparty/git.git/commitdiff
config: add repo_config_set_worktree_gently()
authorDerrick Stolee <dstolee@microsoft.com>
Mon, 7 Feb 2022 21:33:00 +0000 (21:33 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 8 Feb 2022 17:49:20 +0000 (09:49 -0800)
Some config settings, such as those for sparse-checkout, are likely
intended to only apply to one worktree at a time. To make this write
easier, add a new config API method, repo_config_set_worktree_gently().

This method will attempt to write to the worktree-specific config, but
will instead write to the common config file if worktree config is not
enabled.  The next change will introduce a consumer of this method.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
config.c
config.h

index 2bffa8d4a01ba1f281d6e6fd95f35bf133cbd9c5..1a03ced1a54cd794da1e82b85bc28da6bfa6bb1d 100644 (file)
--- a/config.c
+++ b/config.c
@@ -21,6 +21,7 @@
 #include "dir.h"
 #include "color.h"
 #include "refs.h"
+#include "worktree.h"
 
 struct config_source {
        struct config_source *prev;
@@ -2884,6 +2885,20 @@ int git_config_set_gently(const char *key, const char *value)
        return git_config_set_multivar_gently(key, value, NULL, 0);
 }
 
+int repo_config_set_worktree_gently(struct repository *r,
+                                   const char *key, const char *value)
+{
+       /* Only use worktree-specific config if it is is already enabled. */
+       if (repository_format_worktree_config) {
+               char *file = repo_git_path(r, "config.worktree");
+               int ret = git_config_set_multivar_in_file_gently(
+                                       file, key, value, NULL, 0);
+               free(file);
+               return ret;
+       }
+       return repo_config_set_multivar_gently(r, key, value, NULL, 0);
+}
+
 void git_config_set(const char *key, const char *value)
 {
        git_config_set_multivar(key, value, NULL, 0);
@@ -3181,14 +3196,28 @@ 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_pattern, unsigned flags)
 {
-       return git_config_set_multivar_in_file_gently(NULL, key, value, value_pattern,
-                                                     flags);
+       return repo_config_set_multivar_gently(the_repository, key, value,
+                                              value_pattern, flags);
+}
+
+int repo_config_set_multivar_gently(struct repository *r, const char *key,
+                                   const char *value,
+                                   const char *value_pattern, unsigned flags)
+{
+       char *file = repo_git_path(r, "config");
+       int res = git_config_set_multivar_in_file_gently(file,
+                                                        key, value,
+                                                        value_pattern,
+                                                        flags);
+       free(file);
+       return res;
 }
 
 void git_config_set_multivar(const char *key, const char *value,
                             const char *value_pattern, unsigned flags)
 {
-       git_config_set_multivar_in_file(NULL, key, value, value_pattern,
+       git_config_set_multivar_in_file(git_path("config"),
+                                       key, value, value_pattern,
                                        flags);
 }
 
index f119de01309ccf5ce5b0a6434d38fa70c472bab0..1d98ad269bdc07f38a9506baf14276c8996c4e66 100644 (file)
--- a/config.h
+++ b/config.h
@@ -253,6 +253,13 @@ void git_config_set_in_file(const char *, const char *, const char *);
 
 int git_config_set_gently(const char *, const char *);
 
+/**
+ * Write a config value that should apply to the current worktree. If
+ * extensions.worktreeConfig is enabled, then the write will happen in the
+ * current worktree's config. Otherwise, write to the common config file.
+ */
+int repo_config_set_worktree_gently(struct repository *, const char *, const char *);
+
 /**
  * write config values to `.git/config`, takes a key/value pair as parameter.
  */
@@ -281,6 +288,7 @@ int git_config_parse_key(const char *, char **, size_t *);
 
 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 repo_config_set_multivar_gently(struct repository *, const char *, const char *, const char *, unsigned);
 int git_config_set_multivar_in_file_gently(const char *, const char *, const char *, const char *, unsigned);
 
 /**