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

[PATCH 03/11] tree-diff: don't assume compare_tree_entry() returns -1,0,1

From
Kirill Smelkov <kirr@mns.spb.ru>
Date
Feb 7, 2014, 17:48 UTC
Message-ID
<e61a30650c98ba5a1f1a9cbc96c4ba4801cee72d.1391794688.git.kirr@mns.spb.ru>
In-Reply-To
<cover.1391794688.git.kirr@mns.spb.ru>

It does, but we'll be reworking it in the next patch after it won't, and besides it is better to stick to standard strcmp/memcmp/base_name_compare/etc... convention, where comparison function returns <0, =0, >0

Regarding performance, comparing for <0, =0, >0 should be a little bit faster, than switch, because it is just 1 test-without-immediate instruction and then up to 3 conditional branches, and in switch you have up to 3 tests with immediate and up to 3 conditional branches.

No worry, that update_tree_entry(t2) is duplicated for =0 and >0 - it will be good after we'll be adding support for multiparent walker and will stay that way.

=0 case goes first, because it happens more often in real diffs - i.e. paths are the same.

Signed-off-by: Kirill Smelkov <kirr@mns.spb.ru>
---
 tree-diff.c | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/tree-diff.c b/tree-diff.c
index 0c8e3fc..c3fbfba 100644
--- a/tree-diff.c
+++ b/tree-diff.c
@@ -181,18 +181,24 @@ int diff_tree(struct tree_desc *t1, struct tree_desc *t2,
 			update_tree_entry(t1);
 			continue;
 		}
-		switch (compare_tree_entry(t1, t2, &base, opt)) {
-		case -1:
+
+		cmp = compare_tree_entry(t1, t2, &base, opt);
+
+		/* t1 = t2 */
+		if (cmp == 0) {
 			update_tree_entry(t1);
-			continue;
-		case 0:
+			update_tree_entry(t2);
+		}
+
+		/* t1 < t2 */
+		else if (cmp < 0) {
 			update_tree_entry(t1);
-			/* Fallthrough */
-		case 1:
+		}
+
+		/* t1 > t2 */
+		else {
 			update_tree_entry(t2);
-			continue;
 		}
-		die("git diff-tree: internal error");
 	}
 
 	strbuf_release(&base);
-- 
1.9.rc1.181.g641f458
Previous: Kirill SmelkovNext: Kirill Smelkov
Message 6 of 21 in “More preparatory work for multiparent tree-walker”
  1. 00/11 More preparatory work for multiparent tree-walkerKirill Smelkov, Feb 7, 2014
  2. 01/11 tree-diff: show_tree() is not neededKirill Smelkov, Feb 7, 2014
  3. 02/11 tree-diff: consolidate code for emitting diffs and recursion in one placeKirill Smelkov, Feb 7, 2014
  4. Junio C HamanoFeb 13, 2014
  5. Kirill SmelkovFeb 13, 2014
  6. 03/11 tree-diff: don't assume compare_tree_entry() returns -1,0,1Kirill Smelkov, Feb 7, 2014
  7. 04/11 tree-diff: move all action-taking code out of compare_tree_entry()Kirill Smelkov, Feb 7, 2014
  8. 05/11 tree-diff: rename compare_tree_entry -> tree_entry_pathcmpKirill Smelkov, Feb 7, 2014
  9. 06/11 tree-diff: show_path prototype is not needed anymoreKirill Smelkov, Feb 7, 2014
  10. 07/11 tree-diff: simplify tree_entry_pathcmpKirill Smelkov, Feb 7, 2014
  11. 08/11 tree-diff: remove special-case diff-emitting code for empty-tree casesKirill Smelkov, Feb 7, 2014
  12. 09/11 tree-diff: rework diff_tree interface to be sha1 basedKirill Smelkov, Feb 7, 2014
  13. 10/11 tree-diff: no need to call "full" diff_tree_sha1 from show_path()Kirill Smelkov, Feb 7, 2014
  14. 11/11 tree-diff: reuse base str(buf) memory on sub-tree recursionKirill Smelkov, Feb 7, 2014
  15. Kirill SmelkovFeb 13, 2014
  16. Junio C HamanoFeb 11, 2014
  17. Kirill SmelkovFeb 11, 2014
  18. Junio C HamanoFeb 11, 2014
  19. Kirill SmelkovFeb 12, 2014
  20. Junio C HamanoFeb 12, 2014
  21. Kirill SmelkovFeb 13, 2014

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.