Patchwork [03,of,12,v2] copies: detect graft-like merges

login
register
mail settings
Submitter Gábor Stefanik
Date Oct. 16, 2016, 3:15 p.m.
Message ID <981a622717343796f65b.1476630940@GSTEFANIK.NavnGo.local>
Download mbox | patch
Permalink /patch/17132/
State Accepted
Headers show

Comments

Gábor Stefanik - Oct. 16, 2016, 3:15 p.m.
# HG changeset patch
# User Gábor Stefanik <gabor.stefanik@nng.com>
# Date 1476316053 -7200
#      Thu Oct 13 01:47:33 2016 +0200
# Node ID 981a622717343796f65b5858f4d4b89f81cb437a
# Parent  7f9a6f30730074c869e5cf9b77c53929b06c4fb3
copies: detect graft-like merges

Right now, nothing changes as a result of this, but we want to handle
grafts differently from ordinary merges later.

(Series developed together with Pierre-Yves David)

Patch

diff -r 7f9a6f307300 -r 981a62271734 mercurial/copies.py
--- a/mercurial/copies.py	Wed Oct 12 12:41:28 2016 +0200
+++ b/mercurial/copies.py	Thu Oct 13 01:47:33 2016 +0200
@@ -321,6 +321,23 @@ 
     if repo.ui.configbool('experimental', 'disablecopytrace'):
         return {}, {}, {}, {}
 
+    # In certain scenarios (e.g. graft, update or rebase), base can be
+    # overridden We still need to know a real common ancestor in this case We
+    # can't just compute _c1.ancestor(_c2) and compare it to ca, because there
+    # can be multiple common ancestors, e.g. in case of bidmerge.  Because our
+    # caller may not know if the revision passed in lieu of the CA is a genuine
+    # common ancestor or not without explicitly checking it, it's better to
+    # determine that here.
+    #
+    # base.descendant(wc) and base.descendant(base) are False, work around that
+    _c1 = c1.p1() if c1.rev() is None else c1
+    _c2 = c2.p1() if c2.rev() is None else c2
+    # an endpoint is "dirty" if it isn't a descendant of the merge base
+    # if we have a dirty endpoint, we need to trigger graft logic, and also
+    # keep track of which endpoint is dirty
+    dirtyc1 = not (base == _c1 or base.descendant(_c1))
+    dirtyc2 = not (base== _c2 or base.descendant(_c2))
+    graft = dirtyc1 or dirtyc2
     limit = _findlimit(repo, c1.rev(), c2.rev())
     if limit is None:
         # no common ancestor, no copies