Rev 497: Refactory convert_repository(). in file:///data/jelmer/bzr-svn/0.4/
Jelmer Vernooij
jelmer at samba.org
Thu Jul 12 09:28:27 BST 2007
At file:///data/jelmer/bzr-svn/0.4/
------------------------------------------------------------
revno: 497
revision-id: jelmer at samba.org-20070624232120-rpsynq9yhsyrn4q5
parent: jelmer at samba.org-20070624231937-ikhtyqlkourqqorc
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: main
timestamp: Mon 2007-06-25 01:21:20 +0200
message:
Refactory convert_repository().
modified:
__init__.py __init__.py-20051008155114-eae558e6cf149e1d
convert.py svn2bzr.py-20051018015439-cb4563bff29e632d
tests/test_convert.py test_convert.py-20060705203611-b1l0bapeku6foco0-1
=== modified file '__init__.py'
--- a/__init__.py 2007-06-24 18:14:04 +0000
+++ b/__init__.py 2007-06-24 23:21:20 +0000
@@ -133,9 +133,21 @@
if all:
standalone = False
+
+ if os.path.isfile(from_location):
+ tmp_repos = tempfile.mkdtemp(prefix='bzr-svn-dump-')
+ mutter('loading dumpfile %r to %r' % (from_location, tmp_repos))
+ load_dumpfile(from_location, tmp_repos)
+ from_location = tmp_repos
+ else:
+ tmp_repos = None
+
convert_repository(from_location, to_location, scheme, not standalone,
trees, all)
+ if tmp_repos is not None:
+ osutils.rmtree(tmp_repos)
+
register_command(cmd_svn_import)
=== modified file 'convert.py'
--- a/convert.py 2007-06-24 14:08:49 +0000
+++ b/convert.py 2007-06-24 23:21:20 +0000
@@ -17,9 +17,6 @@
import os
import tempfile
-from bzrlib.plugin import load_plugins
-load_plugins()
-
from bzrlib.bzrdir import BzrDir, BzrDirFormat, Converter
from bzrlib.branch import Branch
from bzrlib.errors import (BzrError, NotBranchError, NoSuchFile,
@@ -68,29 +65,25 @@
return repos
-def convert_repository(url, output_url, scheme, create_shared_repo=True,
- working_trees=False, all=False):
+def convert_repository(source_repos, output_url, scheme=None,
+ create_shared_repo=True, working_trees=False, all=False,
+ format=None, pb=None):
"""Convert a Subversion repository and its' branches to a
Bazaar repository.
- :param url: URL of the Subversion repository
+ :param source_repos: Subversion repository
:param output_url: URL to write Bazaar repository to.
:param scheme: Branching scheme (object) to use
:param create_shared_repo: Whether to create a shared Bazaar repository
:param working_trees: Whether to create working trees
:param all: Whether old revisions, even those not part of any existing
branches, should be imported
+ :param format: Format to use
+ :param pb: Progress bar to use
"""
assert not all or create_shared_repo
-
- if os.path.isfile(url):
- tmp_repos = tempfile.mkdtemp(prefix='bzr-svn-dump-')
- mutter('loading dumpfile %r to %r' % (url, tmp_repos))
- load_dumpfile(url, tmp_repos)
- url = tmp_repos
- else:
- tmp_repos = None
-
+ if format is None:
+ format = get_rich_root_format()
dirs = {}
to_transport = get_transport(output_url)
def get_dir(path):
@@ -101,80 +94,74 @@
dirs[path] = BzrDir.open_from_transport(nt)
except NotBranchError:
transport_makedirs(to_transport, urlutils.join(to_transport.base, path))
- dirs[path] = get_rich_root_format().initialize_on_transport(nt)
+ dirs[path] = format.initialize_on_transport(nt)
return dirs[path]
- try:
- source_repos = SvnRepository.open(url)
- source_repos.set_branching_scheme(scheme)
-
- if create_shared_repo:
+ source_repos.set_branching_scheme(scheme)
+
+ if create_shared_repo:
+ try:
+ target_repos = get_dir("").open_repository()
+ assert scheme.is_branch("") or scheme.is_tag("") or target_repos.is_shared()
+ except NoRepositoryPresent:
+ target_repos = get_dir("").create_repository(shared=True)
+ target_repos.set_make_working_trees(working_trees)
+ if all:
+ source_repos.copy_content_into(target_repos)
+
+ pb = ui.ui_factory.nested_progress_bar()
+ try:
+ branches = source_repos.find_branches(scheme, pb=pb)
+ existing_branches = filter(lambda (bp, revnum, exists): exists,
+ branches)
+ finally:
+ pb.finished()
+
+ pb = ui.ui_factory.nested_progress_bar()
+
+ try:
+ i = 0
+ for (branch, revnum, _) in existing_branches:
+ if source_repos.transport.check_path(branch, revnum) == svn.core.svn_node_file:
+ continue
+ pb.update("%s:%d" % (branch, revnum), i, len(existing_branches))
+ revid = source_repos.generate_revision_id(revnum, branch,
+ str(scheme))
+
+ target_dir = get_dir(branch)
+ if not create_shared_repo:
+ try:
+ target_dir.open_repository()
+ except NoRepositoryPresent:
+ target_dir.create_repository()
+ source_branch_url = urlutils.join(source_repos.base, branch)
try:
- target_repos = get_dir("").open_repository()
- assert scheme.is_branch("") or scheme.is_tag("") or target_repos.is_shared()
- except NoRepositoryPresent:
- target_repos = get_dir("").create_repository(shared=True)
- target_repos.set_make_working_trees(working_trees)
- if all:
- source_repos.copy_content_into(target_repos)
-
- pb = ui.ui_factory.nested_progress_bar()
- try:
- branches = source_repos.find_branches(scheme, pb=pb)
- existing_branches = filter(lambda (bp, revnum, exists): exists,
- branches)
- finally:
- pb.finished()
-
- pb = ui.ui_factory.nested_progress_bar()
-
- try:
- i = 0
- for (branch, revnum, _) in existing_branches:
- if source_repos.transport.check_path(branch, revnum) == svn.core.svn_node_file:
- continue
- pb.update("%s:%d" % (branch, revnum), i, len(existing_branches))
- revid = source_repos.generate_revision_id(revnum, branch,
- str(scheme))
-
- target_dir = get_dir(branch)
- if not create_shared_repo:
- try:
- target_dir.open_repository()
- except NoRepositoryPresent:
- target_dir.create_repository()
- source_branch_url = urlutils.join(url, branch)
+ target_branch = target_dir.open_branch()
+ except NotBranchError:
+ target_branch = target_dir.create_branch()
+ target_branch.set_parent(source_branch_url)
+ if revid != target_branch.last_revision():
+ source_branch = Branch.open(source_branch_url)
+ # Check if target_branch contains a subset of
+ # source_branch. If that is not the case,
+ # assume that source_branch has been replaced
+ # and remove target_branch
try:
- target_branch = target_dir.open_branch()
- except NotBranchError:
- target_branch = target_dir.create_branch()
- target_branch.set_parent(source_branch_url)
- if revid != target_branch.last_revision():
- source_branch = Branch.open(source_branch_url)
- # Check if target_branch contains a subset of
- # source_branch. If that is not the case,
- # assume that source_branch has been replaced
- # and remove target_branch
- try:
- source_branch.revision_id_to_revno(
- target_branch.last_revision())
- except NoSuchRevision:
- target_branch.set_revision_history([])
- target_branch.pull(source_branch)
- if working_trees and not target_dir.has_workingtree():
- target_dir.create_workingtree()
- i += 1
- finally:
- pb.finished()
+ source_branch.revision_id_to_revno(
+ target_branch.last_revision())
+ except NoSuchRevision:
+ target_branch.set_revision_history([])
+ target_branch.pull(source_branch)
+ if working_trees and not target_dir.has_workingtree():
+ target_dir.create_workingtree()
+ i += 1
finally:
- if tmp_repos:
- osutils.rmtree(tmp_repos)
-
+ pb.finished()
+
class SvnConverter(Converter):
- """Converts from a Subversion dir to another dir."""
- def __init__(self, target_format):
- self.target_format = target_format
+ """Converts from a Subversion directory to a bzr dir."""
def convert(self, to_convert, pb):
- pass
+ convert_repository(to_convert.open_repository(), to_convert.base,
+ format=self.target_format, all=True, pb=pb)
=== modified file 'tests/test_convert.py'
--- a/tests/test_convert.py 2007-06-24 14:08:49 +0000
+++ b/tests/test_convert.py 2007-06-24 23:21:20 +0000
@@ -74,7 +74,8 @@
self.client_commit("dc", "change")
def test_sets_parent_urls(self):
- convert_repository(self.repos_url, "e", TrunkBranchingScheme(),
+ convert_repository(Repository.open(self.repos_url), "e",
+ TrunkBranchingScheme(),
all=False, create_shared_repo=True)
self.assertEquals(self.repos_url+"/trunk",
Branch.open("e/trunk").get_parent())
@@ -87,9 +88,10 @@
self.client_commit("dc", "add a branch")
self.client_delete("dc/branches/somebranch")
self.client_commit("dc", "remove branch")
- convert_repository(self.repos_url, "e", TrunkBranchingScheme(),
+ oldrepos = Repository.open(self.repos_url)
+ convert_repository(oldrepos, "e",
+ TrunkBranchingScheme(),
all=False, create_shared_repo=True)
- oldrepos = Repository.open(self.repos_url)
newrepos = Repository.open("e")
self.assertFalse(newrepos.has_revision(oldrepos.generate_revision_id(2, "branches/somebranch", "trunk0")))
@@ -97,8 +99,8 @@
self.build_tree({'dc/branches/somebranch': 'data'})
self.client_add("dc/branches/somebranch")
self.client_commit("dc", "add a branch")
- convert_repository(self.repos_url, "e", TrunkBranchingScheme())
oldrepos = Repository.open(self.repos_url)
+ convert_repository(oldrepos, "e", TrunkBranchingScheme())
newrepos = Repository.open("e")
self.assertFalse(newrepos.has_revision(oldrepos.generate_revision_id(2, "branches/somebranch", "trunk0")))
@@ -108,9 +110,9 @@
self.client_commit("dc", "add a branch")
self.client_delete("dc/branches/somebranch")
self.client_commit("dc", "remove branch")
- convert_repository(self.repos_url, "e", TrunkBranchingScheme(),
+ oldrepos = Repository.open(self.repos_url)
+ convert_repository(oldrepos, "e", TrunkBranchingScheme(),
all=True, create_shared_repo=True)
- oldrepos = Repository.open(self.repos_url)
newrepos = Repository.open("e")
self.assertTrue(newrepos.has_revision(
oldrepos.generate_revision_id(3, "branches/somebranch", "trunk0")))
@@ -119,38 +121,40 @@
BzrDir.create_repository("e", shared=True,
format=get_rich_root_format())
- convert_repository("svn+"+self.repos_url, "e",
+ convert_repository(Repository.open("svn+"+self.repos_url), "e",
TrunkBranchingScheme(), True)
self.assertTrue(Repository.open("e").is_shared())
def test_shared_import_continue_remove(self):
- convert_repository(self.repos_url, "e", TrunkBranchingScheme(), True)
+ convert_repository(Repository.open(self.repos_url), "e",
+ TrunkBranchingScheme(), True)
self.client_update("dc")
self.client_delete("dc/trunk")
self.client_commit("dc", "blafoo")
self.build_tree({'dc/trunk/file': 'otherdata'})
self.client_add("dc/trunk")
self.client_commit("dc", "change")
- convert_repository(self.repos_url, "e", TrunkBranchingScheme(), True)
+ convert_repository(Repository.open(self.repos_url), "e",
+ TrunkBranchingScheme(), True)
def test_shared_import_continue_with_wt(self):
- convert_repository("svn+"+self.repos_url, "e",
+ convert_repository(Repository.open("svn+"+self.repos_url), "e",
TrunkBranchingScheme(), working_trees=True)
- convert_repository("svn+"+self.repos_url, "e",
+ convert_repository(Repository.open("svn+"+self.repos_url), "e",
TrunkBranchingScheme(), working_trees=True)
def test_shared_import_nonescheme_empty(self):
BzrDir.create_repository("e", shared=True, format=get_rich_root_format())
- convert_repository("svn+"+self.repos_url, "e",
+ convert_repository(Repository.open("svn+"+self.repos_url), "e",
NoBranchingScheme(), True)
def test_shared_import_with_wt(self):
BzrDir.create_repository("e", shared=True,
format=get_rich_root_format())
- convert_repository("svn+"+self.repos_url, "e",
+ convert_repository(Repository.open("svn+"+self.repos_url), "e",
TrunkBranchingScheme(), True, True)
self.assertTrue(os.path.isfile(os.path.join(
@@ -160,7 +164,7 @@
BzrDir.create_repository("e", shared=True,
format=get_rich_root_format())
- convert_repository("svn+"+self.repos_url, "e",
+ convert_repository(Repository.open("svn+"+self.repos_url), "e",
TrunkBranchingScheme(), True, False)
self.assertFalse(os.path.isfile(os.path.join(
@@ -171,11 +175,11 @@
format=format_registry.make_bzrdir('knit'))
self.assertRaises(IncompatibleRepositories,
- lambda: convert_repository("svn+"+self.repos_url, "e",
+ lambda: convert_repository(Repository.open(self.repos_url), "e",
TrunkBranchingScheme(), True, False))
def test_shared_import_continue_branch(self):
- convert_repository("svn+"+self.repos_url, "e",
+ convert_repository(Repository.open("svn+"+self.repos_url), "e",
TrunkBranchingScheme(), True)
self.build_tree({'dc/trunk/file': 'foodata'})
@@ -185,7 +189,7 @@
Repository.open(self.repos_url).generate_revision_id(2, "trunk", "trunk0"),
Branch.open("e/trunk").last_revision())
- convert_repository("svn+"+self.repos_url, "e",
+ convert_repository(Repository.open("svn+"+self.repos_url), "e",
TrunkBranchingScheme(), True)
self.assertEqual(Repository.open(self.repos_url).generate_revision_id(3, "trunk", "trunk0"),
@@ -193,22 +197,22 @@
def test_shared_import(self):
- convert_repository("svn+"+self.repos_url, "e",
+ convert_repository(Repository.open("svn+"+self.repos_url), "e",
TrunkBranchingScheme(), True)
self.assertTrue(Repository.open("e").is_shared())
def test_simple(self):
- convert_repository("svn+"+self.repos_url, os.path.join(self.test_dir, "e"), TrunkBranchingScheme())
+ convert_repository(Repository.open("svn+"+self.repos_url), os.path.join(self.test_dir, "e"), TrunkBranchingScheme())
self.assertTrue(os.path.isdir(os.path.join(self.test_dir, "e", "trunk")))
self.assertTrue(os.path.isdir(os.path.join(self.test_dir, "e", "branches", "abranch")))
def test_convert_to_nonexistant(self):
- self.assertRaises(NoSuchFile, convert_repository,"svn+"+self.repos_url, os.path.join(self.test_dir, "e", "foo", "bar"), TrunkBranchingScheme())
+ self.assertRaises(NoSuchFile, convert_repository,Repository.open("svn+"+self.repos_url), os.path.join(self.test_dir, "e", "foo", "bar"), TrunkBranchingScheme())
def test_notshared_import(self):
- convert_repository("svn+"+self.repos_url, "e", TrunkBranchingScheme(),
- False)
+ convert_repository(Repository.open("svn+"+self.repos_url), "e",
+ TrunkBranchingScheme(), False)
self.assertRaises(NotBranchError, Repository.open, "e")
@@ -231,11 +235,16 @@
PROPS-END
""")
branch_path = os.path.join(self.test_dir, "f")
- convert_repository(dumpfile, branch_path, NoBranchingScheme())
+ repos = self.load_dumpfile(dumpfile, 'g')
+ convert_repository(repos, branch_path, NoBranchingScheme())
branch = Repository.open(branch_path)
self.assertEqual(['svn-v3-none:6987ef2d-cd6b-461f-9991-6f1abef3bd59::0'], branch.all_revision_ids())
Branch.open(branch_path)
+ def load_dumpfile(self, dumpfile, target_path):
+ load_dumpfile(dumpfile, target_path)
+ return Repository.open(target_path)
+
def test_dumpfile_open_empty_trunk(self):
dumpfile = os.path.join(self.test_dir, "dumpfile")
open(dumpfile, 'w').write(
@@ -254,7 +263,8 @@
PROPS-END
""")
branch_path = os.path.join(self.test_dir, "f")
- convert_repository(dumpfile, branch_path, TrunkBranchingScheme())
+ repos = self.load_dumpfile(dumpfile, 'g')
+ convert_repository(repos, branch_path, TrunkBranchingScheme())
repository = Repository.open(branch_path)
self.assertEqual([], repository.all_revision_ids())
self.assertRaises(NotBranchError, Branch.open, branch_path)
@@ -316,10 +326,10 @@
""")
- convert_repository(filename, os.path.join(self.test_dir, "e"),
+ repos = self.load_dumpfile(filename, 'g')
+ convert_repository(repos, os.path.join(self.test_dir, "e"),
TrunkBranchingScheme())
branch = Branch.open(os.path.join(self.test_dir, "e", "trunk"))
self.assertEqual("file://%s/e/trunk" % self.test_dir, branch.base.rstrip("/"))
self.assertEqual(generate_svn_revision_id("6987ef2d-cd6b-461f-9991-6f1abef3bd59", 1, 'trunk', "trunk0"), branch.last_revision())
-
More information about the bazaar-commits
mailing list