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

[PATCH 04/11] tree-diff: move all action-taking code out of compare_tree_entry()

From
Kirill Smelkov <kirr@mns.spb.ru>
Date
Feb 7, 2014, 17:48 UTC
Message-ID
<533204f5c956f2cb7442a48ac2a776eee4a43049.1391794688.git.kirr@mns.spb.ru>
In-Reply-To
<cover.1391794688.git.kirr@mns.spb.ru>
- let it do only comparison.

This way the code is cleaner and more structured - cmp function only compares, and the driver takes action based on comparison result.

There should be no change in performance, as effectively, we just move if series from on place into another, and merge it to was-already-there same switch/if, so the result is maybe a little bit faster.

Signed-off-by: Kirill Smelkov <kirr@mns.spb.ru>
---
 tree-diff.c | 28 ++++++++++++----------------
 1 file changed, 12 insertions(+), 16 deletions(-)
diff --git a/tree-diff.c b/tree-diff.c
index c3fbfba..54a3d23 100644
--- a/tree-diff.c
+++ b/tree-diff.c
@@ -9,8 +9,7 @@
 static void show_path(struct strbuf *base, struct diff_options *opt,
 		      struct tree_desc *t1, struct tree_desc *t2);
 
-static int compare_tree_entry(struct tree_desc *t1, struct tree_desc *t2,
-			      struct strbuf *base, struct diff_options *opt)
+static int compare_tree_entry(struct tree_desc *t1, struct tree_desc *t2)
 {
 	unsigned mode1, mode2;
 	const char *path1, *path2;
@@ -28,19 +27,7 @@ static int compare_tree_entry(struct tree_desc *t1, struct tree_desc *t2,
 	 * even when having the same name.
 	 */
 	cmp = base_name_compare(path1, pathlen1, mode1, path2, pathlen2, mode2);
-	if (cmp < 0) {
-		show_path(base, opt, t1, /*t2=*/NULL);
-		return -1;
-	}
-	if (cmp > 0) {
-		show_path(base, opt, /*t1=*/NULL, t2);
-		return 1;
-	}
-	if (!DIFF_OPT_TST(opt, FIND_COPIES_HARDER) && !hashcmp(sha1, sha2) && mode1 == mode2)
-		return 0;
-
-	show_path(base, opt, t1, t2);
-	return 0;
+	return cmp;
 }
 
 
@@ -163,6 +150,8 @@ int diff_tree(struct tree_desc *t1, struct tree_desc *t2,
 	strbuf_add(&base, base_str, baselen);
 
 	for (;;) {
+		int cmp;
+
 		if (diff_can_quit_early(opt))
 			break;
 		if (opt->pathspec.nr) {
@@ -182,21 +171,28 @@ int diff_tree(struct tree_desc *t1, struct tree_desc *t2,
 			continue;
 		}
 
-		cmp = compare_tree_entry(t1, t2, &base, opt);
+		cmp = compare_tree_entry(t1, t2);
 
 		/* t1 = t2 */
 		if (cmp == 0) {
+			if (DIFF_OPT_TST(opt, FIND_COPIES_HARDER) ||
+			    hashcmp(t1->entry.sha1, t2->entry.sha1) ||
+			    (t1->entry.mode != t2->entry.mode))
+				show_path(&base, opt, t1, t2);
+
 			update_tree_entry(t1);
 			update_tree_entry(t2);
 		}
 
 		/* t1 < t2 */
 		else if (cmp < 0) {
+			show_path(&base, opt, t1, /*t2=*/NULL);
 			update_tree_entry(t1);
 		}
 
 		/* t1 > t2 */
 		else {
+			show_path(&base, opt, /*t1=*/NULL, t2);
 			update_tree_entry(t2);
 		}
 	}
-- 
1.9.rc1.181.g641f458
Previous: Kirill SmelkovNext: Kirill Smelkov
Message 7 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.