Rev 1558: Cache revid results properly. in file:///data/jelmer/bzr-svn/pushmerged/

Jelmer Vernooij jelmer at samba.org
Sun Aug 3 17:41:49 BST 2008


At file:///data/jelmer/bzr-svn/pushmerged/

------------------------------------------------------------
revno: 1558
revision-id: jelmer at samba.org-20080803164148-ilobgwf4nd7lce9s
parent: jelmer at samba.org-20080803155905-dk9t1da9cjr4aviy
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: pushmerged
timestamp: Sun 2008-08-03 18:41:48 +0200
message:
  Cache revid results properly.
modified:
  revids.py                      revids.py-20070416220458-36vfa0730cchevp1-1
=== modified file 'revids.py'
--- a/revids.py	2008-08-03 15:59:05 +0000
+++ b/revids.py	2008-08-03 16:41:48 +0000
@@ -64,7 +64,8 @@
 
         for entry_revid, branch, revno, mapping in self.discover_revids(layout, 0, self.repos.get_latest_revnum()):
             if revid == entry_revid:
-                return self.bisect_revid_revnum(revid, branch, 0, revno)
+                (bp, revnum, scheme) = self.bisect_revid_revnum(revid, branch, 0, revno)
+                return (bp, revnum, BzrSvnMappingv3FileProps(scheme))
         raise NoSuchRevision(self, revid)
 
     def discover_revids(self, layout, from_revnum, to_revnum):
@@ -93,6 +94,14 @@
                 yield (entry_revid, branch, revno, BzrSvnMappingv3FileProps(BranchingScheme.find_scheme(scheme)))
 
     def bisect_revid_revnum(self, revid, branch_path, min_revnum, max_revnum):
+        """Find out what the actual revnum was that corresponds to a revid.
+
+        :param revid: Revision id to search for
+        :param branch_path: Branch path at which to start searching
+        :param min_revnum: Last revnum to check
+        :param max_revnum: First revnum to check
+        :return: Tuple with actual branchpath, revnum and scheme
+        """
         assert min_revnum <= max_revnum
         # Find the branch property between min_revnum and max_revnum that 
         # added revid
@@ -111,7 +120,7 @@
                     scheme = BranchingScheme.find_scheme(propname[len(SVN_PROP_BZR_REVISION_ID):])
                     assert (scheme.is_tag(revmeta.branch_path) or 
                             scheme.is_branch(revmeta.branch_path))
-                    return (revmeta.branch_path, revmeta.revnum, BzrSvnMappingv3FileProps(scheme))
+                    return (revmeta.branch_path, revmeta.revnum, scheme)
 
         raise InvalidBzrSvnRevision(revid)
 
@@ -120,6 +129,7 @@
     def __init__(self, actual, cachedb=None):
         self.cache = RevisionIdMapCache(cachedb)
         self.actual = actual
+        self.revid_seen = set()
 
     def get_revision_id(self, revnum, path, mapping, changed_fileprops, revprops):
         # Look in the cache to see if it already has a revision id
@@ -165,31 +175,33 @@
                 return (branch_path, min_revnum, BzrSvnMappingv3FileProps(get_scheme(scheme)))
         except NoSuchRevision, e:
             last_revnum = self.actual.repos.get_latest_revnum()
-            if (last_revnum <= self.cache.last_revnum_checked(str(layout))):
+            if (last_revnum <= self.cache.last_revnum_checked(repr(layout))):
                 # All revision ids in this repository for the current 
                 # layout have already been discovered. No need to 
                 # check again.
                 raise e
             found = False
-            revid_seen = set()
-            for entry_revid, branch, revno, mapping in self.actual.discover_revids(layout, self.cache.last_revnum_checked(str(layout)), last_revnum):
+            for entry_revid, branch, revno, mapping in self.actual.discover_revids(layout, self.cache.last_revnum_checked(repr(layout)), last_revnum):
                 if entry_revid == revid:
                     found = True
-                if entry_revid not in revid_seen:
+                if entry_revid not in self.revid_seen:
                     self.cache.insert_revid(entry_revid, branch, 0, revno, str(mapping.scheme))
-                    revid_seen.add(entry_revid)
+                    self.revid_seen.add(entry_revid)
                 
             # We've added all the revision ids for this layout in the repository,
             # so no need to check again unless new revisions got added
-            self.cache.set_last_revnum_checked(str(layout), last_revnum)
+            self.cache.set_last_revnum_checked(repr(layout), last_revnum)
             if not found:
                 raise e
             (branch_path, min_revnum, max_revnum, scheme) = self.cache.lookup_revid(revid)
             assert min_revnum <= max_revnum
             assert isinstance(branch_path, str)
 
-        return self.actual.bisect_revid_revnum(revid, branch_path, min_revnum,
+        (branch_path, revnum, scheme) = self.actual.bisect_revid_revnum(revid, branch_path, min_revnum,
                                                max_revnum)
+        self.cache.insert_revid(revid, branch_path, revnum, revnum, str(scheme))
+        return (branch_path, revnum, BzrSvnMappingv3FileProps(scheme))
+
 
 
 class RevisionIdMapCache(CacheTable):
@@ -290,9 +302,14 @@
         assert isinstance(min_revnum, int) and isinstance(max_revnum, int)
         assert min_revnum <= max_revnum
         self.mutter("insert revid %r:%r-%r -> %r", branch, min_revnum, max_revnum, revid)
-        cursor = self.cachedb.execute(
-            "update revmap set min_revnum = MAX(min_revnum,?), max_revnum = MIN(max_revnum, ?) WHERE revid=? AND path=? AND scheme=?",
-            (min_revnum, max_revnum, revid, branch, scheme))
+        if min_revnum == max_revnum:
+            cursor = self.cachedb.execute(
+                "update revmap set min_revnum = ?, max_revnum = ? WHERE revid=? AND path=? AND scheme=?",
+                (min_revnum, max_revnum, revid, branch, scheme))
+        else:
+            cursor = self.cachedb.execute(
+                "update revmap set min_revnum = MAX(min_revnum,?), max_revnum = MIN(max_revnum, ?) WHERE revid=? AND path=? AND scheme=?",
+                (min_revnum, max_revnum, revid, branch, scheme))
         if cursor.rowcount == 0:
             self.cachedb.execute(
                 "insert into revmap (revid,path,min_revnum,max_revnum,scheme) VALUES (?,?,?,?,?)",




More information about the bazaar-commits mailing list