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