]> git.ipfire.org Git - thirdparty/git.git/commitdiff
merge-ort: implement detect_regular_renames()
authorElijah Newren <newren@gmail.com>
Mon, 14 Dec 2020 16:21:32 +0000 (16:21 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 14 Dec 2020 16:45:59 +0000 (08:45 -0800)
Based heavily on merge-recursive's get_diffpairs() function, and also
includes the necessary paired call to diff_warn_rename_limit() so that
users will be warned if merge.renameLimit is not sufficiently large for
rename detection to run.

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
merge-ort.c

index 8552f5e23185b9f8eb358b7087bc04508dc728b6..66f84d39b436ace1d83ef0dd3e9f85ff05906218 100644 (file)
@@ -661,7 +661,33 @@ static void detect_regular_renames(struct merge_options *opt,
                                   struct tree *side,
                                   unsigned side_index)
 {
-       die("Not yet implemented.");
+       struct diff_options diff_opts;
+       struct rename_info *renames = &opt->priv->renames;
+
+       repo_diff_setup(opt->repo, &diff_opts);
+       diff_opts.flags.recursive = 1;
+       diff_opts.flags.rename_empty = 0;
+       diff_opts.detect_rename = DIFF_DETECT_RENAME;
+       diff_opts.rename_limit = opt->rename_limit;
+       if (opt->rename_limit <= 0)
+               diff_opts.rename_limit = 1000;
+       diff_opts.rename_score = opt->rename_score;
+       diff_opts.show_rename_progress = opt->show_rename_progress;
+       diff_opts.output_format = DIFF_FORMAT_NO_OUTPUT;
+       diff_setup_done(&diff_opts);
+       diff_tree_oid(&merge_base->object.oid, &side->object.oid, "",
+                     &diff_opts);
+       diffcore_std(&diff_opts);
+
+       if (diff_opts.needed_rename_limit > renames->needed_limit)
+               renames->needed_limit = diff_opts.needed_rename_limit;
+
+       renames->pairs[side_index] = diff_queued_diff;
+
+       diff_opts.output_format = DIFF_FORMAT_NO_OUTPUT;
+       diff_queued_diff.nr = 0;
+       diff_queued_diff.queue = NULL;
+       diff_flush(&diff_opts);
 }
 
 /*
@@ -1406,6 +1432,10 @@ void merge_switch_to_result(struct merge_options *opt,
                        printf("%s", sb->buf);
                }
                string_list_clear(&olist, 0);
+
+               /* Also include needed rename limit adjustment now */
+               diff_warn_rename_limit("merge.renamelimit",
+                                      opti->renames.needed_limit, 0);
        }
 
        merge_finalize(opt, result);