Duy Nguyen wrote:
> On Wed, Feb 28, 2018 at 8:02 AM, Brandon Williams <bmw...@google.com> wrote:
>> On 02/27, Jonathan Nieder wrote:

>>> If I share my .gitconfig or .git/config file between multiple machines
>>> (or between multiple Git versions on a single machine) and set
>>>
>>>       [protocol]
>>>               version = 2
>>>
>>> then running "git fetch" with a Git version that does not support
>>> protocol v2 errors out with
>>>
>>>       fatal: unknown value for config 'protocol.version': 2
>>>
>>> In the spirit of v1.7.6-rc0~77^2~1 (Improve error handling when
>>> parsing dirstat parameters, 2011-04-29), it is better to (perhaps
>>> after warning the user) ignore the unrecognized protocol version.
>>> After all, future Git versions might add even more protocol versions,
>>> and using two different Git versions with the same Git repo, machine,
>>> or home directory should not cripple the older Git version just
>>> because of a parameter that is only understood by a more recent Git
>>> version.
>
> I wonder if it's better to specify multiple versions. If v2 is not
> recognized by this git but v0 is, then it can pick that up. But if you
> explicitly tell it to choose between v2 and v3 only and it does not
> understand either, then it dies. Not sure if this is a good idea
> though.

Interesting thought.  Something roughly like this (on top of the patch
this is a reply to)?

diff --git i/protocol.c w/protocol.c
index ce9c634a3a..6aa8857a11 100644
--- i/protocol.c
+++ w/protocol.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "string-list.h"
 #include "config.h"
 #include "protocol.h"
 
@@ -14,14 +15,18 @@ static enum protocol_version parse_protocol_version(const 
char *value)
 
 enum protocol_version get_protocol_version_config(void)
 {
-       const char *value;
-       if (!git_config_get_string_const("protocol.version", &value)) {
-               enum protocol_version version = parse_protocol_version(value);
-               if (version != protocol_unknown_version)
-                       return version;
+       const struct string_list *values;
+       const struct string_list_item *value;
+       enum protocol_version result = protocol_v0;
+
+       values = git_config_get_value_multi("protocol.version");
+       for_each_string_list_item(value, values) {
+               enum protocol_version v = parse_protocol_version(value->string);
+               if (v != protocol_unknown_version)
+                       result = v;
        }
 
-       return protocol_v0;
+       return result;
 }
 
 enum protocol_version determine_protocol_version_server(void)

Reply via email to