repository: move global r_f_p_c to repo struct

Move repository_format_partial_clone, which is currently a global
variable, into struct repository. (Full support for per-repository
partial clone config will be done in a subsequent commit - this is split
into its own commit because of the extent of the changes needed.)

The new repo-specific variable cannot be set in
check_repository_format_gently() (as is currently), because that
function does not know which repo it is operating on (or even whether
the value is important); therefore this responsibility is delegated to
the outermost caller that knows. Of all the outermost callers that know
(found by looking at all functions that call clear_repository_format()),
I looked at those that either read from the main Git directory or write
into a struct repository. These callers have been modified accordingly
(write to the_repository in the former case and write to the given
struct repository in the latter case).

Signed-off-by: Jonathan Tan <jonathantanmy@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jonathan Tan 2021-06-17 10:13:22 -07:00 committed by Junio C Hamano
parent ebf3c04b26
commit ebaf3bcf1a
5 changed files with 23 additions and 20 deletions

View File

@ -5,13 +5,6 @@
#include "transport.h"
#include "strvec.h"
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)
@ -145,15 +138,15 @@ static void promisor_remote_init(void)
git_config(promisor_remote_config, NULL);
if (repository_format_partial_clone) {
if (the_repository->repository_format_partial_clone) {
struct promisor_remote *o, *previous;
o = promisor_remote_lookup(repository_format_partial_clone,
o = promisor_remote_lookup(the_repository->repository_format_partial_clone,
&previous);
if (o)
promisor_remote_move_to_tail(o, previous);
else
promisor_remote_new(repository_format_partial_clone);
promisor_remote_new(the_repository->repository_format_partial_clone);
}
}

View File

@ -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 */

View File

@ -172,6 +172,10 @@ int repo_init(struct repository *repo,
repo_set_hash_algo(repo, format.hash_algo);
/* take ownership of format.partial_clone */
repo->repository_format_partial_clone = format.partial_clone;
format.partial_clone = NULL;
if (worktree)
repo_set_worktree(repo, worktree);

View File

@ -139,6 +139,9 @@ struct repository {
/* True if commit-graph has been disabled within this process. */
int commit_graph_disabled;
/* Configurations related to promisor remotes. */
char *repository_format_partial_clone;
/* Configurations */
/* Indicate if a repository has a different 'commondir' from 'gitdir' */

17
setup.c
View File

@ -468,8 +468,6 @@ static enum extension_result handle_extension_v0(const char *var,
data->precious_objects = git_config_bool(var, value);
return EXTENSION_OK;
} else if (!strcmp(ext, "partialclone")) {
if (!value)
return config_error_nonbool(var);
data->partial_clone = xstrdup(value);
return EXTENSION_OK;
} else if (!strcmp(ext, "worktreeconfig")) {
@ -566,7 +564,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);
@ -1193,6 +1190,11 @@ int discover_git_directory(struct strbuf *commondir,
return -1;
}
/* take ownership of candidate.partial_clone */
the_repository->repository_format_partial_clone =
candidate.partial_clone;
candidate.partial_clone = NULL;
clear_repository_format(&candidate);
return 0;
}
@ -1300,8 +1302,13 @@ const char *setup_git_directory_gently(int *nongit_ok)
gitdir = DEFAULT_GIT_DIR_ENVIRONMENT;
setup_git_env(gitdir);
}
if (startup_info->have_repository)
if (startup_info->have_repository) {
repo_set_hash_algo(the_repository, repo_fmt.hash_algo);
/* take ownership of repo_fmt.partial_clone */
the_repository->repository_format_partial_clone =
repo_fmt.partial_clone;
repo_fmt.partial_clone = NULL;
}
}
/*
* Since precompose_string_if_needed() needs to look at
@ -1386,6 +1393,8 @@ void check_repository_format(struct repository_format *fmt)
check_repository_format_gently(get_git_dir(), fmt, NULL);
startup_info->have_repository = 1;
repo_set_hash_algo(the_repository, fmt->hash_algo);
the_repository->repository_format_partial_clone =
xstrdup_or_null(fmt->partial_clone);
clear_repository_format(&repo_fmt);
}