From: "Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: vdye@github.com, johannes.schindelin@gmx.de, newren@gmail.com,
peff@peff.net, gitster@pobox.com,
Derrick Stolee <derrickstolee@github.com>,
Derrick Stolee <derrickstolee@github.com>
Subject: [PATCH 6/6] config: move ignore_case to global config
Date: Fri, 02 Jun 2023 14:33:40 +0000 [thread overview]
Message-ID: <2b4198c09cb6c04c60608d19072d419503dfe5df.1685716421.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.1539.git.1685716420.gitgitgadget@gmail.com>
From: Derrick Stolee <derrickstolee@github.com>
The core.ignoreCase config setting is currently stored in the
ignore_case global. Add it to the list of config globals as
INT_CONFIG_IGNORE_CASE instead as a precaution. This allows us to load
the config only when needed.
There is a subtle use of force-enabling this global in 'test-tool
init-name-hash', since it is trying to test a feature that is only on
when core.ignoreCase is true. Instead of forcing it on in-memory, adjust
the test scripts to set the config.
Signed-off-by: Derrick Stolee <derrickstolee@github.com>
---
apply.c | 3 ++-
builtin/mv.c | 2 +-
config.c | 5 -----
dir.c | 23 ++++++++++++++---------
environment.c | 1 -
environment.h | 1 -
global-config.c | 2 ++
global-config.h | 1 +
merge-recursive.c | 8 ++++----
name-hash.c | 6 +++---
read-cache.c | 8 ++++----
t/helper/test-lazy-init-name-hash.c | 5 -----
t/perf/p0004-lazy-init-name-hash.sh | 6 ++++++
t/t3008-ls-files-lazy-init-name-hash.sh | 1 +
unpack-trees.c | 2 +-
15 files changed, 39 insertions(+), 35 deletions(-)
diff --git a/apply.c b/apply.c
index 17092d2bb12..4292d595062 100644
--- a/apply.c
+++ b/apply.c
@@ -3882,7 +3882,8 @@ 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,
+ get_int_config_global(INT_CONFIG_IGNORE_CASE));
if (ce && S_ISLNK(ce->ce_mode))
return 1;
} else {
diff --git a/builtin/mv.c b/builtin/mv.c
index 32935af48e6..e7a0280ad34 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -359,7 +359,7 @@ dir_check:
goto act_on_entry;
}
if (lstat(dst, &st) == 0 &&
- (!ignore_case || strcasecmp(src, dst))) {
+ (!get_int_config_global(INT_CONFIG_IGNORE_CASE) || strcasecmp(src, dst))) {
bad = _("destination exists");
if (force) {
/*
diff --git a/config.c b/config.c
index e104bc704ae..4292a3be416 100644
--- a/config.c
+++ b/config.c
@@ -1568,11 +1568,6 @@ static int git_default_core_config(const char *var, const char *value, void *cb)
check_stat = 0;
}
- if (!strcmp(var, "core.ignorecase")) {
- ignore_case = git_config_bool(var, value);
- return 0;
- }
-
if (!strcmp(var, "core.attributesfile"))
return git_config_pathname(&git_attributes_file, var, value);
diff --git a/dir.c b/dir.c
index aa840995c40..45f09bcbe4d 100644
--- a/dir.c
+++ b/dir.c
@@ -84,7 +84,8 @@ int count_slashes(const char *s)
int fspathcmp(const char *a, const char *b)
{
- return ignore_case ? strcasecmp(a, b) : strcmp(a, b);
+ return get_int_config_global(INT_CONFIG_IGNORE_CASE) ?
+ strcasecmp(a, b) : strcmp(a, b);
}
int fspatheq(const char *a, const char *b)
@@ -94,12 +95,14 @@ int fspatheq(const char *a, const char *b)
int fspathncmp(const char *a, const char *b, size_t count)
{
- return ignore_case ? strncasecmp(a, b, count) : strncmp(a, b, count);
+ return get_int_config_global(INT_CONFIG_IGNORE_CASE) ?
+ strncasecmp(a, b, count) : strncmp(a, b, count);
}
unsigned int fspathhash(const char *str)
{
- return ignore_case ? strihash(str) : strhash(str);
+ return get_int_config_global(INT_CONFIG_IGNORE_CASE) ?
+ strihash(str) : strhash(str);
}
int git_fnmatch(const struct pathspec_item *item,
@@ -148,7 +151,7 @@ static int fnmatch_icase_mem(const char *pattern, int patternlen,
use_str = str_buf.buf;
}
- if (ignore_case)
+ if (get_int_config_global(INT_CONFIG_IGNORE_CASE))
flags |= WM_CASEFOLD;
match_status = wildmatch(use_pat, use_str, flags);
@@ -1749,7 +1752,8 @@ 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,
+ get_int_config_global(INT_CONFIG_IGNORE_CASE)))
return NULL;
ALLOC_GROW(dir->entries, dir->nr+1, dir->internal.alloc);
@@ -1786,7 +1790,8 @@ 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,
+ get_int_config_global(INT_CONFIG_IGNORE_CASE));
if (ce && S_ISGITLINK(ce->ce_mode))
return index_gitdir;
@@ -1805,7 +1810,7 @@ static enum exist_status directory_exists_in_index(struct index_state *istate,
{
int pos;
- if (ignore_case)
+ if (get_int_config_global(INT_CONFIG_IGNORE_CASE))
return directory_exists_in_index_icase(istate, dirname, len);
pos = index_name_pos(istate, dirname, len);
@@ -2313,7 +2318,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);
+ get_int_config_global(INT_CONFIG_IGNORE_CASE));
if (dtype != DT_DIR && has_path_in_index)
return path_none;
@@ -3067,7 +3072,7 @@ static int cmp_icase(char a, char b)
{
if (a == b)
return 0;
- if (ignore_case)
+ if (get_int_config_global(INT_CONFIG_IGNORE_CASE))
return toupper(a) - toupper(b);
return a - b;
}
diff --git a/environment.c b/environment.c
index 312e006feb0..44cbaa3e0f9 100644
--- a/environment.c
+++ b/environment.c
@@ -32,7 +32,6 @@
int check_stat = 1;
int minimum_abbrev = 4, default_abbrev = -1;
-int ignore_case;
int assume_unchanged;
int prefer_symlink_refs;
int is_bare_repository_cfg = -1; /* unspecified */
diff --git a/environment.h b/environment.h
index fb2cfa9c1aa..d77f4b233f8 100644
--- a/environment.h
+++ b/environment.h
@@ -113,7 +113,6 @@ void set_git_work_tree(const char *tree);
/* Environment bits from configuration mechanism */
extern int check_stat;
extern int minimum_abbrev, default_abbrev;
-extern int ignore_case;
extern int assume_unchanged;
extern int prefer_symlink_refs;
extern int warn_ambiguous_refs;
diff --git a/global-config.c b/global-config.c
index 526ced5b24c..779b894cf07 100644
--- a/global-config.c
+++ b/global-config.c
@@ -8,6 +8,7 @@ static int global_ints[] = {
[INT_CONFIG_TRUST_CTIME] = 1,
[INT_CONFIG_QUOTE_PATH_FULLY] = 1,
[INT_CONFIG_HAS_SYMLINKS] = 1,
+ [INT_CONFIG_IGNORE_CASE] = 0,
};
/* Bitmask for the enum. */
@@ -19,6 +20,7 @@ static const char *global_int_names[] = {
[INT_CONFIG_TRUST_CTIME] = "core.trustctime",
[INT_CONFIG_QUOTE_PATH_FULLY] = "core.quotepath",
[INT_CONFIG_HAS_SYMLINKS] = "core.symlinks",
+ [INT_CONFIG_IGNORE_CASE] = "core.ignorecase",
};
static int config_available;
diff --git a/global-config.h b/global-config.h
index 2532f426e2b..cb32503fbd9 100644
--- a/global-config.h
+++ b/global-config.h
@@ -7,6 +7,7 @@ enum int_config_key {
INT_CONFIG_TRUST_CTIME,
INT_CONFIG_QUOTE_PATH_FULLY,
INT_CONFIG_HAS_SYMLINKS,
+ INT_CONFIG_IGNORE_CASE,
};
/**
diff --git a/merge-recursive.c b/merge-recursive.c
index 10fdd14a642..ec806be4753 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -709,10 +709,9 @@ static int remove_file(struct merge_options *opt, int clean,
return -1;
}
if (update_working_directory) {
- if (ignore_case) {
+ if (get_int_config_global(INT_CONFIG_IGNORE_CASE)) {
struct cache_entry *ce;
- ce = index_file_exists(opt->repo->index, path, strlen(path),
- ignore_case);
+ ce = index_file_exists(opt->repo->index, path, strlen(path), 1);
if (ce && ce_stage(ce) == 0 && strcmp(path, ce->name))
return 0;
}
@@ -875,7 +874,8 @@ static int was_dirty(struct merge_options *opt, const char *path)
return !dirty;
ce = index_file_exists(opt->priv->unpack_opts.src_index,
- path, strlen(path), ignore_case);
+ path, strlen(path),
+ get_int_config_global(INT_CONFIG_IGNORE_CASE));
dirty = verify_uptodate(ce, &opt->priv->unpack_opts) != 0;
return dirty;
}
diff --git a/name-hash.c b/name-hash.c
index fb13716e430..7c32e2be2e9 100644
--- a/name-hash.c
+++ b/name-hash.c
@@ -119,7 +119,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 (get_int_config_global(INT_CONFIG_IGNORE_CASE))
add_dir_entry(istate, ce);
}
@@ -200,7 +200,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 (!get_int_config_global(INT_CONFIG_IGNORE_CASE))
return 0;
nr_cpus = online_cpus();
@@ -642,7 +642,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 (get_int_config_global(INT_CONFIG_IGNORE_CASE))
remove_dir_entry(istate, ce);
}
diff --git a/read-cache.c b/read-cache.c
index b80a54133f9..444b37aff63 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -828,12 +828,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 (get_int_config_global(INT_CONFIG_IGNORE_CASE)) {
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), get_int_config_global(INT_CONFIG_IGNORE_CASE));
if (alias &&
!ce_stage(alias) &&
!ie_match_stat(istate, alias, st, ce_option)) {
@@ -854,7 +854,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 (get_int_config_global(INT_CONFIG_IGNORE_CASE) && alias && different_name(ce, alias))
ce = create_alias_ce(istate, ce, alias);
ce->ce_flags |= CE_ADDED;
@@ -1024,7 +1024,7 @@ static int verify_dotfile(const char *rest, unsigned mode)
switch (*rest) {
/*
* ".git" followed by NUL or slash is bad. Note that we match
- * case-insensitively here, even if ignore_case is not set.
+ * case-insensitively here, regardless of core.ignoreCase.
* This outlaws ".GIT" everywhere out of an abundance of caution,
* since there's really no good reason to allow it.
*
diff --git a/t/helper/test-lazy-init-name-hash.c b/t/helper/test-lazy-init-name-hash.c
index f23d983c118..5b69f90d888 100644
--- a/t/helper/test-lazy-init-name-hash.c
+++ b/t/helper/test-lazy-init-name-hash.c
@@ -212,11 +212,6 @@ int cmd__lazy_init_name_hash(int argc, const char **argv)
argc = parse_options(argc, argv, prefix, options, usage, 0);
- /*
- * istate->dir_hash is only created when ignore_case is set.
- */
- ignore_case = 1;
-
if (dump) {
if (perf || analyze > 0)
die("cannot combine dump, perf, or analyze");
diff --git a/t/perf/p0004-lazy-init-name-hash.sh b/t/perf/p0004-lazy-init-name-hash.sh
index 85be14e4ddb..90dad259161 100755
--- a/t/perf/p0004-lazy-init-name-hash.sh
+++ b/t/perf/p0004-lazy-init-name-hash.sh
@@ -6,6 +6,12 @@ test_description='Tests multi-threaded lazy_init_name_hash'
test_perf_large_repo
test_checkout_worktree
+test_expect_success 'initialize core.ignorecase' '
+ # This is needed since the name-hash structure is ignored when
+ # core.ignorecase is false.
+ git config core.ignorecase true
+'
+
test_expect_success 'verify both methods build the same hashmaps' '
test-tool lazy-init-name-hash --dump --single >out.single &&
if test-tool lazy-init-name-hash --dump --multi >out.multi
diff --git a/t/t3008-ls-files-lazy-init-name-hash.sh b/t/t3008-ls-files-lazy-init-name-hash.sh
index 51d3dffaa66..54bde980769 100755
--- a/t/t3008-ls-files-lazy-init-name-hash.sh
+++ b/t/t3008-ls-files-lazy-init-name-hash.sh
@@ -22,6 +22,7 @@ test_expect_success 'no buffer overflow in lazy_init_name_hash' '
) |
sed "s/^/100644 $EMPTY_BLOB /" |
git update-index --index-info &&
+ git config core.ignoreCase true &&
test-tool lazy-init-name-hash -m
'
diff --git a/unpack-trees.c b/unpack-trees.c
index c0732aa0c2d..b678745e699 100644
--- a/unpack-trees.c
+++ b/unpack-trees.c
@@ -2405,7 +2405,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 (get_int_config_global(INT_CONFIG_IGNORE_CASE) && icase_exists(o, name, len, st))
return 0;
if (o->internal.dir &&
--
gitgitgadget
next prev parent reply other threads:[~2023-06-02 14:33 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-02 14:33 [PATCH 0/6] [RFC] Lazy-loaded default Git config Derrick Stolee via GitGitGadget
2023-06-02 14:33 ` [PATCH 1/6] config: create new global config helpers Derrick Stolee via GitGitGadget
2023-06-02 14:33 ` [PATCH 2/6] config: add trust_executable_bit to global config Derrick Stolee via GitGitGadget
2023-06-02 14:33 ` [PATCH 3/6] config: move trust_ctime " Derrick Stolee via GitGitGadget
2023-06-02 14:33 ` [PATCH 4/6] config: move quote_path_fully " Derrick Stolee via GitGitGadget
2023-06-02 14:33 ` [PATCH 5/6] config: move has_symlinks " Derrick Stolee via GitGitGadget
2023-06-02 14:33 ` Derrick Stolee via GitGitGadget [this message]
2023-06-08 18:19 ` [PATCH 0/6] [RFC] Lazy-loaded default Git config Glen Choo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2b4198c09cb6c04c60608d19072d419503dfe5df.1685716421.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=derrickstolee@github.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=johannes.schindelin@gmx.de \
--cc=newren@gmail.com \
--cc=peff@peff.net \
--cc=vdye@github.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).