Rev 377: Generate revision ids for upgraded revisions correctly and some other random in http://people.samba.org/bzr/jelmer/bzr-svn/bzr.dev

Jelmer Vernooij jelmer at samba.org
Sat Jan 6 20:53:38 GMT 2007


------------------------------------------------------------
revno: 377
revision-id: jelmer at samba.org-20070106205319-xuizcqarqb4rrv2e
parent: jelmer at samba.org-20070106193150-ubn5wjhot0mqo9et
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: main
timestamp: Sat 2007-01-06 21:53:19 +0100
message:
  Generate revision ids for upgraded revisions correctly and some other random 
  plumbing.
modified:
  tests/test_upgrade.py          test_upgrade.py-20070106170128-64zt3eqggg4tng1c-1
  upgrade.py                     upgrade.py-20070106192108-0rakplee2lzah4gs-1
=== modified file 'tests/test_upgrade.py'
--- a/tests/test_upgrade.py	2007-01-06 19:31:50 +0000
+++ b/tests/test_upgrade.py	2007-01-06 20:53:19 +0000
@@ -15,13 +15,14 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 from bzrlib.bzrdir import BzrDir
-from bzrlib.errors import NoRepositoryPresent
+from bzrlib.errors import NoRepositoryPresent, InvalidRevisionId
 from bzrlib.tests import TestCase, TestCaseWithTransport
 
-from repository import SvnRepository
+from repository import SvnRepository, MAPPING_VERSION
 from tests import TestCaseWithSubversionRepository
-from upgrade import (change_revision_parent, upgrade_branch, 
-                     UpgradeChangesContent)
+from upgrade import (change_revision_parent, upgrade_repository, 
+                     UpgradeChangesContent, parse_legacy_revision_id,
+                     create_upgraded_revid)
 
 class TestUpgradeChangesContent(TestCase):
     def test_init(self):
@@ -29,6 +30,32 @@
         self.assertEqual("revisionx", x.revid)
 
 
+class ParserTests(TestCase):
+    def test_current(self):
+        self.assertEqual(("uuid", "trunk", 1, 2), 
+                         parse_legacy_revision_id("svn-v2:1 at uuid-trunk"))
+
+    def test_legacy(self):
+        self.assertEqual(("uuid", "trunk", 1, 1), 
+                         parse_legacy_revision_id("svn-v1:1 at uuid-trunk"))
+
+    def test_except(self):
+        self.assertRaises(InvalidRevisionId, 
+                         parse_legacy_revision_id, "svn-v0:1 at uuid-trunk")
+
+    def test_except_nonsvn(self):
+        self.assertRaises(InvalidRevisionId, 
+                         parse_legacy_revision_id, "blah")
+
+    def test_create_upgraded_revid_new(self):
+        self.assertEqual("bla-svn%d-upgrade" % MAPPING_VERSION,
+                         create_upgraded_revid("bla"))
+
+    def test_create_upgraded_revid_upgrade(self):
+        self.assertEqual("bla-svn%d-upgrade" % MAPPING_VERSION,
+                         create_upgraded_revid("bla-svn1-upgrade"))
+
+
 class ConversionTests(TestCaseWithTransport):
     def test_simple(self):
         wt = self.make_branch_and_tree('.')
@@ -43,9 +70,9 @@
         file('hello', 'w').write('world')
         wt.commit(message='change hello', rev_id="bla2")
         
-        newrev = change_revision_parent(wt.branch.repository, "bla2", ["bloe"])
-        self.assertNotEqual(None, newrev)
-        self.assertNotEqual(newrev, "bla2")
+        newrev = change_revision_parent(wt.branch.repository, "bla2", "bla4", 
+                                        ["bloe"])
+        self.assertEqual("bla4", newrev)
         self.assertTrue(wt.branch.repository.has_revision(newrev))
         self.assertEqual(["bloe"], wt.branch.repository.revision_parents(newrev))
 

=== modified file 'upgrade.py'
--- a/upgrade.py	2007-01-06 19:31:50 +0000
+++ b/upgrade.py	2007-01-06 20:53:19 +0000
@@ -18,10 +18,10 @@
 #
 
 from bzrlib.config import Config
-from bzrlib.errors import BzrError
+from bzrlib.errors import BzrError, InvalidRevisionId
 from bzrlib.ui import ui_factory
 
