From: Patrick Steinhardt Date: Tue, 30 Jun 2026 11:47:42 +0000 (+0200) Subject: setup: unify setup of shallow file X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2b36a1c44657a9937f7fc41dae9f650dda05de56;p=thirdparty%2Fgit.git setup: unify setup of shallow file It is possible to configure an arbitrary "shallow" file via two mechanisms, and the respective logic to handle these is split across two locations: - Via the "GIT_SHALLOW_FILE" environment variable, which is handled in `setup_git_env_internal()`. - Via the global "--shallow-file=" command line option, which is handled in `handle_options()`. We can rather easily unify this logic by not configuring the shallow file in `handle_options()`, but instead overwriting the environment variable. The environment variable itself is then handled inside of `apply_repository_format()`, which is responsible for configuring a discovered Git directory. This new logic is similar in nature to how we handle the other global options already, all of which end up setting an environment variable. So for one this gives us more consistency. But more importantly, this change means that `the_repository` will not contain any relevant state anymore before we hit `apply_repository_format()` once we're at the end of this patch series. Consequently, it will become possible for us to completely discard `the_repository` and populate it anew. Signed-off-by: Patrick Steinhardt Signed-off-by: Junio C Hamano --- diff --git a/git.c b/git.c index 387eabe38c..e5f1811b6b 100644 --- a/git.c +++ b/git.c @@ -306,7 +306,7 @@ static int handle_options(const char ***argv, int *argc, int *envchanged) } else if (!strcmp(cmd, "--shallow-file")) { (*argv)++; (*argc)--; - set_alternate_shallow_file(the_repository, (*argv)[0], 1); + setenv(GIT_SHALLOW_FILE_ENVIRONMENT, (*argv)[0], 1); if (envchanged) *envchanged = 1; } else if (!strcmp(cmd, "-C")) { diff --git a/setup.c b/setup.c index 1d8c193375..278daf6c3b 100644 --- a/setup.c +++ b/setup.c @@ -1046,7 +1046,6 @@ static void setup_git_env_internal(struct repository *repo, const char *git_dir) { char *git_replace_ref_base; - const char *shallow_file; const char *replace_ref_base; struct set_gitdir_args args = { NULL }; struct strvec to_free = STRVEC_INIT; @@ -1067,10 +1066,6 @@ static void setup_git_env_internal(struct repository *repo, : "refs/replace/"); update_ref_namespace(NAMESPACE_REPLACE, git_replace_ref_base); - shallow_file = getenv(GIT_SHALLOW_FILE_ENVIRONMENT); - if (shallow_file) - set_alternate_shallow_file(repo, shallow_file, 0); - if (git_env_bool(NO_LAZY_FETCH_ENVIRONMENT, 0)) fetch_if_missing = 0; } @@ -1774,8 +1769,13 @@ int apply_repository_format(struct repository *repo, } if (flags & APPLY_REPOSITORY_FORMAT_HONOR_ENV) { + const char *shallow_file; + object_directory = xstrdup_or_null(getenv(DB_ENVIRONMENT)); alternate_object_directories = xstrdup_or_null(getenv(ALTERNATE_DB_ENVIRONMENT)); + shallow_file = getenv(GIT_SHALLOW_FILE_ENVIRONMENT); + if (shallow_file) + set_alternate_shallow_file(repo, shallow_file, 0); } repo->bare_cfg = format->is_bare;