]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fetch: make filter_options local to cmd_fetch()
authorChristian Couder <christian.couder@gmail.com>
Tue, 23 Dec 2025 11:11:08 +0000 (12:11 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 23 Dec 2025 13:43:05 +0000 (22:43 +0900)
The `struct list_objects_filter_options filter_options` variable used
in "builtin/fetch.c" to store the parsed filters specified by
`--filter=<filterspec>` is currently a static variable global to the
file.

As we are going to use it more in a following commit, it could become a
bit less easy to understand how it's managed.

To avoid that, let's make it clear that it's owned by cmd_fetch() by
moving its definition into that function and making it non-static.

This requires passing a pointer to it through the prepare_transport(),
do_fetch(), backfill_tags(), fetch_one_setup_partial(), and fetch_one()
functions, but it's quite straightforward.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fetch.c

index 288d3772eaeabe9020e7af2f3e1a2efea023b378..b9841734473964110b9a5f17f06614bbd48c18cb 100644 (file)
@@ -97,7 +97,6 @@ static struct strbuf default_rla = STRBUF_INIT;
 static struct transport *gtransport;
 static struct transport *gsecondary;
 static struct refspec refmap = REFSPEC_INIT_FETCH;
-static struct list_objects_filter_options filter_options = LIST_OBJECTS_FILTER_INIT;
 static struct string_list server_options = STRING_LIST_INIT_DUP;
 static struct string_list negotiation_tip = STRING_LIST_INIT_NODUP;
 
@@ -1449,7 +1448,8 @@ static void add_negotiation_tips(struct git_transport_options *smart_options)
        smart_options->negotiation_tips = oids;
 }
 
