Rev 3784: CommitBuilder handles deletes via record_iter_entries. in http://people.ubuntu.com/~robertc/baz2.0/commit-iterchanges

Robert Collins robertc at robertcollins.net
Tue Nov 18 04:08:35 GMT 2008


At http://people.ubuntu.com/~robertc/baz2.0/commit-iterchanges

------------------------------------------------------------
revno: 3784
revision-id: robertc at robertcollins.net-20081118040830-r2h40qd6q5yq7mcq
parent: robertc at robertcollins.net-20081118030221-u9cx70qw029tg2b5
committer: Robert Collins <robertc at robertcollins.net>
branch nick: commit-iterchanges
timestamp: Tue 2008-11-18 15:08:30 +1100
message:
  CommitBuilder handles deletes via record_iter_entries.
modified:
  bzrlib/commit.py               commit.py-20050511101309-79ec1a0168e0e825
  bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
  bzrlib/tests/per_repository/test_commit_builder.py test_commit_builder.py-20060606110838-76e3ra5slucqus81-1
=== modified file 'bzrlib/commit.py'
--- a/bzrlib/commit.py	2008-11-18 03:02:21 +0000
+++ b/bzrlib/commit.py	2008-11-18 04:08:30 +0000
@@ -437,7 +437,7 @@
         # unless deletes occured, in which case the length is irrelevant.
         if (self.any_entries_deleted or 
             (len(self.builder.new_inventory) != 1 and
-             self.builder.any_entries_changed())):
+             self.builder.any_changes())):
             return
         raise PointlessCommit()
 

=== modified file 'bzrlib/repository.py'
--- a/bzrlib/repository.py	2008-11-18 02:43:51 +0000
+++ b/bzrlib/repository.py	2008-11-18 04:08:30 +0000
@@ -124,9 +124,9 @@
         self.basis_delta = []
         self._recording_deletes = False
         # memo'd check for no-op commits.
-        self._any_entries_changed = False
+        self._any_changes = False
 
-    def any_entries_changed(self):
+    def any_changes(self):
         """Return True if any entries were changed.
         
         This includes merge-only changes. It is the core for the --unchanged
@@ -134,7 +134,7 @@
 
         :return: True if any changes have occured.
         """
-        return self._any_entries_changed
+        return self._any_changes
 
     def commit(self, message):
         """Make the actual commit.
@@ -169,8 +169,11 @@
         deserializing the inventory, while we already have a copy in
         memory.
         """
+        if self.new_inventory is None:
+            self.new_inventory = self.repository.get_inventory(
+                self._new_revision_id)
         return RevisionTree(self.repository, self.new_inventory,
-                            self._new_revision_id)
+            self._new_revision_id)
 
     def finish_inventory(self):
         """Tell the builder that the inventory is finished.
@@ -182,12 +185,12 @@
             # an inventory delta was accumulated without creating a new
             # inventory.
             try:
-                basis_id = self.parents[0].revision_id
+                basis_id = self.parents[0]
             except IndexError:
                 basis_id = _mod_revision.NULL_REVISION
             self.inv_sha1 = self.repository.add_inventory_delta(
                 basis_id, self.basis_delta, self._new_revision_id,
-                [parent.revision_id for parent in self.parents])
+                self.parents)
         else:
             if self.new_inventory.root is None:
                 raise AssertionError('Root entry should be supplied to'
@@ -242,15 +245,17 @@
         # _new_revision_id
         ie.revision = self._new_revision_id
 
-    def _require_root_change(self):
+    def _require_root_change(self, tree):
         """Enforce an appropriate root object change.
 
         This is called once when record_iter_changes is called, if and only if
         the root was not in the delta calculated by record_iter_changes.
+
+        :param tree: The tree which is being committed.
         """
         # NB: if there are no parents then this method is not called, so no
         # need to guard on parents having length.
-        entry = entry_factory['directory'](self.parents[0].root.file_id, '',
+        entry = entry_factory['directory'](tree.path2id(''), '',
             None)
         entry.revision = self._new_revision_id
         self.basis_delta.append(('', '', entry.file_id, entry))
@@ -502,13 +507,14 @@
         else:
             raise NotImplementedError('unknown kind')
         ie.revision = self._new_revision_id
-        self._any_entries_changed = True
+        self._any_changes = True
         return self._get_delta(ie, basis_inv, path), True, fingerprint
 
-    def record_iter_changes(self, basis_revision_id, iter_changes,
+    def record_iter_changes(self, tree, basis_revision_id, iter_changes,
         _entry_factory=entry_factory):
         """Record a new tree via iter_changes.
 
+        :param tree: The tree to obtain text contents from for changed objects.
         :param basis_revision_id: The revision id of the tree the iter_changes
             has been generated against.
         :param iter_changes: An iter_changes iterator.
@@ -543,10 +549,10 @@
                 seen_root = True
         self.new_inventory = None
         if len(inv_delta):
-            self._any_entries_changed = True
+            self._any_changes = True
         if not seen_root:
             # housekeeping root entry changes do not affect no-change commits.
