diff hgsubversion/maps.py @ 1434:0a6b3da6d34c

RevMap: move lastpulled from SVNMeta down into RevMap There was a conceptual cycle present between the revmap and the meta object caused by this layering, which is nicely resolved by moving the lastpulled information down into the revmap. RevMap no longer makes use of meta outside the constructor, which is great progress.
author Augie Fackler <raf@durin42.com>
date Sun, 05 Jun 2016 21:18:23 -0400
parents a2ef2c1e3644
children 18a961672a72
line wrap: on
line diff
--- a/hgsubversion/maps.py
+++ b/hgsubversion/maps.py
@@ -348,15 +348,35 @@ class RevMap(dict):
 
     def __init__(self, meta):
         dict.__init__(self)
-        self.meta = meta
         self._filepath = meta.revmap_file
+        self._lastpulled_file = os.path.join(meta.metapath, 'lastpulled')
         self._hashes = None
 
+        self.firstpulled = 0
+        if os.path.exists(self._lastpulled_file):
+            with open(self._lastpulled_file) as f:
+                self._lastpulled = int(f.read())
+        else:
+            self._lastpulled = 0
+
         if os.path.isfile(self._filepath):
             self._load()
         else:
             self._write()
 
+    def _writelastpulled(self):
+        with open(self._lastpulled_file, 'w') as f:
+            f.write('%d\n' % self.lastpulled)
+
+    @property
+    def lastpulled(self):
+        return self._lastpulled
+
+    @lastpulled.setter
+    def lastpulled(self, value):
+        self._lastpulled = value
+        self._writelastpulled()
+
     def hashes(self):
         if self._hashes is None:
             self._hashes = dict((v, k) for (k, v) in self.iteritems())
@@ -390,7 +410,7 @@ class RevMap(dict):
         dict.clear(self)
         self._hashes = None
 
-    def batchset(self, items):
+    def batchset(self, items, lastpulled):
         '''Set items in batches
 
         items is an array of (rev num, branch, binary hash)
@@ -402,6 +422,8 @@ class RevMap(dict):
         f.write(''.join('%s %s %s\n' % (revnum, hex(binhash), br or '')
                         for revnum, br, binhash in items))
         f.close()
+        with open(self._lastpulled_file, 'w') as f:
+            f.write('%s\n' % lastpulled)
 
     def _readmapfile(self):
         path = self._filepath
@@ -422,8 +444,11 @@ class RevMap(dict):
 
     @util.gcdisable
     def _load(self):
-        lastpulled = self.meta.lastpulled
-        firstpulled = self.meta.firstpulled
+        lastpulled = self.lastpulled
+        firstpulled = self.firstpulled
+        if os.path.exists(self._lastpulled_file):
+            with open(self._lastpulled_file) as f:
+                lastpulled = int(f.read())
         setitem = dict.__setitem__
         for l in self._readmapfile():
             revnum, ha, branch = l.split(' ', 2)
@@ -437,13 +462,15 @@ class RevMap(dict):
             if revnum < firstpulled or not firstpulled:
                 firstpulled = revnum
             setitem(self, (revnum, branch), bin(ha))
-        self.meta.lastpulled = lastpulled
-        self.meta.firstpulled = firstpulled
+        if self.lastpulled != lastpulled:
+            self.lastpulled = lastpulled
+        self.firstpulled = firstpulled
 
     def _write(self):
         f = open(self._filepath, 'w')
         f.write('%s\n' % self.VERSION)
         f.close()
+        self._writelastpulled()
 
     def __setitem__(self, key, ha):
         revnum, branch = key
@@ -451,10 +478,10 @@ class RevMap(dict):
         b = branch or ''
         f.write(str(revnum) + ' ' + hex(ha) + ' ' + b + '\n')
         f.close()
-        if revnum > self.meta.lastpulled or not self.meta.lastpulled:
-            self.meta.lastpulled = revnum
-        if revnum < self.meta.firstpulled or not self.meta.firstpulled:
-            self.meta.firstpulled = revnum
+        if revnum > self.lastpulled or not self.lastpulled:
+            self.lastpulled = revnum
+        if revnum < self.firstpulled or not self.firstpulled:
+            self.firstpulled = revnum
         dict.__setitem__(self, (revnum, branch), ha)
         if self._hashes is not None:
             self._hashes[ha] = (revnum, branch)