Re: [PATCH] protocol: treat unrecognized protocol.version setting as 0
- From
Jonathan Nieder <jrnieder@gmail.com>
- Date
- Feb 28, 2018, 01:22 UTC
- Message-ID
- <20180228012207.GB251290@aiede.svl.corp.google.com>
- In-Reply-To
- <CACsJy8Cn2hcodoR8ksRBY9qf7MmJaP+KAzYqv6seeR9s-Be8Hw@mail.gmail.com>
Duy Nguyen wrote:
> On Wed, Feb 28, 2018 at 8:02 AM, Brandon Williams <bmwill@google.com> wrote: >> On 02/27, Jonathan Nieder wrote:
Show 25 quoted lines
>>> 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)