Rev 272: Add a bunch of direct tests for the _TreeShim interface. in lp:~jameinel/bzr-fastimport/less-sticky

John Arbash Meinel john at arbash-meinel.com
Wed Dec 9 20:14:51 GMT 2009


At lp:~jameinel/bzr-fastimport/less-sticky

------------------------------------------------------------
revno: 272
revision-id: john at arbash-meinel.com-20091209201446-cqvb4hhugk8lf9m0
parent: john at arbash-meinel.com-20091130175702-5qz8g0rtioon45wk
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: less-sticky
timestamp: Wed 2009-12-09 14:14:46 -0600
message:
  Add a bunch of direct tests for the _TreeShim interface.
-------------- next part --------------
=== modified file 'revision_store.py'
--- a/revision_store.py	2009-11-30 17:57:02 +0000
+++ b/revision_store.py	2009-12-09 20:14:46 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2008 Canonical Ltd
+# Copyright (C) 2008, 2009 Canonical Ltd
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -40,10 +40,16 @@
         if file_id in self._new_info_by_id:
             new_path = self._new_info_by_id[file_id][0]
             if new_path is None:
-                raise errors.NoSuchId()
+                raise errors.NoSuchId(self, file_id)
+            return new_path
         return self._basis_inv.id2path(file_id)
 
     def path2id(self, path):
+        # CommitBuilder currently only requires access to the root id. We don't
+        # build a map of renamed files, etc. One possibility if we ever *do*
+        # need more than just root, is to defer to basis_inv.path2id() and then
+        # check if the file_id is in our _new_info_by_id dict. And in that
+        # case, return _new_info_by_id[file_id][0]
         if path != '':
             raise NotImplementedError(_TreeShim.path2id)
         # TODO: Handle root renames?
@@ -72,7 +78,6 @@
     def get_reference_revision(self, file_id, path=None):
         raise NotImplementedError(_TreeShim.get_reference_revision)
 
-
     def _delta_to_iter_changes(self):
         """Convert the inv_delta into an iter_changes repr."""
         # iter_changes is:
@@ -87,6 +92,9 @@
         #   )
         basis_inv = self._basis_inv
         for old_path, new_path, file_id, ie in self._inv_delta:
+            # Perf: Would this be faster if we did 'if file_id in basis_inv'?
+            # Since the *very* common case is that the file already exists, it
+            # probably is better to optimize for that
             try:
                 old_ie = basis_inv[file_id]
             except errors.NoSuchId:
@@ -126,6 +134,7 @@
                     content_modified = (ie.text_sha1 != old_ie.text_sha1
                                         or ie.text_size != old_ie.text_size)
                     # TODO: ie.kind != old_ie.kind
