[PATCH 1 of 3] obsolete: move obsolete markers read/write logic to obsstore object

Pierre-Yves David pierre-yves.david at ens-lyon.org
Tue Jul 3 19:26:11 CDT 2012


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
# Date 1341360036 -7200
# Node ID f7efc57ef2e61b94028726e5887ce97d159c2524
# Parent  f7a2849ef8cdd0ff3662b300702e40d55109d49b
obsolete: move obsolete markers read/write logic to obsstore object

This is the first step toward incremental writing of obsolete marker within a
transaction.

For this purpose, obsstore is now given its repo sopener. This make it able to
handles read and write to the obsstore file itself. Most IO logic is removed
from localrepo and handled by obsstore object directly.

diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -193,10 +193,7 @@
 
     @storecache('obsstore')
     def obsstore(self):
-        store = obsolete.obsstore()
-        data = self.sopener.tryread('obsstore')
-        if data:
-            store.loadmarkers(data)
+        store = obsolete.obsstore(self.sopener)
         return store
 
     @storecache('00changelog.i')
@@ -990,16 +987,8 @@
             self.store.write()
             if '_phasecache' in vars(self):
                 self._phasecache.write()
-            if 'obsstore' in vars(self) and self.obsstore._new:
-                # XXX: transaction logic should be used here. But for
-                # now rewriting the whole file is good enough.
-                f = self.sopener('obsstore', 'wb', atomictemp=True)
-                try:
-                    self.obsstore.flushmarkers(f)
-                    f.close()
-                except: # re-raises
-                    f.discard()
-                    raise
+            if 'obsstore' in vars(self):
+                self.obsstore.flushmarkers()
             for k, ce in self._filecache.items():
                 if k == 'dirstate':
                     continue
diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py
--- a/mercurial/obsolete.py
+++ b/mercurial/obsolete.py
@@ -156,12 +156,17 @@
     - successors: new -> set(old)
     """
 
-    def __init__(self):
+    def __init__(self, sopener):
         self._all = []
         # new markers to serialize
         self._new = []
         self.precursors = {}
         self.successors = {}
+        self.sopener = sopener
+        data = sopener.tryread('obsstore')
+        if data:
+            for marker in _readmarkers(data):
+                self._load(marker)
 
     def __iter__(self):
         return iter(self._all)
@@ -193,11 +198,6 @@
         self._new.append(marker)
         self._load(marker)
 
-    def loadmarkers(self, data):
-        """Load all markers in data, mark them as known."""
-        for marker in _readmarkers(data):
-            self._load(marker)
-
     def mergemarkers(self, data):
         other = set(_readmarkers(data))
         local = set(self._all)
@@ -205,12 +205,21 @@
         for marker in new:
             self.add(marker)
 
-    def flushmarkers(self, stream):
-        """Write all markers to a stream
+    def flushmarkers(self):
+        """Write all markers on disk
 
         After this operation, "new" markers are considered "known"."""
-        self._writemarkers(stream)
-        self._new[:] = []
+        if self._new:
+            # XXX: transaction logic should be used here. But for
+            # now rewriting the whole file is good enough.
+            f = self.sopener('obsstore', 'wb', atomictemp=True)
+            try:
+                self._writemarkers(f)
+                f.close()
+                self._new[:] = []
+            except: # re-raises
+                f.discard()
+                raise
 
     def _load(self, marker):
         self._all.append(marker)


More information about the Mercurial-devel mailing list