diffcore-rename: don't change similarity index based on basename equality
authorRené Scharfe <rene.scharfe@lsrfire.ath.cx>
Sun, 24 Jun 2007 22:23:28 +0000 (00:23 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 25 Jun 2007 06:12:31 +0000 (23:12 -0700)
This implements a suggestion from Johannes.  It uses a separate field in
struct diff_score to keep the result of the file name comparison in the
rename detection logic.  This reverts the value of the similarity index
to be a function of file contents, only, and basename comparison is only
used to decide between files with equal amounts of content changes.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diffcore-rename.c

index 79c984c9cf5489d22f359b7a2ad3464ffc271c35..e0a89f3796890d0d23bb80b3fd6e3cac2ae1b752 100644 (file)
@@ -138,6 +138,7 @@ struct diff_score {
        int src; /* index in rename_src */
        int dst; /* index in rename_dst */
        int score;
+       int name_score;
 };
 
 static int estimate_similarity(struct diff_filespec *src,
@@ -201,11 +202,8 @@ static int estimate_similarity(struct diff_filespec *src,
         */
        if (!dst->size)
                score = 0; /* should not happen */
-       else {
+       else
                score = (int)(src_copied * MAX_SCORE / max_size);
-               if (basename_same(src, dst))
-                       score++;
-       }
        return score;
 }
 
@@ -242,6 +240,10 @@ static void record_rename_pair(int dst_index, int src_index, int score)
 static int score_compare(const void *a_, const void *b_)
 {
        const struct diff_score *a = a_, *b = b_;
+
+       if (a->score == b->score)
+               return b->name_score - a->name_score;
+
        return b->score - a->score;
 }
 
@@ -360,6 +362,7 @@ void diffcore_rename(struct diff_options *options)
                        m->dst = i;
                        m->score = estimate_similarity(one, two,
                                                       minimum_score);
+                       m->name_score = basename_same(one, two);
                        diff_free_filespec_data(one);
                }
                /* We do not need the text anymore */