X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=diffcore-rename.c;h=e99269872026c7f08e729acb6ffba7ef3c9c8fd8;hb=65b5e41e24dd76e9cc272399f458857d5b13d63e;hp=ffd126af0d2cd3539e0f186e83c7671132758e6b;hpb=c40610422e1157e71dbc3c1a2f9e19bbe117962f;p=git.git diff --git a/diffcore-rename.c b/diffcore-rename.c index ffd126af..e9926987 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -4,8 +4,6 @@ #include "cache.h" #include "diff.h" #include "diffcore.h" -#include "delta.h" -#include "count-delta.h" /* Table of rename/copy destinations */ @@ -135,8 +133,7 @@ static int estimate_similarity(struct diff_filespec *src, * match than anything else; the destination does not even * call into this function in that case. */ - void *delta; - unsigned long delta_size, base_size, src_copied, literal_added; + unsigned long max_size, delta_size, base_size, src_copied, literal_added; unsigned long delta_limit; int score; @@ -147,9 +144,9 @@ static int estimate_similarity(struct diff_filespec *src, if (!S_ISREG(src->mode) || !S_ISREG(dst->mode)) return 0; - delta_size = ((src->size < dst->size) ? - (dst->size - src->size) : (src->size - dst->size)); + max_size = ((src->size > dst->size) ? src->size : dst->size); base_size = ((src->size < dst->size) ? src->size : dst->size); + delta_size = max_size - base_size; /* We would not consider edits that change the file size so * drastically. delta_size must be smaller than @@ -165,42 +162,22 @@ static int estimate_similarity(struct diff_filespec *src, if (diff_populate_filespec(src, 0) || diff_populate_filespec(dst, 0)) return 0; /* error but caught downstream */ + delta_limit = base_size * (MAX_SCORE-minimum_score) / MAX_SCORE; - delta = diff_delta(src->data, src->size, - dst->data, dst->size, - &delta_size, delta_limit); - if (!delta) - /* If delta_limit is exceeded, we have too much differences */ + if (diffcore_count_changes(src->data, src->size, + dst->data, dst->size, + &src->cnt_data, &dst->cnt_data, + delta_limit, + &src_copied, &literal_added)) return 0; - /* A delta that has a lot of literal additions would have - * big delta_size no matter what else it does. + /* How similar are they? + * what percentage of material in dst are from source? */ - if (base_size * (MAX_SCORE-minimum_score) < delta_size * MAX_SCORE) { - free(delta); - return 0; - } - - /* Estimate the edit size by interpreting delta. */ - if (count_delta(delta, delta_size, &src_copied, &literal_added)) { - free(delta); - return 0; - } - free(delta); - - /* Extent of damage */ - if (src->size + literal_added < src_copied) - delta_size = 0; + if (!dst->size) + score = 0; /* should not happen */ else - delta_size = (src->size - src_copied) + literal_added; - - /* - * Now we will give some score to it. 100% edit gets 0 points - * and 0% edit gets MAX_SCORE points. - */ - score = MAX_SCORE - (MAX_SCORE * delta_size / base_size); - if (score < 0) return 0; - if (MAX_SCORE < score) return MAX_SCORE; + score = src_copied * MAX_SCORE / max_size; return score; } @@ -328,6 +305,8 @@ void diffcore_rename(struct diff_options *options) m->score = estimate_similarity(one, two, minimum_score); } + /* We do not need the text anymore */ + diff_free_filespec_data(two); dst_cnt++; } /* cost matrix sorted by most to least similar pair */