merge: add an internal:merge3 tool
This variant gives access to a feature already present in ``internal:merge``:
displaying merge base content.
In the basic merge (calling ``hg merge``) case, including more context to the
merge markers is an interesting addition.
But this extra information is the only viable option in case conflict from
grafting (, rebase, etc…).
When grafting ``source`` on ``destination``, the parent of ``source`` is
used as the ``base``. When all three changesets add content in the same
location, the marker for ``source`` will contains both ``base`` and ``source``
content. Without the content of base exposed, there is no way for the user
to discriminate content coming from ``base`` and content commit from ``source``.
Practical example (all addition are in the same place):
* ``destination`` adds ``Dest-Content``
* ``base`` adds ``Base-Content``
* ``source`` adds ``Src-Content``
Grafting ``source`` on ``destination`` will produce the following conflict:
<<<<<<< destination
Dest-Content
=======
Base-Content
Src-Content
>>>>>>> source
This that case there is no way to distinct ``base`` from ``source``. As a result
content from ``base`` are likely to slip in the resolution result.
However, adding the base make the situation very clear:
<<<<<<< destination
Dest-Content
||||||| base
Base-Content
======= base
Base-Content
Src-Content
>>>>>>> source
Once the base is added, the addition from the grafted changeset is made clear.
User can compare the content from ``base`` and ``source`` to make an enlightened
decision during merge resolution.
--- a/mercurial/filemerge.py Tue Aug 05 15:09:54 2014 -0700
+++ b/mercurial/filemerge.py Tue Aug 05 14:58:45 2014 -0700
@@ -223,6 +223,21 @@
return True, r
return False, 0
+@internaltool('merge3', True,
+ _("merging %s incomplete! "
+ "(edit conflicts, then use 'hg resolve --mark')\n"))
+def _imerge3(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
+ """
+ Uses the internal non-interactive simple merge algorithm for merging
+ files. It will fail if there are any conflicts and leave markers in
+ the partially merged file. Marker will have three sections, one from each
+ side of the merge and one for the base content."""
+ if not labels:
+ labels = _defaultconflictlabels
+ if len(labels) < 3:
+ labels.append('base')
+ return _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels)
+
@internaltool('tagmerge', True,
_("automatic tag merging of %s failed! "
"(use 'hg resolve --tool internal:merge' or another merge "
--- a/tests/test-conflict.t Tue Aug 05 15:09:54 2014 -0700
+++ b/tests/test-conflict.t Tue Aug 05 14:58:45 2014 -0700
@@ -198,3 +198,37 @@
5
>>>>>>> other
Hop we are done.
+
+internal:merge3
+
+ $ hg up -q --clean .
+
+ $ hg merge 1 --tool internal:merge3
+ merging a
+ warning: conflicts during merge.
+ merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ [1]
+ $ cat a
+ Small Mathematical Series.
+ <<<<<<< local
+ 1
+ 2
+ 3
+ 6
+ 8
+ ||||||| base
+ One
+ Two
+ Three
+ Four
+ Five
+ =======
+ 1
+ 2
+ 3
+ 4
+ 5
+ >>>>>>> other
+ Hop we are done.