+                    # TODO: symlinks changing targets, content_modified?
                     change = (file_id,
                         (old_path, new_path),
                         content_modified,

=== modified file 'tests/__init__.py'
--- a/tests/__init__.py	2009-02-25 11:33:28 +0000
+++ b/tests/__init__.py	2009-12-09 20:14:46 +0000
@@ -21,15 +21,16 @@
 
 
 def test_suite():
-    module_names = [
-        'bzrlib.plugins.fastimport.tests.test_branch_mapper',
-        'bzrlib.plugins.fastimport.tests.test_commands',
-        'bzrlib.plugins.fastimport.tests.test_errors',
-        'bzrlib.plugins.fastimport.tests.test_filter_processor',
-        'bzrlib.plugins.fastimport.tests.test_generic_processor',
-        'bzrlib.plugins.fastimport.tests.test_head_tracking',
-        'bzrlib.plugins.fastimport.tests.test_helpers',
-        'bzrlib.plugins.fastimport.tests.test_parser',
-        ]
+    module_names = [__name__ + '.' + x for x in [
+        'test_branch_mapper',
+        'test_commands',
+        'test_errors',
+        'test_filter_processor',
+        'test_generic_processor',
+        'test_head_tracking',
+        'test_helpers',
+        'test_parser',
+        'test_revision_store',
+        ]]
     loader = TestLoader()
     return loader.loadTestsFromModuleNames(module_names)

=== added file 'tests/test_revision_store.py'
--- a/tests/test_revision_store.py	1970-01-01 00:00:00 +0000
+++ b/tests/test_revision_store.py	2009-12-09 20:14:46 +0000
@@ -0,0 +1,147 @@
+# Copyright (C) 2008, 2009 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+"""Direct tests of the revision_store classes."""
+
+from bzrlib import (
+    branch,
+    errors,
+    inventory,
+    osutils,
+    tests,
+    )
+
+from bzrlib.plugins.fastimport import (
+    revision_store,
+    )
+
+
+class Test_TreeShim(tests.TestCase):
+
+    def invAddEntry(self, inv, path, file_id=None):
+        if path.endswith('/'):
+            path = path[:-1]
+            kind = 'directory'
+        else:
+            kind = 'file'
+        parent_path, basename = osutils.split(path)
+        parent_id = inv.path2id(parent_path)
+        inv.add(inventory.make_entry(kind, basename, parent_id, file_id))
+
+    def make_trivial_basis_inv(self):
+        basis_inv = inventory.Inventory('TREE_ROOT')
+        self.invAddEntry(basis_inv, 'foo', 'foo-id')
+        self.invAddEntry(basis_inv, 'bar/', 'bar-id')
+        self.invAddEntry(basis_inv, 'bar/baz', 'baz-id')
+        return basis_inv
+        
+    def test_id2path_no_delta(self):
+        basis_inv = self.make_trivial_basis_inv()
+        shim = revision_store._TreeShim(repo=None, basis_inv=basis_inv,
+                                        inv_delta=[], content_provider=None)
+        self.assertEqual('', shim.id2path('TREE_ROOT'))
+        self.assertEqual('foo', shim.id2path('foo-id'))
+        self.assertEqual('bar', shim.id2path('bar-id'))
+        self.assertEqual('bar/baz', shim.id2path('baz-id'))
+        self.assertRaises(errors.NoSuchId, shim.id2path, 'qux-id')
+
+    def test_id2path_with_delta(self):
+        basis_inv = self.make_trivial_basis_inv()
+        foo_entry = inventory.make_entry('file', 'foo2', 'TREE_ROOT', 'foo-id')
+        inv_delta = [('foo', 'foo2', 'foo-id', foo_entry),
+                     ('bar/baz', None, 'baz-id', None),
+                    ]
+
+        shim = revision_store._TreeShim(repo=None, basis_inv=basis_inv,
+                                        inv_delta=inv_delta,
+                                        content_provider=None)
+        self.assertEqual('', shim.id2path('TREE_ROOT'))
+        self.assertEqual('foo2', shim.id2path('foo-id'))
+        self.assertEqual('bar', shim.id2path('bar-id'))
+        self.assertRaises(errors.NoSuchId, shim.id2path, 'baz-id')
+
+    def test_path2id(self):
+        basis_inv = self.make_trivial_basis_inv()
+        shim = revision_store._TreeShim(repo=None, basis_inv=basis_inv,
+                                        inv_delta=[], content_provider=None)
+        self.assertEqual('TREE_ROOT', shim.path2id(''))
+        # We don't want to ever give a wrong value, so for now we just raise
+        # NotImplementedError
+        self.assertRaises(NotImplementedError, shim.path2id, 'bar')
+
+    def test_get_file_with_stat_content_in_stream(self):
+        basis_inv = self.make_trivial_basis_inv()
+
+        def content_provider(file_id):
+            return 'content of\n' + file_id + '\n'
+        
+        shim = revision_store._TreeShim(repo=None, basis_inv=basis_inv,
+                                        inv_delta=[],
+                                        content_provider=content_provider)
+        f_obj, stat_val = shim.get_file_with_stat('baz-id')
+        self.assertIs(None, stat_val)
+        self.assertEqualDiff('content of\nbaz-id\n', f_obj.read())
+
+    # TODO: Test when the content isn't in the stream, and we fall back to the
+    #       repository that was passed in
+
+    def test_get_symlink_target(self):
+        basis_inv = self.make_trivial_basis_inv()
+        ie = inventory.make_entry('symlink', 'link', 'TREE_ROOT', 'link-id')
+        ie.symlink_target = u'link-target'
+        basis_inv.add(ie)
+        shim = revision_store._TreeShim(repo=None, basis_inv=basis_inv,
+                                        inv_delta=[], content_provider=None)
+        self.assertEqual(u'link-target', shim.get_symlink_target('link-id'))
+
+    def test_get_symlink_target_from_delta(self):
+        basis_inv = self.make_trivial_basis_inv()
+        ie = inventory.make_entry('symlink', 'link', 'TREE_ROOT', 'link-id')
+        ie.symlink_target = u'link-target'
+        inv_delta = [(None, 'link', 'link-id', ie)]
+        shim = revision_store._TreeShim(repo=None, basis_inv=basis_inv,
+                                        inv_delta=inv_delta,
+                                        content_provider=None)
+        self.assertEqual(u'link-target', shim.get_symlink_target('link-id'))
+
+    def test__delta_to_iter_changes(self):
+        basis_inv = self.make_trivial_basis_inv()
+        foo_entry = inventory.make_entry('file', 'foo2', 'bar-id', 'foo-id')
+        link_entry = inventory.make_entry('symlink', 'link', 'TREE_ROOT',
+                                          'link-id')
+        link_entry.symlink_target = u'link-target'
+        inv_delta = [('foo', 'bar/foo2', 'foo-id', foo_entry),
+                     ('bar/baz', None, 'baz-id', None),
+                     (None, 'link', 'link-id', link_entry),
+                    ]
+        shim = revision_store._TreeShim(repo=None, basis_inv=basis_inv,
+                                        inv_delta=inv_delta,
+                                        content_provider=None)
+        changes = list(shim._delta_to_iter_changes())
+        expected = [('foo-id', ('foo', 'bar/foo2'), False, (True, True),
+                     ('TREE_ROOT', 'bar-id'), ('foo', 'foo2'),
+                     ('file', 'file'), (False, False)),
+                    ('baz-id', ('bar/baz', None), True, (True, False),
+                     ('bar-id', None), ('baz', None),
+                     ('file', None), (False, None)),
+                    ('link-id', (None, 'link'), True, (False, True),
+                     (None, 'TREE_ROOT'), (None, 'link'),
+                     (None, 'symlink'), (None, False)),
+                   ]
+        # from pprint import pformat
+        # self.assertEqualDiff(pformat(expected), pformat(changes))
+        self.assertEqual(expected, changes)
+                        



More information about the bazaar-commits mailing list