git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Nguyen Thai Ngoc Duy <pclouds@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 10/21] tree_entry_interesting(): fix depth limit with overlapping pathspecs
Date: Sat, 18 Dec 2010 10:37:28 +0700	[thread overview]
Message-ID: <AANLkTik+DaUrh99qs4T-Pm_+3Oq499L_NtP6Xcht1wfH@mail.gmail.com> (raw)
In-Reply-To: <7vmxo5l2g4.fsf@alter.siamese.dyndns.org>

2010/12/17 Junio C Hamano <gitster@pobox.com>:
> 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

  parent reply	other threads:[~2010-12-18  3:41 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-15 15:02 [PATCH 00/21] nd/struct-pathspec v2 Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 01/21] Add struct pathspec Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 02/21] diff-no-index: use diff_tree_setup_paths() Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 03/21] Convert struct diff_options to use struct pathspec Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 04/21] tree_entry_interesting(): remove dependency on struct diff_options Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 05/21] Move tree_entry_interesting() to tree-walk.c and export it Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 06/21] glossary: define pathspec Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 07/21] diff-tree: convert base+baselen to writable strbuf Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 08/21] tree_entry_interesting(): refactor into separate smaller functions Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 09/21] tree_entry_interesting(): support depth limit Nguyễn Thái Ngọc Duy
2011-01-28 20:40   ` Junio C Hamano
2011-01-29  3:13     ` Nguyen Thai Ngoc Duy
2011-01-31 20:21       ` [PATCH] tree_entry_interesting(): with no pathspecs, everything will match Junio C Hamano
2010-12-15 15:02 ` [PATCH 10/21] tree_entry_interesting(): fix depth limit with overlapping pathspecs Nguyễn Thái Ngọc Duy
2010-12-16 23:31   ` Junio C Hamano
2010-12-17 10:05     ` Nguyen Thai Ngoc Duy
2010-12-17 20:02       ` Junio C Hamano
2010-12-18  3:37     ` Nguyen Thai Ngoc Duy [this message]
2010-12-15 15:02 ` [PATCH 11/21] tree_entry_interesting(): support wildcard matching Nguyễn Thái Ngọc Duy
2019-02-04 10:36   ` [PATCH] diff-tree doc: correct & remove wrong documentation Ævar Arnfjörð Bjarmason
2019-02-04 10:42     ` Duy Nguyen
2019-02-04 21:10     ` Junio C Hamano
2019-02-04 21:49       ` Ævar Arnfjörð Bjarmason
2010-12-15 15:02 ` [PATCH 12/21] tree_entry_interesting(): optimize wildcard matching when base is matched Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 13/21] pathspec: add match_pathspec_depth() Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 14/21] Convert ce_path_match() to use struct pathspec Nguyễn Thái Ngọc Duy
2010-12-17  0:02   ` Junio C Hamano
2010-12-17  9:59     ` Nguyen Thai Ngoc Duy
2010-12-17 12:43       ` [PATCH 14/21] struct rev_info: convert prune_data to " Nguyễn Thái Ngọc Duy
2010-12-17 12:43         ` [PATCH 15/21] Convert ce_path_match() to use " Nguyễn Thái Ngọc Duy
2010-12-17 15:09       ` [PATCH 14/21] " Junio C Hamano
2010-12-17 15:11         ` Nguyen Thai Ngoc Duy
2010-12-17 20:29           ` Junio C Hamano
2010-12-15 15:02 ` [PATCH 15/21] Convert ce_path_match() to use match_pathspec_depth() Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 16/21] grep: convert to use struct pathspec Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 17/21] grep: use match_pathspec_depth() for cache/worktree grepping Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 18/21] strbuf: allow "buf" to point to the middle of the allocated buffer Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 19/21] grep: use writable strbuf from caller in grep_tree() Nguyễn Thái Ngọc Duy
2010-12-17  0:15   ` Junio C Hamano
2010-12-17  9:56     ` Nguyen Thai Ngoc Duy
2010-12-17 12:44       ` [PATCH 19/21] grep: use writable strbuf from caller for grep_tree() Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 20/21] grep: drop pathspec_matches() in favor of tree_entry_interesting() Nguyễn Thái Ngọc Duy
2010-12-17 12:45   ` Nguyễn Thái Ngọc Duy
2010-12-15 15:02 ` [PATCH 21/21] t7810: overlapping pathspecs and depth limit Nguyễn Thái Ngọc Duy

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AANLkTik+DaUrh99qs4T-Pm_+3Oq499L_NtP6Xcht1wfH@mail.gmail.com \
    --to=pclouds@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).