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