[PATCH 07/16] upload-pack: support subtree pack
From: Nguyễn Thái Ngọc Duy <hidden>
Date: 2016-06-15 22:49:13
Subsystem:
the rest · Maintainer:
Linus Torvalds
With core_subtree turned on (capability "subtree", request "subtree" from fetch-pack), traverse_commit_list will be in "subtree mode", which will not go farther than the given subtree. As the result, the pack is broken be design, only contains enough blobs/trees/commits to reach the given subtree. Signed-off-by: Nguyễn Thái Ngọc Duy <redacted> --- upload-pack.c | 18 ++++++++++++++++-- 1 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/upload-pack.c b/upload-pack.c
index e432e83..9b6710a 100644
--- a/upload-pack.c
+++ b/upload-pack.c@@ -160,7 +160,7 @@ static void create_pack_file(void) ssize_t sz; const char *argv[10]; int arg = 0; - int internal_rev_list = shallow_nr; + int internal_rev_list = shallow_nr || core_subtree; if (internal_rev_list) { memset(&rev_list, 0, sizeof(rev_list));
@@ -505,6 +505,20 @@ static void receive_needs(void) if (debug_fd) write_in_full(debug_fd, line, len); + if (!prefixcmp(line, "subtree ")) { + int len; + char *subtree; + if (core_subtree) + die("sorry, only one subtree supported"); + len = strlen(line+8); + subtree = malloc(len+1); + memcpy(subtree, line+8, len-1); + subtree[len-1] = '\0'; /* \n */ + if (subtree[len-2] != '/') + die("subtree request must end with a slash"); + core_subtree = subtree; + continue; + } if (!prefixcmp(line, "shallow ")) { unsigned char sha1[20]; struct object *object;
@@ -624,7 +638,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 subtree"; struct object *o = parse_object(sha1); if (!o)
--
1.7.1.rc1.69.g24c2f7