[PATCH v1 3/3] environment: migrate assume_unchanged into repo_config_values
From: Tian Yuchen <hidden>
Date: 2026-07-25 11:54:48
Subsystem:
the rest · Maintainer:
Linus Torvalds
Move the global 'assume_unchanged' configuration into the repository-specific 'repo_config_values' struct. We do not introduce a getter for it because the readers are limited and no hardcoded fallback values are needed. Mentored-by: Christian Couder [off-list ref] Mentored-by: Ayush Chandekar [off-list ref] Mentored-by: Olamide Caleb Bello [off-list ref] Signed-off-by: Tian Yuchen <redacted> --- builtin/update-index.c | 3 ++- environment.c | 4 ++-- environment.h | 2 +- read-cache.c | 9 ++++++--- 4 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/builtin/update-index.c b/builtin/update-index.c
index 4c4b39a157..3ef7e9bb90 100644
--- a/builtin/update-index.c
+++ b/builtin/update-index.c@@ -419,6 +419,7 @@ static int add_cacheinfo(unsigned int mode, const struct object_id *oid, { int len, option; struct cache_entry *ce; + struct repo_config_values *cfg = repo_config_values(the_repository); if (!verify_path(path, mode)) return error("Invalid path '%s'", path);
@@ -431,7 +432,7 @@ static int add_cacheinfo(unsigned int mode, const struct object_id *oid, ce->ce_flags = create_ce_flags(stage); ce->ce_namelen = len; ce->ce_mode = create_ce_mode(mode); - if (assume_unchanged) + if (cfg->assume_unchanged) ce->ce_flags |= CE_VALID; option = allow_add ? ADD_CACHE_OK_TO_ADD : 0; option |= allow_replace ? ADD_CACHE_OK_TO_REPLACE : 0;
diff --git a/environment.c b/environment.c
index ff731a9611..8fdb736023 100644
--- a/environment.c
+++ b/environment.c@@ -43,7 +43,6 @@ static int zlib_compression_seen; int trust_executable_bit = 1; int has_symlinks = 1; -int assume_unchanged; char *git_commit_encoding; char *git_log_output_encoding; char *apply_default_whitespace;
@@ -374,7 +373,7 @@ int git_default_core_config(const char *var, const char *value, } if (!strcmp(var, "core.ignorestat")) { - assume_unchanged = git_config_bool(var, value); + cfg->assume_unchanged = git_config_bool(var, value); return 0; }
@@ -758,6 +757,7 @@ void repo_config_values_init(struct repo_config_values *cfg) cfg->pack_compression_level = Z_DEFAULT_COMPRESSION; cfg->minimum_abbrev = 4; cfg->default_abbrev = -1; + cfg->assume_unchanged = 0; cfg->precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */ cfg->core_sparse_checkout_cone = 0; cfg->sparse_expect_files_outside_of_patterns = 0;
diff --git a/environment.h b/environment.h
index c1d5bba2f0..a7e2bcbe30 100644
--- a/environment.h
+++ b/environment.h@@ -97,6 +97,7 @@ struct repo_config_values { int pack_compression_level; int minimum_abbrev; int default_abbrev; + int assume_unchanged; int precomposed_unicode; int core_sparse_checkout_cone; int warn_on_object_refname_ambiguity;
@@ -187,7 +188,6 @@ int have_git_dir(void); /* Environment bits from configuration mechanism */ extern int trust_executable_bit; extern int has_symlinks; -extern int assume_unchanged; extern char *apply_default_whitespace; extern char *apply_default_ignorewhitespace;
diff --git a/read-cache.c b/read-cache.c
index 38b55323dd..643b13f1fb 100644
--- a/read-cache.c
+++ b/read-cache.c@@ -192,9 +192,11 @@ void rename_index_entry_at(struct index_state *istate, int nr, const char *new_n */ void fill_stat_cache_info(struct index_state *istate, struct cache_entry *ce, struct stat *st) { + struct repo_config_values *cfg = repo_config_values(the_repository); + fill_stat_data(&ce->ce_stat_data, st); - if (assume_unchanged) + if (cfg->assume_unchanged) ce->ce_flags |= CE_VALID; if (S_ISREG(st->st_mode)) {
@@ -1346,6 +1348,7 @@ static struct cache_entry *refresh_cache_ent(struct index_state *istate, { struct stat st; struct cache_entry *updated; + struct repo_config_values *cfg = repo_config_values(the_repository); int changed; int refresh = options & CE_MATCH_REFRESH; int ignore_valid = options & CE_MATCH_IGNORE_VALID;
@@ -1405,7 +1408,7 @@ static struct cache_entry *refresh_cache_ent(struct index_state *istate, * is not marked VALID, this is the place to mark it * valid again, under "assume unchanged" mode. */ - if (ignore_valid && assume_unchanged && + if (ignore_valid && cfg->assume_unchanged && !(ce->ce_flags & CE_VALID)) ; /* mark this one VALID again */ else {
@@ -1440,7 +1443,7 @@ static struct cache_entry *refresh_cache_ent(struct index_state *istate, * (i.e. things to be edited) will reacquire CE_VALID bit * automatically, which is not really what we want. */ - if (!ignore_valid && assume_unchanged && + if (!ignore_valid && cfg->assume_unchanged && !(ce->ce_flags & CE_VALID)) updated->ce_flags &= ~CE_VALID;
--
2.43.0