If narrow-tree line is sent from fetch-pack, rev-walk will be put in narrow mode. Currently only one narrow-tree is supported. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- upload-pack.c | 31 +++++++++++++++++++++++++++++-- 1 files changed, 29 insertions(+), 2 deletions(-) diff --git a/upload-pack.c b/upload-pack.c index fc79dde..571fcb6 100644 --- a/upload-pack.c +++ b/upload-pack.c @@ -41,6 +41,7 @@ static int use_sideband; static int debug_fd; static int advertise_refs; static int stateless_rpc; +char *narrow_prefix; static void reset_timeout(void) { @@ -117,6 +118,10 @@ static int do_rev_list(int in, int out, void *user_data) revs.blob_objects = 1; if (use_thin_pack) revs.edge_hint = 1; + if (narrow_prefix) { + revs.narrow_tree = 1; + revs.narrow_prefix = narrow_prefix; + } for (i = 0; i < want_obj.nr; i++) { struct object *o = want_obj.objects[i].item; @@ -153,7 +158,8 @@ 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]; + char arg_narrow[PATH_MAX]; int arg = 0; if (shallow_nr) { @@ -173,6 +179,10 @@ static void create_pack_file(void) } argv[arg++] = "--stdout"; + if (narrow_prefix) { + sprintf(arg_narrow, "--narrow-tree=%s", narrow_prefix); + argv[arg++] = arg_narrow; + } if (!no_progress) argv[arg++] = "--progress"; if (use_ofs_delta) @@ -499,6 +509,18 @@ static void receive_needs(void) if (debug_fd) write_in_full(debug_fd, line, len); + if (!prefixcmp(line, "narrow-tree ")) { + int len; + if (narrow_prefix) + die("sorry, only one narrow prefix is supported"); + len = strlen(line+12); + narrow_prefix = malloc(len+1); + memcpy(narrow_prefix, line+12, len-1); + narrow_prefix[len-1] = '\0'; /* \n */ + if (narrow_prefix[len-2] == '/') + die("trailing slash in narrow prefix not allowed"); + continue; + } if (!prefixcmp(line, "shallow ")) { unsigned char sha1[20]; struct object *object; @@ -562,6 +584,9 @@ static void receive_needs(void) if (!use_sideband && daemon_mode) no_progress = 1; + if (narrow_prefix) + use_thin_pack = 0; + if (depth == 0 && shallows.nr == 0) return; if (depth > 0) { @@ -619,7 +644,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 narrow-tree"; struct object *o = parse_object(sha1); if (!o) @@ -724,6 +749,8 @@ int main(int argc, char **argv) die("'%s' does not appear to be a git repository", dir); if (is_repository_shallow()) die("attempt to fetch/clone from a shallow repository"); + if (get_narrow_prefix()) + die("attempt to fetch/clone from a narrow repository"); if (getenv("GIT_DEBUG_SEND_PACK")) debug_fd = atoi(getenv("GIT_DEBUG_SEND_PACK")); upload_pack(); -- 1.7.1.rc1.69.g24c2f7 -- 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