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

[PATCH 1/3] diffcore-rename: refactor "too many candidates" logic

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 22, 2011, 21:50 UTC
Message-ID
<1300830649-22830-1-git-send-email-gitster@pobox.com>
In-Reply-To
<7vk4fqkewo.fsf@alter.siamese.dyndns.org>

Move the logic to a separate function, to be enhanced by later patches in the series.

While at it, swap the condition used in the if statement from "if it is too big then do this" to "if it would fit then do this".

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 Rebased to 'master' as the logic to use the result of this logic was
 updated recently, together with the addition of eye-candy.
---
 diffcore-rename.c |   47 +++++++++++++++++++++++++++++------------------
 1 files changed, 29 insertions(+), 18 deletions(-)
diff --git a/diffcore-rename.c b/diffcore-rename.c
index d40e40a..00f7f84 100644
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -419,6 +419,34 @@ static void record_if_better(struct diff_score m[], struct diff_score *o)
 		m[worst] = *o;
 }
 
+static int too_many_rename_candidates(int num_create,
+				      struct diff_options *options)
+{
+	int rename_limit = options->rename_limit;
+	int num_src = rename_src_nr;
+
+	options->needed_rename_limit = 0;
+
+	/*
+	 * This basically does a test for the rename matrix not
+	 * growing larger than a "rename_limit" square matrix, ie:
+	 *
+	 *    num_create * num_src > rename_limit * rename_limit
+	 *
+	 * but handles the potential overflow case specially (and we
+	 * assume at least 32-bit integers)
+	 */
+	if (rename_limit <= 0 || rename_limit > 32767)
+		rename_limit = 32767;
+	if ((num_create <= rename_limit || num_src <= rename_limit) &&
+	    (num_create * num_src <= rename_limit * rename_limit))
+		return 0;
+
+	options->needed_rename_limit =
+		num_src > num_create ? num_src : num_create;
+	return 1;
+}
+
 static int find_renames(struct diff_score *mx, int dst_cnt, int minimum_score, int copies)
 {
 	int count = 0, i;
@@ -444,7 +472,6 @@ void diffcore_rename(struct diff_options *options)
 {
 	int detect_rename = options->detect_rename;
 	int minimum_score = options->rename_score;
-	int rename_limit = options->rename_limit;
 	struct diff_queue_struct *q = &diff_queued_diff;
 	struct diff_queue_struct outq;
 	struct diff_score *mx;
@@ -511,24 +538,8 @@ void diffcore_rename(struct diff_options *options)
 	if (!num_create)
 		goto cleanup;
 
-	/*
-	 * This basically does a test for the rename matrix not
-	 * growing larger than a "rename_limit" square matrix, ie:
-	 *
-	 *    num_create * num_src > rename_limit * rename_limit
-	 *
-	 * but handles the potential overflow case specially (and we
-	 * assume at least 32-bit integers)
-	 */
-	options->needed_rename_limit = 0;
-	if (rename_limit <= 0 || rename_limit > 32767)
-		rename_limit = 32767;
-	if ((num_create > rename_limit && num_src > rename_limit) ||
-	    (num_create * num_src > rename_limit * rename_limit)) {
-		options->needed_rename_limit =
-			num_src > num_create ? num_src : num_create;
+	if (too_many_rename_candidates(num_create, options))
 		goto cleanup;
-	}
 
 	if (options->show_rename_progress) {
 		progress = start_progress_delay(
-- 
1.7.4.1.554.gfdad8
Previous: Junio C HamanoNext: Junio C Hamano
Message 2 of 24 in “builtin/diff.c: remove duplicated call to diff_result_code()”
  1. builtin/diff.c: remove duplicated call to diff_result_code()Junio C Hamano, Mar 22, 2011
  2. 1/3 diffcore-rename: refactor "too many candidates" logicJunio C Hamano, Mar 22, 2011
  3. 2/3 diffcore-rename: record filepair for rename srcJunio C Hamano, Mar 22, 2011
  4. 3/3 diffcore-rename: fall back to -C when -C -C busts the rename limitJunio C Hamano, Mar 22, 2011
  5. Jeff KingMar 23, 2011
  6. Junio C HamanoMar 23, 2011
  7. Jeff KingMar 23, 2011
  8. Jeff KingMar 23, 2011
  9. 1/3 pager: save the original stderr when redirecting to pagerJeff King, Mar 23, 2011
  10. 2/3 progress: use pager's original_stderr if availableJeff King, Mar 23, 2011
  11. 3/3 show: turn on rename progressJeff King, Mar 23, 2011
  12. Junio C HamanoMar 23, 2011
  13. Jeff KingMar 24, 2011
  14. Junio C HamanoMar 24, 2011
  15. Jeff KingMar 24, 2011
  16. 1/4 pager: save the original stderr when redirecting to pagerJeff King, Mar 24, 2011
  17. 2/4 progress: use pager's original_stderr if availableJeff King, Mar 24, 2011
  18. 3/4 show: turn on rename detection progress reportingJeff King, Mar 24, 2011
  19. Junio C HamanoMar 24, 2011
  20. Jeff KingMar 25, 2011
  21. 4/4 diff: turn on rename detection progress reportingJeff King, Mar 24, 2011
  22. Johannes SixtMar 25, 2011
  23. Jeff KingMar 25, 2011
  24. Junio C HamanoMar 24, 2011

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.