]> git.ipfire.org Git - thirdparty/git.git/commitdiff
connect, transport: encapsulate arg in struct
authorJonathan Tan <jonathantanmy@google.com>
Fri, 5 Feb 2021 20:48:48 +0000 (12:48 -0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 5 Feb 2021 21:49:54 +0000 (13:49 -0800)
In a future patch we plan to return the name of an unborn current branch
from deep in the callchain to a caller via a new pointer parameter that
points at a variable in the caller when the caller calls
get_remote_refs() and transport_get_remote_refs().

In preparation for that, encapsulate the existing ref_prefixes
parameter into a struct. The aforementioned unborn current branch will
go into this new struct in the future patch.

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/clone.c
builtin/fetch-pack.c
builtin/fetch.c
builtin/ls-remote.c
connect.c
remote.h
transport-helper.c
transport-internal.h
transport.c
transport.h

index a5630337e4eb7a60bdc33a27fcc3769867fa0d43..211d4f54b09e611879de6314c7088889fda4a208 100644 (file)
@@ -979,7 +979,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
        int err = 0, complete_refs_before_fetch = 1;
        int submodule_progress;
 
-       struct strvec ref_prefixes = STRVEC_INIT;
+       struct transport_ls_refs_options transport_ls_refs_options =
+               TRANSPORT_LS_REFS_OPTIONS_INIT;
 
        packet_trace_identity("clone");
 
@@ -1257,14 +1258,17 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
                transport->smart_options->check_self_contained_and_connected = 1;
 
 
-       strvec_push(&ref_prefixes, "HEAD");
-       refspec_ref_prefixes(&remote->fetch, &ref_prefixes);
+       strvec_push(&transport_ls_refs_options.ref_prefixes, "HEAD");
+       refspec_ref_prefixes(&remote->fetch,
+                            &transport_ls_refs_options.ref_prefixes);
        if (option_branch)
-               expand_ref_prefix(&ref_prefixes, option_branch);
+               expand_ref_prefix(&transport_ls_refs_options.ref_prefixes,
+                                 option_branch);
        if (!option_no_tags)
-               strvec_push(&ref_prefixes, "refs/tags/");
+               strvec_push(&transport_ls_refs_options.ref_prefixes,
+                           "refs/tags/");
 
-       refs = transport_get_remote_refs(transport, &ref_prefixes);
+       refs = transport_get_remote_refs(transport, &transport_ls_refs_options);
 
        if (refs) {
                int hash_algo = hash_algo_by_ptr(transport_get_hash_algo(transport));
@@ -1380,6 +1384,6 @@ cleanup:
        strbuf_release(&key);
        junk_mode = JUNK_LEAVE_ALL;
 
-       strvec_clear(&ref_prefixes);
+       strvec_clear(&transport_ls_refs_options.ref_prefixes);
        return err;
 }
index 58b7c1fbdc47b7f3bf866e1e9bcdf924a10e8033..c2d96f4c89ab0fa7207f74a17d0bdf94f8bd3780 100644 (file)
@@ -220,7 +220,8 @@ int cmd_fetch_pack(int argc, const char **argv, const char *prefix)
        version = discover_version(&reader);
        switch (version) {
        case protocol_v2:
-               get_remote_refs(fd[1], &reader, &ref, 0, NULL, NULL, args.stateless_rpc);
+               get_remote_refs(fd[1], &reader, &ref, 0, NULL, NULL,
+                               args.stateless_rpc);
                break;
        case protocol_v1:
        case protocol_v0:
index ecf8537605077a8485e59d6dbba6d4d447642910..837382ef4f0f71869cddc6fb7f25a9a183a9002e 100644 (file)
@@ -1349,7 +1349,8 @@ static int do_fetch(struct transport *transport,
        int autotags = (transport->remote->fetch_tags == 1);
        int retcode = 0;
        const struct ref *remote_refs;
-       struct strvec ref_prefixes = STRVEC_INIT;
+       struct transport_ls_refs_options transport_ls_refs_options =
+               TRANSPORT_LS_REFS_OPTIONS_INIT;
        int must_list_refs = 1;
 
        if (tags == TAGS_DEFAULT) {
@@ -1369,7 +1370,7 @@ static int do_fetch(struct transport *transport,
        if (rs->nr) {
                int i;
 
-               refspec_ref_prefixes(rs, &ref_prefixes);
+               refspec_ref_prefixes(rs, &transport_ls_refs_options.ref_prefixes);
 
                /*
                 * We can avoid listing refs if all of them are exact
@@ -1383,22 +1384,25 @@ static int do_fetch(struct transport *transport,
                        }
                }
        } else if (transport->remote && transport->remote->fetch.nr)
-               refspec_ref_prefixes(&transport->remote->fetch, &ref_prefixes);
+               refspec_ref_prefixes(&transport->remote->fetch,
+                                    &transport_ls_refs_options.ref_prefixes);
 
        if (tags == TAGS_SET || tags == TAGS_DEFAULT) {
                must_list_refs = 1;
-               if (ref_prefixes.nr)
-                       strvec_push(&ref_prefixes, "refs/tags/");
+               if (transport_ls_refs_options.ref_prefixes.nr)
+                       strvec_push(&transport_ls_refs_options.ref_prefixes,
+                                   "refs/tags/");
        }
 
        if (must_list_refs) {
                trace2_region_enter("fetch", "remote_refs", the_repository);
-               remote_refs = transport_get_remote_refs(transport, &ref_prefixes);
+               remote_refs = transport_get_remote_refs(transport,
+                                                       &transport_ls_refs_options);
                trace2_region_leave("fetch", "remote_refs", the_repository);
        } else
                remote_refs = NULL;
 
-       strvec_clear(&ref_prefixes);
+       strvec_clear(&transport_ls_refs_options.ref_prefixes);
 
        ref_map = get_ref_map(transport->remote, remote_refs, rs,
                              tags, &autotags);
index 092917eca29b76f27bce31cbf6a5fff562fae7f0..ef604752a044a48609a10ee90a8ca487c0acfb2d 100644 (file)
@@ -45,7 +45,8 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
        int show_symref_target = 0;
        const char *uploadpack = NULL;
        const char **pattern = NULL;
-       struct strvec ref_prefixes = STRVEC_INIT;
+       struct transport_ls_refs_options transport_options =
+               TRANSPORT_LS_REFS_OPTIONS_INIT;
        int i;
        struct string_list server_options = STRING_LIST_INIT_DUP;
 
@@ -94,9 +95,9 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
        }
 
        if (flags & REF_TAGS)
-               strvec_push(&ref_prefixes, "refs/tags/");
+               strvec_push(&transport_options.ref_prefixes, "refs/tags/");
        if (flags & REF_HEADS)
-               strvec_push(&ref_prefixes, "refs/heads/");
+               strvec_push(&transport_options.ref_prefixes, "refs/heads/");
 
        remote = remote_get(dest);
        if (!remote) {
@@ -118,7 +119,7 @@ int cmd_ls_remote(int argc, const char **argv, const char *prefix)
        if (server_options.nr)
                transport->server_options = &server_options;
 
-       ref = transport_get_remote_refs(transport, &ref_prefixes);
+       ref = transport_get_remote_refs(transport, &transport_options);
        if (ref) {
                int hash_algo = hash_algo_by_ptr(transport_get_hash_algo(transport));
                repo_set_hash_algo(the_repository, hash_algo);
index 8b8f56cf6d230b23c46bb980755cb6d1fc3684ef..328c2792504f9c5f1a0469a2fc5463be49eec5bc 100644 (file)
--- a/connect.c
+++ b/connect.c
@@ -453,12 +453,14 @@ void check_stateless_delimiter(int stateless_rpc,
 
 struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
                             struct ref **list, int for_push,
-                            const struct strvec *ref_prefixes,
+                            struct transport_ls_refs_options *transport_options,
                             const struct string_list *server_options,
                             int stateless_rpc)
 {
        int i;
        const char *hash_name;
+       struct strvec *ref_prefixes = transport_options ?
+               &transport_options->ref_prefixes : NULL;
        *list = NULL;
 
        if (server_supports_v2("ls-refs", 1))
index 3211abdf05ceef275309053af0dafc06f51fbb13..4ae676a11b7ebdf7b6fcf3981b4897a953ad1a5d 100644 (file)
--- a/remote.h
+++ b/remote.h
@@ -6,6 +6,8 @@
 #include "hashmap.h"
 #include "refspec.h"
 
+struct transport_ls_refs_options;
+
 /**
  * The API gives access to the configuration related to remotes. It handles
  * all three configuration mechanisms historically and currently used by Git,
@@ -196,7 +198,7 @@ struct ref **get_remote_heads(struct packet_reader *reader,
 /* Used for protocol v2 in order to retrieve refs from a remote */
 struct ref **get_remote_refs(int fd_out, struct packet_reader *reader,
                             struct ref **list, int for_push,
-                            const struct strvec *ref_prefixes,
+                            struct transport_ls_refs_options *transport_options,
                             const struct string_list *server_options,
                             int stateless_rpc);
 
index 5f6e0b3bd874dba714c107dffebd423ef25d10b4..49b7fb4dcb9a3012a9bdc60bc6fa581a47875e07 100644 (file)
@@ -1162,13 +1162,14 @@ static int has_attribute(const char *attrs, const char *attr)
 }
 
 static struct ref *get_refs_list(struct transport *transport, int for_push,
-                                const struct strvec *ref_prefixes)
+                                struct transport_ls_refs_options *transport_options)
 {
        get_helper(transport);
 
        if (process_connect(transport, for_push)) {
                do_take_over(transport);
-               return transport->vtable->get_refs_list(transport, for_push, ref_prefixes);
+               return transport->vtable->get_refs_list(transport, for_push,
+                                                       transport_options);
        }
 
        return get_refs_list_using_list(transport, for_push);
index 27c9daffc47ac95b2070006f570373c14cd4aa22..b60f1ba9077d09c5f0c3259fe5bc86c5facdbc78 100644 (file)
@@ -4,6 +4,7 @@
 struct ref;
 struct transport;
 struct strvec;
+struct transport_ls_refs_options;
 
 struct transport_vtable {
        /**
@@ -18,19 +19,12 @@ struct transport_vtable {
         * the transport to try to share connections, for_push is a
         * hint as to whether the ultimate operation is a push or a fetch.
         *
-        * If communicating using protocol v2 a list of prefixes can be
-        * provided to be sent to the server to enable it to limit the ref
-        * advertisement.  Since ref filtering is done on the server's end, and
-        * only when using protocol v2, this list will be ignored when not
-        * using protocol v2 meaning this function can return refs which don't
-        * match the provided ref_prefixes.
-        *
         * If the transport is able to determine the remote hash for
         * the ref without a huge amount of effort, it should store it
         * in the ref's old_sha1 field; otherwise it should be all 0.
         **/
        struct ref *(*get_refs_list)(struct transport *transport, int for_push,
-                                    const struct strvec *ref_prefixes);
+                                    struct transport_ls_refs_options *transport_options);
 
        /**
         * Fetch the objects for the given refs. Note that this gets
index 679a35e7c1b6168d3b8fc93f72ec9a50178d894c..b13fab5dc3b1b90933b77f15fe87ca422cc70784 100644 (file)
@@ -127,7 +127,7 @@ struct bundle_transport_data {
 
 static struct ref *get_refs_from_bundle(struct transport *transport,
                                        int for_push,
-                                       const struct strvec *ref_prefixes)
+                                       struct transport_ls_refs_options *transport_options)
 {
        struct bundle_transport_data *data = transport->data;
        struct ref *result = NULL;
@@ -280,7 +280,7 @@ static void die_if_server_options(struct transport *transport)
  * remote refs.
  */
 static struct ref *handshake(struct transport *transport, int for_push,
-                            const struct strvec *ref_prefixes,
+                            struct transport_ls_refs_options *options,
                             int must_list_refs)
 {
        struct git_transport_data *data = transport->data;
@@ -303,7 +303,7 @@ static struct ref *handshake(struct transport *transport, int for_push,
                        trace2_data_string("transfer", NULL, "server-sid", server_sid);
                if (must_list_refs)
                        get_remote_refs(data->fd[1], &reader, &refs, for_push,
-                                       ref_prefixes,
+                                       options,
                                        transport->server_options,
                                        transport->stateless_rpc);
                break;
@@ -334,9 +334,9 @@ static struct ref *handshake(struct transport *transport, int for_push,
 }
 
 static struct ref *get_refs_via_connect(struct transport *transport, int for_push,
-                                       const struct strvec *ref_prefixes)
+                                       struct transport_ls_refs_options *options)
 {
-       return handshake(transport, for_push, ref_prefixes, 1);
+       return handshake(transport, for_push, options, 1);
 }
 
 static int fetch_refs_via_pack(struct transport *transport,
@@ -1252,19 +1252,20 @@ int transport_push(struct repository *r,
                int porcelain = flags & TRANSPORT_PUSH_PORCELAIN;
                int pretend = flags & TRANSPORT_PUSH_DRY_RUN;
                int push_ret, ret, err;
-               struct strvec ref_prefixes = STRVEC_INIT;
+               struct transport_ls_refs_options transport_options =
+                       TRANSPORT_LS_REFS_OPTIONS_INIT;
 
                if (check_push_refs(local_refs, rs) < 0)
                        return -1;
 
-               refspec_ref_prefixes(rs, &ref_prefixes);
+               refspec_ref_prefixes(rs, &transport_options.ref_prefixes);
 
                trace2_region_enter("transport_push", "get_refs_list", r);
                remote_refs = transport->vtable->get_refs_list(transport, 1,
-                                                              &ref_prefixes);
+                                                              &transport_options);
                trace2_region_leave("transport_push", "get_refs_list", r);
 
-               strvec_clear(&ref_prefixes);
+               strvec_clear(&transport_options.ref_prefixes);
 
                if (flags & TRANSPORT_PUSH_ALL)
                        match_flags |= MATCH_REFS_ALL;
@@ -1380,12 +1381,12 @@ int transport_push(struct repository *r,
 }
 
 const struct ref *transport_get_remote_refs(struct transport *transport,
-                                           const struct strvec *ref_prefixes)
+                                           struct transport_ls_refs_options *transport_options)
 {
        if (!transport->got_remote_refs) {
                transport->remote_refs =
                        transport->vtable->get_refs_list(transport, 0,
-                                                        ref_prefixes);
+                                                        transport_options);
                transport->got_remote_refs = 1;
        }
 
index 24558c027d61bba1dd99b17a1c9d1cd484b1cb8a..1f5b60e4d3156984197364a39344c4bc53e0834a 100644 (file)
@@ -233,17 +233,24 @@ int transport_push(struct repository *repo,
                   struct refspec *rs, int flags,
                   unsigned int * reject_reasons);
 
+struct transport_ls_refs_options {
+       /*
+        * Optionally, a list of ref prefixes can be provided which can be sent
+        * to the server (when communicating using protocol v2) to enable it to
+        * limit the ref advertisement.  Since ref filtering is done on the
+        * server's end (and only when using protocol v2),
+        * transport_get_remote_refs() could return refs which don't match the
+        * provided ref_prefixes.
+        */
+       struct strvec ref_prefixes;
+};
+#define TRANSPORT_LS_REFS_OPTIONS_INIT { STRVEC_INIT }
+
 /*
  * Retrieve refs from a remote.
- *
- * Optionally a list of ref prefixes can be provided which can be sent to the
- * server (when communicating using protocol v2) to enable it to limit the ref
- * advertisement.  Since ref filtering is done on the server's end (and only
- * when using protocol v2), this can return refs which don't match the provided
- * ref_prefixes.
  */
 const struct ref *transport_get_remote_refs(struct transport *transport,
-                                           const struct strvec *ref_prefixes);
+                                           struct transport_ls_refs_options *transport_options);
 
 /*
  * Fetch the hash algorithm used by a remote.