summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Elijah Newren <newren@gmail.com>2021-03-13 22:22:07 +0000
committerLibravatar Junio C Hamano <gitster@pobox.com>2021-03-18 14:32:56 -0700
commitec59da6015c457e84953a802fc6484ae2da2d774 (patch)
tree7fd53279daab6f796b5c7d5422c13e34d9ab76e2
parentdiffcore-rename: add computation of number of unknown renames (diff)
downloadtgif-ec59da6015c457e84953a802fc6484ae2da2d774.tar.xz
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 <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--diffcore.h6
-rw-r--r--merge-ort.c15
2 files changed, 16 insertions, 5 deletions
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);