Rev 397: Merge from upstream. in http://people.samba.org/bzr/jelmer/bzr-svn/ver3

Jelmer Vernooij jelmer at samba.org
Mon Jan 15 17:29:02 GMT 2007


------------------------------------------------------------
revno: 397
revision-id: jelmer at samba.org-20070115172815-93j1sk2ylwzh8tt9
parent: jelmer at samba.org-20070114055700-9ybu0e0sf0t2bsp9
parent: jelmer at samba.org-20070115133448-o4pcdn4dvzqu5u25
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: ver3
timestamp: Mon 2007-01-15 18:28:15 +0100
message:
  Merge from upstream.
modified:
  TODO                           todo-20060729211917-2kpobww0zyvvo0j2-1
  branch.py                      svnbranch.py-20051017135706-11c749eb0dab04a7
  checkout.py                    workingtree.py-20060306120941-b083cb0fdd4a69de
  commit.py                      commit.py-20060607190346-qvq128wgfubhhgm2-1
  tests/test_upgrade.py          test_upgrade.py-20070106170128-64zt3eqggg4tng1c-1
  tests/test_workingtree.py      test_workingtree.py-20060622191524-0di7bc3q1ckdbybb-1
  transport.py                   transport.py-20060406231150-b3472d06b3a0818d
  upgrade.py                     upgrade.py-20070106192108-0rakplee2lzah4gs-1
    ------------------------------------------------------------
    revno: 389.1.12
    merged: jelmer at samba.org-20070115133448-o4pcdn4dvzqu5u25
    parent: jelmer at samba.org-20070115040110-rkf44wgfw2k3wzdo
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: main
    timestamp: Mon 2007-01-15 14:34:48 +0100
    message:
      Attempt to keep parent file ids.
    ------------------------------------------------------------
    revno: 389.1.11
    merged: jelmer at samba.org-20070115040110-rkf44wgfw2k3wzdo
    parent: jelmer at samba.org-20070115031521-e4ejwccyzei1kntf
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: main
    timestamp: Mon 2007-01-15 05:01:10 +0100
    message:
      Add progress bar, as this function can take a long time to run.
    ------------------------------------------------------------
    revno: 389.1.10
    merged: jelmer at samba.org-20070115031521-e4ejwccyzei1kntf
    parent: jelmer at samba.org-20070115003937-mxyoa82zy1t616pi
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: main
    timestamp: Mon 2007-01-15 04:15:21 +0100
    message:
      handle incremental calls to svn-upgrade nicely.
    ------------------------------------------------------------
    revno: 389.1.9
    merged: jelmer at samba.org-20070115003937-mxyoa82zy1t616pi
    parent: jelmer at samba.org-20070114233809-pjrkm3wnr2ezy6eo
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: main
    timestamp: Mon 2007-01-15 01:39:37 +0100
    message:
      The Python Subversion bindings have trouble dealing with unicode commit messages.
    ------------------------------------------------------------
    revno: 389.1.8
    merged: jelmer at samba.org-20070114233809-pjrkm3wnr2ezy6eo
    parent: jelmer at samba.org-20070114052234-aj73nfyj8sslv3n9
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: main
    timestamp: Mon 2007-01-15 00:38:09 +0100
    message:
      Use global configuration object.
=== modified file 'TODO'
--- a/TODO	2007-01-14 04:11:21 +0000
+++ b/TODO	2007-01-15 03:15:21 +0000
@@ -7,7 +7,7 @@
 - when committing specific files in a lightweight checkout, make sure to 
   commit the right file id changes for "."
 - custom implementation of WorkingTree.revert()
