* Re: gitignore pattern matching issue with Windows
2025-07-28 21:09 gitignore pattern matching issue with Windows TDD Guru
@ 2025-07-28 22:36 ` Junio C Hamano
0 siblings, 0 replies; 2+ messages in thread
From: Junio C Hamano @ 2025-07-28 22:36 UTC (permalink / raw)
To: TDD Guru; +Cc: git
TDD Guru <tddguru@gmail.com> writes:
> C:\gitbug>git check-ignore -v a
>
> C:\gitbug>git check-ignore -v b
>
> C:\gitbug>git check-ignore -v A
>
> C:\gitbug>git check-ignore -v B
I do not think this is not limited to Windows. The exclusion
patterns use the wildmatch machinery, and its ignore-case behaviour
seems iffy. The code expects that pattern characters to be
lowercase in character classes in order to match their uppercase
counterpart, which sounds like a bug.
$ cat >.gitignore <<\EOF
[ab]
[CD]
EOF
$ git -c core.ignorecase check-ignore -v A
$ git -c core.ignorecase check-ignore -v C
Here is a totally untested patch to downcase the pattern characters
to match against the text characters that are already downcased.
wildmatch.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git c/wildmatch.c w/wildmatch.c
index 69a2ae7000..1a2d86b691 100644
--- c/wildmatch.c
+++ w/wildmatch.c
@@ -189,10 +189,14 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
do {
if (!p_ch)
return WM_ABORT_ALL;
+ if ((flags & WM_CASEFOLD) && ISUPPER(p_ch))
+ p_ch = tolower(p_ch);
if (p_ch == '\\') {
p_ch = *++p;
if (!p_ch)
return WM_ABORT_ALL;
+ if ((flags & WM_CASEFOLD) && ISUPPER(p_ch))
+ p_ch = tolower(p_ch);
if (t_ch == p_ch)
matched = 1;
} else if (p_ch == '-' && prev_ch && p[1] && p[1] != ']') {
@@ -201,6 +205,8 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
p_ch = *++p;
if (!p_ch)
return WM_ABORT_ALL;
+ if ((flags & WM_CASEFOLD) && ISUPPER(p_ch))
+ p_ch = tolower(p_ch);
}
if (t_ch <= p_ch && t_ch >= prev_ch)
matched = 1;
@@ -225,6 +231,11 @@ static int dowild(const uchar *p, const uchar *text, unsigned int flags)
matched = 1;
goto next;
}
+
+ /*
+ * [[:alnum:]] etc. must be spelled in
+ * lowercase even under icase matching rule.
+ */
if (CC_EQ(s,i, "alnum")) {
if (ISALNUM(t_ch))
matched = 1;
^ permalink raw reply related [flat|nested] 2+ messages in thread