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