From: Junio C Hamano Date: Sat, 4 Nov 2006 20:37:02 +0000 (-0800) Subject: git-pickaxe: re-scan the blob after making progress with -M X-Git-Tag: v1.4.4-rc1~2^2~6 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=650e2f6752ad29b0cba394535d3b098cf4bb102b;p=git.git git-pickaxe: re-scan the blob after making progress with -M Otherwise we would miss copied lines that are contained in the parts before or after the part that we find after splitting the blame_entry (i.e. split[0] and split[2]). Signed-off-by: Junio C Hamano --- diff --git a/builtin-pickaxe.c b/builtin-pickaxe.c index 082ff45fe..29839cd48 100644 --- a/builtin-pickaxe.c +++ b/builtin-pickaxe.c @@ -766,7 +766,7 @@ static int find_move_in_parent(struct scoreboard *sb, struct origin *target, struct origin *parent) { - int last_in_target; + int last_in_target, made_progress; struct blame_entry *e, split[3]; mmfile_t file_p; char type[10]; @@ -784,14 +784,20 @@ static int find_move_in_parent(struct scoreboard *sb, return 0; } - for (e = sb->ent; e; e = e->next) { - if (e->guilty || cmp_suspect(e->suspect, target)) - continue; - find_copy_in_blob(sb, e, parent, split, &file_p); - if (split[1].suspect && - blame_move_score < ent_score(sb, &split[1])) - split_blame(sb, split, e); - decref_split(split); + made_progress = 1; + while (made_progress) { + made_progress = 0; + for (e = sb->ent; e; e = e->next) { + if (e->guilty || cmp_suspect(e->suspect, target)) + continue; + find_copy_in_blob(sb, e, parent, split, &file_p); + if (split[1].suspect && + blame_move_score < ent_score(sb, &split[1])) { + split_blame(sb, split, e); + made_progress = 1; + } + decref_split(split); + } } free(blob_p); return 0;