[PATCH 13/19] tree_entry_interesting(): optimize fnmatch when base is matched
- From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
- Date
- Dec 13, 2010, 09:46 UTC
- Message-ID
- <1292233616-27692-14-git-send-email-pclouds@gmail.com>
- In-Reply-To
- <1292233616-27692-1-git-send-email-pclouds@gmail.com>
If base is already matched, skip that part when calling fnmatch(). This happens quite often when users start a command from worktree's subdirectory and prefix is usually prepended to all pathspecs.
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> --- t/t4010-diff-pathspec.sh | 14 ++++++++++++++ tree-walk.c | 15 +++++++++++++++ 2 files changed, 29 insertions(+), 0 deletions(-)
diff --git a/t/t4010-diff-pathspec.sh b/t/t4010-diff-pathspec.sh index 94df7ae..4b120f8 100755 --- a/t/t4010-diff-pathspec.sh +++ b/t/t4010-diff-pathspec.sh @@ -70,4 +70,18 @@ test_expect_success 'diff-tree pathspec' ' test_cmp expected current ' +EMPTY_TREE=4b825dc642cb6eb9a060e54bf8d69288fbee4904 + +test_expect_success 'diff-tree with wildcard shows dir also matches' ' + git diff-tree --name-only $EMPTY_TREE $tree -- "f*" >result && + echo file0 >expected && + test_cmp expected result +' + +test_expect_success 'diff-tree -r with wildcard' ' + git diff-tree -r --name-only $EMPTY_TREE $tree -- "*file1" >result && + echo path1/file1 >expected && + test_cmp expected result +' + test_done diff --git a/tree-walk.c b/tree-walk.c index b5ad42b..e1a18fc 100644 --- a/tree-walk.c +++ b/tree-walk.c @@ -597,6 +597,21 @@ int tree_entry_interesting(const struct name_entry *entry, match + baselen, matchlen - baselen, &never_interesting)) return 1; + + if (item->has_wildcard) { + never_interesting = 0; + if (!fnmatch(match + baselen, entry->path, 0)) + return 1; + + /* + * Match all directories. We'll try to + * match files later on. + */ + if (ps->recursive && S_ISDIR(entry->mode)) + return 1; + } + + continue; } match_wildcards:
-- 1.7.3.3.476.g10a82