[PATCH 05/14] transport: add infrastructure to support a protocol version number
From: Stefan Beller <hidden>
Date: 2016-06-16 02:19:05
Subsystem:
the rest · Maintainer:
Linus Torvalds
Signed-off-by: Stefan Beller <redacted> --- 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