Skip to content

Commit

Permalink
Do the fuzzy rename detection limits with the exact renames removed
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Linus Torvalds authored and Junio C Hamano committed Oct 27, 2007
1 parent 81ac051 commit 42899ac
Showing 1 changed file with 18 additions and 14 deletions.
32 changes: 18 additions & 14 deletions diffcore-rename.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 42899ac

Please sign in to comment.