Browse Source

Do the fuzzy rename detection limits with the exact renames removed

When we do the fuzzy rename detection, we don't care about the
destinations that we already handled with the exact rename detector.
And, in fact, the code already knew that - but the rename limiter, which
used to run *before* exact renames were detected, did not.

This fixes it so that the rename detection limiter now bases its
decisions on the *remaining* rename counts, rather than the original
ones.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Linus Torvalds 18 years ago committed by Junio C Hamano
parent
commit
42899ac898
  1. 32
      diffcore-rename.c

32
diffcore-rename.c

@ -435,33 +435,37 @@ void diffcore_rename(struct diff_options *options) @@ -435,33 +435,37 @@ void diffcore_rename(struct diff_options *options)
*/
rename_count = find_exact_renames();

/* Did we only want exact renames? */
if (minimum_score == MAX_SCORE)
goto cleanup;

/*
* Calculate how many renames are left (but all the source
* files still remain as options for rename/copies!)
*/
num_create = (rename_dst_nr - rename_count);
num_src = rename_src_nr;

/* All done? */
if (!num_create)
goto cleanup;

/*
* This basically does a test for the rename matrix not
* growing larger than a "rename_limit" square matrix, ie:
*
* rename_dst_nr * rename_src_nr > rename_limit * rename_limit
* 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 (rename_dst_nr > rename_limit && rename_src_nr > rename_limit)
if (num_create > rename_limit && num_src > rename_limit)
goto cleanup;
if (rename_dst_nr * rename_src_nr > rename_limit * rename_limit)
if (num_create * num_src > rename_limit * rename_limit)
goto cleanup;

/* Have we run out the created file pool? If so we can avoid
* doing the delta matrix altogether.
*/
if (rename_count == rename_dst_nr)
goto cleanup;

if (minimum_score == MAX_SCORE)
goto cleanup;

num_create = (rename_dst_nr - rename_count);
num_src = rename_src_nr;
mx = xmalloc(sizeof(*mx) * num_create * num_src);
for (dst_cnt = i = 0; i < rename_dst_nr; i++) {
int base = dst_cnt * num_src;

Loading…
Cancel
Save