git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 10/21] tree_entry_interesting(): fix depth limit with overlapping pathspecs

From
Nguyen Thai Ngoc Duy <pclouds@gmail.com>
Date
Dec 18, 2010, 03:37 UTC
Message-ID
<AANLkTik+DaUrh99qs4T-Pm_+3Oq499L_NtP6Xcht1wfH@mail.gmail.com>
In-Reply-To
<7vmxo5l2g4.fsf@alter.siamese.dyndns.org>
2010/12/17 Junio C Hamano <gitster@pobox.com>:
Show 20 quoted lines
> One possible definition of interaction between limit and wildcard may be
> to count the number of slashes in the part of the path that matches the
> wildcarded part of the pathspec, add the number of path components
> appended due to the leading directory match, and then subtract the number
> of literal slashes in the wildcarded part of the pattern from the above,
> and declare that a match is found if the difference is less than the
> limit.
>
> E.g. a pathspec element "a/*/x" would match "a/b/c/x", "a/b/c/d/e/x",
> "a/b/x/y" and "a/b/x/y/z" without limit, and with the limit of 1:
>
>    a/b/c/x        matches ('*' expands to "b/c")
>    a/b/c/d/e/x    no ('*' has to expand to "c/d/e" and needs 2 levels)
>    a/b/x/y        matches ('*' expands to "b" costing zero, "/y" needs 1)
>    a/b/x/y/z      does not match
>
> Another definition could be to count _only_ the part that is appended by
> recursion (i.e. we do not count how many slashes has to match '*' in the
> above examples), and as the option is called --depth, it might make more
> sense.

So with the above example, "a/" won't be counted. Depth limit of 0 or 1 will result in no matches. Depth limit of 2 will result in a/b/c/x and a/b/x/y, correct?

I prefer this definition to the former. It sounds simpler to understand and use, also less computation. But I can implement both :-) We can mark what matching strategy we would use in struct pathspec. Hmm.. I'm not much help in figuring out which one makes more sense.

Another thing, I don't know if anybody would need it. Should we support depth limit per pathspec, so "a/*/x" can have depth limit of 2, but "*.c" has depth limit of 1..For one thing, his may help keeping current's git-grep depth limit behavior if depth limit can also be applied to wildcard pathspecs by setting depth limit for wildcard pathspecs to -1. Exposing depth limit per pathspec to users is another matter.

> In either case, I am not sure if "if it matches the longest pathspec, we
> have the answer without looking at shorter ones" would be a good rule to
> use.

As long as the rule of matching is "if any of these pathspecs is matched, we have a match", then pathspec order should not matter (without depth limit). Matching decision of one pathspec does not affect the others. Depth limit is the first one breaking the last sentence. And because pathspec order does not matter before depth limit introduction, it should not cause any regression when depth limit requires pathspecs in certain order. That's how I thought when I decided to sort pathspecs.

