Skip to content

Commit fc58071

Browse files
author
Junio C Hamano
committed
diffcore-rename: fix merging back a broken pair.
When a broken pair is matched up by rename detector to be merged back, we do not want to say it is "dissimilar" with the similarity index. The output should just say they were changed, taking the break score left by the earlier diffcore-break run if any. Signed-off-by: Junio C Hamano <junkio@cox.net>
1 parent a041d94 commit fc58071

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

diffcore-rename.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,14 @@ static struct diff_rename_dst *locate_rename_dst(struct diff_filespec *two,
5454
/* Table of rename/copy src files */
5555
static struct diff_rename_src {
5656
struct diff_filespec *one;
57+
unsigned short score; /* to remember the break score */
5758
unsigned src_path_left : 1;
5859
} *rename_src;
5960
static int rename_src_nr, rename_src_alloc;
6061

6162
static struct diff_rename_src *register_rename_src(struct diff_filespec *one,
62-
int src_path_left)
63+
int src_path_left,
64+
unsigned short score)
6365
{
6466
int first, last;
6567

@@ -89,6 +91,7 @@ static struct diff_rename_src *register_rename_src(struct diff_filespec *one,
8991
memmove(rename_src + first + 1, rename_src + first,
9092
(rename_src_nr - first - 1) * sizeof(*rename_src));
9193
rename_src[first].one = one;
94+
rename_src[first].score = score;
9295
rename_src[first].src_path_left = src_path_left;
9396
return &(rename_src[first]);
9497
}
@@ -198,7 +201,10 @@ static void record_rename_pair(int dst_index, int src_index, int score)
198201
fill_filespec(two, dst->sha1, dst->mode);
199202

200203
dp = diff_queue(NULL, one, two);
201-
dp->score = score;
204+
if (!strcmp(src->path, dst->path))
205+
dp->score = rename_src[src_index].score;
206+
else
207+
dp->score = score;
202208
dp->source_stays = rename_src[src_index].src_path_left;
203209
rename_dst[dst_index].pair = dp;
204210
}
@@ -256,10 +262,10 @@ void diffcore_rename(struct diff_options *options)
256262
* that means the source actually stays.
257263
*/
258264
int stays = (p->broken_pair && !p->score);
259-
register_rename_src(p->one, stays);
265+
register_rename_src(p->one, stays, p->score);
260266
}
261267
else if (detect_rename == DIFF_DETECT_COPY)
262-
register_rename_src(p->one, 1);
268+
register_rename_src(p->one, 1, p->score);
263269
}
264270
if (rename_dst_nr == 0 || rename_src_nr == 0 ||
265271
(0 < rename_limit && rename_limit < rename_dst_nr))

0 commit comments

Comments
 (0)