Rev 3769: Create a smoke-tested CHKInventory.iter_changes(CHKInventory) - incomplete in general but enough to start working with. in http://people.ubuntu.com/~robertc/baz2.0/repository
Robert Collins
robertc at robertcollins.net
Thu Nov 13 03:50:00 GMT 2008
At http://people.ubuntu.com/~robertc/baz2.0/repository
------------------------------------------------------------
revno: 3769
revision-id: robertc at robertcollins.net-20081113034955-itzi7mvzhqkml36w
parent: robertc at robertcollins.net-20081113032056-djjm0lykam7okvit
committer: Robert Collins <robertc at robertcollins.net>
branch nick: repository
timestamp: Thu 2008-11-13 14:49:55 +1100
message:
Create a smoke-tested CHKInventory.iter_changes(CHKInventory) - incomplete in general but enough to start working with.
modified:
bzrlib/inventory.py inventory.py-20050309040759-6648b84ca2005b37
bzrlib/tests/test_inv.py testinv.py-20050722220913-1dc326138d1a5892
bzrlib/tree.py tree.py-20050309040759-9d5f2496be663e77
=== modified file 'bzrlib/inventory.py'
--- a/bzrlib/inventory.py 2008-11-12 04:47:37 +0000
+++ b/bzrlib/inventory.py 2008-11-13 03:49:55 +0000
@@ -1477,6 +1477,55 @@
for key, _ in self.id_to_entry.iteritems():
yield key[-1]
+ def iter_changes(self, basis):
+ """Generate a Tree.iter_changes change list between this and basis.
+
+ :param basis: Another CHKInventory.
+ :return: An iterator over the changes between self and basis, as per
+ tree.iter_changes().
+ """
+ # We want: (file_id, (path_in_source, path_in_target),
+ # changed_content, versioned, parent, name, kind,
+ # executable)
+ for key, basis_value, self_value in \
+ self.id_to_entry.iter_changes(basis.id_to_entry):
+ file_id = key[0]
+ path_in_source = basis.id2path(file_id)
+ path_in_target = self.id2path(file_id)
+ if basis_value is not None:
+ basis_entry = basis._bytes_to_entry(basis_value)
+ if self_value is not None:
+ self_entry = self._bytes_to_entry(self_value)
+ if basis_value is None:
+ # add
+ kind = (None, self_entry.kind)
+ versioned = (False, True)
+ if self_value is None:
+ # delete
+ kind = (basis_entry.kind, None)
+ versioned = (True, False)
+ else:
+ kind = (basis_entry.kind, self_entry.kind)
+ versioned = (True, True)
+ if kind[0] != kind[1]:
+ changed_content = True
+ elif kind[0] == 'file':
+ if (self_entry.text_size != basis_entry.text_size or
+ self_entry.text_sha1 != basis_entry.text_sha1):
+ changed_content = True
+ elif kind[1] == 'symlink':
+ if self_entry.symlink_target != basis_entry.symlink_target:
+ changed_content = True
+ elif kind[2] == 'tree-reference':
+ if (self_entry.reference_revision !=
+ basis_entry.reference_revision):
+ changed_content = True
+ parent = (basis_entry.parent_id, self_entry.parent_id)
+ name = (basis_entry.name, self_entry.name)
+ executable = (basis_entry.executable, self_entry.executable)
+ yield (file_id, (path_in_source, path_in_target), changed_content,
+ versioned, parent, name, kind, executable)
+
def __len__(self):
"""Return the number of entries in the inventory."""
return len(self.id_to_entry)
=== modified file 'bzrlib/tests/test_inv.py'
--- a/bzrlib/tests/test_inv.py 2008-11-12 04:47:37 +0000
+++ b/bzrlib/tests/test_inv.py 2008-11-13 03:49:55 +0000
@@ -403,3 +403,35 @@
self.assertEqual(reference_inv.root_id, new_inv.root_id)
self.assertEqual(reference_inv.id_to_entry._root_node._key,
new_inv.id_to_entry._root_node._key)
+
+ def test_iter_changes(self):
+ # Low level bootstrapping smoke test; comprehensive generic tests via
+ # InterTree are coming.
+ inv = Inventory()
+ inv.revision_id = "revid"
+ inv.root.revision = "rootrev"
+ inv.add(InventoryFile("fileid", "file", inv.root.file_id))
+ inv["fileid"].revision = "filerev"
+ inv["fileid"].executable = True
+ inv["fileid"].text_sha1 = "ffff"
+ inv["fileid"].text_size = 1
+ inv2 = Inventory()
+ inv2.revision_id = "revid2"
+ inv2.root.revision = "rootrev"
+ inv2.add(InventoryFile("fileid", "file", inv.root.file_id))
+ inv2["fileid"].revision = "filerev2"
+ inv2["fileid"].executable = False
+ inv2["fileid"].text_sha1 = "bbbb"
+ inv2["fileid"].text_size = 2
+ # get fresh objects.
+ chk_bytes = self.get_chk_bytes()
+ chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
+ bytes = ''.join(chk_inv.to_lines())
+ inv_1 = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
+ chk_inv2 = CHKInventory.from_inventory(chk_bytes, inv2)
+ bytes = ''.join(chk_inv2.to_lines())
+ inv_2 = CHKInventory.deserialise(chk_bytes, bytes, ("revid2",))
+ self.assertEqual([('fileid', (u'file', u'file'), True, (True, True),
+ ('TREE_ROOT', 'TREE_ROOT'), (u'file', u'file'), ('file', 'file'),
+ (False, True))],
+ list(inv_1.iter_changes(inv_2)))
=== modified file 'bzrlib/tree.py'
--- a/bzrlib/tree.py 2008-10-28 09:16:22 +0000
+++ b/bzrlib/tree.py 2008-11-13 03:49:55 +0000
@@ -919,10 +919,10 @@
if (self.source.get_symlink_target(file_id) !=
self.target.get_symlink_target(file_id)):
changed_content = True
- elif from_kind == 'tree-reference':
- if (self.source.get_reference_revision(file_id, from_path)
- != self.target.get_reference_revision(file_id, to_path)):
- changed_content = True
+ elif from_kind == 'tree-reference':
+ if (self.source.get_reference_revision(file_id, from_path)
+ != self.target.get_reference_revision(file_id, to_path)):
+ changed_content = True
parent = (from_parent, to_entry.parent_id)
name = (from_name, to_entry.name)
executable = (from_executable, to_executable)
More information about the bazaar-commits
mailing list