]> git.ipfire.org Git - thirdparty/git.git/commitdiff
config: use repo_ignore_case() to access core.ignorecase
authorTian Yuchen <cat@malon.dev>
Fri, 19 Jun 2026 15:51:52 +0000 (23:51 +0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 19 Jun 2026 17:04:56 +0000 (10:04 -0700)
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 <christian.couder@gmail.com>
Mentored-by: Ayush Chandekar <ayu.chandekar@gmail.com>
Mentored-by: Olamide Caleb Bello <belkid98@gmail.com>
Signed-off-by: Tian Yuchen <cat@malon.dev>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
14 files changed:
apply.c
builtin/fetch.c
builtin/mv.c
compat/win32/path-utils.c
dir.c
environment.c
environment.h
fsmonitor.c
name-hash.c
read-cache.c
refs/files-backend.c
submodule.c
t/helper/test-lazy-init-name-hash.c
unpack-trees.c

diff --git a/apply.c b/apply.c
index 249248d4f205ca5f5121487573d30f4ed0011b9d..620c88d2a001977a4fa36604c61a1ce524c3a0c2 100644 (file)
--- 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 {
index e4e8a72ed97120819a36bd1accaaf6fbbd1f556d..073e716bc4ebb98e52be5bc9f18db2275e410f11 100644 (file)
@@ -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"
index 948b3306390337055da2d987104c4dcd7421a31a..d60582262c57356e10d2af904339976fe8f6a6f3 100644 (file)
@@ -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) {
                                /*
index 966ef779b9ca9b36d50ddc16122b7dc726315fb7..f779f367cfc35982a0d73c3ef396cb08d3b39fc4 100644 (file)
@@ -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 33c81c256ee925862b9f1e9651194cfd497e6cff..540dd372c1955da080a1d2209cdce8cbfe65312f 100644 (file)
--- 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;
 }
index bfa3cb3045fe74600ba18c395f3e511ba5f2b2e1..c288c3613d72ccbc7b7fd4fa2bc9cef581dc07df 100644 (file)
@@ -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;
        }
 
index 39a8bf0b49849dd861c841c4ac907f1ba4e16c11..c15121db659cb375c9d3a60111809ccf6e2f5b8c 100644 (file)
@@ -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;
index d07dc18967ae339a4c023e36a18285ac5c787e7c..107767527ebec749130deeffa2262c750b0ae063 100644 (file)
@@ -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(
index b91e276267891e67d6efce3c26a744bb95eac371..83757db8746230393f94bd6613f0f9c847d18dd7 100644 (file)
@@ -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);
 }
 
index 21829102ae275e124eb7b94550bc7ccf16993bac..fcdf0e5ef17116a027d89b78b5ded863cd239143 100644 (file)
@@ -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;
 
index a4c7858787127d1ffd76d6b898ab928a68d33afc..c1da06b1d5106ecc74b88eb13b49b61a4ee064fa 100644 (file)
@@ -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);
index a939ff5072726f8ba6096bd321d7e426efd7cc3c..6e7f8b9f7caf60284f5a20955b0921936086c265 100644 (file)
@@ -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);
index e542985c943452687bfcfc23613061c8069221cd..43cead6d7d514627efb67bf3f1e02e9e6df960aa 100644 (file)
@@ -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)
index 998a1e6dc70cae48a700651459ba87b8151a765a..d13b004f71fc033859f52faad7c279277883f0d7 100644 (file)
@@ -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 &&