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

[PATCH v3 2/2] tree:<depth>: skip some trees even when collecting omits

From
Matthew DeVore <matvore@google.com>
Date
Jan 9, 2019, 02:59 UTC
Message-ID
<20190109025914.247473-3-matvore@google.com>
In-Reply-To
<20190109025914.247473-1-matvore@google.com>

If a tree has already been recorded as omitted, we don't need to traverse it again just to collect its omits. Stop traversing trees a second time when collecting omits.

Signed-off-by: Matthew DeVore <matvore@google.com>
---
 list-objects-filter.c               | 18 ++++++++++++------
 t/t6112-rev-list-filters-objects.sh | 11 ++++++++++-
 2 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/list-objects-filter.c b/list-objects-filter.c
index 786e0dd0b1..ee449de3f7 100644
--- a/list-objects-filter.c
+++ b/list-objects-filter.c
@@ -107,18 +107,19 @@ struct seen_map_entry {
 	size_t depth;
 };
 
-static void filter_trees_update_omits(
+/* Returns 1 if the oid was in the omits set before it was invoked. */
+static int filter_trees_update_omits(
 	struct object *obj,
 	struct filter_trees_depth_data *filter_data,
 	int include_it)
 {
 	if (!filter_data->omits)
-		return;
+		return 0;
 
 	if (include_it)
-		oidset_remove(filter_data->omits, &obj->oid);
+		return oidset_remove(filter_data->omits, &obj->oid);
 	else
-		oidset_insert(filter_data->omits, &obj->oid);
+		return oidset_insert(filter_data->omits, &obj->oid);
 }
 
 static enum list_objects_filter_result filter_trees_depth(
@@ -171,12 +172,17 @@ static enum list_objects_filter_result filter_trees_depth(
 		if (already_seen) {
 			filter_res = LOFR_SKIP_TREE;
 		} else {
+			int been_omitted = filter_trees_update_omits(
+				obj, filter_data, include_it);
 			seen_info->depth = filter_data->current_depth;
-			filter_trees_update_omits(obj, filter_data, include_it);
 
 			if (include_it)
 				filter_res = LOFR_DO_SHOW;
-			else if (filter_data->omits)
+			else if (filter_data->omits && !been_omitted)
+				/*
+				 * Must update omit information of children
+				 * recursively; they have not been omitted yet.
+				 */
 				filter_res = LOFR_ZERO;
 			else
 				filter_res = LOFR_SKIP_TREE;
diff --git a/t/t6112-rev-list-filters-objects.sh b/t/t6112-rev-list-filters-objects.sh
index 706845f1d9..eb9e4119e2 100755
--- a/t/t6112-rev-list-filters-objects.sh
+++ b/t/t6112-rev-list-filters-objects.sh
@@ -283,7 +283,7 @@ test_expect_success 'verify tree:0 includes trees in "filtered" output' '
 
 # Make sure tree:0 does not iterate through any trees.
 
-test_expect_success 'filter a GIANT tree through tree:0' '
+test_expect_success 'verify skipping tree iteration when not collecting omits' '
 	GIT_TRACE=1 git -C r3 rev-list \
 		--objects --filter=tree:0 HEAD 2>filter_trace &&
 	grep "Skipping contents of tree [.][.][.]" filter_trace >actual &&
@@ -377,6 +377,15 @@ test_expect_success 'test tree:# filter provisional omit for blob and tree' '
 	expect_has_with_different_name r4 filt/subdir
 '
 
+test_expect_success 'verify skipping tree iteration when collecting omits' '
+	GIT_TRACE=1 git -C r4 rev-list --filter-print-omitted \
+		--objects --filter=tree:0 HEAD 2>filter_trace &&
+	grep "^Skipping contents of tree " filter_trace >actual &&
+
+	echo "Skipping contents of tree subdir/..." >expect &&
+	test_cmp expect actual
+'
+
 # Test tree:<depth> where a tree is iterated to twice - once where a subentry is
 # too deep to be included, and again where the blob inside it is shallow enough
 # to be included. This makes sure we don't use LOFR_MARK_SEEN incorrectly (we
-- 
2.20.1.97.g81188d93c3-goog
Previous: Matthew DeVoreNext: Jonathan Tan
Message 19 of 24 in “support for filtering trees and blobs based on depth”
  1. 0/2 support for filtering trees and blobs based on depthMatthew DeVore, Dec 10, 2018
  2. 1/2 list-objects-filter: teach tree:# how to handle >0Matthew DeVore, Dec 10, 2018
  3. Jonathan TanJan 8, 2019
  4. Matthew DeVoreJan 8, 2019
  5. Jonathan TanJan 8, 2019
  6. Junio C HamanoJan 8, 2019
  7. Jonathan TanJan 8, 2019
  8. Junio C HamanoJan 8, 2019
  9. MATTHEW DEVOREJan 9, 2019
  10. 2/2 tree:<depth>: skip some trees even when collecting omitsMatthew DeVore, Dec 10, 2018
  11. Jonathan TanJan 8, 2019
  12. Jonathan TanJan 8, 2019
  13. MATTHEW DEVOREJan 9, 2019
  14. Matthew DeVoreJan 9, 2019
  15. Junio C HamanoDec 11, 2018
  16. Matthew DeVoreJan 8, 2019
  17. 0/2 support for filtering trees and blobs based on depthMatthew DeVore, Jan 9, 2019
  18. 1/2 list-objects-filter: teach tree:# how to handle >0Matthew DeVore, Jan 9, 2019
  19. 2/2 tree:<depth>: skip some trees even when collecting omitsMatthew DeVore, Jan 9, 2019
  20. Jonathan TanJan 9, 2019
  21. Junio C HamanoJan 15, 2019
  22. Junio C HamanoJan 15, 2019
  23. Matthew DeVoreJan 17, 2019
  24. Junio C HamanoJan 17, 2019

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.