mirror of
https://github.com/git/git.git
synced 2026-01-11 13:23:12 +09:00
fetch: make filter_options local to cmd_fetch()
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>
This commit is contained in:
parent
50cedfdf94
commit
6ac467fdbd
@ -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;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user