-- don't update to the same revnum when opening working tree
+- don't update all entries to the same revnum when opening working tree
 - avoid extra connect in logwalker?
 - get rid of use of `svn ls' in logwalker
 - make ListBranchingScheme() support wildcards

=== modified file 'branch.py'
--- a/branch.py	2007-01-09 03:22:00 +0000
+++ b/branch.py	2007-01-14 23:38:09 +0000
@@ -33,7 +33,7 @@
 
 from commit import push_as_merged
 from repository import SvnRepository
-from transport import bzr_to_svn_url
+from transport import bzr_to_svn_url, svn_config
 from tree import SvnRevisionTree
 
 
@@ -101,6 +101,7 @@
             mutter('hist: %r' % self.revision_history())
 
         client_ctx = svn.client.create_context()
+        client_ctx.config = svn_config
         svn.client.checkout(bzr_to_svn_url(self.base), to_location, rev, 
                             True, client_ctx)
 

=== modified file 'checkout.py'
--- a/checkout.py	2007-01-10 01:50:47 +0000
+++ b/checkout.py	2007-01-15 00:39:37 +0000
@@ -62,8 +62,9 @@
         self.bzrdir = bzrdir
         self._branch = branch
         self.base_revnum = 0
+        self.pool = Pool()
         self.client_ctx = svn.client.create_context()
-        self.pool = Pool()
+        self.client_ctx.config = svn_config
         self.client_ctx.log_msg_func2 = svn.client.svn_swig_py_get_commit_log_func
         self.client_ctx.auth_baton = _create_auth_baton(self.pool)
 
@@ -395,12 +396,12 @@
         if message_callback is not None:
             def log_message_func(items, pool):
                 """ Simple log message provider for unit tests. """
-                return message_callback(self)
+                return str(message_callback(self))
         else:
             assert isinstance(message, basestring)
             def log_message_func(items, pool):
                 """ Simple log message provider for unit tests. """
-                return message
+                return str(message)
 
         self.client_ctx.log_msg_baton2 = log_message_func
         commit_info = svn.client.commit3(specific_files, True, False, self.client_ctx)
@@ -420,13 +421,15 @@
         return revid
 
     def add(self, files, ids=None):
+        import pdb
+        pdb.set_trace()
         if ids:
             ids = copy(ids)
             ids.reverse()
         assert isinstance(files, list)
-        wc = self._get_wc(write_lock=True)
-        try:
-            for f in files:
+        for f in files:
+            try:
+                wc = self._get_wc(os.path.dirname(f), write_lock=True)
                 try:
                     svn.wc.add2(os.path.join(self.basedir, f), wc, None, 0, 
                             None, None, None)
@@ -438,8 +441,8 @@
                     elif num == svn.core.SVN_ERR_WC_PATH_NOT_FOUND:
                         raise NoSuchFile(path=f)
                     raise
-        finally:
-            svn.wc.adm_close(wc)
+            finally:
+                svn.wc.adm_close(wc)
         self.read_working_inventory()
 
     def basis_tree(self):

=== modified file 'commit.py'
--- a/commit.py	2007-01-10 03:59:17 +0000
+++ b/commit.py	2007-01-15 17:28:15 +0000
@@ -289,7 +289,7 @@
             self.date = date
             self.author = author
             mutter('committed %r, author: %r, date: %r' % (revision, author, date))
-
+        
         mutter('obtaining commit editor')
         self.editor, editor_baton = self.repository.transport.get_commit_editor(
             message, done, None, False)

=== modified file 'tests/test_upgrade.py'
--- a/tests/test_upgrade.py	2007-01-10 03:59:17 +0000
+++ b/tests/test_upgrade.py	2007-01-15 17:28:15 +0000
@@ -20,6 +20,7 @@
 from bzrlib.tests import TestCase, TestCaseWithTransport
 from bzrlib.trace import mutter
 
+from fileids import generate_svn_file_id
 import repository
 from repository import SvnRepository, MAPPING_VERSION, REVISION_ID_PREFIX
 from tests import TestCaseWithSubversionRepository
@@ -132,6 +133,69 @@
         self.assertTrue([oldrepos.generate_revision_id(1, "")],
                         newrepos.revision_parents("customrev-svn%d-upgrade" % MAPPING_VERSION))
 
+    def test_single_keep_parent_fileid(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/a': 'b'})
+        self.client_add("dc/a")
+        self.client_commit("dc", "data")
+
+        oldrepos = Repository.open(repos_url)
+        dir = BzrDir.create("f")
+        newrepos = dir.create_repository()
+        oldrepos.copy_content_into(newrepos)
+        dir.create_branch()
+        wt = dir.create_workingtree()
+        file("f/a", "w").write("b")
+        wt.add(["a"], ["someid"])
+        wt.commit(message="data", rev_id="svn-v1:1@%s-" % oldrepos.uuid)
+        wt.rename_one("a", "b")
+        file("f/a", 'w').write("moredata")
+        wt.add(["a"], ["specificid"])
+        wt.commit(message='fix moredata', rev_id="customrev")
+
+        upgrade_repository(newrepos, oldrepos, allow_change=True)
+
+        tree = newrepos.revision_tree("customrev-svn%d-upgrade" % MAPPING_VERSION)
+        self.assertEqual("specificid", tree.inventory.path2id("a"))
+        self.assertEqual(generate_svn_file_id(oldrepos.uuid, 1, "", "a"), 
+                         tree.inventory.path2id("b"))
+
+
+    def test_single_custom_continue(self):
+        repos_url = self.make_client("a", "dc")
+        self.build_tree({'dc/a': 'b', 'dc/b': 'c'})
+        self.client_add("dc/a")
+        self.client_add("dc/b")
+        self.client_commit("dc", "data")
+
+        oldrepos = Repository.open(repos_url)
+        dir = BzrDir.create("f")
+        newrepos = dir.create_repository()
+        oldrepos.copy_content_into(newrepos)
+        dir.create_branch()
+        wt = dir.create_workingtree()
+        file("f/a", "w").write("b")
+        file("f/b", "w").write("c")
+        wt.add("a")
+        wt.add("b")
+        wt.commit(message="data", rev_id="svn-v1:1@%s-" % oldrepos.uuid)
+        file("f/a", 'w').write("moredata")
+        file("f/b", 'w').write("moredata")
+        wt.commit(message='fix moredata', rev_id="customrev")
+
+        tree = newrepos.revision_tree("svn-v1:1@%s-" % oldrepos.uuid)
+
+        vf = newrepos.weave_store.get_weave_or_empty(tree.inventory.path2id("a"), newrepos.get_transaction())
+        vf.clone_text("customrev-svn%d-upgrade" % MAPPING_VERSION,
+                "svn-v1:1@%s-" % oldrepos.uuid, ["svn-v1:1@%s-" % oldrepos.uuid])
+
+        upgrade_repository(newrepos, oldrepos, allow_change=True)
+
+        self.assertTrue(newrepos.has_revision(oldrepos.generate_revision_id(1, "")))
+        self.assertTrue(newrepos.has_revision("customrev-svn%d-upgrade" % MAPPING_VERSION))
+        self.assertTrue([oldrepos.generate_revision_id(1, "")],
+                        newrepos.revision_parents("customrev-svn%d-upgrade" % MAPPING_VERSION))
+
     def test_more_custom(self):
         repos_url = self.make_client("a", "dc")
         self.build_tree({'dc/a': 'b'})

=== modified file 'tests/test_workingtree.py'
--- a/tests/test_workingtree.py	2007-01-10 03:59:17 +0000
+++ b/tests/test_workingtree.py	2007-01-15 17:28:15 +0000
@@ -57,6 +57,26 @@
         self.assertTrue(inv.has_filename("bl"))
         self.assertFalse(inv.has_filename("aa"))
 
+    def test_add_not_recursive(self):
+        self.make_client('a', 'dc')
+        self.build_tree({"dc/bl/file": "data"})
+        tree = WorkingTree.open("dc")
+        tree.add(["bl"])
+
+        tree = WorkingTree.open("dc")
+        self.assertTrue(tree.inventory.has_filename("bl"))
+        self.assertFalse(tree.inventory.has_filename("bl/file"))
+
+    def test_add_nested(self):
+        self.make_client('a', 'dc')
+        self.build_tree({"dc/bl/file": "data"})
+        tree = WorkingTree.open("dc")
+        tree.add(["bl", "bl/file"])
+
+        tree = WorkingTree.open("dc")
+        self.assertTrue(tree.inventory.has_filename("bl"))
+        self.assertTrue(tree.inventory.has_filename("bl/file"))
+
     def test_lock_write(self):
         self.make_client('a', 'dc')
         tree = WorkingTree.open("dc")
@@ -271,6 +291,13 @@
         tree = WorkingTree.open("dc")
         self.assertEqual(['bl'], list(tree.unknowns()))
 
+    def test_unknown_not_added(self):
+        self.make_client('a', 'dc')
+        self.build_tree({"dc/bl": None})
+
+        tree = WorkingTree.open("dc")
+        self.assertFalse(tree.inventory.has_filename("bl"))
+
     def test_extras(self):
         self.make_client('a', 'dc')
         self.build_tree({"dc/bl": None})
@@ -338,6 +365,33 @@
         orig_tree = tree.basis_tree()
         tree.commit(message_callback=lambda x: "data")
 
+    def test_commit_callback_unicode(self):
+        self.make_client('a', 'dc')
+        self.build_tree({"dc/bl": "data"})
+        self.client_add("dc/bl")
+        tree = WorkingTree.open("dc")
+        orig_tree = tree.basis_tree()
+        tree.commit(message_callback=lambda x: u"data")
+
+    def test_commit_message_unicode(self):
+        self.make_client('a', 'dc')
+        self.build_tree({"dc/bl": "data"})
+        self.client_add("dc/bl")
+        tree = WorkingTree.open("dc")
+        orig_tree = tree.basis_tree()
+        tree.commit(message=u"data")
+
+    def test_commit_nested(self):
+        repos_url = self.make_client('a', 'dc')
+        self.build_tree({"dc/branches/foobranch/file": "data"})
+        self.client_add("dc/branches")
+        self.client_commit("dc", "initial changes")
+        self.make_checkout(repos_url + "/branches/foobranch", "de")
+        tree = WorkingTree.open("de")
+        self.build_tree({'de/file': "foo"})
+        orig_tree = tree.basis_tree()
+        tree.commit(message="data")
+
     def test_update_after_commit(self):
         self.make_client('a', 'dc')
         self.build_tree({"dc/bl": "data"})

=== modified file 'transport.py'
--- a/transport.py	2007-01-01 16:26:35 +0000
+++ b/transport.py	2007-01-14 23:38:09 +0000
@@ -104,6 +104,7 @@
 
         self._client = svn.client.create_context(self.pool)
         self._client.auth_baton = _create_auth_baton(self.pool)
+        self._client.config = svn_config
 
         try:
             mutter('opening SVN RA connection to %r' % self.svn_url)

=== modified file 'upgrade.py'
--- a/upgrade.py	2007-01-10 03:59:17 +0000
+++ b/upgrade.py	2007-01-15 17:28:15 +0000
@@ -43,6 +43,7 @@
 # Change the parent of a revision
 def change_revision_parent(repository, oldrevid, newrevid, new_parents):
     assert isinstance(new_parents, list)
+    mutter('creating copy %r of %r with new parents %r' % (newrevid, oldrevid, new_parents))
     oldrev = repository.get_revision(oldrevid)
 
     builder = repository.get_commit_builder(branch=None, parents=new_parents, 
@@ -53,13 +54,67 @@
                                   revprops=oldrev.properties,
                                   revision_id=newrevid)
 
-    for path, ie in repository.get_revision_inventory(oldrevid).iter_entries():
-        new_ie = ie.copy()
-        if new_ie.revision == oldrevid:
-            new_ie.revision = None
-        builder.record_entry_contents(new_ie, 
-               map(repository.get_revision_inventory, new_parents), 
-               path, repository.revision_tree(oldrevid))
+    # Check what new_ie.file_id should be
+    # use old and new parent inventories to generate new_id map
+    old_parents = oldrev.parent_ids
+    new_id = {}
+    for (oldp, newp) in zip(old_parents, new_parents):
+        oldinv = repository.get_revision_inventory(oldp)
+        newinv = repository.get_revision_inventory(newp)
+        for path, ie in oldinv.iter_entries():
+            if newinv.has_filename(path):
+                new_id[ie.file_id] = newinv.path2id(path)
+
+    mutter('new id %r' % new_id)
+    i = 0
+    class MapTree:
+        def __init__(self, oldtree, map):
+            self.oldtree = oldtree
+            self.map = map
+
+        def old_id(self, file_id):
+            for x in self.map:
+                if self.map[x] == file_id:
+                    return x
+            return file_id
+
+        def get_file_sha1(self, file_id, path=None):
+            return self.oldtree.get_file_sha1(file_id=self.old_id(file_id), 
+                                              path=path)
+
+        def get_file(self, file_id):
+            return self.oldtree.get_file(self.old_id(file_id=file_id))
+
+        def is_executable(self, file_id, path=None):
+            return self.oldtree.is_executable(self.old_id(file_id=file_id), 
+                                              path=path)
+
+    oldtree = MapTree(repository.revision_tree(oldrevid), new_id)
+    oldinv = repository.get_revision_inventory(oldrevid)
+    total = len(oldinv)
+    pb = ui_factory.nested_progress_bar()
+    try:
+        for path, ie in oldinv.iter_entries():
+            pb.update('upgrading revision', i, total)
+            i+=1
+            new_ie = ie.copy()
+            if new_ie.revision == oldrevid:
+                new_ie.revision = None
+            def lookup(file_id):
+                if new_id.has_key(file_id):
+                    return new_id[file_id]
+                return file_id
+
+            new_ie.file_id = lookup(new_ie.file_id)
+            new_ie.parent_id = lookup(new_ie.parent_id)
+            versionedfile = repository.weave_store.get_weave_or_empty(new_ie.file_id, 
+                    repository.get_transaction())
+            if not versionedfile.has_version(newrevid):
+                builder.record_entry_contents(new_ie, 
+                       map(repository.get_revision_inventory, new_parents), 
+                       path, oldtree)
+    finally:
+        pb.finished()
 
     builder.finish_inventory()
     return builder.commit(oldrev.message)
@@ -190,10 +245,11 @@
 
         pb = ui_factory.nested_progress_bar()
         i = 0
+        total = len(needs_upgrading)
         try:
             while len(needs_upgrading) > 0:
                 revid = needs_upgrading.pop()
-                pb.update('upgrading revisions', i, len(needs_upgrading))
+                pb.update('upgrading revisions', i, total)
                 i+=1
                 newrevid = create_upgraded_revid(revid)
                 rename_map[revid] = newrevid




More information about the bazaar-commits mailing list