is_hfs_dotgit: match other .git files
Both verify_path() and fsck match ".git", ".GIT", and other variants specific to HFS+. Let's allow matching other special files like ".gitmodules", which we'll later use to enforce extra restrictions via verify_path() and fsck. Signed-off-by: Jeff King <peff@peff.net>
This commit is contained in:
parent
11a9f4d807
commit
0fc333ba20
58
utf8.c
58
utf8.c
@ -619,28 +619,33 @@ static ucs_char_t next_hfs_char(const char **in)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int is_hfs_dotgit(const char *path)
|
static int is_hfs_dot_generic(const char *path,
|
||||||
|
const char *needle, size_t needle_len)
|
||||||
{
|
{
|
||||||
ucs_char_t c;
|
ucs_char_t c;
|
||||||
|
|
||||||
c = next_hfs_char(&path);
|
c = next_hfs_char(&path);
|
||||||
if (c != '.')
|
if (c != '.')
|
||||||
return 0;
|
return 0;
|
||||||
c = next_hfs_char(&path);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* there's a great deal of other case-folding that occurs
|
* there's a great deal of other case-folding that occurs
|
||||||
* in HFS+, but this is enough to catch anything that will
|
* in HFS+, but this is enough to catch our fairly vanilla
|
||||||
* convert to ".git"
|
* hard-coded needles.
|
||||||
*/
|
*/
|
||||||
if (c != 'g' && c != 'G')
|
for (; needle_len > 0; needle++, needle_len--) {
|
||||||
return 0;
|
c = next_hfs_char(&path);
|
||||||
c = next_hfs_char(&path);
|
|
||||||
if (c != 'i' && c != 'I')
|
/*
|
||||||
return 0;
|
* We know our needles contain only ASCII, so we clamp here to
|
||||||
c = next_hfs_char(&path);
|
* make the results of tolower() sane.
|
||||||
if (c != 't' && c != 'T')
|
*/
|
||||||
return 0;
|
if (c > 127)
|
||||||
|
return 0;
|
||||||
|
if (tolower(c) != *needle)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
c = next_hfs_char(&path);
|
c = next_hfs_char(&path);
|
||||||
if (c && !is_dir_sep(c))
|
if (c && !is_dir_sep(c))
|
||||||
return 0;
|
return 0;
|
||||||
@ -648,6 +653,35 @@ int is_hfs_dotgit(const char *path)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Inline wrapper to make sure the compiler resolves strlen() on literals at
|
||||||
|
* compile time.
|
||||||
|
*/
|
||||||
|
static inline int is_hfs_dot_str(const char *path, const char *needle)
|
||||||
|
{
|
||||||
|
return is_hfs_dot_generic(path, needle, strlen(needle));
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_hfs_dotgit(const char *path)
|
||||||
|
{
|
||||||
|
return is_hfs_dot_str(path, "git");
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_hfs_dotgitmodules(const char *path)
|
||||||
|
{
|
||||||
|
return is_hfs_dot_str(path, "gitmodules");
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_hfs_dotgitignore(const char *path)
|
||||||
|
{
|
||||||
|
return is_hfs_dot_str(path, "gitignore");
|
||||||
|
}
|
||||||
|
|
||||||
|
int is_hfs_dotgitattributes(const char *path)
|
||||||
|
{
|
||||||
|
return is_hfs_dot_str(path, "gitattributes");
|
||||||
|
}
|
||||||
|
|
||||||
const char utf8_bom[] = "\357\273\277";
|
const char utf8_bom[] = "\357\273\277";
|
||||||
|
|
||||||
int skip_utf8_bom(char **text, size_t len)
|
int skip_utf8_bom(char **text, size_t len)
|
||||||
|
5
utf8.h
5
utf8.h
@ -52,8 +52,13 @@ int mbs_chrlen(const char **text, size_t *remainder_p, const char *encoding);
|
|||||||
* The path should be NUL-terminated, but we will match variants of both ".git\0"
|
* The path should be NUL-terminated, but we will match variants of both ".git\0"
|
||||||
* and ".git/..." (but _not_ ".../.git"). This makes it suitable for both fsck
|
* and ".git/..." (but _not_ ".../.git"). This makes it suitable for both fsck
|
||||||
* and verify_path().
|
* and verify_path().
|
||||||
|
*
|
||||||
|
* Likewise, the is_hfs_dotgitfoo() variants look for ".gitfoo".
|
||||||
*/
|
*/
|
||||||
int is_hfs_dotgit(const char *path);
|
int is_hfs_dotgit(const char *path);
|
||||||
|
int is_hfs_dotgitmodules(const char *path);
|
||||||
|
int is_hfs_dotgitignore(const char *path);
|
||||||
|
int is_hfs_dotgitattributes(const char *path);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ALIGN_LEFT,
|
ALIGN_LEFT,
|
||||||
|
Loading…
Reference in New Issue
Block a user