merge-ort: implement detect_regular_renames()

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>

Elijah Newren committed Dec 14, 2020 at 16:21 UTC f39d05ca2637dfcbf0498824d06e7854427936a5
1 file changed +31 -1
merge-ort.c
+31 -1
@@ -661,7 +661,33 @@ static void detect_regular_renames(struct merge_options *opt,
661 struct tree *side,
662 unsigned side_index)
663 {
664 - die("Not yet implemented.");
664 + struct diff_options diff_opts;
665 + struct rename_info *renames = &opt->priv->renames;
666 +
667 + repo_diff_setup(opt->repo, &diff_opts);
668 + diff_opts.flags.recursive = 1;
669 + diff_opts.flags.rename_empty = 0;
670 + diff_opts.detect_rename = DIFF_DETECT_RENAME;
671 + diff_opts.rename_limit = opt->rename_limit;
672 + if (opt->rename_limit <= 0)
673 + diff_opts.rename_limit = 1000;
674 + diff_opts.rename_score = opt->rename_score;
675 + diff_opts.show_rename_progress = opt->show_rename_progress;
676 + diff_opts.output_format = DIFF_FORMAT_NO_OUTPUT;
677 + diff_setup_done(&diff_opts);
678 + diff_tree_oid(&merge_base->object.oid, &side->object.oid, "",
679 + &diff_opts);
680 + diffcore_std(&diff_opts);
681 +
682 + if (diff_opts.needed_rename_limit > renames->needed_limit)
683 + renames->needed_limit = diff_opts.needed_rename_limit;
684 +
685 + renames->pairs[side_index] = diff_queued_diff;
686 +
687 + diff_opts.output_format = DIFF_FORMAT_NO_OUTPUT;
688 + diff_queued_diff.nr = 0;
689 + diff_queued_diff.queue = NULL;
690 + diff_flush(&diff_opts);
691 }
692
693 /*
@@ -1406,6 +1432,10 @@ void merge_switch_to_result(struct merge_options *opt,
1432 printf("%s", sb->buf);
1433 }
1434 string_list_clear(&olist, 0);
1435 +
1436 + /* Also include needed rename limit adjustment now */
1437 + diff_warn_rename_limit("merge.renamelimit",
1438 + opti->renames.needed_limit, 0);
1439 }
1440
1441 merge_finalize(opt, result);