mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-30 08:12:42 +00:00
Fix ignore difference from git with trailing /*
Ignore patterns that ended with a trailing '/*' were still needing to match against another actual '/' character in the full path. This is not the same behavior as core Git. Instead, we strip a trailing '/*' off of any patterns that were matching and just take it to imply the FNM_LEADING_DIR behavior.
This commit is contained in:
parent
e3a2a04cef
commit
916fcbd617
@ -353,6 +353,8 @@ bool git_attr_fnmatch__match(
|
|||||||
|
|
||||||
if (match->flags & GIT_ATTR_FNMATCH_ICASE)
|
if (match->flags & GIT_ATTR_FNMATCH_ICASE)
|
||||||
flags |= FNM_CASEFOLD;
|
flags |= FNM_CASEFOLD;
|
||||||
|
if (match->flags & GIT_ATTR_FNMATCH_LEADINGDIR)
|
||||||
|
flags |= FNM_LEADING_DIR;
|
||||||
|
|
||||||
if (match->flags & GIT_ATTR_FNMATCH_FULLPATH) {
|
if (match->flags & GIT_ATTR_FNMATCH_FULLPATH) {
|
||||||
filename = path->path;
|
filename = path->path;
|
||||||
@ -543,6 +545,13 @@ int git_attr_fnmatch__parse(
|
|||||||
if (--slash_count <= 0)
|
if (--slash_count <= 0)
|
||||||
spec->flags = spec->flags & ~GIT_ATTR_FNMATCH_FULLPATH;
|
spec->flags = spec->flags & ~GIT_ATTR_FNMATCH_FULLPATH;
|
||||||
}
|
}
|
||||||
|
if (spec->length >= 2 &&
|
||||||
|
pattern[spec->length - 1] == '*' &&
|
||||||
|
pattern[spec->length - 2] == '/') {
|
||||||
|
spec->length -= 2;
|
||||||
|
spec->flags = spec->flags | GIT_ATTR_FNMATCH_LEADINGDIR;
|
||||||
|
/* leave FULLPATH match on, however */
|
||||||
|
}
|
||||||
|
|
||||||
if ((spec->flags & GIT_ATTR_FNMATCH_FULLPATH) != 0 &&
|
if ((spec->flags & GIT_ATTR_FNMATCH_FULLPATH) != 0 &&
|
||||||
context != NULL && git_path_root(pattern) < 0)
|
context != NULL && git_path_root(pattern) < 0)
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#define GIT_ATTR_FNMATCH_MATCH_ALL (1U << 8)
|
#define GIT_ATTR_FNMATCH_MATCH_ALL (1U << 8)
|
||||||
#define GIT_ATTR_FNMATCH_ALLOWNEG (1U << 9)
|
#define GIT_ATTR_FNMATCH_ALLOWNEG (1U << 9)
|
||||||
#define GIT_ATTR_FNMATCH_ALLOWMACRO (1U << 10)
|
#define GIT_ATTR_FNMATCH_ALLOWMACRO (1U << 10)
|
||||||
|
#define GIT_ATTR_FNMATCH_LEADINGDIR (1U << 11)
|
||||||
|
|
||||||
#define GIT_ATTR_FNMATCH__INCOMING \
|
#define GIT_ATTR_FNMATCH__INCOMING \
|
||||||
(GIT_ATTR_FNMATCH_ALLOWSPACE | \
|
(GIT_ATTR_FNMATCH_ALLOWSPACE | \
|
||||||
|
@ -456,6 +456,24 @@ void test_status_ignore__contained_dir_with_matching_name(void)
|
|||||||
cl_assert_equal_i(0, counts.wrong_sorted_path);
|
cl_assert_equal_i(0, counts.wrong_sorted_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_status_ignore__trailing_slash_star(void)
|
||||||
|
{
|
||||||
|
static const char *test_files[] = {
|
||||||
|
"empty_standard_repo/file",
|
||||||
|
"empty_standard_repo/subdir/file",
|
||||||
|
"empty_standard_repo/subdir/sub2/sub3/file",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
make_test_data("empty_standard_repo", test_files);
|
||||||
|
cl_git_mkfile(
|
||||||
|
"empty_standard_repo/subdir/.gitignore", "/**/*\n");
|
||||||
|
|
||||||
|
refute_is_ignored("file");
|
||||||
|
assert_is_ignored("subdir/sub2/sub3/file");
|
||||||
|
assert_is_ignored("subdir/file");
|
||||||
|
}
|
||||||
|
|
||||||
void test_status_ignore__adding_internal_ignores(void)
|
void test_status_ignore__adding_internal_ignores(void)
|
||||||
{
|
{
|
||||||
g_repo = cl_git_sandbox_init("empty_standard_repo");
|
g_repo = cl_git_sandbox_init("empty_standard_repo");
|
||||||
|
Loading…
Reference in New Issue
Block a user