]> git.ipfire.org Git - thirdparty/git.git/commitdiff
setup: unify setup of shallow file
authorPatrick Steinhardt <ps@pks.im>
Tue, 30 Jun 2026 11:47:42 +0000 (13:47 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 30 Jun 2026 18:29:41 +0000 (11:29 -0700)
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 <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git.c
setup.c

diff --git a/git.c b/git.c
index 387eabe38c19516fc1a94bc3b92cb26661c5e02c..e5f1811b6bb7622e0ca9fc2445f9d44caa9c84cf 100644 (file)
--- 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 1d8c193375c4d8caf266a01515256a68bc0773c1..278daf6c3b2361bab64fa9e616c6b31a02e6d7cc 100644 (file)
--- 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;