Re: [PATCH v2] ls-files: add pathspec matching for submodules
- From
- Brandon Williams <bmwill@google.com>
- Date
- Sep 20, 2016, 16:30 UTC
- Message-ID
- <CAKoko1oU+QR61Vy0eSxaRe_w8u4q_bC9gx9H7oMqH=CwNzBVCA@mail.gmail.com>
- In-Reply-To
- <xmqqh99bcw6m.fsf@gitster.mtv.corp.google.com>
On Mon, Sep 19, 2016 at 4:21 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 10 quoted lines
> > As the previous one that used a wrong (sorry) argument is not even > in 'next' yet, let's pretend that it never happened. It is OK to > still keep it and this patch as two separate steps, i.e. a topic > with two patches in it. > > That means that this patch will become 2/2 of a series, and 1/2 is > rerolled to use submodule_prefix from the get-go, without ever > introducing output_path_prefix variable, so that many of the above > lines we won't have to review in 2/2.
Ah ok. Would you like me to resend the first patch with the desired change then?
Show 17 quoted lines
> >> + /* >> + * Pass in the original pathspec args. The submodule will be >> + * responsible for prepending the 'submodule_prefix' prior to comparing >> + * against the pathspec for matches. >> + */ > > Good. > >> + argv_array_push(&cp.args, "--"); >> + for (i = 0; i < pathspec.nr; ++i) >> + argv_array_push(&cp.args, pathspec.items[i].original); >> + > > Please prefer post-increment i++ over pre-increment ++i when writing > a for(;;) loop, unless there is a strong reason not to (familiarlity > in C++ is not a good reason).
I had a compiler instructor drill into my head that ++i in a for loop was faster historically since it wouldn't have to create a temporary value. Of course now a days there probably isn't much (or any) difference between the two. If post-fix operators are the norm in git code then I can try to remember to use them :)
Show 26 quoted lines
>> +
>> + if (item->flags & PATHSPEC_ONESTAR) {
>> + return WM_MATCH;
>> + } else if (item->magic & PATHSPEC_GLOB) {
>> + return wildmatch(pattern, string,
>> + WM_PATHNAME |
>> + (item->magic & PATHSPEC_ICASE ?
>> + WM_CASEFOLD : 0),
>> + NULL);
>
> Isn't this last one overly tight? I am wondering about a scenario
> where you have a submodule at "sub/" in the superproject, and "sub/"
> has a "file" at the top of its working tree. And you do:
>
> git ls-files --recurse-submodules ':(glob)??b/fi?e'
>
> at the top of the superproject. The "pattern" would be '??b/fi?e"
> while string would be 'sub', and wildmatch() would not like it, but
> there is no way for this caller to append anything to 'sub' before
> making this call, as it hasn't looked into what paths appear in the
> submodule repository (and it should not want to). And I think we
> would want it to recurse to find sub/file. IOW, this looks like a
> false negative we must avoid in this function. As we cannot afford
> to check if anything that matches 'fi?e' is in the index file of the
> submodule repository, we shouldn't try to match 'fi?e' portion of
> the given pathspec pattern.good point. Let me think about this some more.