phases: basic I/O logic
Add function to read and write phase roots. Add a _phaseroots filecache on
localrepo class to access the phaseroots data.
--- a/mercurial/localrepo.py Thu Nov 03 23:49:14 2011 +0100
+++ b/mercurial/localrepo.py Fri Nov 04 00:16:24 2011 +0100
@@ -8,7 +8,7 @@
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
@@ -170,6 +170,10 @@
def _writebookmarks(self, marks):
bookmarks.write(self)
+ @filecache('phaseroots')
+ def _phaseroots(self):
+ return phases.readroots(self)
+
@filecache('00changelog.i', True)
def changelog(self):
c = changelog.changelog(self.sopener)
--- a/mercurial/phases.py Thu Nov 03 23:49:14 2011 +0100
+++ b/mercurial/phases.py Fri Nov 04 00:16:24 2011 +0100
@@ -7,5 +7,33 @@
# 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, bin, hex
+
allphases = range(2)
trackedphases = allphases[1:]
+
+def readroots(repo):
+ """Read phase roots from disk"""
+ roots = [set() for i in allphases]
+ roots[0].add(nullid)
+ try:
+ f = repo.sopener('phaseroots')
+ try:
+ for line in f:
+ phase, nh = line.strip().split()
+ roots[int(phase)].add(bin(nh))
+ finally:
+ f.close()
+ except IOError:
+ pass # default value are enough
+ return roots
+
+def writeroots(repo):
+ """Write phase roots from disk"""
+ f = repo.sopener('phaseroots', 'w', atomictemp=True)
+ try:
+ for phase, roots in enumerate(repo._phaseroots):
+ for h in roots:
+ f.write('%i %s\n' % (phase, hex(h)))
+ finally:
+ f.close()