[PATCH 02 of 18] phases: basic I/O logic

pierre-yves.david at logilab.fr pierre-yves.david at logilab.fr
Mon Oct 10 07:27:58 CDT 2011


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
# Date 1318159211 -7200
# Node ID a021813a715118f511262e67a3b80179207efe5b
# Parent  712a670bb8ce039782649741a8c409de66968d42
phases: basic I/O logic

diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -6,11 +6,11 @@
 # GNU General Public License version 2 or any later version.
 
 from node import bin, hex, nullid, nullrev, short
 from i18n import _
 import repo, changegroup, subrepo, discovery, pushkey
-import changelog, dirstate, filelog, manifest, context, bookmarks
+import changelog, dirstate, filelog, manifest, context, bookmarks, phases
 import lock, transaction, store, encoding
 import scmutil, util, extensions, hook, error, revset
 import match as matchmod
 import merge as mergemod
 import tags as tagsmod
@@ -165,10 +165,14 @@ class localrepository(repo.repository):
 
     @filecache('bookmarks.current')
     def _bookmarkcurrent(self):
         return bookmarks.readcurrent(self)
 
+    @filecache('phases-heads')
+    def _phasesheads(self):
+        return phases.readheads(self)
+
     @filecache('00changelog.i', True)
     def changelog(self):
         c = changelog.changelog(self.sopener)
         if 'HG_PENDING' in os.environ:
             p = os.environ['HG_PENDING']
diff --git a/mercurial/phases.py b/mercurial/phases.py
--- a/mercurial/phases.py
+++ b/mercurial/phases.py
@@ -5,7 +5,39 @@
 #                Augie Fackler     <durin42 at gmail.com>
 #
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
+from node import nullid
+
 allphases = range(2)
 trackedphases = allphases[:-1]
+
+### I/O code
+############
+
+def readheads(repo):
+    """Read phrases head from disk"""
+    try:
+        heads = [set()]
+        f = repo.sopener('phrases-heads')
+        try:
+            for line in f:
+                phrase, nh = line.strip().split()
+                heads[int(phrase)].add(bin(nh))
+        finally:
+            f.close()
+    except IOError:
+        pass # gracefully filled bellow
+    if not heads[0]:
+        heads[0].add(nullid)
+    return heads
+
+def writeheads(repo):
+    """Write phrases head from disk"""
+    f = repo.sopener('phrases-heads', 'w', atomictemp=True)
+    try:
+        for phrase, heads in enumerate(repo._phraseheads):
+            for h in heads:
+                f.write('%i %s\n' % (phrase, hex(h)))
+    finally:
+        f.close()


More information about the Mercurial-devel mailing list