At http://bazaar.launchpad.net/~lifeless/bzr/apply-inventory-delta
------------------------------------------------------------ revno: 4513 revision-id: [email protected] parent: [email protected] committer: Robert Collins <[email protected]> branch nick: apply-inventory-delta timestamp: Fri 2009-07-10 15:18:29 +1000 message: Fix fallout from the delta checking work, don't error on deltas containing the root inventory item in CHK delta application, and clean up Inventory docs. === modified file 'bzrlib/dirstate.py' --- a/bzrlib/dirstate.py 2009-07-10 02:33:46 +0000 +++ b/bzrlib/dirstate.py 2009-07-10 05:18:29 +0000 @@ -1459,9 +1459,6 @@ (source_path, target_path, entry[0][2], None, False)) deletes.append( (encode(old_path), new_path, file_id, None, False)) - # note the parent for validation - dirname, basename = osutils.split(new_path) - parents.add((dirname, inv_entry.parent_id)) else: # changes to just the root should not require remove/insertion # of everything. @@ -1609,12 +1606,12 @@ entry = self._get_entry(1, file_id, dirname) if entry[1] is None: self._changes_aborted = True - raise errors.InconsistentDelta(dirname, file_id, + raise errors.InconsistentDelta(dirname.decode('utf8'), file_id, "This parent is not present.") # Parents of things must be directories if entry[1][1][0] != 'd': self._changes_aborted = True - raise errors.InconsistentDelta(dirname, file_id, + raise errors.InconsistentDelta(dirname.decode('utf8'), file_id, "This parent is not a directory.") def _observed_sha1(self, entry, sha1, stat_value, @@ -1865,7 +1862,7 @@ self._read_dirblocks_if_needed() if path_utf8 is not None: if type(path_utf8) is not str: - raise AssertionError('path_utf8 is not a str: %s %s' + raise errors.BzrError('path_utf8 is not a str: %s %r' % (type(path_utf8), path_utf8)) # path lookups are faster dirname, basename = osutils.split(path_utf8) === modified file 'bzrlib/inventory.py' --- a/bzrlib/inventory.py 2009-07-09 23:04:39 +0000 +++ b/bzrlib/inventory.py 2009-07-10 05:18:29 +0000 @@ -712,7 +712,19 @@ class CommonInventory(object): - """Basic inventory logic, defined in terms of primitives like has_id.""" + """Basic inventory logic, defined in terms of primitives like has_id. + + An inventory is the metadata about the contents of a tree. + + This is broadly a map from file_id to entries such as directories, files, + symlinks and tree references. Each entry maintains its own metadata like + SHA1 and length for files, or children for a directory. + + Entries can be looked up either by path or by file_id. + + InventoryEntry objects must not be modified after they are + inserted, other than through the Inventory API. + """ def __contains__(self, file_id): """True if this entry contains a file with given id. @@ -1019,46 +1031,32 @@ class Inventory(CommonInventory): - """Inventory of versioned files in a tree. - - This describes which file_id is present at each point in the tree, - and possibly the SHA-1 or other information about the file. - Entries can be looked up either by path or by file_id. - - The inventory represents a typical unix file tree, with - directories containing files and subdirectories. We never store - the full path to a file, because renaming a directory implicitly - moves all of its contents. This class internally maintains a + """Mutable dict based in-memory inventory. + + We never store the full path to a file, because renaming a directory + implicitly moves all of its contents. This class internally maintains a lookup tree that allows the children under a directory to be returned quickly. - InventoryEntry objects must not be modified after they are - inserted, other than through the Inventory API. - >>> inv = Inventory() >>> inv.add(InventoryFile('123-123', 'hello.c', ROOT_ID)) InventoryFile('123-123', 'hello.c', parent_id='TREE_ROOT', sha1=None, len=None, revision=None) >>> inv['123-123'].name 'hello.c' - May be treated as an iterator or set to look up file ids: + Id's may be looked up from paths: - >>> bool(inv.path2id('hello.c')) - True + >>> inv.path2id('hello.c') + '123-123' >>> '123-123' in inv True - May also look up by name: + There are iterators over the contents: - >>> [x[0] for x in inv.iter_entries()] + >>> [entry[0] for entry in inv.iter_entries()] ['', u'hello.c'] - >>> inv = Inventory('TREE_ROOT-12345678-12345678') - >>> inv.add(InventoryFile('123-123', 'hello.c', ROOT_ID)) - Traceback (most recent call last): - BzrError: parent_id {TREE_ROOT} not in inventory - >>> inv.add(InventoryFile('123-123', 'hello.c', 'TREE_ROOT-12345678-12345678')) - InventoryFile('123-123', 'hello.c', parent_id='TREE_ROOT-12345678-12345678', sha1=None, len=None, revision=None) """ + def __init__(self, root_id=ROOT_ID, revision_id=None): """Create or read an inventory. @@ -1680,6 +1678,7 @@ result.id_to_entry.apply_delta(id_to_entry_delta) if parent_id_basename_delta: result.parent_id_basename_to_file_id.apply_delta(parent_id_basename_delta) + parents.discard(None) for parent in parents: try: if result[parent].kind != 'directory': === modified file 'bzrlib/tests/inventory_implementations/basics.py' --- a/bzrlib/tests/inventory_implementations/basics.py 2009-06-10 03:56:49 +0000 +++ b/bzrlib/tests/inventory_implementations/basics.py 2009-07-10 05:18:29 +0000 @@ -112,12 +112,9 @@ def test_error_encoding(self): inv = self.make_inventory('tree-root') inv.add(InventoryFile('a-id', u'\u1234', 'tree-root')) - try: - inv.add(InventoryFile('b-id', u'\u1234', 'tree-root')) - except errors.BzrError, e: - self.assertContainsRe(str(e), u'\u1234'.encode('utf-8')) - else: - self.fail('BzrError not raised') + e = self.assertRaises(errors.InconsistentDelta, inv.add, + InventoryFile('b-id', u'\u1234', 'tree-root')) + self.assertContainsRe(str(e), r'\\u1234') def test_add_recursive(self): parent = InventoryDirectory('src-id', 'src', 'tree-root') @@ -129,6 +126,13 @@ class TestInventoryApplyDelta(TestInventory): + """A subset of the inventory delta application tests. + + See test_inv which has comprehensive delta application tests for + inventories, dirstate, and repository based inventories, unlike the tests + here which only test in-memory implementations that can support a plain + 'apply_delta'. + """ def test_apply_delta_add(self): inv = self.make_inventory('tree-root') @@ -161,7 +165,7 @@ def test_apply_delta_illegal(self): # A file-id cannot appear in a delta more than once inv = self.make_inventory('tree-root') - self.assertRaises(AssertionError, inv.apply_delta, [ + self.assertRaises(errors.InconsistentDelta, inv.apply_delta, [ ("a", "a", "id-1", InventoryFile('id-1', 'a', 'tree-root')), ("a", "b", "id-1", InventoryFile('id-1', 'b', 'tree-root')), ]) -- bazaar-commits mailing list [email protected] https://lists.ubuntu.com/mailman/listinfo/bazaar-commits
