Skip to content

Commit 2d7a202

Browse files
committed
Merge branch 'bw/clone-ref-prefixes'
The wire-protocol v2 relies on the client to send "ref prefixes" to limit the bandwidth spent on the initial ref advertisement. "git clone" when learned to speak v2 forgot to do so, which has been corrected. * bw/clone-ref-prefixes: clone: send ref-prefixes when using protocol v2
2 parents 1689c22 + 402c47d commit 2d7a202

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

builtin/clone.c

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -897,7 +897,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
897897
int err = 0, complete_refs_before_fetch = 1;
898898
int submodule_progress;
899899

900-
struct refspec_item refspec;
900+
struct refspec rs = REFSPEC_INIT_FETCH;
901+
struct argv_array ref_prefixes = ARGV_ARRAY_INIT;
901902

902903
fetch_if_missing = 0;
903904

@@ -1079,7 +1080,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
10791080
if (option_required_reference.nr || option_optional_reference.nr)
10801081
setup_reference();
10811082

1082-
refspec_item_init_or_die(&refspec, value.buf, REFSPEC_FETCH);
1083+
refspec_append(&rs, value.buf);
10831084

10841085
strbuf_reset(&value);
10851086

@@ -1136,10 +1137,18 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
11361137
if (transport->smart_options && !deepen && !filter_options.choice)
11371138
transport->smart_options->check_self_contained_and_connected = 1;
11381139

1139-
refs = transport_get_remote_refs(transport, NULL);
1140+
1141+
argv_array_push(&ref_prefixes, "HEAD");
1142+
refspec_ref_prefixes(&rs, &ref_prefixes);
1143+
if (option_branch)
1144+
expand_ref_prefix(&ref_prefixes, option_branch);
1145+
if (!option_no_tags)
1146+
argv_array_push(&ref_prefixes, "refs/tags/");
1147+
1148+
refs = transport_get_remote_refs(transport, &ref_prefixes);
11401149

11411150
if (refs) {
1142-
mapped_refs = wanted_peer_refs(refs, &refspec);
1151+
mapped_refs = wanted_peer_refs(refs, &rs.items[0]);
11431152
/*
11441153
* transport_get_remote_refs() may return refs with null sha-1
11451154
* in mapped_refs (see struct transport->get_refs_list
@@ -1233,6 +1242,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
12331242
strbuf_release(&value);
12341243
junk_mode = JUNK_LEAVE_ALL;
12351244

1236-
refspec_item_clear(&refspec);
1245+
refspec_clear(&rs);
1246+
argv_array_clear(&ref_prefixes);
12371247
return err;
12381248
}

t/t5702-protocol-v2.sh

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,12 @@ test_expect_success 'clone with file:// using protocol v2' '
181181
test_cmp expect actual &&
182182
183183
# Server responded using protocol v2
184-
grep "clone< version 2" log
184+
grep "clone< version 2" log &&
185+
186+
# Client sent ref-prefixes to filter the ref-advertisement
187+
grep "ref-prefix HEAD" log &&
188+
grep "ref-prefix refs/heads/" log &&
189+
grep "ref-prefix refs/tags/" log
185190
'
186191

187192
test_expect_success 'fetch with file:// using protocol v2' '

0 commit comments

Comments
 (0)