Construct a list of ref patterns to be passed to 'get_refs_list()' from the refspec to be used during the push. This list of ref patterns will be used to allow the server to filter the ref advertisement when communicating using protocol v2. Signed-off-by: Brandon Williams <bmwill@xxxxxxxxxx> --- transport.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/transport.c b/transport.c index dfc603b36..6ea3905e3 100644 --- a/transport.c +++ b/transport.c @@ -1026,11 +1026,26 @@ int transport_push(struct transport *transport, int porcelain = flags & TRANSPORT_PUSH_PORCELAIN; int pretend = flags & TRANSPORT_PUSH_DRY_RUN; int push_ret, ret, err; + struct refspec *tmp_rs; + struct argv_array ref_patterns = ARGV_ARRAY_INIT; + int i; if (check_push_refs(local_refs, refspec_nr, refspec) < 0) return -1; - remote_refs = transport->vtable->get_refs_list(transport, 1, NULL); + tmp_rs = parse_push_refspec(refspec_nr, refspec); + for (i = 0; i < refspec_nr; i++) { + if (tmp_rs[i].dst) + argv_array_push(&ref_patterns, tmp_rs[i].dst); + else if (tmp_rs[i].src && !tmp_rs[i].exact_sha1) + argv_array_push(&ref_patterns, tmp_rs[i].src); + } + + remote_refs = transport->vtable->get_refs_list(transport, 1, + &ref_patterns); + + argv_array_clear(&ref_patterns); + free_refspec(refspec_nr, tmp_rs); if (flags & TRANSPORT_PUSH_ALL) match_flags |= MATCH_REFS_ALL; -- 2.16.0.rc1.238.g530d649a79-goog