Wildcard pathspecs are handled in a completely different path (even with depth limit in either way you described). Overlapping is no issue to wildcard pathspecs, we always need full pathspec to call fnmatch() (unless you implied some early cut optmization that I don't see). Therefore pathspec order is no issue.

Even when I introduce negative pathspec, it would be actually negative prefix and go the same route as current depth limit impl (it also has the same overlapping pathspec issue). Negative wildcard pathspecs would blow my mind.

-- 
Duy
Previous: Junio C HamanoNext: Nguyễn Thái Ngọc Duy
Message 18 of 44 in “nd/struct-pathspec v2”
  1. 00/21 nd/struct-pathspec v2Nguyễn Thái Ngọc Duy, Dec 15, 2010
  2. 01/21 Add struct pathspecNguyễn Thái Ngọc Duy, Dec 15, 2010
  3. 02/21 diff-no-index: use diff_tree_setup_paths()Nguyễn Thái Ngọc Duy, Dec 15, 2010
  4. 03/21 Convert struct diff_options to use struct pathspecNguyễn Thái Ngọc Duy, Dec 15, 2010
  5. 04/21 tree_entry_interesting(): remove dependency on struct diff_optionsNguyễn Thái Ngọc Duy, Dec 15, 2010
  6. 05/21 Move tree_entry_interesting() to tree-walk.c and export itNguyễn Thái Ngọc Duy, Dec 15, 2010
  7. 06/21 glossary: define pathspecNguyễn Thái Ngọc Duy, Dec 15, 2010
  8. 07/21 diff-tree: convert base+baselen to writable strbufNguyễn Thái Ngọc Duy, Dec 15, 2010
  9. 08/21 tree_entry_interesting(): refactor into separate smaller functionsNguyễn Thái Ngọc Duy, Dec 15, 2010
  10. 09/21 tree_entry_interesting(): support depth limitNguyễn Thái Ngọc Duy, Dec 15, 2010
  11. Junio C HamanoJan 28, 2011
  12. Nguyen Thai Ngoc DuyJan 29, 2011
  13. tree_entry_interesting(): with no pathspecs, everything will matchJunio C Hamano, Jan 31, 2011
  14. 10/21 tree_entry_interesting(): fix depth limit with overlapping pathspecsNguyễn Thái Ngọc Duy, Dec 15, 2010
  15. Junio C HamanoDec 16, 2010
  16. Nguyen Thai Ngoc DuyDec 17, 2010
  17. Junio C HamanoDec 17, 2010
  18. Nguyen Thai Ngoc DuyDec 18, 2010
  19. 11/21 tree_entry_interesting(): support wildcard matchingNguyễn Thái Ngọc Duy, Dec 15, 2010
  20. diff-tree doc: correct & remove wrong documentationÆvar Arnfjörð Bjarmason, Feb 4, 2019
  21. Duy NguyenFeb 4, 2019
  22. Junio C HamanoFeb 4, 2019
  23. Ævar Arnfjörð BjarmasonFeb 4, 2019
  24. 12/21 tree_entry_interesting(): optimize wildcard matching when base is matchedNguyễn Thái Ngọc Duy, Dec 15, 2010
  25. 13/21 pathspec: add match_pathspec_depth()Nguyễn Thái Ngọc Duy, Dec 15, 2010
  26. 14/21 Convert ce_path_match() to use struct pathspecNguyễn Thái Ngọc Duy, Dec 15, 2010
  27. Junio C HamanoDec 17, 2010
  28. Nguyen Thai Ngoc DuyDec 17, 2010
  29. 14/21 struct rev_info: convert prune_data to struct pathspecNguyễn Thái Ngọc Duy, Dec 17, 2010
  30. 15/21 Convert ce_path_match() to use struct pathspecNguyễn Thái Ngọc Duy, Dec 17, 2010
  31. Junio C HamanoDec 17, 2010
  32. Nguyen Thai Ngoc DuyDec 17, 2010
  33. Junio C HamanoDec 17, 2010
  34. 15/21 Convert ce_path_match() to use match_pathspec_depth()Nguyễn Thái Ngọc Duy, Dec 15, 2010
  35. 16/21 grep: convert to use struct pathspecNguyễn Thái Ngọc Duy, Dec 15, 2010
  36. 17/21 grep: use match_pathspec_depth() for cache/worktree greppingNguyễn Thái Ngọc Duy, Dec 15, 2010
  37. 18/21 strbuf: allow "buf" to point to the middle of the allocated bufferNguyễn Thái Ngọc Duy, Dec 15, 2010
  38. 19/21 grep: use writable strbuf from caller in grep_tree()Nguyễn Thái Ngọc Duy, Dec 15, 2010
  39. Junio C HamanoDec 17, 2010
  40. Nguyen Thai Ngoc DuyDec 17, 2010
  41. 19/21 grep: use writable strbuf from caller for grep_tree()Nguyễn Thái Ngọc Duy, Dec 17, 2010
  42. 20/21 grep: drop pathspec_matches() in favor of tree_entry_interesting()Nguyễn Thái Ngọc Duy, Dec 15, 2010
  43. 20/21 grep: drop pathspec_matches() in favor of tree_entry_interesting()Nguyễn Thái Ngọc Duy, Dec 17, 2010
  44. 21/21 t7810: overlapping pathspecs and depth limitNguyễn Thái Ngọc Duy, Dec 15, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.