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

[PATCH 5/5] try-to-simplify-commit: use diff-tree --quiet machinery.

From
Junio C Hamano <junkio@cox.net>
Date
Mar 14, 2007, 21:26 UTC
Message-ID
<7v7itj7bz7.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<7vwt1j8z0e.fsf@assigned-by-dhcp.cox.net>

This uses diff-tree --quiet machinery to terminate the internal diff-tree between a commit and its parents via revs.pruning (not revs.diffopt) as soon as we find enough about the tree change.

With respect to the optionally given pathspec, we are interested if the tree of commit is identical to the parent's, only adds new paths to the parent's, or there are other differences. As soon as we find out that there is one such other kind of difference, we do not have to compare the rest of the tree.

Because we do not call standard diff_addremove/diff_change, we instruct the diff-tree machinery to stop early by setting has_changes when we say we found the trees to be different.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 revision.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/revision.c b/revision.c
index 129d197..bcdb6a1 100644
--- a/revision.c
+++ b/revision.c
@@ -243,6 +243,8 @@ static void file_add_remove(struct diff_options *options,
 		diff = REV_TREE_NEW;
 	}
 	tree_difference = diff;
+	if (tree_difference == REV_TREE_DIFFERENT)
+		options->has_changes = 1;
 }
 
 static void file_change(struct diff_options *options,
@@ -252,6 +254,7 @@ static void file_change(struct diff_options *options,
 		 const char *base, const char *path)
 {
 	tree_difference = REV_TREE_DIFFERENT;
+	options->has_changes = 1;
 }
 
 int rev_compare_tree(struct rev_info *revs, struct tree *t1, struct tree *t2)
@@ -261,6 +264,7 @@ int rev_compare_tree(struct rev_info *revs, struct tree *t1, struct tree *t2)
 	if (!t2)
 		return REV_TREE_DIFFERENT;
 	tree_difference = REV_TREE_SAME;
+	revs->pruning.has_changes = 0;
 	if (diff_tree_sha1(t1->object.sha1, t2->object.sha1, "",
 			   &revs->pruning) < 0)
 		return REV_TREE_DIFFERENT;
@@ -285,6 +289,7 @@ int rev_same_tree_as_empty(struct rev_info *revs, struct tree *t1)
 	empty.size = 0;
 
 	tree_difference = REV_TREE_SAME;
+	revs->pruning.has_changes = 0;
 	retval = diff_tree(&empty, &real, "", &revs->pruning);
 	free(tree);
 
@@ -552,6 +557,7 @@ void init_revisions(struct rev_info *revs, const char *prefix)
 	revs->ignore_merges = 1;
 	revs->simplify_history = 1;
 	revs->pruning.recursive = 1;
+	revs->pruning.quiet = 1;
 	revs->pruning.add_remove = file_add_remove;
 	revs->pruning.change = file_change;
 	revs->lifo = 1;
-- 
1.5.0.3.1036.g6baf1
Previous: Junio C Hamano
Message 23 of 23 in “diff --quick”
  1. 1/2 diff --quickJunio C Hamano, Mar 14, 2007
  2. 1/5 Remove unused diffcore_std_no_resolveJunio C Hamano, Mar 14, 2007
  3. 2/5 diff --quietJunio C Hamano, Mar 14, 2007
  4. Alex RiesenMar 14, 2007
  5. Alex RiesenMar 14, 2007
  6. Junio C HamanoMar 14, 2007
  7. Alex RiesenMar 15, 2007
  8. Alex RiesenMar 14, 2007
  9. Junio C HamanoMar 14, 2007
  10. Linus TorvaldsMar 15, 2007
  11. Junio C HamanoMar 15, 2007
  12. Junio C HamanoMar 15, 2007
  13. Linus TorvaldsMar 15, 2007
  14. Alex RiesenMar 15, 2007
  15. Johannes SchindelinMar 15, 2007
  16. Alex RiesenMar 15, 2007
  17. Johannes SchindelinMar 15, 2007
  18. Alex RiesenMar 15, 2007
  19. Johannes SchindelinMar 15, 2007
  20. Junio C HamanoMar 16, 2007
  21. 3/5 Teach --quiet to diff backends.Junio C Hamano, Mar 14, 2007
  22. 4/5 revision.c: explain what tree_difference doesJunio C Hamano, Mar 14, 2007
  23. 5/5 try-to-simplify-commit: use diff-tree --quiet machinery.Junio C Hamano, Mar 14, 2007

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.