The transport version set via command line argument in git fetch takes precedence over the configured version. Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- builtin/fetch.c | 6 ++++++ remote.c | 2 ++ remote.h | 2 ++ transport-helper.c | 1 + transport.c | 13 +++++++++++++ transport.h | 4 ++++ 6 files changed, 28 insertions(+) diff --git a/builtin/fetch.c b/builtin/fetch.c index 7910419..d2e1828 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -46,6 +46,7 @@ static const char *recurse_submodules_default; static int shown_url = 0; static int refmap_alloc, refmap_nr; static const char **refmap_array; +static const char *transport_version; static int option_parse_recurse_submodules(const struct option *opt, const char *arg, int unset) @@ -121,6 +122,9 @@ static struct option builtin_fetch_options[] = { N_("default mode for recursion"), PARSE_OPT_HIDDEN }, OPT_BOOL(0, "update-shallow", &update_shallow, N_("accept refs that update .git/shallow")), + OPT_STRING('y', "transport-version", &transport_version, + N_("transport-version"), + N_("specify transport version to be used")), { OPTION_CALLBACK, 0, "refmap", NULL, N_("refmap"), N_("specify fetch refmap"), PARSE_OPT_NONEG, parse_refmap_arg }, OPT_END() @@ -848,6 +852,8 @@ static struct transport *prepare_transport(struct remote *remote) struct transport *transport; transport = transport_get(remote, NULL); transport_set_verbosity(transport, verbosity, progress); + if (transport_version) + set_option(transport, TRANS_OPT_TRANSPORTVERSION, transport_version); if (upload_pack) set_option(transport, TRANS_OPT_UPLOADPACK, upload_pack); if (keep) diff --git a/remote.c b/remote.c index 68901b0..2914d9d 100644 --- a/remote.c +++ b/remote.c @@ -476,6 +476,8 @@ static int handle_config(const char *key, const char *value, void *cb) key, value); } else if (!strcmp(subkey, ".vcs")) { return git_config_string(&remote->foreign_vcs, key, value); + } else if (!strcmp(subkey, ".transportversion")) { + remote->transport_version = git_config_int(key, value); } return 0; } diff --git a/remote.h b/remote.h index 02d66ce..04e2310 100644 --- a/remote.h +++ b/remote.h @@ -50,6 +50,8 @@ struct remote { const char *receivepack; const char *uploadpack; + int transport_version; + /* * for curl remotes only */ diff --git a/transport-helper.c b/transport-helper.c index 5d99a6b..ab3cd5b 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -247,6 +247,7 @@ static int disconnect_helper(struct transport *transport) } static const char *unsupported_options[] = { + TRANS_OPT_TRANSPORTVERSION, TRANS_OPT_UPLOADPACK, TRANS_OPT_RECEIVEPACK, TRANS_OPT_THIN, diff --git a/transport.c b/transport.c index f080e93..3ef15f6 100644 --- a/transport.c +++ b/transport.c @@ -479,6 +479,16 @@ static int set_git_option(struct git_transport_options *opts, } else if (!strcmp(name, TRANS_OPT_PUSH_CERT)) { opts->push_cert = !!value; return 0; + } else if (!strcmp(name, TRANS_OPT_TRANSPORTVERSION)) { + if (!value) + opts->transport_version = 0; + else { + char *end; + opts->transport_version = strtol(value, &end, 0); + if (*end) + die("transport: invalid transport version option '%s'", value); + } + return 0; } return 1; } @@ -988,6 +998,9 @@ struct transport *transport_get(struct remote *remote, const char *url) ret->smart_options->receivepack = "git-receive-pack"; if (remote->receivepack) ret->smart_options->receivepack = remote->receivepack; + if (remote->transport_version) + ret->smart_options->transport_version = + remote->transport_version; } return ret; diff --git a/transport.h b/transport.h index 18d2cf8..e07d356 100644 --- a/transport.h +++ b/transport.h @@ -14,6 +14,7 @@ struct git_transport_options { unsigned update_shallow : 1; unsigned push_cert : 1; int depth; + int transport_version; const char *uploadpack; const char *receivepack; struct push_cas_option *cas; @@ -162,6 +163,9 @@ struct transport *transport_get(struct remote *, const char *); /* Send push certificates */ #define TRANS_OPT_PUSH_CERT "pushcert" +/* Use a new version of the git protocol */ +#define TRANS_OPT_TRANSPORTVERSION "transportversion" + /** * Returns 0 if the option was used, non-zero otherwise. Prints a * message to stderr if the option is not used. -- 2.4.1.345.gab207b6.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html