-static struct transport *prepare_transport(struct remote *remote, int deepen)
+static struct transport *prepare_transport(struct remote *remote, int deepen,
+                                          struct list_objects_filter_options *filter_options)
 {
        struct transport *transport;
 
@@ -1473,9 +1473,9 @@ static struct transport *prepare_transport(struct remote *remote, int deepen)
                set_option(transport, TRANS_OPT_UPDATE_SHALLOW, "yes");
        if (refetch)
                set_option(transport, TRANS_OPT_REFETCH, "yes");
-       if (filter_options.choice) {
+       if (filter_options->choice) {
                const char *spec =
-                       expand_list_objects_filter_spec(&filter_options);
+                       expand_list_objects_filter_spec(filter_options);
                set_option(transport, TRANS_OPT_LIST_OBJECTS_FILTER, spec);
                set_option(transport, TRANS_OPT_FROM_PROMISOR, "1");
        }
@@ -1493,7 +1493,8 @@ static int backfill_tags(struct display_state *display_state,
                         struct ref_transaction *transaction,
                         struct ref *ref_map,
                         struct fetch_head *fetch_head,
-                        const struct fetch_config *config)
+                        const struct fetch_config *config,
+                        struct list_objects_filter_options *filter_options)
 {
        int retcode, cannot_reuse;
 
@@ -1507,7 +1508,7 @@ static int backfill_tags(struct display_state *display_state,
        cannot_reuse = transport->cannot_reuse ||
                deepen_since || deepen_not.nr;
        if (cannot_reuse) {
-               gsecondary = prepare_transport(transport->remote, 0);
+               gsecondary = prepare_transport(transport->remote, 0, filter_options);
                transport = gsecondary;
        }
 
@@ -1713,7 +1714,8 @@ out:
 
 static int do_fetch(struct transport *transport,
                    struct refspec *rs,
-                   const struct fetch_config *config)
+                   const struct fetch_config *config,
+                   struct list_objects_filter_options *filter_options)
 {
        struct ref_transaction *transaction = NULL;
        struct ref *ref_map = NULL;
@@ -1873,7 +1875,7 @@ static int do_fetch(struct transport *transport,
                         * the transaction and don't commit anything.
                         */
                        if (backfill_tags(&display_state, transport, transaction, tags_ref_map,
-                                         &fetch_head, config))
+                                         &fetch_head, config, filter_options))
                                retcode = 1;
                }
 
@@ -2198,20 +2200,21 @@ static int fetch_multiple(struct string_list *list, int max_children,
  * Fetching from the promisor remote should use the given filter-spec
  * or inherit the default filter-spec from the config.
  */
-static inline void fetch_one_setup_partial(struct remote *remote)
+static inline void fetch_one_setup_partial(struct remote *remote,
+                                          struct list_objects_filter_options *filter_options)
 {
        /*
         * Explicit --no-filter argument overrides everything, regardless
         * of any prior partial clones and fetches.
         */
-       if (filter_options.no_filter)
+       if (filter_options->no_filter)
                return;
 
        /*
         * If no prior partial clone/fetch and the current fetch DID NOT
         * request a partial-fetch, do a normal fetch.
         */
-       if (!repo_has_promisor_remote(the_repository) && !filter_options.choice)
+       if (!repo_has_promisor_remote(the_repository) && !filter_options->choice)
                return;
 
        /*
@@ -2220,8 +2223,8 @@ static inline void fetch_one_setup_partial(struct remote *remote)
         * filter-spec as the default for subsequent fetches to this
         * remote if there is currently no default filter-spec.
         */
-       if (filter_options.choice) {
-               partial_clone_register(remote->name, &filter_options);
+       if (filter_options->choice) {
+               partial_clone_register(remote->name, filter_options);
                return;
        }
 
@@ -2230,14 +2233,15 @@ static inline void fetch_one_setup_partial(struct remote *remote)
         * explicitly given filter-spec or inherit the filter-spec from
         * the config.
         */
-       if (!filter_options.choice)
-               partial_clone_get_default_filter_spec(&filter_options, remote->name);
+       if (!filter_options->choice)
+               partial_clone_get_default_filter_spec(filter_options, remote->name);
        return;
 }
 
 static int fetch_one(struct remote *remote, int argc, const char **argv,
                     int prune_tags_ok, int use_stdin_refspecs,
-                    const struct fetch_config *config)
+                    const struct fetch_config *config,
+                    struct list_objects_filter_options *filter_options)
 {
        struct refspec rs = REFSPEC_INIT_FETCH;
        int i;
@@ -2249,7 +2253,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv,
                die(_("no remote repository specified; please specify either a URL or a\n"
                      "remote name from which new revisions should be fetched"));
 
-       gtransport = prepare_transport(remote, 1);
+       gtransport = prepare_transport(remote, 1, filter_options);
 
        if (prune < 0) {
                /* no command line request */
@@ -2304,7 +2308,7 @@ static int fetch_one(struct remote *remote, int argc, const char **argv,
        sigchain_push_common(unlock_pack_on_signal);
        atexit(unlock_pack_atexit);
        sigchain_push(SIGPIPE, SIG_IGN);
-       exit_code = do_fetch(gtransport, &rs, config);
+       exit_code = do_fetch(gtransport, &rs, config, filter_options);
        sigchain_pop(SIGPIPE);
        refspec_clear(&rs);
        transport_disconnect(gtransport);
@@ -2329,6 +2333,7 @@ int cmd_fetch(int argc,
        const char *submodule_prefix = "";
        const char *bundle_uri;
        struct string_list list = STRING_LIST_INIT_DUP;
+       struct list_objects_filter_options filter_options = LIST_OBJECTS_FILTER_INIT;
        struct remote *remote = NULL;
        int all = -1, multiple = 0;
        int result = 0;
@@ -2594,7 +2599,7 @@ int cmd_fetch(int argc,
                trace2_region_enter("fetch", "negotiate-only", the_repository);
                if (!remote)
                        die(_("must supply remote when using --negotiate-only"));
-               gtransport = prepare_transport(remote, 1);
+               gtransport = prepare_transport(remote, 1, &filter_options);
                if (gtransport->smart_options) {
                        gtransport->smart_options->acked_commits = &acked_commits;
                } else {
@@ -2616,12 +2621,12 @@ int cmd_fetch(int argc,
        } else if (remote) {
                if (filter_options.choice || repo_has_promisor_remote(the_repository)) {
                        trace2_region_enter("fetch", "setup-partial", the_repository);
-                       fetch_one_setup_partial(remote);
+                       fetch_one_setup_partial(remote, &filter_options);
                        trace2_region_leave("fetch", "setup-partial", the_repository);
                }
                trace2_region_enter("fetch", "fetch-one", the_repository);
                result = fetch_one(remote, argc, argv, prune_tags_ok, stdin_refspecs,
-                                  &config);
+                                  &config, &filter_options);
                trace2_region_leave("fetch", "fetch-one", the_repository);
        } else {
                int max_children = max_jobs;
@@ -2727,5 +2732,6 @@ int cmd_fetch(int argc,
 
  cleanup:
        string_list_clear(&list, 0);
+       list_objects_filter_release(&filter_options);
        return result;
 }