Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- fetch-pack.h | 1 + remote.c | 2 ++ remote.h | 2 ++ transport-helper.c | 1 + transport.c | 20 ++++++++++++++++++-- transport.h | 8 ++++++++ 6 files changed, 32 insertions(+), 2 deletions(-) diff --git a/fetch-pack.h b/fetch-pack.h index bb7fd76..3314362 100644 --- a/fetch-pack.h +++ b/fetch-pack.h @@ -8,6 +8,7 @@ struct sha1_array; struct fetch_pack_args { const char *uploadpack; + int transport_version; int unpacklimit; int depth; unsigned quiet:1; diff --git a/remote.c b/remote.c index 28fd676..760611d 100644 --- a/remote.c +++ b/remote.c @@ -9,6 +9,7 @@ #include "string-list.h" #include "mergesort.h" #include "argv-array.h" +#include "transport.h" enum map_direction { FROM_SRC, FROM_DST }; @@ -164,6 +165,7 @@ static struct remote *make_remote(const char *name, int len) return ret; ret = xcalloc(1, sizeof(struct remote)); + ret->transport_version = DEFAULT_TRANSPORT_VERSION; ret->prune = -1; /* unspecified */ ALLOC_GROW(remotes, remotes_nr + 1, remotes_alloc); remotes[remotes_nr++] = ret; diff --git a/remote.h b/remote.h index c21fd37..cdb25d0 100644 --- a/remote.h +++ b/remote.h @@ -51,6 +51,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 b934183..3cb386f 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -248,6 +248,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 095e61f..608b92c 100644 --- a/transport.c +++ b/transport.c @@ -151,6 +151,16 @@ static int set_git_option(struct git_transport_options *opts, die("transport: invalid depth option '%s'", value); } return 0; + } else if (!strcmp(name, TRANS_OPT_TRANSPORTVERSION)) { + if (!value) + opts->transport_version = DEFAULT_TRANSPORT_VERSION; + else { + char *end; + opts->transport_version = strtol(value, &end, 0); + if (*end) + die("transport: invalid transport version option '%s'", value); + } + return 0; } return 1; } @@ -203,6 +213,7 @@ static int fetch_refs_via_pack(struct transport *transport, memset(&args, 0, sizeof(args)); args.uploadpack = data->options.uploadpack; + args.transport_version = data->options.transport_version; args.keep_pack = data->options.keep; args.lock_pack = 1; args.use_thin_pack = data->options.thin; @@ -694,6 +705,8 @@ struct transport *transport_get(struct remote *remote, const char *url) ret->connect = connect_git; ret->disconnect = disconnect_git; ret->smart_options = &(data->options); + ret->smart_options->transport_version = + DEFAULT_TRANSPORT_VERSION; data->conn = NULL; data->got_remote_heads = 0; @@ -706,12 +719,15 @@ struct transport *transport_get(struct remote *remote, const char *url) if (ret->smart_options) { ret->smart_options->thin = 1; - ret->smart_options->uploadpack = "git-upload-pack"; + ret->smart_options->uploadpack = DEFAULT_TRANSPORT_UPLOAD_PACK; if (remote->uploadpack) ret->smart_options->uploadpack = remote->uploadpack; - ret->smart_options->receivepack = "git-receive-pack"; + ret->smart_options->receivepack = DEFAULT_TRANSPORT_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 c681408..af90529 100644 --- a/transport.h +++ b/transport.h @@ -13,6 +13,7 @@ struct git_transport_options { unsigned self_contained_and_connected : 1; unsigned update_shallow : 1; int depth; + int transport_version; const char *uploadpack; const char *receivepack; struct push_cas_option *cas; @@ -188,6 +189,13 @@ int transport_restrict_protocols(void); /* Send push certificates */ #define TRANS_OPT_PUSH_CERT "pushcert" +/* Use a new version of the git protocol */ +#define TRANS_OPT_TRANSPORTVERSION "transportversion" + +#define DEFAULT_TRANSPORT_VERSION 1 +#define DEFAULT_TRANSPORT_UPLOAD_PACK "git-upload-pack" +#define DEFAULT_TRANSPORT_RECEIVE_PACK "git-receive-pack" + /** * Returns 0 if the option was used, non-zero otherwise. Prints a * message to stderr if the option is not used. -- 2.8.0.32.g71f8beb.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