Skip to content

Commit

Permalink
push: pass ref prefixes when pushing
Browse files Browse the repository at this point in the history
Construct a list of ref prefixes to be passed to 'get_refs_list()' from
the refspec to be used during the push.  This list of ref prefixes will
be used to allow the server to filter the ref advertisement when
communicating using protocol v2.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
bmwill authored and gitster committed Mar 15, 2018
1 parent 230d7dd commit 5b872ff
Showing 1 changed file with 28 additions and 1 deletion.
29 changes: 28 additions & 1 deletion transport.c
Expand Up @@ -1028,11 +1028,38 @@ 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_prefixes = 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++) {
const char *prefix = NULL;

if (tmp_rs[i].dst)
prefix = tmp_rs[i].dst;
else if (tmp_rs[i].src && !tmp_rs[i].exact_sha1)
prefix = tmp_rs[i].src;

if (prefix) {
const char *glob = strchr(prefix, '*');
if (glob)
argv_array_pushf(&ref_prefixes, "%.*s",
(int)(glob - prefix),
prefix);
else
expand_ref_prefix(&ref_prefixes, prefix);
}
}

remote_refs = transport->vtable->get_refs_list(transport, 1,
&ref_prefixes);

argv_array_clear(&ref_prefixes);
free_refspec(refspec_nr, tmp_rs);

if (flags & TRANSPORT_PUSH_ALL)
match_flags |= MATCH_REFS_ALL;
Expand Down

0 comments on commit 5b872ff

Please sign in to comment.