Thread (45 messages) 45 messages, 10 authors, 2016-06-15

Re: [PATCH/RFC v3 6/8] Add case insensitivity support when using git ls-files

From: Erik Faye-Lund <hidden>
Date: 2016-06-15 22:49:41

On Mon, Oct 4, 2010 at 6:02 PM, Robin Rosenberg
[off-list ref] wrote:
söndagen den 3 oktober 2010 11.56.44 skrev  Ævar Arnfjörð Bjarmason:
quoted
From: Joshua Jensen <redacted>

When mydir/filea.txt is added, mydir/ is renamed to MyDir/, and
MyDir/fileb.txt is added, running git ls-files mydir only shows
mydir/filea.txt. Running git ls-files MyDir shows MyDir/fileb.txt.
Running git ls-files mYdIR shows nothing.

With this patch running git ls-files for mydir, MyDir, and mYdIR shows
mydir/filea.txt and MyDir/fileb.txt.

Wildcards are not handled case insensitively in this patch. Example:
MyDir/aBc/file.txt is added. git ls-files MyDir/a* works fine, but git
ls-files mydir/a* does not.

Signed-off-by: Joshua Jensen <redacted>
Signed-off-by: Johannes Sixt <redacted>
Signed-off-by: Junio C Hamano <redacted>
---
 dir.c |   38 ++++++++++++++++++++++++++------------
 1 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/dir.c b/dir.c
index cf8f65c..53aa4f3 100644
--- a/dir.c
+++ b/dir.c
@@ -107,16 +107,30 @@ static int match_one(const char *match, const char
*name, int namelen) if (!*match)
              return MATCHED_RECURSIVELY;

-     for (;;) {
-             unsigned char c1 = *match;
-             unsigned char c2 = *name;
-             if (c1 == '\0' || is_glob_special(c1))
-                     break;
-             if (c1 != c2)
-                     return 0;
-             match++;
-             name++;
-             namelen--;
+     if (ignore_case) {
+             for (;;) {
+                     unsigned char c1 = tolower(*match);
+                     unsigned char c2 = tolower(*name);
Is anyone thinking "unicode" around here?
You're not the first to think about the combination of core.ignorecase
and unicode, but unfortunately way too few people have.

slow_same_name() (and index_name_exists() by proxy) already does the
Wrong Thing (tm), so the problem is already rooted in the index. The
consensus on the msysGit mailing list last time this was brought up
[1] was simply to ignore the combination of unicode and
core.ignorecase, but I'm not sure I'm convinced myself that it's a
good idea. We might end up painting our selves further into a corner,
in the end making it nearly impossible to fix.

One complicating factor is that Windows' definition of what
character-pairs compare as identical depends on a table stored
somewhere in NTFS[2]. The time your drive was formatted decides what
that table looks like, and I haven't been able to retrieve it. This
might be going a little too far, as this table is likely to be very
rarely changed, but I think it's worth noting.

[1]: http://groups.google.com/group/msysgit/browse_thread/thread/675ad16102f6233f/a25cd7bb8dfa2abb#a25cd7bb8dfa2abb
[2]: http://blogs.msdn.com/b/michkap/archive/2007/10/24/5641619.aspx
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help