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>
This commit is contained in:
		
				
					committed by
					
						
						Junio C Hamano
					
				
			
			
				
	
			
			
			
						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' '
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user