is_hfs_dotgit: loosen over-eager match of \u{..47}
commit6aaf956b08cfab2dcaa1a1afe4192390d0ef14fd
authorJeff King <peff@peff.net>
Tue, 23 Dec 2014 08:45:36 +0000 (23 03:45 -0500)
committerJunio C Hamano <gitster@pobox.com>
Mon, 29 Dec 2014 20:06:27 +0000 (29 12:06 -0800)
treec7922e942a9ba4ee433446465d6ca418881c1b82
parentd08c13b947335cc48ecc1a8453d97b7147c2d6d6
is_hfs_dotgit: loosen over-eager match of \u{..47}

Our is_hfs_dotgit function relies on the hackily-implemented
next_hfs_char to give us the next character that an HFS+
filename comparison would look at. It's hacky because it
doesn't implement the full case-folding table of HFS+; it
gives us just enough to see if the path matches ".git".

At the end of next_hfs_char, we use tolower() to convert our
32-bit code point to lowercase. Our tolower() implementation
only takes an 8-bit char, though; it throws away the upper
24 bits. This means we can't have any false negatives for
is_hfs_dotgit. We only care about matching 7-bit ASCII
characters in ".git", and we will correctly process 'G' or
'g'.

However, we _can_ have false positives. Because we throw
away the upper bits, code point \u{0147} (for example) will
look like 'G' and get downcased to 'g'. It's not known
whether a sequence of code points whose truncation ends up
as ".git" is meaningful in any language, but it does not
hurt to be more accurate here. We can just pass out the full
32-bit code point, and compare it manually to the upper and
lowercase characters we care about.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t1450-fsck.sh
utf8.c