X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=diffcore-rename.c;h=b80b4320ff6ea586d8d3c2800a7c42d68ccdd796;hb=a7e71bb4898223b0be41e44f52f382c884404434;hp=55cf1c37f344628eb06c40393295f288fb186a50;hpb=6f85a78df69d84d06eef53288c3c303109f8644e;p=git.git diff --git a/diffcore-rename.c b/diffcore-rename.c index 55cf1c37..b80b4320 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -166,23 +166,20 @@ static int estimate_similarity(struct diff_filespec *src, delta_limit = base_size * (MAX_SCORE-minimum_score) / MAX_SCORE; 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; - /* Extent of damage */ - if (src->size + literal_added < src_copied) - delta_size = 0; - 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. + /* How similar are they? + * what percentage of material in dst are from source? */ - score = MAX_SCORE - (MAX_SCORE * delta_size / base_size); - if (score < 0) return 0; - if (MAX_SCORE < score) return MAX_SCORE; + if (dst->size < src_copied) + score = MAX_SCORE; + else if (!dst->size) + score = 0; /* should not happen */ + else + score = src_copied * MAX_SCORE / dst->size; return score; } @@ -310,6 +307,8 @@ void diffcore_rename(struct diff_options *options) m->score = estimate_similarity(one, two, minimum_score); } + free(two->cnt_data); + two->cnt_data = NULL; dst_cnt++; } /* cost matrix sorted by most to least similar pair */