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