Sync with Git 2.13.7
* maint-2.13: Git 2.13.7 verify_path: disallow symlinks in .gitmodules update-index: stat updated files earlier verify_dotfile: mention case-insensitivity in comment verify_path: drop clever fallthrough skip_prefix: add case-insensitive variant is_{hfs,ntfs}_dotgitmodules: add tests is_ntfs_dotgit: match other .git files is_hfs_dotgit: match other .git files is_ntfs_dotgit: use a size_t for traversing string submodule-config: verify submodule names as paths
This commit is contained in:
86
path.c
86
path.c
@ -1304,7 +1304,7 @@ static int only_spaces_and_periods(const char *path, size_t len, size_t skip)
|
||||
|
||||
int is_ntfs_dotgit(const char *name)
|
||||
{
|
||||
int len;
|
||||
size_t len;
|
||||
|
||||
for (len = 0; ; len++)
|
||||
if (!name[len] || name[len] == '\\' || is_dir_sep(name[len])) {
|
||||
@ -1321,6 +1321,90 @@ int is_ntfs_dotgit(const char *name)
|
||||
}
|
||||
}
|
||||
|
||||
static int is_ntfs_dot_generic(const char *name,
|
||||
const char *dotgit_name,
|
||||
size_t len,
|
||||
const char *dotgit_ntfs_shortname_prefix)
|
||||
{
|
||||
int saw_tilde;
|
||||
size_t i;
|
||||
|
||||
if ((name[0] == '.' && !strncasecmp(name + 1, dotgit_name, len))) {
|
||||
i = len + 1;
|
||||
only_spaces_and_periods:
|
||||
for (;;) {
|
||||
char c = name[i++];
|
||||
if (!c)
|
||||
return 1;
|
||||
if (c != ' ' && c != '.')
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Is it a regular NTFS short name, i.e. shortened to 6 characters,
|
||||
* followed by ~1, ... ~4?
|
||||
*/
|
||||
if (!strncasecmp(name, dotgit_name, 6) && name[6] == '~' &&
|
||||
name[7] >= '1' && name[7] <= '4') {
|
||||
i = 8;
|
||||
goto only_spaces_and_periods;
|
||||
}
|
||||
|
||||
/*
|
||||
* Is it a fall-back NTFS short name (for details, see
|
||||
* https://en.wikipedia.org/wiki/8.3_filename?
|
||||
*/
|
||||
for (i = 0, saw_tilde = 0; i < 8; i++)
|
||||
if (name[i] == '\0')
|
||||
return 0;
|
||||
else if (saw_tilde) {
|
||||
if (name[i] < '0' || name[i] > '9')
|
||||
return 0;
|
||||
} else if (name[i] == '~') {
|
||||
if (name[++i] < '1' || name[i] > '9')
|
||||
return 0;
|
||||
saw_tilde = 1;
|
||||
} else if (i >= 6)
|
||||
return 0;
|
||||
else if (name[i] < 0) {
|
||||
/*
|
||||
* We know our needles contain only ASCII, so we clamp
|
||||
* here to make the results of tolower() sane.
|
||||
*/
|
||||
return 0;
|
||||
} else if (tolower(name[i]) != dotgit_ntfs_shortname_prefix[i])
|
||||
return 0;
|
||||
|
||||
goto only_spaces_and_periods;
|
||||
}
|
||||
|
||||
/*
|
||||
* Inline helper to make sure compiler resolves strlen() on literals at
|
||||
* compile time.
|
||||
*/
|
||||
static inline int is_ntfs_dot_str(const char *name, const char *dotgit_name,
|
||||
const char *dotgit_ntfs_shortname_prefix)
|
||||
{
|
||||
return is_ntfs_dot_generic(name, dotgit_name, strlen(dotgit_name),
|
||||
dotgit_ntfs_shortname_prefix);
|
||||
}
|
||||
|
||||
int is_ntfs_dotgitmodules(const char *name)
|
||||
{
|
||||
return is_ntfs_dot_str(name, "gitmodules", "gi7eba");
|
||||
}
|
||||
|
||||
int is_ntfs_dotgitignore(const char *name)
|
||||
{
|
||||
return is_ntfs_dot_str(name, "gitignore", "gi250a");
|
||||
}
|
||||
|
||||
int is_ntfs_dotgitattributes(const char *name)
|
||||
{
|
||||
return is_ntfs_dot_str(name, "gitattributes", "gi7d29");
|
||||
}
|
||||
|
||||
int looks_like_command_line_option(const char *str)
|
||||
{
|
||||
return str && str[0] == '-';
|
||||
|
Reference in New Issue
Block a user