Patchwork [03,of,11] phases: track phase movements in 'advanceboundary'

login
register
mail settings
Submitter Boris Feld
Date July 14, 2017, 1:25 p.m.
Message ID <d578e17d880990375cf6.1500038737@FB>
Download mbox | patch
Permalink /patch/22319/
State Accepted
Headers show

Comments

Boris Feld - July 14, 2017, 1:25 p.m.
# HG changeset patch
# User Boris Feld <boris.feld@octobus.net>
# Date 1499733592 -7200
#      Tue Jul 11 02:39:52 2017 +0200
# Node ID d578e17d880990375cf64d4c026e927987211fe7
# Parent  936da074fe26e45133672419d670febbfdb447a8
# EXP-Topic tr.changes.phases
phases: track phase movements in 'advanceboundary'

Makes advanceboundary record the phase movement of affected revisions in
tr.changes['phases'].

The tracking is not usable yet because the 'retractboundary' function can also
affect phases.

We'll improve that in the coming changesets.

Patch

diff -r 936da074fe26 -r d578e17d8809 mercurial/localrepo.py
--- a/mercurial/localrepo.py	Mon Jul 10 22:18:41 2017 +0200
+++ b/mercurial/localrepo.py	Tue Jul 11 02:39:52 2017 +0200
@@ -1136,6 +1136,7 @@ 
                                      checkambigfiles=_cachedfiles)
         tr.changes['revs'] = set()
         tr.changes['obsmarkers'] = set()
+        tr.changes['phases'] = {}
 
         tr.hookargs['txnid'] = txnid
         # note: writing the fncache only during finalize mean that the file is
diff -r 936da074fe26 -r d578e17d8809 mercurial/phases.py
--- a/mercurial/phases.py	Mon Jul 10 22:18:41 2017 +0200
+++ b/mercurial/phases.py	Tue Jul 11 02:39:52 2017 +0200
@@ -154,6 +154,18 @@ 
         dirty = True
     return roots, dirty
 
+def _trackphasechange(data, rev, old, new):
+    """add a phase move the <data> dictionnary
+
+    If data is None, nothing happens.
+    """
+    if data is None:
+        return
+    existing = data.get(rev)
+    if existing is not None:
+        old = existing[0]
+    data[rev] = (old, new)
+
 class phasecache(object):
     def __init__(self, repo, phasedefaults, _load=True):
         if _load:
@@ -289,8 +301,13 @@ 
         """
         # Be careful to preserve shallow-copied values: do not update
         # phaseroots values, replace them.
+        if tr is None:
+            phasetracking = None
+        else:
+            phasetracking = tr.changes.get('phases')
 
         repo = repo.unfiltered()
+
         delroots = [] # set of root deleted by this path
         for phase in xrange(targetphase + 1, len(allphases)):
             # filter nodes that are not in a compatible phase already
@@ -300,7 +317,11 @@ 
                 break # no roots to move anymore
 
             olds = self.phaseroots[phase]
+
             affected = repo.revs('%ln::%ln', olds, nodes)
+            for r in affected:
+                _trackphasechange(phasetracking, r, self.phase(repo, r),
+                                  targetphase)
 
             roots = set(ctx.node() for ctx in repo.set(
                     'roots((%ln::) - %ld)', olds, affected))