Rev 1569: Preserve individual text revision ids correctly when round-tripping. in http://people.samba.org/bzr/jelmer/bzr-svn/trunk
Jelmer Vernooij
jelmer at samba.org
Sat Aug 9 02:58:03 BST 2008
At http://people.samba.org/bzr/jelmer/bzr-svn/trunk
------------------------------------------------------------
revno: 1569
revision-id: jelmer at samba.org-20080809015800-en938uqrhjmof4rk
parent: jelmer at samba.org-20080808235503-0hsgvb1lm0uqsmcv
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.4
timestamp: Sat 2008-08-09 03:58:00 +0200
message:
Preserve individual text revision ids correctly when round-tripping.
modified:
NEWS news-20061231030336-h9fhq245ie0de8bs-1
commit.py commit.py-20060607190346-qvq128wgfubhhgm2-1
fetch.py fetch.py-20060625004942-x2lfaib8ra707a8p-1
fileids.py fileids.py-20060714013623-u5iiyqqnko11grcf-1
tests/test_push.py test_push.py-20070201165715-g2ievcdfqi33wqsy-1
tree.py tree.py-20060624222557-dudlwqcmkf22lt2s-1
=== modified file 'NEWS'
--- a/NEWS 2008-08-04 16:37:35 +0000
+++ b/NEWS 2008-08-09 01:58:00 +0000
@@ -124,6 +124,8 @@
* Fixed http exception during expensive log -v. (#94316)
+ * Preserve individual text revision ids correctly when round-tripping. (#250480)
+
bzr-svn 0.4.10 2008-05-12
CHANGES
=== modified file 'commit.py'
--- a/commit.py 2008-08-06 01:58:22 +0000
+++ b/commit.py 2008-08-09 01:58:00 +0000
@@ -460,8 +460,9 @@
for id, path, revid in changes:
fileids[path] = id
- if revid is not None and revid != self.base_revid:
+ if revid is not None and revid != self.base_revid and revid != self._new_revision_id:
text_parents[path] = revid
+ mutter('in %r: overriding text revid for %r -> %r' % (self._new_revision_id, path, revid))
self.base_mapping.export_text_parents(text_parents, self._svn_revprops, self._svnprops)
self.base_mapping.export_fileid_map(fileids, self._svn_revprops, self._svnprops)
=== modified file 'fetch.py'
--- a/fetch.py 2008-08-06 02:51:47 +0000
+++ b/fetch.py 2008-08-09 01:58:00 +0000
@@ -230,12 +230,19 @@
self.editor.inventory.remove_recursive_id(self.editor._get_old_id(self.old_id, path))
def _close(self):
- self.editor.inventory[self.new_id].revision = self.editor.revid
+ if (not self.new_id in self.editor.old_inventory or
+ self.editor.inventory[self.new_id] != self.editor.old_inventory[self.new_id] or
+ self.editor._get_text_revid(self.path) is not None):
+ ie = self.editor.inventory[self.new_id]
+ assert self.editor.revid is not None
+ ie.revision = self.editor.revid
- self.editor.texts.add_lines((self.new_id, self.editor.revid),
- [(self.new_id, revid) for revid in self.parent_revids], [])
+ self.editor.texts.add_lines(
+ (self.new_id, self.editor._get_text_revid(self.path) or ie.revision),
+ [(self.new_id, revid) for revid in self.parent_revids], [])
if self.new_id == self.editor.inventory.root.file_id:
+ assert self.editor.inventory.root.revision is not None
assert len(self.editor._premature_deletes) == 0
self.editor._finish_commit()
@@ -258,7 +265,6 @@
else:
old_file_id = None
ie = self.editor.inventory.add_path(path, 'directory', file_id)
- ie.revision = self.editor.revid
return DirectoryRevisionBuildEditor(self.editor, path, old_file_id, file_id)
@@ -280,7 +286,6 @@
self.editor.inventory._byid[file_id] = ie
ie.file_id = file_id
file_parents = []
- ie.revision = self.editor.revid
return DirectoryRevisionBuildEditor(self.editor, path, base_file_id, file_id,
file_parents)
@@ -346,7 +351,7 @@
actual_checksum = md5_strings(lines)
assert checksum is None or checksum == actual_checksum
- self.editor.texts.add_lines((self.file_id, self.editor.revid),
+ self.editor.texts.add_lines((self.file_id, self.editor._get_text_revid(self.path) or self.editor.revid),
[(self.file_id, revid) for revid in self.file_parents], lines)
if self.is_special is not None:
@@ -365,16 +370,15 @@
ie.text_sha1 = None
ie.text_size = None
ie.executable = False
- ie.revision = self.editor.revid
else:
ie = self.editor.inventory.add_path(self.path, 'file', self.file_id)
- ie.revision = self.editor.revid
ie.kind = 'file'
ie.symlink_target = None
ie.text_sha1 = osutils.sha_strings(lines)
ie.text_size = sum(map(len, lines))
assert ie.text_size is not None
ie.executable = self.is_executable
+ ie.revision = self.editor._get_text_revid(self.path) or self.editor.revid
self.file_stream = None
@@ -388,10 +392,12 @@
self.source = source
self.texts = target.texts
self.revid = revid
+ self._text_revids = None
self._premature_deletes = set()
mapping = self.source.lookup_revision_id(revid)[2]
self.old_inventory = prev_inventory
self.inventory = prev_inventory.copy()
+ assert prev_inventory.root is None or self.inventory.root.revision == prev_inventory.root.revision
super(RevisionBuildEditor, self).__init__(revmeta, mapping)
def _get_revision(self, revid):
@@ -419,12 +425,10 @@
def _finish_commit(self):
(rev, signature) = self._get_revision(self.revid)
self.inventory.revision_id = self.revid
- for path, textrevid in self.mapping.import_text_parents(self.revmeta.revprops,
- self.revmeta.fileprops).items():
- self.inventory[self.inventory.path2id(path)].revision = textrevid
# Escaping the commit message is really the task of the serialiser
rev.message = _escape_commit_message(rev.message)
rev.inventory_sha1 = None
+ assert self.inventory.root.revision is not None
self.target.add_revision(self.revid, rev, self.inventory)
if signature is not None:
self.target.add_signature_text(self.revid, signature)
@@ -439,6 +443,7 @@
self.inventory.rename(file_id, parent_id, urlutils.basename(new_path))
def _open_root(self, base_revnum):
+ assert self.revid is not None
if self.old_inventory.root is None:
# First time the root is set
old_file_id = None
@@ -455,7 +460,8 @@
ie = self.inventory.root
else:
ie = self.inventory.add_path("", 'directory', file_id)
- ie.revision = self.revid
+ ie.revision = self.revid
+ assert ie.revision is not None
return DirectoryRevisionBuildEditor(self, "", old_file_id, file_id, file_parents)
def _get_old_id(self, parent_id, old_path):
@@ -480,6 +486,13 @@
return self.mapping.generate_file_id(self.revmeta.uuid, self.revmeta.revnum,
self.revmeta.branch_path, new_path)
+ def _get_text_revid(self, path):
+ if self._text_revids is None:
+ self._text_revids = self.mapping.import_text_parents(self.revmeta.revprops,
+ self.revmeta.fileprops)
+ return self._text_revids.get(path)
+
+
class FileTreeDeltaBuildEditor(FileBuildEditor):
=== modified file 'fileids.py'
--- a/fileids.py 2008-08-08 23:55:03 +0000
+++ b/fileids.py 2008-08-09 01:58:00 +0000
@@ -291,7 +291,6 @@
self.actual.update_map(map, revid, idmap, changes)
self._use_text_revids(mapping, revmeta, map)
- mutter('%r -> %r' % (revid, map))
parent_revs = next_parent_revs
=== modified file 'tests/test_push.py'
--- a/tests/test_push.py 2008-08-06 02:51:47 +0000
+++ b/tests/test_push.py 2008-08-09 01:58:00 +0000
@@ -307,16 +307,17 @@
b = Branch.open("b")
def check_tree_revids(rtree):
- self.assertEqual(rtree.inventory.root.revision, revid)
self.assertEqual(rtree.inventory[rtree.path2id("file")].revision,
revid)
self.assertEqual(rtree.inventory[rtree.path2id("foo")].revision,
- revid)
+ b.revision_history()[1])
self.assertEqual(rtree.inventory[rtree.path2id("foo/bla")].revision,
revid)
+ self.assertEqual(rtree.inventory.root.revision, b.revision_history()[0])
+
+ check_tree_revids(wt.branch.repository.revision_tree(b.last_revision()))
check_tree_revids(b.repository.revision_tree(b.last_revision()))
-
bc = self.svndir.open_branch()
check_tree_revids(bc.repository.revision_tree(bc.last_revision()))
@@ -608,11 +609,7 @@
wt1.lock_write()
try:
- wt1.branch.repository.fetch(wt2.branch.repository)
- merge = Merger.from_revision_ids(DummyProgress(), wt1, other=other_revid)
- merge.merge_type = Merge3Merger
- merge.do_merge()
- merge.set_pending()
+ wt1.merge_from_branch(wt2.branch)
self.assertEquals([wt1.last_revision(), other_revid], wt1.get_parent_ids())
mergingrevid = wt1.commit("merge", rev_id="side2")
check_tree(wt1.branch.repository.revision_tree(mergingrevid))
=== modified file 'tree.py'
--- a/tree.py 2008-08-08 22:10:26 +0000
+++ b/tree.py 2008-08-09 01:58:00 +0000
@@ -72,9 +72,10 @@
self._revision_id = revision_id
(self.branch_path, self.revnum, mapping) = repository.lookup_revision_id(revision_id)
self._inventory = Inventory()
+ self._inventory.revision_id = revision_id
self.id_map = repository.get_fileid_map(self.revnum, self.branch_path,
mapping)
- editor = TreeBuildEditor(self)
+ editor = TreeBuildEditor(self, revision_id)
self.file_data = {}
root_repos = repository.transport.get_svn_repos_root()
conn = repository.transport.get_connection()
@@ -105,7 +106,6 @@
file_id, revision_id = self.tree.id_map[""]
ie = self.tree._inventory.add_path("", 'directory', file_id)
ie.revision = revision_id
- self.tree._inventory.revision_id = revision_id
return DirectoryTreeEditor(self.tree, file_id)
def close(self):
More information about the bazaar-commits
mailing list