Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- Documentation/technical/protocol-capabilities.txt | 10 ++++++++++ upload-pack.c | 16 +++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/Documentation/technical/protocol-capabilities.txt b/Documentation/technical/protocol-capabilities.txt index fd8ffa5..be09792 100644 --- a/Documentation/technical/protocol-capabilities.txt +++ b/Documentation/technical/protocol-capabilities.txt @@ -217,3 +217,13 @@ allow-tip-sha1-in-want If the upload-pack server advertises this capability, fetch-pack may send "want" lines with SHA-1s that exist at the server but are not advertised by upload-pack. + +packv4 +------ + +The upload-server can generate .pack version 4. If the client accepts +this capability, the server may send a pack version 4. The server can +choose to send pack version 2 even if the client accepts this +capability. + +This capability does not include multi-base tree support. diff --git a/upload-pack.c b/upload-pack.c index ccf76d9..291d366 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -32,7 +32,7 @@ static unsigned long oldest_have; static int multi_ack; static int no_done; -static int use_thin_pack, use_ofs_delta, use_include_tag; +static int use_thin_pack, use_ofs_delta, use_include_tag, packv4_ok; static int no_progress, daemon_mode; static int allow_tip_sha1_in_want; static int shallow_nr; @@ -140,7 +140,7 @@ static void create_pack_file(void) "corruption on the remote side."; int buffered = -1; ssize_t sz; - const char *argv[10]; + const char *argv[11]; int arg = 0; argv[arg++] = "pack-objects"; @@ -157,6 +157,14 @@ static void create_pack_file(void) argv[arg++] = "--delta-base-offset"; if (use_include_tag) argv[arg++] = "--include-tag"; + /* + * The client may have requested pack v4. But if this is a v2 + * repo on a busy machine, we may want to send v2 and let the + * client do the v2->v4 conversion to reduce the cost on the + * server side. + */ + if (packv4_ok) + argv[arg++] = "--version=4"; argv[arg++] = NULL; memset(&pack_objects, 0, sizeof(pack_objects)); @@ -633,6 +641,8 @@ static void receive_needs(void) no_progress = 1; if (parse_feature_request(features, "include-tag")) use_include_tag = 1; + if (parse_feature_request(features, "packv4")) + packv4_ok = 1; o = parse_object(sha1_buf); if (!o) @@ -738,7 +748,7 @@ static int send_ref(const char *refname, const unsigned char *sha1, int flag, vo { static const char *capabilities = "multi_ack thin-pack side-band" " side-band-64k ofs-delta shallow no-progress" - " include-tag multi_ack_detailed"; + " include-tag multi_ack_detailed packv4"; const char *refname_nons = strip_namespace(refname); unsigned char peeled[20]; -- 1.8.2.82.gc24b958 -- 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