Patchwork [2,of,6,V2] simplermerge: support three label when merging

login
register
mail settings
Submitter Pierre-Yves David
Date Aug. 5, 2014, 11:30 p.m.
Message ID <e6fa924a5144ddfeddd4.1407281442@marginatus.alto.octopoid.net>
Download mbox | patch
Permalink /patch/5268/
State Accepted
Headers show

Comments

Pierre-Yves David - Aug. 5, 2014, 11:30 p.m.
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david@fb.com>
# Date 1407276650 25200
#      Tue Aug 05 15:10:50 2014 -0700
# Node ID e6fa924a5144ddfeddd4a7c2e9b26af694eef53c
# Parent  3630e859cb13ace36f3171142732dc8718d62979
simplermerge: support three label when merging

If a third label is provided it will be used for the "base" content:

  <<<<<<< local
  content
  from
  local
  ||||||| base
  former
  common
  =======
  other
  conflicting
  >>>>>>> other

Patch

diff --git a/mercurial/simplemerge.py b/mercurial/simplemerge.py
--- a/mercurial/simplemerge.py
+++ b/mercurial/simplemerge.py
@@ -377,17 +377,20 @@  def simplemerge(ui, local, base, other, 
                 raise util.Abort(msg)
         return text
 
     name_a = local
     name_b = other
+    name_base = None
     labels = opts.get('label', [])
     if len(labels) > 0:
         name_a = labels[0]
     if len(labels) > 1:
         name_b = labels[1]
     if len(labels) > 2:
-        raise util.Abort(_("can only specify two labels."))
+        name_base = labels[2]
+    if len(labels) > 3:
+        raise util.Abort(_("can only specify three labels."))
 
     try:
         localtext = readfile(local)
         basetext = readfile(base)
         othertext = readfile(other)
@@ -400,11 +403,15 @@  def simplemerge(ui, local, base, other, 
         out = opener(os.path.basename(local), "w", atomictemp=True)
     else:
         out = sys.stdout
 
     m3 = Merge3Text(basetext, localtext, othertext)
-    for line in m3.merge_lines(name_a=name_a, name_b=name_b):
+    extrakwargs = {}
+    if name_base is not None:
+        extrakwargs['base_marker'] = '|||||||'
+        extrakwargs['name_base'] = name_base
+    for line in m3.merge_lines(name_a=name_a, name_b=name_b, **extrakwargs):
         out.write(line)
 
     if not opts.get('print'):
         out.close()
 
diff --git a/tests/test-contrib.t b/tests/test-contrib.t
--- a/tests/test-contrib.t
+++ b/tests/test-contrib.t
@@ -182,14 +182,29 @@  2 labels
   end
   >>>>>>> bar
   warning: conflicts during merge.
   [1]
 
+3 labels
+
+  $ python simplemerge -p -L foo -L bar -L base conflict-local base conflict-other
+  base
+  <<<<<<< foo
+  not other
+  end
+  ||||||| base
+  =======
+  other
+  end
+  >>>>>>> bar
+  warning: conflicts during merge.
+  [1]
+
 too many labels
 
-  $ python simplemerge -p -L foo -L bar -L baz conflict-local base conflict-other
-  abort: can only specify two labels.
+  $ python simplemerge -p -L foo -L bar -L baz -L buz conflict-local base conflict-other
+  abort: can only specify three labels.
   [255]
 
 binary file
 
   $ python -c "f = file('binary-local', 'w'); f.write('\x00'); f.close()"