Unverified Commit 44788c96 by Edward Thomson Committed by GitHub

Merge pull request #4662 from pks-t/pks/gitfile-api

path: unify `git_path_is_*` APIs
parents bc0f3227 92159bd4
...@@ -1766,14 +1766,14 @@ static bool verify_component( ...@@ -1766,14 +1766,14 @@ static bool verify_component(
if (flags & GIT_PATH_REJECT_DOT_GIT_HFS) { if (flags & GIT_PATH_REJECT_DOT_GIT_HFS) {
if (!verify_dotgit_hfs(component, len)) if (!verify_dotgit_hfs(component, len))
return false; return false;
if (S_ISLNK(mode) && git_path_is_hfs_dotgit_modules(component, len)) if (S_ISLNK(mode) && git_path_is_gitfile(component, len, GIT_PATH_GITFILE_GITMODULES, GIT_PATH_FS_HFS))
return false; return false;
} }
if (flags & GIT_PATH_REJECT_DOT_GIT_NTFS) { if (flags & GIT_PATH_REJECT_DOT_GIT_NTFS) {
if (!verify_dotgit_ntfs(repo, component, len)) if (!verify_dotgit_ntfs(repo, component, len))
return false; return false;
if (S_ISLNK(mode) && git_path_is_ntfs_dotgit_modules(component, len)) if (S_ISLNK(mode) && git_path_is_gitfile(component, len, GIT_PATH_GITFILE_GITMODULES, GIT_PATH_FS_NTFS))
return false; return false;
} }
...@@ -1872,64 +1872,40 @@ int git_path_normalize_slashes(git_buf *out, const char *path) ...@@ -1872,64 +1872,40 @@ int git_path_normalize_slashes(git_buf *out, const char *path)
return 0; return 0;
} }
static int verify_dotgit_generic(const char *name, size_t len, const char *dotgit_name, size_t dotgit_len, const char *shortname_pfix) static const struct {
{ const char *file;
if (!verify_dotgit_ntfs_generic(name, len, dotgit_name, dotgit_len, shortname_pfix)) const char *hash;
return false; size_t filelen;
} gitfiles[] = {
return verify_dotgit_hfs_generic(name, len, dotgit_name, dotgit_len); { "gitignore", "gi250a", CONST_STRLEN("gitignore") },
} { "gitmodules", "gi7eba", CONST_STRLEN("gitmodules") },
{ "gitattributes", "gi7d29", CONST_STRLEN("gitattributes") }
int git_path_is_ntfs_dotgit_modules(const char *name, size_t len) };
{
return !verify_dotgit_ntfs_generic(name, len, "gitmodules", CONST_STRLEN("gitmodules"), "gi7eba");
}
int git_path_is_hfs_dotgit_modules(const char *name, size_t len)
{
return !verify_dotgit_hfs_generic(name, len, "gitmodules", CONST_STRLEN("gitmodules"));
}
int git_path_is_dotgit_modules(const char *name, size_t len)
{
if (git_path_is_hfs_dotgit_modules(name, len))
return 1;
return git_path_is_ntfs_dotgit_modules(name, len);
}
int git_path_is_ntfs_dotgit_ignore(const char *name, size_t len)
{
return !verify_dotgit_ntfs_generic(name, len, "gitignore", CONST_STRLEN("gitignore"), "gi250a");
}
int git_path_is_hfs_dotgit_ignore(const char *name, size_t len) extern int git_path_is_gitfile(const char *path, size_t pathlen, git_path_gitfile gitfile, git_path_fs fs)
{ {
return !verify_dotgit_hfs_generic(name, len, "gitignore", CONST_STRLEN("gitignore")); const char *file, *hash;
} size_t filelen;
int git_path_is_dotgit_ignore(const char *name, size_t len)
{
if (git_path_is_hfs_dotgit_ignore(name, len))
return 1;
return git_path_is_ntfs_dotgit_ignore(name, len);
}
int git_path_is_hfs_dotgit_attributes(const char *name, size_t len) if (gitfile < 0 && gitfile >= ARRAY_SIZE(gitfiles)) {
{ giterr_set(GITERR_OS, "invalid gitfile for path validation");
return !verify_dotgit_hfs_generic(name, len, "gitattributes", CONST_STRLEN("gitattributes")); return -1;
} }
int git_path_is_ntfs_dotgit_attributes(const char *name, size_t len)
{
return !verify_dotgit_ntfs_generic(name, len, "gitattributes", CONST_STRLEN("gitattributes"), "gi7d29");
}
int git_path_is_dotgit_attributes(const char *name, size_t len)
{
if (git_path_is_hfs_dotgit_attributes(name, len))
return 1;
return git_path_is_ntfs_dotgit_attributes(name, len); file = gitfiles[gitfile].file;
filelen = gitfiles[gitfile].filelen;
hash = gitfiles[gitfile].hash;
switch (fs) {
case GIT_PATH_FS_GENERIC:
return !verify_dotgit_ntfs_generic(path, pathlen, file, filelen, hash) ||
!verify_dotgit_hfs_generic(path, pathlen, file, filelen);
case GIT_PATH_FS_NTFS:
return !verify_dotgit_ntfs_generic(path, pathlen, file, filelen, hash);
case GIT_PATH_FS_HFS:
return !verify_dotgit_hfs_generic(path, pathlen, file, filelen);
default:
giterr_set(GITERR_OS, "invalid filesystem for path validation");
return -1;
}
} }
...@@ -645,76 +645,42 @@ extern bool git_path_isvalid( ...@@ -645,76 +645,42 @@ extern bool git_path_isvalid(
*/ */
int git_path_normalize_slashes(git_buf *out, const char *path); int git_path_normalize_slashes(git_buf *out, const char *path);
/** /*
* Check whether a path component corresponds to a .gitmodules file * The order needs to stay the same to not break the `gitfiles`
* * array in path.c
* @param name the path component to check */
* @param len the length of `name` typedef enum {
*/ GIT_PATH_GITFILE_GITIGNORE,
extern int git_path_is_dotgit_modules(const char *name, size_t len); GIT_PATH_GITFILE_GITMODULES,
GIT_PATH_GITFILE_GITATTRIBUTES
/** } git_path_gitfile;
* Check whether a path component corresponds to a .gitmodules file in NTFS
* typedef enum {
* @param name the path component to check /* Do both NTFS- and HFS-specific checks */
* @param len the length of `name` GIT_PATH_FS_GENERIC,
*/ /* Do NTFS-specific checks only */
extern int git_path_is_ntfs_dotgit_modules(const char *name, size_t len); GIT_PATH_FS_NTFS,
/* Do HFS-specific checks only */
/** GIT_PATH_FS_HFS
* Check whether a path component corresponds to a .gitmodules file in HFS+ } git_path_fs;
*
* @param name the path component to check /**
* @param len the length of `name` * Check whether a path component corresponds to a .git$SUFFIX
*/ * file.
extern int git_path_is_hfs_dotgit_modules(const char *name, size_t len); *
* As some filesystems do special things to filenames when
/** * writing files to disk, you cannot always do a plain string
* Check whether a path component corresponds to a .gitignore file * comparison to verify whether a file name matches an expected
* * path or not. This function can do the comparison for you,
* @param name the path component to check * depending on the filesystem you're on.
* @param len the length of `name` *
*/ * @param path the path component to check
extern int git_path_is_dotgit_ignore(const char *name, size_t len); * @param pathlen the length of `path` that is to be checked
* @param gitfile which file to check against
/** * @param fs which filesystem-specific checks to use
* Check whether a path component corresponds to a .gitignore file in NTFS * @return 0 in case the file does not match, a positive value if
* * it does; -1 in case of an error
* @param name the path component to check */
* @param len the length of `name` extern int git_path_is_gitfile(const char *path, size_t pathlen, git_path_gitfile gitfile, git_path_fs fs);
*/
extern int git_path_is_ntfs_dotgit_ignore(const char *name, size_t len);
/**
* Check whether a path component corresponds to a .gitignore file in HFS+
*
* @param name the path component to check
* @param len the length of `name`
*/
extern int git_path_is_hfs_dotgit_ignore(const char *name, size_t len);
/**
* Check whether a path component corresponds to a .gitignore file
*
* @param name the path component to check
* @param len the length of `name`
*/
extern int git_path_is_dotgit_attributes(const char *name, size_t len);
/**
* Check whether a path component corresponds to a .gitattributes file in NTFS
*
* @param name the path component to check
* @param len the length of `name`
*/
extern int git_path_is_ntfs_dotgit_attributes(const char *name, size_t len);
/**
* Check whether a path component corresponds to a .gitattributes file in HFS+
*
* @param name the path component to check
* @param len the length of `name`
*/
extern int git_path_is_hfs_dotgit_attributes(const char *name, size_t len);
#endif #endif
...@@ -94,21 +94,21 @@ static char *gitmodules_not_altnames[] = { ...@@ -94,21 +94,21 @@ static char *gitmodules_not_altnames[] = {
void test_path_dotgit__dotgit_modules(void) void test_path_dotgit__dotgit_modules(void)
{ {
size_t i; size_t i;
cl_assert_equal_i(1, git_path_is_dotgit_modules(".gitmodules", strlen(".gitmodules")));
cl_assert_equal_i(1, git_path_is_dotgit_modules(".git\xe2\x80\x8cmodules", strlen(".git\xe2\x80\x8cmodules"))); cl_assert_equal_i(1, git_path_is_gitfile(".gitmodules", strlen(".gitmodules"), GIT_PATH_GITFILE_GITMODULES, GIT_PATH_FS_GENERIC));
cl_assert_equal_i(1, git_path_is_gitfile(".git\xe2\x80\x8cmodules", strlen(".git\xe2\x80\x8cmodules"), GIT_PATH_GITFILE_GITMODULES, GIT_PATH_FS_GENERIC));
for (i = 0; i < ARRAY_SIZE(gitmodules_altnames); i++) { for (i = 0; i < ARRAY_SIZE(gitmodules_altnames); i++) {
const char *name = gitmodules_altnames[i]; const char *name = gitmodules_altnames[i];
if (!git_path_is_dotgit_modules(name, strlen(name))) if (!git_path_is_gitfile(name, strlen(name), GIT_PATH_GITFILE_GITMODULES, GIT_PATH_FS_GENERIC))
cl_fail(name); cl_fail(name);
} }
for (i = 0; i < ARRAY_SIZE(gitmodules_not_altnames); i++) { for (i = 0; i < ARRAY_SIZE(gitmodules_not_altnames); i++) {
const char *name = gitmodules_not_altnames[i]; const char *name = gitmodules_not_altnames[i];
if (git_path_is_dotgit_modules(name, strlen(name))) if (git_path_is_gitfile(name, strlen(name), GIT_PATH_GITFILE_GITMODULES, GIT_PATH_FS_GENERIC))
cl_fail(name); cl_fail(name);
} }
} }
void test_path_dotgit__dotgit_modules_symlink(void) void test_path_dotgit__dotgit_modules_symlink(void)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment