|
|
|
@ -5,6 +5,7 @@
@@ -5,6 +5,7 @@
|
|
|
|
|
#include "diff.h" |
|
|
|
|
#include "diffcore.h" |
|
|
|
|
#include "hash.h" |
|
|
|
|
#include "progress.h" |
|
|
|
|
|
|
|
|
|
/* Table of rename/copy destinations */ |
|
|
|
|
|
|
|
|
@ -449,6 +450,7 @@ void diffcore_rename(struct diff_options *options)
@@ -449,6 +450,7 @@ void diffcore_rename(struct diff_options *options)
|
|
|
|
|
struct diff_score *mx; |
|
|
|
|
int i, j, rename_count; |
|
|
|
|
int num_create, num_src, dst_cnt; |
|
|
|
|
struct progress *progress = NULL; |
|
|
|
|
|
|
|
|
|
if (!minimum_score) |
|
|
|
|
minimum_score = DEFAULT_RENAME_SCORE; |
|
|
|
@ -518,15 +520,22 @@ void diffcore_rename(struct diff_options *options)
@@ -518,15 +520,22 @@ void diffcore_rename(struct diff_options *options)
|
|
|
|
|
* 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)) { |
|
|
|
|
if (options->warn_on_too_large_rename) |
|
|
|
|
warning("too many files (created: %d deleted: %d), skipping inexact rename detection", num_create, num_src); |
|
|
|
|
options->needed_rename_limit = |
|
|
|
|
num_src > num_create ? num_src : num_create; |
|
|
|
|
goto cleanup; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (options->show_rename_progress) { |
|
|
|
|
progress = start_progress_delay( |
|
|
|
|
"Performing inexact rename detection", |
|
|
|
|
rename_dst_nr * rename_src_nr, 50, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
mx = xcalloc(num_create * NUM_CANDIDATE_PER_DST, sizeof(*mx)); |
|
|
|
|
for (dst_cnt = i = 0; i < rename_dst_nr; i++) { |
|
|
|
|
struct diff_filespec *two = rename_dst[i].two; |
|
|
|
@ -556,7 +565,9 @@ void diffcore_rename(struct diff_options *options)
@@ -556,7 +565,9 @@ void diffcore_rename(struct diff_options *options)
|
|
|
|
|
diff_free_filespec_blob(two); |
|
|
|
|
} |
|
|
|
|
dst_cnt++; |
|
|
|
|
display_progress(progress, (i+1)*rename_src_nr); |
|
|
|
|
} |
|
|
|
|
stop_progress(&progress); |
|
|
|
|
|
|
|
|
|
/* cost matrix sorted by most to least similar pair */ |
|
|
|
|
qsort(mx, dst_cnt * NUM_CANDIDATE_PER_DST, sizeof(*mx), score_compare); |
|
|
|
|