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