Browse Source

Merge branch 'maint-1.8.5' into maint-1.9

* maint-1.8.5:
  is_hfs_dotgit: loosen over-eager match of \u{..47}
maint
Junio C Hamano 10 years ago
parent
commit
64a03e970a
  1. 15
      t/t1450-fsck.sh
  2. 32
      utf8.c

15
t/t1450-fsck.sh

@ -287,4 +287,19 @@ dot-backslash-case .\\\\.GIT\\\\foobar @@ -287,4 +287,19 @@ dot-backslash-case .\\\\.GIT\\\\foobar
dotgit-case-backslash .git\\\\foobar
EOF

test_expect_success 'fsck allows .Ňit' '
(
git init not-dotgit &&
cd not-dotgit &&
echo content >file &&
git add file &&
git commit -m base &&
blob=$(git rev-parse :file) &&
printf "100644 blob $blob\t.\\305\\207it" >tree &&
tree=$(git mktree <tree) &&
git fsck 2>err &&
test_line_count = 0 err
)
'

test_done

32
utf8.c

@ -629,8 +629,8 @@ int mbs_chrlen(const char **text, size_t *remainder_p, const char *encoding) @@ -629,8 +629,8 @@ int mbs_chrlen(const char **text, size_t *remainder_p, const char *encoding)
}

/*
* Pick the next char from the stream, folding as an HFS+ filename comparison
* would. Note that this is _not_ complete by any means. It's just enough
* Pick the next char from the stream, ignoring codepoints an HFS+ would.
* Note that this is _not_ complete by any means. It's just enough
* to make is_hfs_dotgit() work, and should not be used otherwise.
*/
static ucs_char_t next_hfs_char(const char **in)
@ -667,12 +667,7 @@ static ucs_char_t next_hfs_char(const char **in) @@ -667,12 +667,7 @@ static ucs_char_t next_hfs_char(const char **in)
continue;
}

/*
* there's a great deal of other case-folding that occurs,
* but this is enough to catch anything that will convert
* to ".git"
*/
return tolower(out);
return out;
}
}

@ -680,10 +675,23 @@ int is_hfs_dotgit(const char *path) @@ -680,10 +675,23 @@ int is_hfs_dotgit(const char *path)
{
ucs_char_t c;

if (next_hfs_char(&path) != '.' ||
next_hfs_char(&path) != 'g' ||
next_hfs_char(&path) != 'i' ||
next_hfs_char(&path) != 't')
c = next_hfs_char(&path);
if (c != '.')
return 0;
c = next_hfs_char(&path);

/*
* there's a great deal of other case-folding that occurs
* in HFS+, but this is enough to catch anything that will
* convert to ".git"
*/
if (c != 'g' && c != 'G')
return 0;
c = next_hfs_char(&path);
if (c != 'i' && c != 'I')
return 0;
c = next_hfs_char(&path);
if (c != 't' && c != 'T')
return 0;
c = next_hfs_char(&path);
if (c && !is_dir_sep(c))

Loading…
Cancel
Save