[PATCH 2 of 2] filemerge: add non-interactive internal:merge-local and internal:merge-other

Jordi Gutiérrez Hermoso jordigh at octave.org
Sun Aug 24 18:06:40 CDT 2014


# HG changeset patch
# User Jordi Gutiérrez Hermoso <jordigh at octave.org>
# Date 1407783206 14400
#      Mon Aug 11 14:53:26 2014 -0400
# Node ID 87bc71fdf83ba5ba2d85f8cf082819d30b93e31f
# Parent  44ecb51c857da4cbfddcc8c1220747a477a96ac2
filemerge: add non-interactive internal:merge-local and internal:merge-other

There are two non-interactive internal merge tools, internal:other and
internal:local, but they don't really merge, they just pick all
changes from the local or other version of the file. In some
situations, it is known that we want a merge and also know that all
merge conflicts should be resolved in one direction. Although external
merge tools can do this, sometimes it can be convenient to do so from
within hg, without invoking a merge tool. These new
internal:merge-local and internal:merge-other tools can do just that.

diff --git a/mercurial/filemerge.py b/mercurial/filemerge.py
--- a/mercurial/filemerge.py
+++ b/mercurial/filemerge.py
@@ -229,6 +229,40 @@ def _imerge(repo, mynode, orig, fcd, fco
         return True, r
     return False, 0
 
+def _imergeauto(repo, mynode, orig, fcd, fco, fca, toolconf, files,
+                labels=None, localorother=None):
+    """
+    Generic driver for _imergelocal and _imergeother
+    """
+    assert localorother is not None
+    tool, toolpath, binary, symlink = toolconf
+    if symlink:
+        repo.ui.warn(_('warning: internal:merge-%s cannot merge symlinks '
+                       'for %s\n') % (localorother, fcd.path()))
+        return False, 1
+    a, b, c, back = files
+    r = simplemerge.simplemerge(repo.ui, a, b, c, label=labels,
+                                localorother=localorother)
+    return True, r
+
+ at internaltool('merge-local', True)
+def _imergelocal(*args, **kwargs):
+    """
+    Like internal:merge, but resolve all conflicts non-interactively
+    in favor of the local changes.
+    """
+    success, status = _imergeauto(localorother='local', *args, **kwargs)
+    return success, status
+
+ at internaltool('merge-other', True)
+def _imergeother(*args, **kwargs):
+    """
+    Like internal:merge, but resolve all conflicts non-interactively
+    in favor of the other changes.
+    """
+    success, status = _imergeauto(localorother='other', *args, **kwargs)
+    return success, status
+
 @internaltool('merge3', True,
               _("merging %s incomplete! "
                 "(edit conflicts, then use 'hg resolve --mark')\n"))
diff --git a/tests/test-conflict.t b/tests/test-conflict.t
--- a/tests/test-conflict.t
+++ b/tests/test-conflict.t
@@ -232,3 +232,66 @@ internal:merge3
   5
   >>>>>>> other
   Hop we are done.
+
+
+Add some unconflicting changes on each head, to make sure we really
+are merging, unlike internal:local and internal:other
+
+  $ hg up -C
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ printf "\n\nEnd of file\n" >> a
+  $ hg ci -m "Add some stuff at the end"
+  $ hg up -r 1
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ printf "Start of file\n\n\n" > tmp
+  $ cat a >> tmp
+  $ mv tmp a
+  $ hg ci -m "Add some stuff at the beginning"
+
+Now test internal:merge-other and internal:merge-local
+
+  $ hg merge
+  merging a
+  warning: conflicts during merge.
+  merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
+  1 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]
+  $ hg resolve --tool internal:merge-other a
+  merging a
+  (no more unresolved files)
+  $ cat a
+  Start of file
+  
+  
+  Small Mathematical Series.
+  1
+  2
+  3
+  6
+  8
+  Hop we are done.
+  
+  
+  End of file
+
+  $ hg up -C
+  1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  $ hg merge --tool internal:merge-local
+  merging a
+  2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+  $ cat a
+  Start of file
+  
+  
+  Small Mathematical Series.
+  1
+  2
+  3
+  4
+  5
+  Hop we are done.
+  
+  
+  End of file


More information about the Mercurial-devel mailing list