Rev 4187: Turn record_iter_changes into a generator to emit file system hashes. in http://people.ubuntu.com/~robertc/baz2.0/pending/commit-uses-ric

Robert Collins robertc at robertcollins.net
Wed Mar 25 02:13:58 GMT 2009


At http://people.ubuntu.com/~robertc/baz2.0/pending/commit-uses-ric

------------------------------------------------------------
revno: 4187
revision-id: robertc at robertcollins.net-20090325021348-fx6614yo5iypfugr
parent: robertc at robertcollins.net-20090325005422-fpp8rspbwldukhzk
committer: Robert Collins <robertc at robertcollins.net>
branch nick: commit-uses-ric
timestamp: Wed 2009-03-25 13:13:48 +1100
message:
  Turn record_iter_changes into a generator to emit file system hashes.
=== modified file 'bzrlib/repository.py'
--- a/bzrlib/repository.py	2009-03-24 22:46:51 +0000
+++ b/bzrlib/repository.py	2009-03-25 02:13:48 +0000
@@ -564,7 +564,8 @@
             to basis_revision_id.
         :param _entry_factory: Private method to bind entry_factory locally for
             performance.
-        :return: None
+        :return: A generator of (file_id, relpath, fs_hash) tuples for use with
+            tree._observed_sha1.
         """
         # Create an inventory delta based on deltas between all the parents and
         # deltas between all the parent inventories. We use inventory delta's 
@@ -726,8 +727,10 @@
                     try:
                         entry.text_sha1, entry.text_size = self._add_text_to_weave(
                             file_id, lines, heads, nostore_sha)
+                        yield file_id, change[1][1], (entry.text_sha1, stat_value)
                     except errors.ExistingContent:
                         # No content change against a carry_over parent
+                        # Perhaps this should also yield a fs hash update?
                         carried_over = True
                         entry.text_size = parent_entry.text_size
                         entry.text_sha1 = parent_entry.text_sha1

=== modified file 'bzrlib/tests/per_repository/test_commit_builder.py'
--- a/bzrlib/tests/per_repository/test_commit_builder.py	2009-03-25 00:54:22 +0000
+++ b/bzrlib/tests/per_repository/test_commit_builder.py	2009-03-25 02:13:48 +0000
@@ -76,8 +76,8 @@
         try:
             builder = tree.branch.get_commit_builder([])
             try:
-                builder.record_iter_changes(tree, tree.last_revision(),
-                    tree.iter_changes(tree.basis_tree()))
+                list(builder.record_iter_changes(tree, tree.last_revision(),
+                    tree.iter_changes(tree.basis_tree())))
                 builder.finish_inventory()
             except:
                 builder.abort()
@@ -107,7 +107,7 @@
                 basis = tree.basis_tree()
                 last_rev = tree.last_revision()
                 changes = tree.iter_changes(basis)
-                builder.record_iter_changes(tree, last_rev, changes)
+                list(builder.record_iter_changes(tree, last_rev, changes))
                 builder.finish_inventory()
             finally:
                 builder.abort()
@@ -179,8 +179,8 @@
                 return
             self.assertFalse(builder.random_revid)
             try:
-                builder.record_iter_changes(tree, tree.last_revision(),
-                    tree.iter_changes(tree.basis_tree()))
+                list(builder.record_iter_changes(tree, tree.last_revision(),
+                    tree.iter_changes(tree.basis_tree())))
                 builder.finish_inventory()
             except:
                 builder.abort()
@@ -255,7 +255,7 @@
         tree.lock_write()
         builder = tree.branch.get_commit_builder([old_revision_id])
         try:
-            builder.record_iter_changes(tree, old_revision_id, [])
+            list(builder.record_iter_changes(tree, old_revision_id, []))
             # Regardless of repository root behaviour we should consider this a
             # pointless commit.
             self.assertFalse(builder.any_changes())
@@ -393,7 +393,8 @@
                 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])
+                list(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())
@@ -448,8 +449,9 @@
         try:
             builder = tree.branch.get_commit_builder([])
             try:
-                builder.record_iter_changes(tree, _mod_revision.NULL_REVISION,
-                    tree.iter_changes(tree.basis_tree()))
+                list(builder.record_iter_changes(tree,
+                    _mod_revision.NULL_REVISION,
+                    tree.iter_changes(tree.basis_tree())))
                 builder.finish_inventory()
                 rev_id = builder.commit('foo bar')
             except:
@@ -849,8 +851,8 @@
             record a new version.
         :param delta_against_basis: True of the commit of new_name is expected
             to have a delta against the basis.
-        :param expect_fs_hash: ignored, present for compatibility with test
-            driver code for 'mini_commit'.
+        :param expect_fs_hash: If true, looks for a fs hash output from
+            record_iter_changes.
         """
         tree.lock_write()
         try:
@@ -866,10 +868,21 @@
                 parent_invs.append(tree.branch.repository.revision_tree(
                     parent_id).inventory)
             changes = list(tree.iter_changes(parent_tree))
-            builder.record_iter_changes(tree, parent_ids[0], changes)
+            result = list(builder.record_iter_changes(tree, parent_ids[0],
+                changes))
+            file_id = tree.path2id(new_name)
+            if expect_fs_hash:
+                tree_file_stat = tree.get_file_with_stat(file_id)
+                tree_file_stat[0].close()
+                self.assertLength(1, result)
+                result = result[0]
+                self.assertEqual(result[:2], (file_id, new_name))
+                self.assertEqual(result[2][0], tree.get_file_sha1(file_id))
+                self.assertEqualStat(result[2][1], tree_file_stat[1])
+            else:
+                self.assertEqual([], result)
             delta = builder._basis_delta
             delta_dict = dict((change[2], change) for change in delta)
-            file_id = tree.path2id(new_name)
             version_recorded = (file_id in delta_dict and
                 delta_dict[file_id][3] is not None and
                 delta_dict[file_id][3].revision == builder._new_revision_id)




More information about the bazaar-commits mailing list