On Wed, Jan 13, 2021 at 06:07:56PM -0800, Junio C Hamano wrote:
The rule IIUC is that a path must match one of the positive pathspec
and none of the negative pathspec, but it looks as if there is some
bogus optimization based on string length.
I dug a little on this earlier this morning, but didn't get far enough
to have any confidence that I wasn't barking totally up the wrong tree.
But I found the way the "prefix" is passed match_pathspec to be
confusing. This seems to make the problem go away:
diff --git a/builtin/ls-files.c b/builtin/ls-files.c
index c8eae899b8..93796404bd 100644
--- a/builtin/ls-files.c
+++ b/builtin/ls-files.c
@@ -232,7 +232,7 @@ static void show_ce(struct repository *repo, struct dir_struct *dir,
is_submodule_active(repo, ce->name)) {
show_submodule(repo, dir, ce->name);
} else if (match_pathspec(repo->index, &pathspec, fullname, strlen(fullname),
- max_prefix_len, ps_matched,
+ 0, ps_matched,
S_ISDIR(ce->ce_mode) ||
S_ISGITLINK(ce->ce_mode))) {
tag = get_tag(ce, tag);
which I guess is likewise disabling the same optimization you're talking
about. But that probably means the bug is in match_pathspec().
(I probably won't look further at this for a while, so please continue
your prodding; I just wanted to drop what little knowledge I came up
with).
-Peff