changeset 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 b429e97666fd
children 18a961672a72
files hgsubversion/maps.py hgsubversion/replay.py hgsubversion/stupid.py hgsubversion/svncommands.py hgsubversion/svnmeta.py hgsubversion/wrappers.py
diffstat 6 files changed, 45 insertions(+), 21 deletions(-) [+]
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)
--- a/hgsubversion/replay.py
+++ b/hgsubversion/replay.py
@@ -65,13 +65,13 @@ def _convert_rev(ui, meta, svn, r, tbdel
     editor.current.rev = r
     editor.setsvn(svn)
 
-    if firstrun and meta.firstpulled <= 0:
+    if firstrun and meta.revmap.firstpulled <= 0:
         # We know nothing about this project, so fetch everything before
         # trying to apply deltas.
         ui.debug('replay: fetching full revision\n')
         svn.get_revision(r.revnum, editor)
     else:
-        svn.get_replay(r.revnum, editor, meta.firstpulled)
+        svn.get_replay(r.revnum, editor, meta.revmap.firstpulled)
     editor.close()
 
     current = editor.current
--- a/hgsubversion/stupid.py
+++ b/hgsubversion/stupid.py
@@ -708,7 +708,7 @@ def convert_rev(ui, meta, svn, r, tbdelt
         # path does not support this case with svn >= 1.7. We can fix
         # it, or we can force the existing fetch_branchrev() path. Do
         # the latter for now.
-        incremental = (meta.firstpulled > 0 and
+        incremental = (meta.revmap.firstpulled > 0 and
                        parentctx.rev() != node.nullrev and
                        not firstrun)
 
--- a/hgsubversion/svncommands.py
+++ b/hgsubversion/svncommands.py
@@ -136,7 +136,6 @@ def _buildmeta(ui, repo, args, partial=F
             else:
                 closed.add(parentctx.rev())
 
-    meta.lastpulled = youngest
     ui.progress('prepare', None, total=numrevs)
 
     revmapbuf = []
@@ -276,7 +275,7 @@ def _buildmeta(ui, repo, args, partial=F
                                   int(parentrev),
                                   revision)
 
-    revmap.batchset(revmapbuf)
+    revmap.batchset(revmapbuf, youngest)
     ui.progress('rebuild', None, total=numrevs)
 
     # save off branch info
--- a/hgsubversion/svnmeta.py
+++ b/hgsubversion/svnmeta.py
@@ -27,7 +27,6 @@ class SVNMeta(object):
         self.ui = repo.ui
         self.repo = repo
         self.path = os.path.normpath(repo.join('..'))
-        self.firstpulled = 0
         self.lastdate = '1970-01-01 00:00:00 -0000'
         self.addedtags = {}
         self.deletedtags = {}
@@ -52,7 +51,6 @@ class SVNMeta(object):
         self.subdir = subdir
 
         # generated properties that have a persistent file stored on disk
-        self._gen_cachedconfig('lastpulled', 0, configname=False)
         self._gen_cachedconfig('defaultauthors', True)
         self._gen_cachedconfig('caseignoreauthors', False)
         self._gen_cachedconfig('mapauthorscmd', None)
@@ -70,7 +68,7 @@ class SVNMeta(object):
         """Return a cached value for a config option. If the cache is uninitialized
         then try to read its value from disk. Option can be overridden by the
         commandline.
-            name: property name, e.g. 'lastpulled'
+            name: property name, e.g. 'defaultauthors'
             filename: name of file in .hg/svn
             configname: commandline option name
             default: default value
--- a/hgsubversion/wrappers.py
+++ b/hgsubversion/wrappers.py
@@ -103,7 +103,7 @@ def incoming(orig, ui, repo, origsource=
     meta = repo.svnmeta(svn.uuid, svn.subdir)
 
     ui.status('incoming changes from %s\n' % other.svnurl)
-    svnrevisions = list(svn.revisions(start=meta.lastpulled))
+    svnrevisions = list(svn.revisions(start=meta.revmap.lastpulled))
     if opts.get('newest_first'):
         svnrevisions.reverse()
     # Returns 0 if there are incoming changes, 1 otherwise.
@@ -419,7 +419,7 @@ def pull(repo, source, heads=[], force=F
             meta.branchmap['default'] = meta.branch
 
         ui = repo.ui
-        start = meta.lastpulled
+        start = meta.revmap.lastpulled
 
         if start <= 0:
             # we are initializing a new repository
@@ -512,7 +512,7 @@ def pull(repo, source, heads=[], force=F
         util.swap_out_encoding(old_encoding)
 
     if lastpulled is not None:
-        meta.lastpulled = lastpulled
+        meta.revmap.lastpulled = lastpulled
     revisions = len(meta.revmap) - oldrevisions
 
     if revisions == 0: