]> git.ipfire.org Git - thirdparty/git.git/commitdiff
remote: introduce remote.<name>.serverOption configuration
authorXing Xin <xingxin.xx@bytedance.com>
Tue, 8 Oct 2024 03:38:16 +0000 (03:38 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 8 Oct 2024 17:22:07 +0000 (10:22 -0700)
Currently, server options for Git protocol v2 can only be specified via
the command line option "--server-option" or "-o", which is inconvenient
when users want to specify a list of default options to send. Therefore,
we are introducing a new configuration to hold a list of default server
options, akin to the `push.pushOption` configuration for push options.

Initially, I named the new configuration `fetch.serverOption` to align
with `push.pushOption`. However, after discussing with Patrick, it was
renamed to `remote.<name>.serverOption` as suggested, because:

1. Server options are designed to be server-specific, making it more
   logical to use a per-remote configuration.
2. Using "fetch." prefixed configurations in git-clone or git-ls-remote
   seems out of place and inconsistent in design.

The parsing logic for `remote.<name>.serverOption` also relies on
`transport.c:parse_transport_option`, similar to `push.pushOption`, and
they follow the same priority design:

1. Server options set in lower-priority configuration files (e.g.,
   /etc/gitconfig or $HOME/.gitconfig) can be overridden or unset in
   more specific repository configurations using an empty string.
2. Command-line specified server options take precedence over those from
   the configuration.

Server options from configuration are stored to the corresponding
`remote.h:remote` as a new field `server_options`.  The field will be
utilized in the subsequent commit to help initialize the
`server_options` of `transport.h:transport`.

And documentation have been updated accordingly.

Helped-by: Patrick Steinhardt <ps@pks.im>
Helped-by: Junio C Hamano <gitster@pobox.com>
Reported-by: Liu Zhongbo <liuzhongbo.6666@bytedance.com>
Signed-off-by: Xing Xin <xingxin.xx@bytedance.com>
Reviewed-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config/remote.txt
remote.c
remote.h

index 71d1fee835ffa62bbba55afd637317b465a1903e..6d8b7d6c637eaa13d899029abf34cd3a5e2a4257 100644 (file)
@@ -96,3 +96,13 @@ remote.<name>.partialclonefilter::
        Changing or clearing this value will only affect fetches for new commits.
        To fetch associated objects for commits already present in the local object
        database, use the `--refetch` option of linkgit:git-fetch[1].
+
+remote.<name>.serverOption::
+       The default set of server options used when fetching from this remote.
+       These server options can be overridden by the `--server-option=` command
+       line arguments.
++
+This is a multi-valued variable, and an empty value can be used in a higher
+priority configuration file (e.g. `.git/config` in a repository) to clear
+the values inherited from a lower priority configuration files (e.g.
+`$HOME/.gitconfig`).
index e291e8ff5cddb25e35063be74097b1965b27000e..1777d4508653713b46565c08a9c96104fe42562e 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -24,6 +24,7 @@
 #include "advice.h"
 #include "connect.h"
 #include "parse-options.h"
+#include "transport.h"
 
 enum map_direction { FROM_SRC, FROM_DST };
 
@@ -143,6 +144,7 @@ static struct remote *make_remote(struct remote_state *remote_state,
        ret->name = xstrndup(name, len);
        refspec_init(&ret->push, REFSPEC_PUSH);
        refspec_init(&ret->fetch, REFSPEC_FETCH);
+       string_list_init_dup(&ret->server_options);
 
        ALLOC_GROW(remote_state->remotes, remote_state->remotes_nr + 1,
                   remote_state->remotes_alloc);
@@ -166,6 +168,7 @@ static void remote_clear(struct remote *remote)
        free((char *)remote->uploadpack);
        FREE_AND_NULL(remote->http_proxy);
        FREE_AND_NULL(remote->http_proxy_authmethod);
+       string_list_clear(&remote->server_options, 0);
 }
 
 static void add_merge(struct branch *branch, const char *name)
@@ -508,6 +511,9 @@ static int handle_config(const char *key, const char *value,
        } else if (!strcmp(subkey, "vcs")) {
                FREE_AND_NULL(remote->foreign_vcs);
                return git_config_string(&remote->foreign_vcs, key, value);
+       } else if (!strcmp(subkey, "serveroption")) {
+               return parse_transport_option(key, value,
+                                             &remote->server_options);
        }
        return 0;
 }
index ad4513f6394bed26561bf0de918d0e2e827de28c..a6946816204ea5c7beb8beafc536883f798c1673 100644 (file)
--- a/remote.h
+++ b/remote.h
@@ -4,6 +4,7 @@
 #include "hash.h"
 #include "hashmap.h"
 #include "refspec.h"
+#include "string-list.h"
 #include "strvec.h"
 
 struct option;
@@ -104,6 +105,8 @@ struct remote {
 
        /* The method used for authenticating against `http_proxy`. */
        char *http_proxy_authmethod;
+
+       struct string_list server_options;
 };
 
 /**