-            self._require_root_change()
+            self._require_root_change(tree)
 
     def _add_text_to_weave(self, file_id, new_lines, parents, nostore_sha):
         # Note: as we read the content directly from the tree, we know its not
@@ -576,11 +582,13 @@
         :param tree: The tree that is being committed.
         """
 
-    def _require_root_change(self):
+    def _require_root_change(self, tree):
         """Enforce an appropriate root object change.
 
         This is called once when record_iter_changes is called, if and only if
         the root was not in the delta calculated by record_iter_changes.
+
+        :param tree: The tree which is being committed.
         """
         # versioned roots do not change unless the tree found a change.
 

=== modified file 'bzrlib/tests/per_repository/test_commit_builder.py'
--- a/bzrlib/tests/per_repository/test_commit_builder.py	2008-11-18 02:43:51 +0000
+++ b/bzrlib/tests/per_repository/test_commit_builder.py	2008-11-18 04:08:30 +0000
@@ -76,7 +76,7 @@
         try:
             builder = tree.branch.get_commit_builder([])
             try:
-                builder.record_iter_changes(tree.last_revision(),
+                builder.record_iter_changes(tree, tree.last_revision(),
                     tree.iter_changes(tree.basis_tree()))
                 builder.finish_inventory()
             except:
@@ -104,7 +104,7 @@
         try:
             builder = tree.branch.get_commit_builder([])
             try:
-                builder.record_iter_changes(tree.last_revision(),
+                builder.record_iter_changes(tree, tree.last_revision(),
                     tree.iter_changes(tree.basis_tree()))
                 builder.finish_inventory()
             except:
@@ -180,7 +180,7 @@
                 return
             self.assertFalse(builder.random_revid)
             try:
-                builder.record_iter_changes(tree.last_revision(),
+                builder.record_iter_changes(tree, tree.last_revision(),
                     tree.iter_changes(tree.basis_tree()))
                 builder.finish_inventory()
             except:
@@ -220,7 +220,7 @@
         parent_tree = tree.basis_tree()
         parent_tree.lock_read()
         self.addCleanup(parent_tree.unlock)
-        builder = tree.branch.get_commit_builder([parent_tree.inventory])
+        builder = tree.branch.get_commit_builder([old_revision_id])
         try:
             ie = inventory.make_entry('directory', '', None,
                     tree.get_root_id())
@@ -229,7 +229,7 @@
                 tree.path_content_summary(''))
             # Regardless of repository root behaviour we should consider this a
             # pointless commit.
-            self.assertFalse(builder.any_entries_changed())
+            self.assertFalse(builder.any_changes())
             self.assertFalse(version_recorded)
             # if the repository format recorded a new root revision, that
             # should be in the delta
@@ -258,13 +258,12 @@
         parent_tree = tree.basis_tree()
         parent_tree.lock_read()
         self.addCleanup(parent_tree.unlock)
-        builder = tree.branch.get_commit_builder([parent_tree.inventory])
+        builder = tree.branch.get_commit_builder([old_revision_id])
         try:
-            builder.record_iter_changes(old_revision_id,
-                tree.iter_changes(parent_tree))
+            builder.record_iter_changes(tree, old_revision_id, [])
             # Regardless of repository root behaviour we should consider this a
             # pointless commit.
-            self.assertFalse(builder.any_entries_changed())
+            self.assertFalse(builder.any_changes())
             builder.finish_inventory()
             new_root = tree.branch.repository.get_inventory(
                 builder._new_revision_id).root
@@ -329,6 +328,34 @@
         self.addCleanup(rev_tree.unlock)
         self.assertFalse(rev_tree.path2id('foo'))
 
+    def test_record_delete_record_iter_changes(self):
+        tree = self.make_branch_and_tree(".")
+        self.build_tree(["foo"])
+        tree.add(["foo"], ["foo-id"])
+        rev_id = tree.commit("added foo")
+        tree.lock_write()
+        try:
+            builder = tree.branch.get_commit_builder([rev_id])
+            try:
+                delete_change = ('foo-id', ('foo', None), True, (True, False),
+                    (tree.path2id(''), None), ('foo', None), ('file', None),
+                    (False, None))
+                builder.record_iter_changes(tree, rev_id, [delete_change])
+                self.assertEqual(("foo", None, "foo-id", None),
+                    builder.basis_delta[0])
+                self.assertTrue(builder.any_changes())
+                builder.finish_inventory()
+                rev_id2 = builder.commit('delete foo')
+            except:
+                builder.abort()
+                raise
+        finally:
+            tree.unlock()
+        rev_tree = builder.revision_tree()
+        rev_tree.lock_read()
+        self.addCleanup(rev_tree.unlock)
+        self.assertFalse(rev_tree.path2id('foo'))
+
     def test_record_delete_without_notification(self):
         tree = self.make_branch_and_tree(".")
         self.build_tree(["foo"])




More information about the bazaar-commits mailing list