Skip to content

Commit ec59da6

Browse files
newrengitster
authored andcommitted
merge-ort: record the reason that we want a rename for a file
There are two different reasons we might want a rename for a file -- for three-way content merging or as part of directory rename detection. Record the reason. diffcore-rename will potentially be able to filter some of the ones marked as needed only for directory rename detection, if it can determine those directory renames based solely on renames found via exact rename detection and basename-guided rename detection. Signed-off-by: Elijah Newren <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent bf238b7 commit ec59da6

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

diffcore.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,12 @@ enum dir_rename_relevance {
167167
RELEVANT_FOR_ANCESTOR = 1,
168168
RELEVANT_FOR_SELF = 2
169169
};
170+
/* file_rename_relevance: the reason(s) we want rename information for a file */
171+
enum file_rename_relevance {
172+
RELEVANT_NO_MORE = 0, /* i.e. NOT relevant */
173+
RELEVANT_CONTENT = 1,
174+
RELEVANT_LOCATION = 2
175+
};
170176

171177
void partial_clear_dir_rename_count(struct strmap *dir_rename_count);
172178

merge-ort.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,16 +99,18 @@ struct rename_info {
9999
struct strmap dir_renames[3];
100100

101101
/*
102-
* relevant_sources: deleted paths for which we need rename detection
102+
* relevant_sources: deleted paths wanted in rename detection, and why
103103
*
104104
* relevant_sources is a set of deleted paths on each side of
105105
* history for which we need rename detection. If a path is deleted
106106
* on one side of history, we need to detect if it is part of a
107107
* rename if either
108-
* * we need to detect renames for an ancestor directory
109108
* * the file is modified/deleted on the other side of history
109+
* * we need to detect renames for an ancestor directory
110110
* If neither of those are true, we can skip rename detection for
111-
* that path.
111+
* that path. The reason is stored as a value from enum
112+
* file_rename_relevance, as the reason can inform the algorithm in
113+
* diffcore_rename_extended().
112114
*/
113115
struct strintmap relevant_sources[3];
114116

@@ -677,8 +679,11 @@ static void add_pair(struct merge_options *opt,
677679
unsigned content_relevant = (match_mask == 0);
678680
unsigned location_relevant = (dir_rename_mask == 0x07);
679681

680-
if (content_relevant || location_relevant)
681-
strintmap_set(&renames->relevant_sources[side], pathname, 1);
682+
if (content_relevant || location_relevant) {
683+
/* content_relevant trumps location_relevant */
684+
strintmap_set(&renames->relevant_sources[side], pathname,
685+
content_relevant ? RELEVANT_CONTENT : RELEVANT_LOCATION);
686+
}
682687
}
683688

684689
one = alloc_filespec(pathname);

0 commit comments

Comments
 (0)