Rev 4185: Support tree-reference in record_iter_changes. in http://people.ubuntu.com/~robertc/baz2.0/pending/commit-uses-ric

Robert Collins robertc at robertcollins.net
Tue Mar 24 22:46:57 GMT 2009


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

------------------------------------------------------------
revno: 4185
revision-id: robertc at robertcollins.net-20090324224651-2v2fy6tvuk40l4c0
parent: robertc at robertcollins.net-20090323054814-0y1yph3zuafxgen6
committer: Robert Collins <robertc at robertcollins.net>
branch nick: commit-uses-ric
timestamp: Wed 2009-03-25 09:46:51 +1100
message:
  Support tree-reference in record_iter_changes.
=== modified file 'bzrlib/repository.py'
--- a/bzrlib/repository.py	2009-03-23 05:48:14 +0000
+++ b/bzrlib/repository.py	2009-03-24 22:46:51 +0000
@@ -736,7 +736,7 @@
                     entry.symlink_target = tree.get_symlink_target(file_id)
                     if (carry_over_possible and
                         parent_entry.symlink_target == entry.symlink_target):
-                            carried_over = True
+                        carried_over = True
                     else:
                         self._add_text_to_weave(change[0], [], heads, None)
                 elif kind == 'directory':
@@ -748,7 +748,20 @@
                         if change[1][1] != '' or self.repository.supports_rich_root():
                             self._add_text_to_weave(change[0], [], heads, None)
                 elif kind == 'tree-reference':
-                    raise AssertionError('unknown kind %r' % kind)
+                    if not self.repository._format.supports_tree_reference:
+                        # This isn't quite sane as an error, but we shouldn't
+                        # ever see this code path in practice: tree's don't
+                        # permit references when the repo doesn't support tree
+                        # references.
+                        raise errors.UnsupportedOperation(tree.add_reference,
+                            self.repository)
+                    entry.reference_revision = \
+                        tree.get_reference_revision(change[0])
+                    if (carry_over_possible and
+                        parent_entry.reference_revision == reference_revision):
+                        carried_over = True
+                    else:
+                        self._add_text_to_weave(change[0], [], heads, None)
                 else:
                     raise AssertionError('unknown kind %r' % kind)
                 if not carried_over:

=== modified file 'bzrlib/tests/per_repository/test_commit_builder.py'
--- a/bzrlib/tests/per_repository/test_commit_builder.py	2009-03-23 03:07:13 +0000
+++ b/bzrlib/tests/per_repository/test_commit_builder.py	2009-03-24 22:46:51 +0000
@@ -502,14 +502,17 @@
 
     def _add_commit_check_unchanged(self, tree, name, mini_commit=None):
         tree.add([name], [name + 'id'])
+        self._commit_check_unchanged(self, tree, name, name + 'id',
+            mini_commit=mini_commit)
+
+    def _commit_check_unchanged(self, tree, name, file_id, mini_commit=None):
         rev1 = tree.commit('')
         if mini_commit is None:
             mini_commit = self.mini_commit
         rev2 = mini_commit(tree, name, name, False, False)
         tree1, tree2 = self._get_revtrees(tree, [rev1, rev2])
-        self.assertEqual(rev1, tree1.inventory[name + 'id'].revision)
-        self.assertEqual(rev1, tree2.inventory[name + 'id'].revision)
-        file_id = name + 'id'
+        self.assertEqual(rev1, tree1.inventory[file_id].revision)
+        self.assertEqual(rev1, tree2.inventory[file_id].revision)
         expected_graph = {}
         expected_graph[(file_id, rev1)] = ()
         self.assertFileGraph(expected_graph, tree, (file_id, rev1))
@@ -566,22 +569,51 @@
         self._add_commit_check_unchanged(tree, 'link')
 
     def test_last_modified_revision_after_commit_link_unchanged_ric(self):
-        # committing without changing a link does not change the last modified.
-        self.requireFeature(tests.SymlinkFeature)
+        # committing without changing a subtree does not change the last modified.
         tree = self.make_branch_and_tree('.')
         os.symlink('target', 'link')
         self._add_commit_check_unchanged(tree, 'link',
             mini_commit=self.mini_commit_record_iter_changes)
 
+    def test_last_modified_revision_after_commit_reference_unchanged(self):
+        # committing without changing a subtree does not change the last
+        # modified.
+        tree = self.make_branch_and_tree('.')
+        subtree = self.make_reference('reference')
+        try:
+            tree.add_reference(subtree)
+            self._commit_check_unchanged(tree, 'reference',
+                subtree.get_root_id())
+        except errors.UnsupportedOperation:
+            return
+
+    def test_last_modified_revision_after_commit_reference_unchanged_ric(self):
+        # committing without changing a subtree does not change the last
+        # modified.
+        tree = self.make_branch_and_tree('.')
+        subtree = self.make_reference('reference')
+        try:
+            tree.add_reference(subtree)
+            self._commit_check_unchanged(tree, 'reference',
+                subtree.get_root_id(),
+                mini_commit=self.mini_commit_record_iter_changes)
+        except errors.UnsupportedOperation:
+            return
+
     def _add_commit_renamed_check_changed(self, tree, name,
         expect_fs_hash=False, mini_commit=None):
         def rename():
             tree.rename_one(name, 'new_' + name)
