From: Christian Couder Date: Fri, 10 Jul 2026 08:51:36 GMT Subject: [PATCH 2/3] promisor-remote: introduce enum allow_lazy_fetch Message-ID: <20260710085137.4171240-3-christian.couder@gmail.com> In-Reply-To: <20260710085137.4171240-1-christian.couder@gmail.com> The `GIT_NO_LAZY_FETCH` environment variable is currently parsed as a Boolean, using git_env_bool(), in both "setup.c" and "promisor-remote.c". In a following commit, we are going to allow a third value for this variable, on top of 'true' and 'false'. To prepare for that, let's introduce an `enum allow_lazy_fetch` with the possible results of parsing the variable, along with a parse_allow_lazy_fetch_env() function to parse it, and let's use them everywhere the variable is parsed. Note that, as before, an invalid value makes us die(), only the error message changes from "bad boolean environment value ..." to "bad environment value ...". Signed-off-by: Christian Couder --- promisor-remote.c | 24 +++++++++++++++++++++++- promisor-remote.h | 13 +++++++++++++ setup.c | 5 ++++- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/promisor-remote.c b/promisor-remote.c index 65496c69cf..56f57c5267 100644 --- a/promisor-remote.c +++ b/promisor-remote.c @@ -21,6 +21,26 @@ struct promisor_remote_config { struct promisor_remote **promisors_tail; }; +enum allow_lazy_fetch parse_allow_lazy_fetch_env(void) +{ + const char *v = getenv(NO_LAZY_FETCH_ENVIRONMENT); + int val; + + if (!v) + return LAZY_FETCH_ALL; + + val = git_parse_maybe_bool(v); + + if (!val) + return LAZY_FETCH_ALL; + if (val > 0) + return LAZY_FETCH_NONE; + + die(_("bad environment value '%s' for '%s'; " + "only 'false/0' and 'true/1' are valid"), + v, NO_LAZY_FETCH_ENVIRONMENT); +} + static int fetch_objects(struct repository *repo, const char *remote_name, const struct object_id *oids, @@ -299,7 +319,9 @@ static bool lazy_fetch_objects(struct repository *repo, int *remaining_nr, int *to_free) { - if (git_env_bool(NO_LAZY_FETCH_ENVIRONMENT, 0)) { + enum allow_lazy_fetch lf = parse_allow_lazy_fetch_env(); + + if (lf == LAZY_FETCH_NONE) { static int warning_shown; if (!warning_shown) { warning_shown = 1; diff --git a/promisor-remote.h b/promisor-remote.h index 301f5ac5cb..87fc24c9eb 100644 --- a/promisor-remote.h +++ b/promisor-remote.h @@ -25,6 +25,19 @@ void promisor_remote_clear(struct promisor_remote_config *config); struct promisor_remote *repo_promisor_remote_find(struct repository *r, const char *remote_name); int repo_has_promisor_remote(struct repository *r); +/* Enum for lazy fetching parsing */ +enum allow_lazy_fetch { + LAZY_FETCH_NONE = 0, /* No lazy fetching */ + LAZY_FETCH_ALL /* Lazy fetch from any promisor remotes */ +}; + +/* + * Parse the NO_LAZY_FETCH_ENVIRONMENT env variable into an + * `enum allow_lazy_fetch`. + * If parsing fails, then die(). + */ +enum allow_lazy_fetch parse_allow_lazy_fetch_env(void); + /* * Fetches all requested objects from all promisor remotes, trying them one at * a time until all objects are fetched. diff --git a/setup.c b/setup.c index 0de56a074f..0a81d9f045 100644 --- a/setup.c +++ b/setup.c @@ -24,6 +24,7 @@ #include "trace.h" #include "trace2.h" #include "worktree.h" +#include "promisor-remote.h" enum allowed_bare_repo { ALLOWED_BARE_REPO_EXPLICIT = 0, @@ -1051,6 +1052,7 @@ static void setup_git_env_internal(struct repository *repo, const char *replace_ref_base; struct set_gitdir_args args = { NULL }; struct strvec to_free = STRVEC_INIT; + enum allow_lazy_fetch lf; args.commondir = getenv_safe(&to_free, GIT_COMMON_DIR_ENVIRONMENT); args.graft_file = getenv_safe(&to_free, GRAFT_ENVIRONMENT); @@ -1072,7 +1074,8 @@ static void setup_git_env_internal(struct repository *repo, if (shallow_file) set_alternate_shallow_file(repo, shallow_file, 0); - if (git_env_bool(NO_LAZY_FETCH_ENVIRONMENT, 0)) + lf = parse_allow_lazy_fetch_env(); + if (lf == LAZY_FETCH_NONE) fetch_if_missing = 0; } -- 2.55.0.125.g395cd2c8ec.dirty