]> git.ipfire.org Git - thirdparty/git.git/commitdiff
merge-ort: add initial outline for basic rename detection
authorElijah Newren <newren@gmail.com>
Mon, 14 Dec 2020 16:21:31 +0000 (16:21 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 14 Dec 2020 16:45:58 +0000 (08:45 -0800)
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
merge-ort.c

index 1c1a7fa4bf115c594ba146b809523f11e9c0801e..8552f5e23185b9f8eb358b7087bc04508dc728b6 100644 (file)
@@ -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;
 }