Brandon Williams [off-list ref] writes:
quoted
OK, so as discussed previously with Heiko and Stefan, the idea is to
- pass the original pathspec as-is,
- when --submodule-prefix is given, a path discovered in a
submodule repository is first prefixed with that string before
getting checked to see if it matches the original pathspec.
And this loop is about relaying the original pathspec.
Exactly. Perhaps I should have made this more clear either with a
detailed comment or
more information in the commit msg.
I think you were clear enough.
Don't read everything other people say in their reviews as pointing
out issues. Often trying to rephrase what they read in the code in
their own words is a good way to make sure the reviewers and the
original author are on the same page. The above was one of these
cases.
quoted
quoted
+ if (prefix > 0) {
+ if (ps_strncmp(item, pattern, string, prefix))
+ return WM_NOMATCH;
This says: when we have a set prefix that must literally match, and
that part does not match what we have, it cannot possibly match.
Is that correct? What do we have in "name" and "item" at this
point? We disable the common-prefix optimization, so we do not have
to worry about a pathspec with two elements "sub/dir1/*" and "sub/dir2/*"
giving you "sub/dir" as the common prefix, when you are wondering if
it is worth descending into "sub/" without knowing what it contains.
Is that what guarantees why this part is correct?
I adopted this structure from another part of the code. The caller
uses a field in
the pathspec item which indicates the location of the first wildcard character.
So the prefix (everything prior to the wildcard char) must match
literally before
we drop into a more expensive wildmatch function.
"Another part of the code" is about tree walking, right? Weren't
you saying that part of the code may be buggy or something earlier
(e.g. pathspec "su?/" vs entry "sub")?
Again, what do we have in "name" and "item" at this point? If we
have a submodule at "sub/" and we are checking a pathspec element
"sub/dir1/*", what is the non-wildcard part of the pathspec and what
is the "string"? Aren't then "sub/dir1/" and "sub/" respectively,
which would not pass ps_strncmp() and produce a (false) negative?
I am starting to have a feeling that the best we can do in this
function safely is to see if prefix (i.e. the constant part of the
pathspec before the first wildcard) is long enough to cover the
"name" and if "name" part does not match to the directory boundary,
e.g. for this combination
pathspec = "a/b/sib/c/*"
name = "a/b/sub/"
we can say with confidence that it is not worth descending into.
When prefix is long enough and "name" and leading part of the prefix
matches to the directory boundary, e.g.
pathspec = "a/b/sub/c/*"
name = "a/b/sub/"
we can say it is worth descending into.
If these two checks cannot decide, we may have to be pessimistic and
say "it may match; we don't know until we descend into it". When
prefix is shorter than name, I am not sure if we can devise a set of
simple rules, e.g.
pathspec = "a/**/c/*"
name = "a/b/sub/"
may match with its ** "b/sub" part and worth descending into, so is
pathspec = "a/b/*/c/*"
name = "a/b/sub/"
but not this one:
pathspec = "a/b/su[c-z]/c/*"
name = "a/b/sub/"
but this is OK:
pathspec = "a/b/su[a-z]/c/*"
name = "a/b/sub/"
So I would think we'd be in the business of counting slashes in the
name (called "string" in this function) and the pathspec, while
noticing '*' and '**' in the latter, and we may be able to be more
precise, but I am not sure how complex the end result would become.
On Mon, Sep 19, 2016 at 10:00 AM, Junio C Hamano [off-list ref] wrote:
I think you were clear enough.
Don't read everything other people say in their reviews as pointing
out issues. Often trying to rephrase what they read in the code in
their own words is a good way to make sure the reviewers and the
original author are on the same page. The above was one of these
cases.
That makes sense, I'll be sure to remember that!
quoted
quoted
quoted
+ if (prefix > 0) {
+ if (ps_strncmp(item, pattern, string, prefix))
+ return WM_NOMATCH;
This says: when we have a set prefix that must literally match, and
that part does not match what we have, it cannot possibly match.
Is that correct? What do we have in "name" and "item" at this
point? We disable the common-prefix optimization, so we do not have
to worry about a pathspec with two elements "sub/dir1/*" and "sub/dir2/*"
giving you "sub/dir" as the common prefix, when you are wondering if
it is worth descending into "sub/" without knowing what it contains.
Is that what guarantees why this part is correct?
I adopted this structure from another part of the code. The caller
uses a field in
the pathspec item which indicates the location of the first wildcard character.
So the prefix (everything prior to the wildcard char) must match
literally before
we drop into a more expensive wildmatch function.
"Another part of the code" is about tree walking, right? Weren't
you saying that part of the code may be buggy or something earlier
(e.g. pathspec "su?/" vs entry "sub")?
I was refering to the logic that is used to do normal pathspec checking:
'match_pathspec' and the functions it calls, in particular
git_fnmatch. And the bug I
pointed out before, I believe is due to how the wildmatch function
works. It requires
that the pattern and the string being compared must match exactly (in
length as well).
The "su?/" case would drop into wildmatch funciton and wouldn't match
against any file
in the directory "sub/file1" for example, because it doesn't exactly
match "su?/". In the
case of "sub" there is logic prior to the wildmatch function call
which would classify it a
match and return before descending into wildmatch.
Again, what do we have in "name" and "item" at this point? If we
have a submodule at "sub/" and we are checking a pathspec element
"sub/dir1/*", what is the non-wildcard part of the pathspec and what
is the "string"? Aren't then "sub/dir1/" and "sub/" respectively,
which would not pass ps_strncmp() and produce a (false) negative?
item will be the pathspec_item struct that we are trying to match against.
name will be the file we are trying to match, which should already have the
'prefix' cut off (this is the prefix that is used as an optimization
in the common
case, which isn't used in the submodule case). The 'prefix' in this function's
context is the part of the pattern prior to the first wildcard character. which
we can do a literal comparison on before descending into the wildmatch function.
I am starting to have a feeling that the best we can do in this
function safely is to see if prefix (i.e. the constant part of the
pathspec before the first wildcard) is long enough to cover the
"name" and if "name" part does not match to the directory boundary,
e.g. for this combination
pathspec = "a/b/sib/c/*"
name = "a/b/sub/"
we can say with confidence that it is not worth descending into.
When prefix is long enough and "name" and leading part of the prefix
matches to the directory boundary, e.g.
pathspec = "a/b/sub/c/*"
name = "a/b/sub/"
we can say it is worth descending into.
If these two checks cannot decide, we may have to be pessimistic and
say "it may match; we don't know until we descend into it". When
prefix is shorter than name, I am not sure if we can devise a set of
simple rules, e.g.
pathspec = "a/**/c/*"
name = "a/b/sub/"
may match with its ** "b/sub" part and worth descending into, so is
pathspec = "a/b/*/c/*"
name = "a/b/sub/"
but not this one:
pathspec = "a/b/su[c-z]/c/*"
name = "a/b/sub/"
but this is OK:
pathspec = "a/b/su[a-z]/c/*"
name = "a/b/sub/"
So I would think we'd be in the business of counting slashes in the
name (called "string" in this function) and the pathspec, while
noticing '*' and '**' in the latter, and we may be able to be more
precise, but I am not sure how complex the end result would become.
I agree, I'm not too sure how much more complex the logic would need
to be to handle
all matters of wildcard characters. We could initially be more
lenient on what qualifies as
a match and then later (or in the near future) revisit the wildmatch
function (which is complex)
and see if we can add better matching capabilities more suited for
submodules while at the
same time fixing that bug discussed above.