diff --git a/diffcore.h b/diffcore.h index d5a497b7a1..cf8d4cb861 100644 --- a/diffcore.h +++ b/diffcore.h @@ -167,6 +167,12 @@ enum dir_rename_relevance { RELEVANT_FOR_ANCESTOR = 1, RELEVANT_FOR_SELF = 2 }; +/* file_rename_relevance: the reason(s) we want rename information for a file */ +enum file_rename_relevance { + RELEVANT_NO_MORE = 0, /* i.e. NOT relevant */ + RELEVANT_CONTENT = 1, + RELEVANT_LOCATION = 2 +}; void partial_clear_dir_rename_count(struct strmap *dir_rename_count); diff --git a/merge-ort.c b/merge-ort.c index f2b259986e..7f5750ce6a 100644 --- a/merge-ort.c +++ b/merge-ort.c @@ -99,16 +99,18 @@ struct rename_info { struct strmap dir_renames[3]; /* - * relevant_sources: deleted paths for which we need rename detection + * relevant_sources: deleted paths wanted in rename detection, and why * * relevant_sources is a set of deleted paths on each side of * history for which we need rename detection. If a path is deleted * on one side of history, we need to detect if it is part of a * rename if either - * * we need to detect renames for an ancestor directory * * the file is modified/deleted on the other side of history + * * we need to detect renames for an ancestor directory * If neither of those are true, we can skip rename detection for - * that path. + * that path. The reason is stored as a value from enum + * file_rename_relevance, as the reason can inform the algorithm in + * diffcore_rename_extended(). */ struct strintmap relevant_sources[3]; @@ -677,8 +679,11 @@ static void add_pair(struct merge_options *opt, unsigned content_relevant = (match_mask == 0); unsigned location_relevant = (dir_rename_mask == 0x07); - if (content_relevant || location_relevant) - strintmap_set(&renames->relevant_sources[side], pathname, 1); + if (content_relevant || location_relevant) { + /* content_relevant trumps location_relevant */ + strintmap_set(&renames->relevant_sources[side], pathname, + content_relevant ? RELEVANT_CONTENT : RELEVANT_LOCATION); + } } one = alloc_filespec(pathname);