Currently, the reading of config related to promisor remotes is done in two places: once in setup.c (which sets the global variable repository_format_partial_clone, to be read by the code in promisor-remote.c), and once in promisor-remote.c. This means that care must be taken to ensure that repository_format_partial_clone is set before any code in promisor-remote.c accesses it. To simplify the code, move all such config reading to promisor-remote.c. By doing this, it will be easier to see when repository_format_partial_clone is written and, thus, to reason about the code. This will be especially helpful in a subsequent commit, which modifies this code. Signed-off-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx> --- cache.h | 1 - promisor-remote.c | 14 +++++++++----- promisor-remote.h | 6 ------ setup.c | 10 +++++++--- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/cache.h b/cache.h index ba04ff8bd3..dbdcec8601 100644 --- a/cache.h +++ b/cache.h @@ -1061,7 +1061,6 @@ extern int repository_format_worktree_config; struct repository_format { int version; int precious_objects; - char *partial_clone; /* value of extensions.partialclone */ int worktree_config; int is_bare; int hash_algo; diff --git a/promisor-remote.c b/promisor-remote.c index da3f2ca261..c0e5061dfe 100644 --- a/promisor-remote.c +++ b/promisor-remote.c @@ -7,11 +7,6 @@ static char *repository_format_partial_clone; -void set_repository_format_partial_clone(char *partial_clone) -{ - repository_format_partial_clone = xstrdup_or_null(partial_clone); -} - static int fetch_objects(const char *remote_name, const struct object_id *oids, int oid_nr) @@ -99,6 +94,15 @@ static int promisor_remote_config(const char *var, const char *value, void *data size_t namelen; const char *subkey; + if (!strcmp(var, "extensions.partialclone")) { + /* + * NULL value is handled in handle_extension_v0 in setup.c. + */ + if (value) + repository_format_partial_clone = xstrdup(value); + return 0; + } + if (parse_config_key(var, "remote", &name, &namelen, &subkey) < 0) return 0; diff --git a/promisor-remote.h b/promisor-remote.h index c7a14063c5..687210ab87 100644 --- a/promisor-remote.h +++ b/promisor-remote.h @@ -32,10 +32,4 @@ int promisor_remote_get_direct(struct repository *repo, const struct object_id *oids, int oid_nr); -/* - * This should be used only once from setup.c to set the value we got - * from the extensions.partialclone config option. - */ -void set_repository_format_partial_clone(char *partial_clone); - #endif /* PROMISOR_REMOTE_H */ diff --git a/setup.c b/setup.c index 59e2facd9d..d60b6bc554 100644 --- a/setup.c +++ b/setup.c @@ -470,7 +470,13 @@ static enum extension_result handle_extension_v0(const char *var, } else if (!strcmp(ext, "partialclone")) { if (!value) return config_error_nonbool(var); - data->partial_clone = xstrdup(value); + /* + * This config variable will be read together with the + * other relevant config variables in + * promisor_remote_config() in promisor_remote.c, so we + * do not need to read it here. Just report that this + * extension is known. + */ return EXTENSION_OK; } else if (!strcmp(ext, "worktreeconfig")) { data->worktree_config = git_config_bool(var, value); @@ -566,7 +572,6 @@ static int check_repository_format_gently(const char *gitdir, struct repository_ } repository_format_precious_objects = candidate->precious_objects; - set_repository_format_partial_clone(candidate->partial_clone); repository_format_worktree_config = candidate->worktree_config; string_list_clear(&candidate->unknown_extensions, 0); string_list_clear(&candidate->v1_only_extensions, 0); @@ -650,7 +655,6 @@ void clear_repository_format(struct repository_format *format) string_list_clear(&format->unknown_extensions, 0); string_list_clear(&format->v1_only_extensions, 0); free(format->work_tree); - free(format->partial_clone); init_repository_format(format); } -- 2.32.0.rc1.229.g3e70b5a671-goog