aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2011-01-06 13:50:04 -0800
committerJunio C Hamano <gitster@pobox.com>2011-03-22 14:29:07 -0700
commit9d8a5a50b7e30d85aff3deac2a6994bf0178983d (patch)
treebb2c94524e0210bab859cb846b8ba3ca14024aed
parente7c3a59c22b28002d7cab3a4a0807fdc0d2388c9 (diff)
downloadgit-9d8a5a50b7e30d85aff3deac2a6994bf0178983d.tar.gz
git-9d8a5a50b7e30d85aff3deac2a6994bf0178983d.tar.xz
diffcore-rename: refactor "too many candidates" logic
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.
-rw-r--r--diffcore-rename.c47
1 files changed, 29 insertions, 18 deletions
diff --git a/diffcore-rename.c b/diffcore-rename.c
index d40e40a3a..00f7f8428 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(