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

[PATCH 12/21] tree_entry_interesting(): optimize wildcard matching when base is matched

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Dec 15, 2010, 15:02 UTC
Message-ID
<1292425376-14550-13-git-send-email-pclouds@gmail.com>
In-Reply-To
<1292425376-14550-1-git-send-email-pclouds@gmail.com>

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 <pclouds@gmail.com>
---
 t/t4010-diff-pathspec.sh |   18 ++++++++++++++++++
 tree-walk.c              |   14 ++++++++++++++
 2 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/t/t4010-diff-pathspec.sh b/t/t4010-diff-pathspec.sh
index 4b120f8..fbc8cd8 100755
--- a/t/t4010-diff-pathspec.sh
+++ b/t/t4010-diff-pathspec.sh
@@ -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
diff --git a/tree-walk.c b/tree-walk.c
index cc5a4e1..99413b3 100644
--- a/tree-walk.c
+++ b/tree-walk.c
@@ -593,6 +593,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:
-- 
1.7.3.3.476.g10a82
Previous: Ævar Arnfjörð BjarmasonNext: Nguyễn Thái Ngọc Duy
Message 24 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.