-from repository import MAPPING_VERSION
+from repository import MAPPING_VERSION, parse_svn_revision_id, unescape_svn_path
 
 # Takes an existing Bazaar branch and replaces all old-version mapped revisions 
 # with new-style revisions mappings. 
@@ -35,20 +35,12 @@
     _fmt = """Upgrade will change contents in revision %(revid)s."""
 
     def __init__(self, revid):
-        super(UpgradeChangesContent, self).__init__()
         self.revid = revid
 
 
 # Change the parent of a revision
-def change_revision_parent(repository, oldrevid, new_parents):
+def change_revision_parent(repository, oldrevid, newrevid, new_parents):
     assert isinstance(new_parents, list)
-    suffix = "-svn%d-upgrade" % MAPPING_VERSION
-    if oldrevid.endswith("-upgrade"):
-        # FIXME: 
-        newrevid = oldrevid
-    else:
-        newrevid = oldrevid + suffix
-
     oldrev = repository.get_revision(oldrevid)
 
     builder = repository.get_commit_builder(branch=None, parents=new_parents, 
@@ -59,7 +51,6 @@
                                   revprops=oldrev.properties,
                                   revision_id=newrevid)
 
-    # FIXME: Populate the inventory
     for path, ie in repository.get_revision_inventory(oldrevid).iter_entries():
         new_ie = ie.copy()
         if new_ie.revision == oldrevid:
@@ -72,18 +63,61 @@
     return builder.commit(oldrev.message)
 
 
-def upgrade_branch(branch, svn_repository, allow_change=False):
+def parse_legacy_revision_id(revid):
+    if revid.startswith("svn-v1:"):
+        revid = revid[len("svn-v1:"):]
+        at = revid.index("@")
+        fash = revid.rindex("-")
+        uuid = revid[at+1:fash]
+        branch_path = unescape_svn_path(revid[fash+1:])
+        revnum = int(revid[0:at])
+        assert revnum >= 0
+        return (uuid, branch_path, revnum, 1)
+    elif revid.startswith("svn-v2:"):
+        (uuid, bp, rev) = parse_svn_revision_id(revid)
+        return (uuid, bp, rev, 2)
+
+    raise InvalidRevisionId(revid, None)
+
+
+def create_upgraded_revid(revid):
+    suffix = "-svn%d-upgrade" % MAPPING_VERSION
+    if revid.endswith("-upgrade"):
+        return revid[0:revid.rfind("-svn")] + suffix
+    else:
+        return revid + suffix
+
+
+def upgrade_repository(repository, svn_repository, revision_id=None, 
+                       allow_change=False):
+
     needed_revs = []
-    needs_upgrading = {}
-    # FIXME: Find revisions that need to be upgraded, create
+    needs_upgrading = set()
+    new_parents = {}
+    rename_map = {}
+
+    # Find revisions that need to be upgraded, create
     # dictionary with revision ids in key, new parents in value
+    graph = repository.get_revision_graph()
+    for revid in graph:
+        new_parents[revid] = []
+        for parent in graph[revid]:
+            try:
+                (uuid, bp, rev, version) = parse_legacy_revision_id(parent)
+                new_parent = svn_repository.generate_revision_id(rev, bp)
+                if new_parent != parent:
+                    needed_revs.append(new_parent)
+                    needs_upgrading.append(revid)
+                new_parents[revid].append(new_parent)
+            except InvalidRevisionId:
+                new_parents[revid].append(parent)
 
     # Make sure all the required current version revisions are present
     pb = ui_factory.nested_progress_bar()
     i = 0
     for revid in needed_revs:
         pb.update('fetching new revisions', i, len(needed_revs))
-        branch.repository.fetch(svn_repository, revid)
+        repository.fetch(svn_repository, revid)
         i+=1
     pb.finished()
 
@@ -91,6 +125,9 @@
     i = 0
     for revid in needs_upgrading:
         pb.update('upgrading revisions', i, len(needed_revs))
-        change_revision_parent(branch, revid, needs_upgrading[revid])
+        newrevid = create_upgraded_revid(revid)
+        change_revision_parent(repository, revid, newrevid, 
+                                          new_parents[revid])
+        # FIXME: also upgrade children of newrevid
         i+=1
     pb.finished()




More information about the bazaar-commits mailing list