Skip to content

Commit

Permalink
tree_entry_interesting(): optimize wildcard matching when base is mat…
Browse files Browse the repository at this point in the history
…ched

If base is already matched, skip that part when calling
fnmatch(). This happens quite often if 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 <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
pclouds authored and gitster committed Feb 3, 2011
1 parent d38f280 commit f1a2ddb
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 0 deletions.
18 changes: 18 additions & 0 deletions t/t4010-diff-pathspec.sh
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,22 @@ test_expect_success 'diff-tree -r with wildcard' '
test_cmp expected result
'

test_expect_success 'diff-tree with wildcard shows dir also matches' '
git diff-tree --name-only $tree $tree2 -- "path1/f*" >result &&
echo path1 >expected &&
test_cmp expected result
'

test_expect_success 'diff-tree -r with wildcard from beginning' '
git diff-tree -r --name-only $tree $tree2 -- "path1/*file1" >result &&
echo path1/file1 >expected &&
test_cmp expected result
'

test_expect_success 'diff-tree -r with wildcard' '
git diff-tree -r --name-only $tree $tree2 -- "path1/f*" >result &&
echo path1/file1 >expected &&
test_cmp expected result
'

test_done
14 changes: 14 additions & 0 deletions tree-walk.c
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,20 @@ int tree_entry_interesting(const struct name_entry *entry,
match + baselen, matchlen - baselen,
&never_interesting))
return 1;

if (ps->items[i].has_wildcard) {
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:
Expand Down

0 comments on commit f1a2ddb

Please sign in to comment.