Duy Nguyen wrote:
> On Wed, Feb 28, 2018 at 8:02 AM, Brandon Williams <[email protected]> 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)