зеркало из https://github.com/microsoft/git.git
dir: check pathspecs before returning `path_excluded`
In 95c11ecc73
("Fix error-prone fill_directory() API; make it only
return matches", 2020-04-01), we taught `fill_directory()`, or more
specifically `treat_path()`, to check against any pathspecs so that we
could simplify the callers.
But in doing so, we added a slightly-too-early return for the "excluded"
case. We end up not checking the pathspecs, meaning we return
`path_excluded` when maybe we should return `path_none`. As a result,
`git status --ignored -- pathspec` might show paths that don't actually
match "pathspec".
Move the "excluded" check down to after we've checked any pathspecs.
Reported-by: Andreas Schwab <schwab@linux-m68k.org>
Reviewed-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
c0af173a13
Коммит
cada7308ad
4
dir.c
4
dir.c
|
@ -2117,13 +2117,13 @@ static enum path_treatment treat_path(struct dir_struct *dir,
|
|||
baselen, excluded, pathspec);
|
||||
case DT_REG:
|
||||
case DT_LNK:
|
||||
if (excluded)
|
||||
return path_excluded;
|
||||
if (pathspec &&
|
||||
!do_match_pathspec(istate, pathspec, path->buf, path->len,
|
||||
0 /* prefix */, NULL /* seen */,
|
||||
0 /* flags */))
|
||||
return path_none;
|
||||
if (excluded)
|
||||
return path_excluded;
|
||||
return path_untracked;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,6 +30,31 @@ test_expect_success 'same with gitignore starting with BOM' '
|
|||
test_cmp expected actual
|
||||
'
|
||||
|
||||
test_expect_success 'status untracked files --ignored with pathspec (no match)' '
|
||||
git status --porcelain --ignored -- untracked/i >actual &&
|
||||
test_must_be_empty actual &&
|
||||
git status --porcelain --ignored -- untracked/u >actual &&
|
||||
test_must_be_empty actual
|
||||
'
|
||||
|
||||
test_expect_success 'status untracked files --ignored with pathspec (literal match)' '
|
||||
git status --porcelain --ignored -- untracked/ignored >actual &&
|
||||
echo "!! untracked/ignored" >expected &&
|
||||
test_cmp expected actual &&
|
||||
git status --porcelain --ignored -- untracked/uncommitted >actual &&
|
||||
echo "?? untracked/uncommitted" >expected &&
|
||||
test_cmp expected actual
|
||||
'
|
||||
|
||||
test_expect_success 'status untracked files --ignored with pathspec (glob match)' '
|
||||
git status --porcelain --ignored -- untracked/i\* >actual &&
|
||||
echo "!! untracked/ignored" >expected &&
|
||||
test_cmp expected actual &&
|
||||
git status --porcelain --ignored -- untracked/u\* >actual &&
|
||||
echo "?? untracked/uncommitted" >expected &&
|
||||
test_cmp expected actual
|
||||
'
|
||||
|
||||
cat >expected <<\EOF
|
||||
?? .gitignore
|
||||
?? actual
|
||||
|
|
Загрузка…
Ссылка в новой задаче