[PATCH 2/2] Do the fuzzy rename detection limits with the exact renames removed
- From
Linus Torvalds <torvalds@linux-foundation.org>
- Date
- Oct 26, 2007, 23:56 UTC
- Message-ID
- <alpine.LFD.0.999.0710261654300.30120@woody.linux-foundation.org>
- In-Reply-To
- <alpine.LFD.0.999.0710261646230.30120@woody.linux-foundation.org>
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> ---
Pretty obvious. It just moves the tests around a bit, and uses the updated counters.
Works For Me(tm), although this isn't all that obviously testable (ie I should find a test that is border-line, and triggers the rename detection limits, but then has enough exact renames that the rename detection array goes away).
diffcore-rename.c | 32 ++++++++++++++++++-------------- 1 files changed, 18 insertions(+), 14 deletions(-)
diff --git a/diffcore-rename.c b/diffcore-rename.c index 7ed5ef8..f9ebea5 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -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;