On Sun, May 27, 2012 at 1:51 PM, Junio C Hamano <gitster@xxxxxxxxx> wrote: > Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> writes: > >> this also avoids calling fnmatch() if the non-wildcard prefix is >> longer than basename >> >> Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> >> --- > > I have been wondering if you can take a different approach based on the > same observation this patch is based on. If you see an entry /foo/bar/*.c > in the top-level .gitignore, perhaps you can set it aside in a different > part of "struct exclude" for the top-level directory (because the pattern > will never match outside foo/bar directory), so that it is not even used > for matching, and only when you descend to foo/bar directory, add "/*.c" > to the "struct exclude" you create for that directory. that part is "base" field in "struct exclude", I believe. > That way, instead of "strcmp is faster than fnmatch, but we always compare > all elements in the huge pattern list given at the toplevel", you would be > doing "we do not even bother to compare with the elements we know do not > matter", which would be far more efficient, no? You still have to do at least one strncmp on "base" though to know if a pattern is applicable to the given directory. So it's not really cheaper than what is done in 3/3. -- Duy -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html