summaryrefslogtreecommitdiff
path: root/merge-ort.c
diff options
context:
space:
mode:
authorElijah Newren <newren@gmail.com>2021-01-07 21:35:49 (GMT)
committerJunio C Hamano <gitster@pobox.com>2021-01-07 23:30:02 (GMT)
commitc09376d55ff41128f3966609e1c4edf3e9fee840 (patch)
tree898b23ed469371cbadb7dca9c02c96b77dcf170a /merge-ort.c
parent8f894b22636d5d0cdfca0ae5fd88d327cc3349b3 (diff)
downloadgit-c09376d55ff41128f3966609e1c4edf3e9fee840.zip
git-c09376d55ff41128f3966609e1c4edf3e9fee840.tar.gz
git-c09376d55ff41128f3966609e1c4edf3e9fee840.tar.bz2
merge-ort: add new data structures for directory rename detection
Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'merge-ort.c')
-rw-r--r--merge-ort.c34
1 files changed, 31 insertions, 3 deletions
diff --git a/merge-ort.c b/merge-ort.c
index d36a92b..652ff73 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -50,14 +50,42 @@ enum merge_side {
struct rename_info {
/*
+ * All variables that are arrays of size 3 correspond to data tracked
+ * for the sides in enum merge_side. Index 0 is almost always unused
+ * because we often only need to track information for MERGE_SIDE1 and
+ * MERGE_SIDE2 (MERGE_BASE can't have rename information since renames
+ * are determined relative to what changed since the MERGE_BASE).
+ */
+
+ /*
* pairs: pairing of filenames from diffcore_rename()
- *
- * Index 1 and 2 correspond to sides 1 & 2 as used in
- * conflict_info.stages. Index 0 unused.
*/
struct diff_queue_struct pairs[3];
/*
+ * dirs_removed: directories removed on a given side of history.
+ */
+ struct strset dirs_removed[3];
+
+ /*
+ * dir_rename_count: tracking where parts of a directory were renamed to
+ *
+ * When files in a directory are renamed, they may not all go to the
+ * same location. Each strmap here tracks:
+ * old_dir => {new_dir => int}
+ * That is, dir_rename_count[side] is a strmap to a strintmap.
+ */
+ struct strmap dir_rename_count[3];
+
+ /*
+ * dir_renames: computed directory renames
+ *
+ * This is a map of old_dir => new_dir and is derived in part from
+ * dir_rename_count.
+ */
+ struct strmap dir_renames[3];
+
+ /*
* needed_limit: value needed for inexact rename detection to run
*
* If the current rename limit wasn't high enough for inexact