summaryrefslogtreecommitdiff
path: root/merge-ort.c
diff options
context:
space:
mode:
authorElijah Newren <newren@gmail.com>2020-12-14 16:21:31 (GMT)
committerJunio C Hamano <gitster@pobox.com>2020-12-14 16:45:58 (GMT)
commite1a124e8dc3d21afedc80cc2842d705c1d5a90c9 (patch)
treed1815f3d4adc30df31e78b453810c8a68e01fdaa /merge-ort.c
parent864075ec433644e5908589fe79f8b3296f896867 (diff)
downloadgit-e1a124e8dc3d21afedc80cc2842d705c1d5a90c9.zip
git-e1a124e8dc3d21afedc80cc2842d705c1d5a90c9.tar.gz
git-e1a124e8dc3d21afedc80cc2842d705c1d5a90c9.tar.bz2
merge-ort: add initial outline for basic 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.c68
1 files changed, 60 insertions, 8 deletions
diff --git a/merge-ort.c b/merge-ort.c
index 1c1a7fa..8552f5e 100644
--- a/merge-ort.c
+++ b/merge-ort.c
@@ -644,20 +644,72 @@ static int handle_content_merge(struct merge_options *opt,
/*** Function Grouping: functions related to regular rename detection ***/
+static int process_renames(struct merge_options *opt,
+ struct diff_queue_struct *renames)
+{
+ die("Not yet implemented.");
+}
+
+static int compare_pairs(const void *a_, const void *b_)
+{
+ die("Not yet implemented.");
+}
+
+/* Call diffcore_rename() to compute which files have changed on given side */
+static void detect_regular_renames(struct merge_options *opt,
+ struct tree *merge_base,
+ struct tree *side,
+ unsigned side_index)
+{
+ die("Not yet implemented.");
+}
+
+/*
+ * Get information of all renames which occurred in 'side_pairs', discarding
+ * non-renames.
+ */
+static int collect_renames(struct merge_options *opt,
+ struct diff_queue_struct *result,
+ unsigned side_index)
+{
+ die("Not yet implemented.");
+}
+
static int detect_and_process_renames(struct merge_options *opt,
struct tree *merge_base,
struct tree *side1,
struct tree *side2)
{
- int clean = 1;
+ struct diff_queue_struct combined;
+ struct rename_info *renames = &opt->priv->renames;
+ int s, clean = 1;
+
+ memset(&combined, 0, sizeof(combined));
+
+ detect_regular_renames(opt, merge_base, side1, MERGE_SIDE1);
+ detect_regular_renames(opt, merge_base, side2, MERGE_SIDE2);
+
+ ALLOC_GROW(combined.queue,
+ renames->pairs[1].nr + renames->pairs[2].nr,
+ combined.alloc);
+ clean &= collect_renames(opt, &combined, MERGE_SIDE1);
+ clean &= collect_renames(opt, &combined, MERGE_SIDE2);
+ QSORT(combined.queue, combined.nr, compare_pairs);
+
+ clean &= process_renames(opt, &combined);
+
+ /* Free memory for renames->pairs[] and combined */
+ for (s = MERGE_SIDE1; s <= MERGE_SIDE2; s++) {
+ free(renames->pairs[s].queue);
+ DIFF_QUEUE_CLEAR(&renames->pairs[s]);
+ }
+ if (combined.nr) {
+ int i;
+ for (i = 0; i < combined.nr; i++)
+ diff_free_filepair(combined.queue[i]);
+ free(combined.queue);
+ }
- /*
- * Rename detection works by detecting file similarity. Here we use
- * a really easy-to-implement scheme: files are similar IFF they have
- * the same filename. Therefore, by this scheme, there are no renames.
- *
- * TODO: Actually implement a real rename detection scheme.
- */
return clean;
}