Rev 401: Attempt to keep parent file ids. in http://people.samba.org/bzr/jelmer/bzr-svn/bzr.dev

Jelmer Vernooij jelmer at samba.org
Mon Jan 15 13:35:07 GMT 2007


------------------------------------------------------------
revno: 401
revision-id: 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.
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-15 03:15:21 +0000
+++ b/tests/test_upgrade.py	2007-01-15 13:34:48 +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
@@ -128,6 +129,34 @@
         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'})

=== modified file 'upgrade.py'
--- a/upgrade.py	2007-01-15 04:01:10 +0000
+++ b/upgrade.py	2007-01-15 13:34:48 +0000
@@ -54,23 +54,65 @@
                                   revprops=oldrev.properties,
                                   revision_id=newrevid)
 
+    # 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
-    inv = repository.get_revision_inventory(oldrevid)
-    total = len(inv)
+    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 inv.iter_entries():
+        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, repository.revision_tree(oldrevid))
+                       path, oldtree)
     finally:
         pb.finished()
 




More information about the bazaar-commits mailing list