clone: send ref-prefixes when using protocol v2
Teach clone to send a list of ref-prefixes, when using protocol v2, to allow the server to filter out irrelevant references from the ref-advertisement. This reduces wasted time and bandwidth when cloning repositories with a larger number of references. Signed-off-by: Brandon Williams <bmwill@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									53f9a3e157
								
							
						
					
					
						commit
						402c47d939
					
				|  | @ -895,7 +895,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix) | |||
| 	int err = 0, complete_refs_before_fetch = 1; | ||||
| 	int submodule_progress; | ||||
|  | ||||
| 	struct refspec_item refspec; | ||||
| 	struct refspec rs = REFSPEC_INIT_FETCH; | ||||
| 	struct argv_array ref_prefixes = ARGV_ARRAY_INIT; | ||||
|  | ||||
| 	fetch_if_missing = 0; | ||||
|  | ||||
|  | @ -1077,7 +1078,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) | |||
| 	if (option_required_reference.nr || option_optional_reference.nr) | ||||
| 		setup_reference(); | ||||
|  | ||||
| 	refspec_item_init(&refspec, value.buf, REFSPEC_FETCH); | ||||
| 	refspec_append(&rs, value.buf); | ||||
|  | ||||
| 	strbuf_reset(&value); | ||||
|  | ||||
|  | @ -1134,10 +1135,18 @@ int cmd_clone(int argc, const char **argv, const char *prefix) | |||
| 	if (transport->smart_options && !deepen && !filter_options.choice) | ||||
| 		transport->smart_options->check_self_contained_and_connected = 1; | ||||
|  | ||||
| 	refs = transport_get_remote_refs(transport, NULL); | ||||
|  | ||||
| 	argv_array_push(&ref_prefixes, "HEAD"); | ||||
| 	refspec_ref_prefixes(&rs, &ref_prefixes); | ||||
| 	if (option_branch) | ||||
| 		expand_ref_prefix(&ref_prefixes, option_branch); | ||||
| 	if (!option_no_tags) | ||||
| 		argv_array_push(&ref_prefixes, "refs/tags/"); | ||||
|  | ||||
| 	refs = transport_get_remote_refs(transport, &ref_prefixes); | ||||
|  | ||||
| 	if (refs) { | ||||
| 		mapped_refs = wanted_peer_refs(refs, &refspec); | ||||
| 		mapped_refs = wanted_peer_refs(refs, &rs.items[0]); | ||||
| 		/* | ||||
| 		 * transport_get_remote_refs() may return refs with null sha-1 | ||||
| 		 * in mapped_refs (see struct transport->get_refs_list | ||||
|  | @ -1231,6 +1240,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix) | |||
| 	strbuf_release(&value); | ||||
| 	junk_mode = JUNK_LEAVE_ALL; | ||||
|  | ||||
| 	refspec_item_clear(&refspec); | ||||
| 	refspec_clear(&rs); | ||||
| 	argv_array_clear(&ref_prefixes); | ||||
| 	return err; | ||||
| } | ||||
|  |  | |||
|  | @ -181,7 +181,12 @@ test_expect_success 'clone with file:// using protocol v2' ' | |||
| 	test_cmp expect actual && | ||||
|  | ||||
| 	# Server responded using protocol v2 | ||||
| 	grep "clone< version 2" log | ||||
| 	grep "clone< version 2" log && | ||||
|  | ||||
| 	# Client sent ref-prefixes to filter the ref-advertisement | ||||
| 	grep "ref-prefix HEAD" log && | ||||
| 	grep "ref-prefix refs/heads/" log && | ||||
| 	grep "ref-prefix refs/tags/" log | ||||
| ' | ||||
|  | ||||
| test_expect_success 'fetch with file:// using protocol v2' ' | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Brandon Williams
						Brandon Williams