]> git.ipfire.org Git - thirdparty/git.git/commitdiff
merge-ort: add implementation of normal rename handling
authorElijah Newren <newren@gmail.com>
Tue, 15 Dec 2020 18:28:05 +0000 (18:28 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 16 Dec 2020 01:18:32 +0000 (17:18 -0800)
Implement handling of normal renames.  This code replaces the following
from merge-recurisve.c:

  * the code relevant to RENAME_NORMAL in process_renames()
  * the RENAME_NORMAL case of process_entry()

Also, there is some shared code from merge-recursive.c for multiple
different rename cases which we will no longer need for this case (or
other rename cases):

  * handle_rename_normal()
  * setup_rename_conflict_info()

The consolidation of four separate codepaths into one is made possible
by a change in design: process_renames() tweaks the conflict_info
entries within opt->priv->paths such that process_entry() can then
handle all the non-rename conflict types (directory/file, modify/delete,
etc.) orthogonally.  This means we're much less likely to miss special
implementation of some kind of combination of conflict types (see
commits brought in by 66c62eaec6 ("Merge branch 'en/merge-tests'",
2020-11-18), especially commit ef52778708 ("merge tests: expect improved
directory/file conflict handling in ort", 2020-10-26) for more details).
That, together with letting worktree/index updating be handled
orthogonally in the merge_switch_to_result() function, dramatically
simplifies the code for various special rename cases.

(To be fair, the code for handling normal renames wasn't all that
complicated beforehand, but it's still much simpler now.)

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

index 1c5b2f7e3b9aa9ac3ff9c93f52d3d5641863f194..26f357e524f960e88caebc3fc974eb9b09eb74a3 100644 (file)
@@ -870,7 +870,11 @@ static int process_renames(struct merge_options *opt,
                                         rename_branch, delete_branch);
                        } else {
                                /* normal rename */
-                               die("Not yet implemented");
+                               memcpy(&newinfo->stages[other_source_index],
+                                      &oldinfo->stages[other_source_index],
+                                      sizeof(newinfo->stages[0]));
+                               newinfo->filemask |= (1 << other_source_index);
+                               newinfo->pathnames[other_source_index] = oldpath;
                        }
                }