-        if mini_commit is None:
-            mini_commit = self.mini_commit
         self._add_commit_change_check_changed(tree, name, rename,
             expect_fs_hash=expect_fs_hash, mini_commit=mini_commit)
 
+    def _commit_renamed_check_changed(self, tree, name, file_id,
+        expect_fs_hash=False, mini_commit=None):
+        def rename():
+            tree.rename_one(name, 'new_' + name)
+        self._commit_change_check_changed(tree, name, file_id, rename,
+            expect_fs_hash=expect_fs_hash, mini_commit=mini_commit)
+
     def test_last_modified_revision_after_rename_dir_changes(self):
         # renaming a dir changes the last modified.
         tree = self.make_branch_and_tree('.')
@@ -625,6 +657,29 @@
         self._add_commit_renamed_check_changed(tree, 'link',
             mini_commit=self.mini_commit_record_iter_changes)
 
+    def test_last_modified_revision_after_rename_ref_changes(self):
+        # renaming a reference changes the last modified.
+        tree = self.make_branch_and_tree('.')
+        subtree = self.make_reference('reference')
+        try:
+            tree.add_reference(subtree)
+            self._commit_renamed_check_changed(tree, 'reference',
+                subtree.get_root_id())
+        except errors.UnsupportedOperation:
+            return
+
+    def test_last_modified_revision_after_rename_ref_changes_ric(self):
+        # renaming a reference changes the last modified.
+        tree = self.make_branch_and_tree('.')
+        subtree = self.make_reference('reference')
+        try:
+            tree.add_reference(subtree)
+            self._commit_renamed_check_changed(tree, 'reference',
+                subtree.get_root_id(),
+                mini_commit=self.mini_commit_record_iter_changes)
+        except errors.UnsupportedOperation:
+            return
+
     def _add_commit_reparent_check_changed(self, tree, name,
         expect_fs_hash=False, mini_commit=None):
         self.build_tree(['newparent/'])
@@ -680,16 +735,20 @@
     def _add_commit_change_check_changed(self, tree, name, changer,
         expect_fs_hash=False, mini_commit=None):
         tree.add([name], [name + 'id'])
+        self._commit_change_check_changed(self, tree, name, name + 'id',
+            changer, expect_fs_hash=expect_fs_hash, mini_commit=mini_commit)
+
+    def _commit_change_check_changed(self, tree,name, file_id, changer,
+        expect_fs_hash=False, mini_commit=None):
         rev1 = tree.commit('')
         changer()
         if mini_commit is None:
             mini_commit = self.mini_commit
-        rev2 = mini_commit(tree, name, tree.id2path(name + 'id'),
+        rev2 = mini_commit(tree, name, tree.id2path(file_id),
             expect_fs_hash=expect_fs_hash)
         tree1, tree2 = self._get_revtrees(tree, [rev1, rev2])
-        self.assertEqual(rev1, tree1.inventory[name + 'id'].revision)
-        self.assertEqual(rev2, tree2.inventory[name + 'id'].revision)
-        file_id = name + 'id'
+        self.assertEqual(rev1, tree1.inventory[file_id].revision)
+        self.assertEqual(rev2, tree2.inventory[file_id].revision)
         expected_graph = {}
         expected_graph[(file_id, rev1)] = ()
         expected_graph[(file_id, rev2)] = ((file_id, rev1),)
@@ -732,8 +791,12 @@
                 path = tree.id2path(file_id)
                 ie = inventory.make_entry(tree.kind(file_id), old_ie.name,
                     old_ie.parent_id, file_id)
+                content_summary = tree.path_content_summary(path)
+                if content_summary[0] == 'tree-reference':
+                    content_summary = content_summary[:3] + (
+                        tree.get_reference_revision(file_id),)
                 return builder.record_entry_contents(ie, parent_invs, path,
-                    tree, tree.path_content_summary(path))
+                    tree, content_summary)
 
             file_id = tree.path2id(new_name)
             parent_id = tree.inventory[file_id].parent_id
@@ -1079,6 +1142,11 @@
         self.requireFeature(tests.SymlinkFeature)
         os.symlink('target', name)
 
+    def make_reference(self, name):
+        tree = self.make_branch_and_tree(name, format='1.9-rich-root')
+        tree.commit('foo')
+        return tree
+
     def _check_kind_change(self, make_before, make_after, expect_fs_hash=False,
         mini_commit=None):
         tree = self.make_branch_and_tree('.')

=== modified file 'bzrlib/workingtree_4.py'
--- a/bzrlib/workingtree_4.py	2009-03-20 04:16:24 +0000
+++ b/bzrlib/workingtree_4.py	2009-03-24 22:46:51 +0000
@@ -351,11 +351,9 @@
                     parent_ies[(dirname + '/' + name).strip('/')] = inv_entry
                 elif kind == 'tree-reference':
                     if not self._repo_supports_tree_reference:
-                        raise AssertionError(
-                            "repository of %r "
-                            "doesn't support tree references "
-                            "required by entry %r"
-                            % (self, name))
+                        raise errors.UnsupportedOperation(
+                            self._generate_inventory,
+                            self.branch.repository)
                     inv_entry.reference_revision = link_or_sha1 or None
                 elif kind != 'symlink':
                     raise AssertionError("unknown kind %r" % kind)




More information about the bazaar-commits mailing list