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