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