refspec: consolidate ref-prefix generation logic
authorBrandon Williams <bmwill@google.com>
Wed, 16 May 2018 23:48:21 +0000 (16:48 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 17 May 2018 21:35:35 +0000 (06:35 +0900)
When using protocol v2 a client constructs a list of ref-prefixes which
are sent across the wire so that the server can do server-side filtering
of the ref-advertisement. The logic that does this exists for both
fetch and push (even though no push support for v2 currently exists yet)
and is roughly the same so lets consolidate this logic and make it
general enough that it can be used for both the push and fetch cases.

Signed-off-by: Brandon Williams <bmwill@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fetch.c
refspec.c
refspec.h
transport.c
index 3fad1f0db91057eba27d410e90cc28d0f47397c8..80bb143707f98be1fe7ab63a71f8599d87171dad 100644 (file)
@@ -351,18 +351,7 @@ static struct ref *get_ref_map(struct transport *transport,
 
        const struct ref *remote_refs;
 
-       for (i = 0; i < rs->nr; i++) {
-               const struct refspec_item *item = &rs->items[i];
-               if (!item->exact_sha1) {
-                       const char *glob = strchr(item->src, '*');
-                       if (glob)
-                               argv_array_pushf(&ref_prefixes, "%.*s",
-                                                (int)(glob - item->src),
-                                                item->src);
-                       else
-                               expand_ref_prefix(&ref_prefixes, item->src);
-               }
-       }
+       refspec_ref_prefixes(rs, &ref_prefixes);
 
        remote_refs = transport_get_remote_refs(transport, &ref_prefixes);
 
index 97e76e8b1d953c9f2d7b99c906aef17fd375d7f5..c59a4ccf1e5d689b6f9cff00ee695a7ec4e40870 100644 (file)
--- a/refspec.c
+++ b/refspec.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "argv-array.h"
 #include "refs.h"
 #include "refspec.h"
 
@@ -192,3 +193,31 @@ int valid_fetch_refspec(const char *fetch_refspec_str)
        refspec_item_clear(&refspec);
        return ret;
 }
+
+void refspec_ref_prefixes(const struct refspec *rs,
+                         struct argv_array *ref_prefixes)
+{
+       int i;
+       for (i = 0; i < rs->nr; i++) {
+               const struct refspec_item *item = &rs->items[i];
+               const char *prefix = NULL;
+
+               if (rs->fetch == REFSPEC_FETCH)
+                       prefix = item->src;
+               else if (item->dst)
+                       prefix = item->dst;
+               else if (item->src && !item->exact_sha1)
+                       prefix = item->src;
+
+               if (prefix) {
+                       if (item->pattern) {
+                               const char *glob = strchr(prefix, '*');
+                               argv_array_pushf(ref_prefixes, "%.*s",
+                                                (int)(glob - prefix),
+                                                prefix);
+                       } else {
+                               expand_ref_prefix(ref_prefixes, prefix);
+                       }
+               }
+       }
+}
index 7e1ff94ac99e58042d623624226a2aa93605a290..01b700e094f04459c2ddca8858bd558630a59966 100644 (file)
--- a/refspec.h
+++ b/refspec.h
@@ -41,4 +41,8 @@ void refspec_clear(struct refspec *rs);
 
 int valid_fetch_refspec(const char *refspec);
 
+struct argv_array;
+void refspec_ref_prefixes(const struct refspec *rs,
+                         struct argv_array *ref_prefixes);
+
 #endif /* REFSPEC_H */
index 7e0b9abba3007cd859b98c20e3b8663a3ab3315a..cbf0044c3ecc4c78e2d94aaeb1aab7bca2423d87 100644 (file)
@@ -1088,30 +1088,11 @@ int transport_push(struct transport *transport,
                int pretend = flags & TRANSPORT_PUSH_DRY_RUN;
                int push_ret, ret, err;
                struct argv_array ref_prefixes = ARGV_ARRAY_INIT;
-               int i;
 
                if (check_push_refs(local_refs, rs) < 0)
                        return -1;
 
-               for (i = 0; i < rs->nr; i++) {
-                       const struct refspec_item *item = &rs->items[i];
-                       const char *prefix = NULL;
-
-                       if (item->dst)
-                               prefix = item->dst;
-                       else if (item->src && !item->exact_sha1)
-                               prefix = item->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);
-                       }
-               }
+               refspec_ref_prefixes(rs, &ref_prefixes);
 
                remote_refs = transport->vtable->get_refs_list(transport, 1,
                                                               &ref_prefixes);