From: Tian Yuchen Date: Fri, 19 Jun 2026 15:51:52 +0000 (+0800) Subject: config: use repo_ignore_case() to access core.ignorecase X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e6a79c9eb88e9bb07af94cc35dfdb392de56456a;p=thirdparty%2Fgit.git config: use repo_ignore_case() to access core.ignorecase Replace the accesses to the global 'ignore_case' variable with calls to 'repo_ignore_case(the_repository)'. This step eliminates the 'ignore_case' global state. Note on compat/win32/path-utils.c: To eliminate the global state, several helper functions (e.g. 'win32_fspathncmp()') now read from 'repo_ignore_case(the_repository)'. While this introduces dependency on 'repository.h' into the 'compat/', it avoids massive refactoring of the signatures across the codebase. Mentored-by: Christian Couder Mentored-by: Ayush Chandekar Mentored-by: Olamide Caleb Bello Signed-off-by: Tian Yuchen Signed-off-by: Junio C Hamano --- diff --git a/apply.c b/apply.c index 249248d4f2..620c88d2a0 100644 --- a/apply.c +++ b/apply.c @@ -4008,7 +4008,7 @@ static int path_is_beyond_symlink_1(struct apply_state *state, struct strbuf *na struct cache_entry *ce; ce = index_file_exists(state->repo->index, name->buf, - name->len, ignore_case); + name->len, repo_ignore_case(the_repository)); if (ce && S_ISLNK(ce->ce_mode)) return 1; } else { diff --git a/builtin/fetch.c b/builtin/fetch.c index e4e8a72ed9..073e716bc4 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -1819,7 +1819,7 @@ static void ref_transaction_rejection_handler(const char *refname, { struct ref_rejection_data *data = cb_data; - if (err == REF_TRANSACTION_ERROR_CASE_CONFLICT && ignore_case && + if (err == REF_TRANSACTION_ERROR_CASE_CONFLICT && repo_ignore_case(the_repository) && !data->case_sensitive_msg_shown) { error(_("You're on a case-insensitive filesystem, and the remote you are\n" "trying to fetch from has references that only differ in casing. It\n" diff --git a/builtin/mv.c b/builtin/mv.c index 948b330639..d60582262c 100644 --- a/builtin/mv.c +++ b/builtin/mv.c @@ -419,7 +419,7 @@ dir_check: goto act_on_entry; } if (lstat(dst, &st) == 0 && - (!ignore_case || strcasecmp(src, dst))) { + (!repo_ignore_case(the_repository) || strcasecmp(src, dst))) { bad = _("destination exists"); if (force) { /* diff --git a/compat/win32/path-utils.c b/compat/win32/path-utils.c index 966ef779b9..f779f367cf 100644 --- a/compat/win32/path-utils.c +++ b/compat/win32/path-utils.c @@ -2,6 +2,7 @@ #include "../../git-compat-util.h" #include "../../environment.h" +#include "../../repository.h" int win32_has_dos_drive_prefix(const char *path) { @@ -75,7 +76,7 @@ int win32_fspathncmp(const char *a, const char *b, size_t count) } else if (is_dir_sep(*b)) return +1; - diff = ignore_case ? + diff = repo_ignore_case(the_repository) ? (unsigned char)tolower(*a) - (int)(unsigned char)tolower(*b) : (unsigned char)*a - (int)(unsigned char)*b; if (diff) diff --git a/dir.c b/dir.c index 33c81c256e..540dd372c1 100644 --- a/dir.c +++ b/dir.c @@ -126,7 +126,7 @@ int count_slashes(const char *s) int git_fspathcmp(const char *a, const char *b) { - return ignore_case ? strcasecmp(a, b) : strcmp(a, b); + return repo_ignore_case(the_repository) ? strcasecmp(a, b) : strcmp(a, b); } int fspatheq(const char *a, const char *b) @@ -136,7 +136,7 @@ int fspatheq(const char *a, const char *b) int git_fspathncmp(const char *a, const char *b, size_t count) { - return ignore_case ? strncasecmp(a, b, count) : strncmp(a, b, count); + return repo_ignore_case(the_repository) ? strncasecmp(a, b, count) : strncmp(a, b, count); } int paths_collide(const char *a, const char *b) @@ -153,7 +153,7 @@ int paths_collide(const char *a, const char *b) unsigned int fspathhash(const char *str) { - return ignore_case ? strihash(str) : strhash(str); + return repo_ignore_case(the_repository) ? strihash(str) : strhash(str); } int git_fnmatch(const struct pathspec_item *item, @@ -202,7 +202,7 @@ static int fnmatch_icase_mem(const char *pattern, int patternlen, use_str = str_buf.buf; } - if (ignore_case) + if (repo_ignore_case(the_repository)) flags |= WM_CASEFOLD; match_status = wildmatch(use_pat, use_str, flags); @@ -1851,7 +1851,7 @@ static struct dir_entry *dir_add_name(struct dir_struct *dir, struct index_state *istate, const char *pathname, int len) { - if (index_file_exists(istate, pathname, len, ignore_case)) + if (index_file_exists(istate, pathname, len, repo_ignore_case(the_repository))) return NULL; ALLOC_GROW(dir->entries, dir->nr+1, dir->internal.alloc); @@ -1888,7 +1888,7 @@ static enum exist_status directory_exists_in_index_icase(struct index_state *ist if (index_dir_exists(istate, dirname, len)) return index_directory; - ce = index_file_exists(istate, dirname, len, ignore_case); + ce = index_file_exists(istate, dirname, len, repo_ignore_case(the_repository)); if (ce && S_ISGITLINK(ce->ce_mode)) return index_gitdir; @@ -1907,7 +1907,7 @@ static enum exist_status directory_exists_in_index(struct index_state *istate, { int pos; - if (ignore_case) + if (repo_ignore_case(the_repository)) return directory_exists_in_index_icase(istate, dirname, len); pos = index_name_pos(istate, dirname, len); @@ -2447,7 +2447,7 @@ static enum path_treatment treat_path(struct dir_struct *dir, /* Always exclude indexed files */ has_path_in_index = !!index_file_exists(istate, path->buf, path->len, - ignore_case); + repo_ignore_case(the_repository)); if (dtype != DT_DIR && has_path_in_index) return path_none; @@ -3201,7 +3201,7 @@ static int cmp_icase(char a, char b) { if (a == b) return 0; - if (ignore_case) + if (repo_ignore_case(the_repository)) return toupper(a) - toupper(b); return a - b; } diff --git a/environment.c b/environment.c index bfa3cb3045..c288c3613d 100644 --- a/environment.c +++ b/environment.c @@ -46,7 +46,6 @@ int trust_ctime = 1; int check_stat = 1; int has_symlinks = 1; int minimum_abbrev = 4, default_abbrev = -1; -int ignore_case; int assume_unchanged; int is_bare_repository_cfg = -1; /* unspecified */ int warn_on_object_refname_ambiguity = 1; @@ -342,7 +341,7 @@ int git_default_core_config(const char *var, const char *value, } if (!strcmp(var, "core.ignorecase")) { - ignore_case = git_config_bool(var, value); + cfg->ignore_case = git_config_bool(var, value); return 0; } diff --git a/environment.h b/environment.h index 39a8bf0b49..c15121db65 100644 --- a/environment.h +++ b/environment.h @@ -171,7 +171,6 @@ extern int trust_ctime; extern int check_stat; extern int has_symlinks; extern int minimum_abbrev, default_abbrev; -extern int ignore_case; extern int assume_unchanged; extern int warn_on_object_refname_ambiguity; extern char *apply_default_whitespace; diff --git a/fsmonitor.c b/fsmonitor.c index d07dc18967..107767527e 100644 --- a/fsmonitor.c +++ b/fsmonitor.c @@ -453,7 +453,7 @@ static void fsmonitor_refresh_callback(struct index_state *istate, char *name) * case-insensitive file system, try again using the name-hash * and dir-name-hash. */ - if (!nr_in_cone && ignore_case) { + if (!nr_in_cone && repo_ignore_case(the_repository)) { nr_in_cone = handle_using_name_hash_icase(istate, name); if (!nr_in_cone) nr_in_cone = handle_using_dir_name_hash_icase( diff --git a/name-hash.c b/name-hash.c index b91e276267..83757db874 100644 --- a/name-hash.c +++ b/name-hash.c @@ -126,7 +126,7 @@ static void hash_index_entry(struct index_state *istate, struct cache_entry *ce) hashmap_add(&istate->name_hash, &ce->ent); } - if (ignore_case) + if (repo_ignore_case(the_repository)) add_dir_entry(istate, ce); } @@ -207,7 +207,7 @@ static int lookup_lazy_params(struct index_state *istate) * code to build the "istate->name_hash". We don't * need the complexity here. */ - if (!ignore_case) + if (!repo_ignore_case(the_repository)) return 0; nr_cpus = online_cpus(); @@ -651,7 +651,7 @@ void remove_name_hash(struct index_state *istate, struct cache_entry *ce) ce->ce_flags &= ~CE_HASHED; hashmap_remove(&istate->name_hash, &ce->ent, ce); - if (ignore_case) + if (repo_ignore_case(the_repository)) remove_dir_entry(istate, ce); } diff --git a/read-cache.c b/read-cache.c index 21829102ae..fcdf0e5ef1 100644 --- a/read-cache.c +++ b/read-cache.c @@ -760,12 +760,12 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st, * case of the file being added to the repository matches (is folded into) the existing * entry's directory case. */ - if (ignore_case) { + if (repo_ignore_case(the_repository)) { adjust_dirname_case(istate, ce->name); } if (!(flags & ADD_CACHE_RENORMALIZE)) { alias = index_file_exists(istate, ce->name, - ce_namelen(ce), ignore_case); + ce_namelen(ce), repo_ignore_case(the_repository)); if (alias && !ce_stage(alias) && !ie_match_stat(istate, alias, st, ce_option)) { @@ -786,7 +786,7 @@ int add_to_index(struct index_state *istate, const char *path, struct stat *st, } else set_object_name_for_intent_to_add_entry(ce); - if (ignore_case && alias && different_name(ce, alias)) + if (repo_ignore_case(the_repository) && alias && different_name(ce, alias)) ce = create_alias_ce(istate, ce, alias); ce->ce_flags |= CE_ADDED; diff --git a/refs/files-backend.c b/refs/files-backend.c index a4c7858787..c1da06b1d5 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -806,7 +806,7 @@ retry: } else { unable_to_lock_message(ref_file.buf, myerr, err); if (myerr == EEXIST) { - if (ignore_case && + if (repo_ignore_case(the_repository) && transaction_has_case_conflicting_update(transaction, update)) { /* * In case-insensitive filesystems, ensure that conflicts within a @@ -920,7 +920,7 @@ retry: * conflicts between 'foo' and 'Foo/bar'. So let's lowercase * the refname. */ - if (ignore_case) { + if (repo_ignore_case(the_repository)) { struct strbuf lower = STRBUF_INIT; strbuf_addstr(&lower, refname); diff --git a/submodule.c b/submodule.c index a939ff5072..6e7f8b9f7c 100644 --- a/submodule.c +++ b/submodule.c @@ -2389,7 +2389,7 @@ static int validate_submodule_encoded_git_dir(char *git_dir, const char *submodu /* Prevent conflicts on case-folding filesystems */ repo_config_get_bool(the_repository, "core.ignorecase", &config_ignorecase); - if (ignore_case || config_ignorecase) { + if (repo_ignore_case(the_repository) || config_ignorecase) { bool suffixes_match = !strcmp(last_submodule_name, submodule_name); return check_casefolding_conflict(git_dir, submodule_name, suffixes_match); diff --git a/t/helper/test-lazy-init-name-hash.c b/t/helper/test-lazy-init-name-hash.c index e542985c94..43cead6d7d 100644 --- a/t/helper/test-lazy-init-name-hash.c +++ b/t/helper/test-lazy-init-name-hash.c @@ -218,7 +218,7 @@ int cmd__lazy_init_name_hash(int argc, const char **argv) /* * istate->dir_hash is only created when ignore_case is set. */ - ignore_case = 1; + repo_config_values(the_repository)->ignore_case = 1; if (dump) { if (perf || analyze > 0) diff --git a/unpack-trees.c b/unpack-trees.c index 998a1e6dc7..d13b004f71 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -2428,7 +2428,7 @@ static int check_ok_to_remove(const char *name, int len, int dtype, * * Ignore that lstat() if it matches. */ - if (ignore_case && icase_exists(o, name, len, st)) + if (repo_ignore_case(the_repository) && icase_exists(o, name, len, st)) return 0; if (o->internal.dir &&