Patchwork [3,of,3] : merge: when merging with ancestor, move active bookmark and update

login
register
mail settings
Submitter Waldemar Kornewald
Date Nov. 8, 2015, 12:19 a.m.
Message ID <CAA5tf+-g3+1SMXgLkmBSOXiDAHsFG11bFgiKH=0uK1LKf7qVxA@mail.gmail.com>
Download mbox | patch
Permalink /patch/11325/
State Changes Requested
Headers show

Comments

Waldemar Kornewald - Nov. 8, 2015, 12:19 a.m.
# HG changeset patch
# User Waldemar Kornewald <wkornewald>
# Date 1446936643 -3600
#      Sat Nov 07 23:50:43 2015 +0100
# Node ID 22af720813819806077417102c1a21fc9d7f266c
# Parent  f9984f76fd90e439221425d751e29bae17bec995
merge: when merging with ancestor, move active bookmark and update

From the perspective of the "branching" concept (implemented in hg through
bookmarks), merging actually means "import those changes into my branch".

The old behavior was confusing and inconsistent:

A merge with a different head would import as expected.
A merge with an ancestor would fail with an error.

We now deal with the second case (ancestor merge) differently:
In order to comply with the merging=importing idea, we simply move the
bookmark forward to the ancestor revision and do an update.

     onode = node
@@ -1176,6 +1180,12 @@
                                    " has no effect"))
             elif pas == [p1]:
                 if not mergeancestor and p1.branch() == p2.branch():
+                    if repo._activebookmark:
+                        active = repo[repo._activebookmark].node()
+                        stats = hg.updaterepo(repo, node, False)
+                        bookmarks.update(repo, [active], node)
+                        return stats
+
                     raise error.Abort(_("nothing to merge"),
                                      hint=_("use 'hg update' "
                                             "or check 'hg heads'"))
@@ -1190,7 +1200,7 @@
                 # call the hooks and exit early
                 repo.hook('preupdate', throw=True, parent1=xp2, parent2='')
                 repo.hook('update', parent1=xp2, parent2='', error=0)
-                return 0, 0, 0, 0
+                return 0, 0, 0, 0, branchmerge

             if pas not in ([p1], [p2]):  # nonlinear
                 dirty = wc.dirty(missing=True)
@@ -1277,6 +1287,7 @@
             repo.vfs.write('updatestate', p2.hex())

         stats = applyupdates(repo, actions, wc, p2, overwrite, labels=labels)
+        stats += (branchmerge,)

         # divergent renames
         for f, fl in sorted(diverge.iteritems()):

Patch

diff -r f9984f76fd90 -r 22af72081381 mercurial/hg.py
--- a/mercurial/hg.py Wed Nov 04 15:17:52 2015 -0600
+++ b/mercurial/hg.py Sat Nov 07 23:50:43 2015 +0100
@@ -620,7 +620,7 @@ 

 def _showstats(repo, stats):
     repo.ui.status(_("%d files updated, %d files merged, "
-                     "%d files removed, %d files unresolved\n") % stats)
+                     "%d files removed, %d files unresolved\n") % stats[:4])

 def updaterepo(repo, node, overwrite):
     """Update the working directory to node.
@@ -658,7 +658,7 @@ 
     if stats[3]:
         repo.ui.status(_("use 'hg resolve' to retry unresolved file merges "
                          "or 'hg update -C .' to abandon\n"))
-    elif remind:
+    elif remind and stats[4]:
         repo.ui.status(_("(branch merge, don't forget to commit)\n"))
     return stats[3] > 0

diff -r f9984f76fd90 -r 22af72081381 mercurial/merge.py
--- a/mercurial/merge.py Wed Nov 04 15:17:52 2015 -0600
+++ b/mercurial/merge.py Sat Nov 07 23:50:43 2015 +0100
@@ -20,10 +20,12 @@ 
     nullrev,
 )
 from . import (
+    bookmarks,
     copies,
     destutil,
     error,
     filemerge,
+    hg,
     obsolete,
     subrepo,
     util,
@@ -1135,7 +1137,9 @@ 
     4 = abort: uncommitted changes (checked in commands.py)
     5 = incompatible options (checked in commands.py)

-    Return the same tuple as applyupdates().
+    Return the same tuple as applyupdates(), plus an extra bool entry
at the end
+    that is True if we've done a merge and a commit is necessary. No commit is
+    needed when a merge just moves a bookmark.
     """