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

Re: comparing file contents in is_exact_match?

From
Junio C Hamano <junkio@cox.net>
Date
Jul 6, 2006, 07:33 UTC
Message-ID
<7vwtar89wy.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<20060706071629.GB12512@admingilde.org>
Martin Waitz <tali@admingilde.org> writes:
Show 7 quoted lines
>> Because your working tree can be out of sync with respect to
>> what's in the index, in which case we cannot trust the sha1
>> while running diff-index (without --cached flag).
>
> so perhaps we need three phases instead of two:
> first sort out all renames that can be detected by the sha1,
> then compare file contents and finally do the diff.
Makes sort-of sense.

Although I am not sure how much this would help with a regular workload, maybe something like this untested patch might help your situation?

-- >8 -- diffcore-rename: try matching up renames without populating filespec first

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
diff --git a/diffcore-rename.c b/diffcore-rename.c
index d57e865..affff7a 100644
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -96,11 +96,15 @@ static struct diff_rename_src *register_
 	return &(rename_src[first]);
 }
 
-static int is_exact_match(struct diff_filespec *src, struct diff_filespec *dst)
+static int is_exact_match(struct diff_filespec *src,
+			  struct diff_filespec *dst,
+			  int contents_too)
 {
 	if (src->sha1_valid && dst->sha1_valid &&
 	    !memcmp(src->sha1, dst->sha1, 20))
 		return 1;
+	if (!contents_too)
+		return 0;
 	if (diff_populate_filespec(src, 1) || diff_populate_filespec(dst, 1))
 		return 0;
 	if (src->size != dst->size)
@@ -242,7 +246,7 @@ void diffcore_rename(struct diff_options
 	struct diff_queue_struct *q = &diff_queued_diff;
 	struct diff_queue_struct outq;
 	struct diff_score *mx;
-	int i, j, rename_count;
+	int i, j, rename_count, contents_too;
 	int num_create, num_src, dst_cnt;
 
 	if (!minimum_score)
@@ -273,16 +277,23 @@ void diffcore_rename(struct diff_options
 
 	/* We really want to cull the candidates list early
 	 * with cheap tests in order to avoid doing deltas.
+	 * The first round matches up the up-to-date entries,
+	 * and then during the second round we try to match
+	 * cache-dirty entries as well.
 	 */
-	for (i = 0; i < rename_dst_nr; i++) {
-		struct diff_filespec *two = rename_dst[i].two;
-		for (j = 0; j < rename_src_nr; j++) {
-			struct diff_filespec *one = rename_src[j].one;
-			if (!is_exact_match(one, two))
-				continue;
-			record_rename_pair(i, j, MAX_SCORE);
-			rename_count++;
-			break; /* we are done with this entry */
+	for (contents_too = 0; contents_too < 2; contents_too++) { 
+		for (i = 0; i < rename_dst_nr; i++) {
+			struct diff_filespec *two = rename_dst[i].two;
+			if (rename_dst[i].pair)
+				continue; /* dealt with an earlier round */
+			for (j = 0; j < rename_src_nr; j++) {
+				struct diff_filespec *one = rename_src[j].one;
+				if (!is_exact_match(one, two, contents_too))
+					continue;
+				record_rename_pair(i, j, MAX_SCORE);
+				rename_count++;
+				break; /* we are done with this entry */
+			}
 		}
 	}
 
Previous: Martin WaitzNext: Martin Waitz
Message 4 of 32 in “comparing file contents in is_exact_match?”
  1. Martin WaitzJul 6, 2006
  2. Junio C HamanoJul 6, 2006
  3. Martin WaitzJul 6, 2006
  4. Junio C HamanoJul 6, 2006
  5. Martin WaitzJul 6, 2006
  6. Martin WaitzJul 6, 2006
  7. Florian WeimerJul 7, 2006
  8. Johannes SchindelinJul 8, 2006
  9. Florian WeimerJul 16, 2006
  10. Johannes SchindelinJul 16, 2006
  11. Yakov LernerJul 16, 2006
  12. Alex RiesenJul 16, 2006
  13. Florian WeimerJul 17, 2006
  14. Johannes SchindelinJul 17, 2006
  15. Linus TorvaldsJul 17, 2006
  16. Johannes SchindelinJul 17, 2006
  17. Linus TorvaldsJul 17, 2006
  18. Martin WaitzJul 17, 2006
  19. Alex RiesenJul 17, 2006
  20. Geert BoschJul 17, 2006
  21. Linus TorvaldsJul 17, 2006
  22. Yakov LernerJul 18, 2006
  23. Johannes SchindelinJul 18, 2006
  24. Linus TorvaldsJul 18, 2006
  25. Alex RiesenJul 18, 2006
  26. Juergen RuehleJul 17, 2006
  27. Johannes SchindelinJul 17, 2006
  28. Juergen RuehleJul 17, 2006
  29. Yakov LernerJul 17, 2006
  30. Juergen RuehleJul 17, 2006
  31. Yakov LernerJul 18, 2006
  32. Yakov LernerJul 17, 2006

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.