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