On Mon, Sep 19, 2016 at 4:21 PM, Junio C Hamano <gitster@xxxxxxxxx> wrote: > > 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? > >> + /* >> + * 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 :) >> + >> + 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.