At http://bazaar.launchpad.net/~lifeless/bzr/apply-inventory-delta
------------------------------------------------------------ revno: 4530 revision-id: [email protected] parent: [email protected] committer: Robert Collins <[email protected]> branch nick: apply-inventory-delta timestamp: Mon 2009-07-13 15:44:06 +1000 message: Look for trivial issues with new_path and entry being out of sync in deltas. === modified file 'bzrlib/dirstate.py' --- a/bzrlib/dirstate.py 2009-07-13 04:51:34 +0000 +++ b/bzrlib/dirstate.py 2009-07-13 05:44:06 +0000 @@ -1296,7 +1296,9 @@ for old_path, new_path, file_id, inv_entry in sorted( inventory._check_delta_unique_old_paths( inventory._check_delta_unique_new_paths( - inventory._check_delta_ids_match_entry(delta))), reverse=True): + inventory._check_delta_ids_match_entry( + inventory._check_delta_new_path_entry_both_or_None(delta)))), + reverse=True): if (file_id in insertions) or (file_id in removals): self._changes_aborted = True raise errors.InconsistentDelta(old_path or new_path, file_id, @@ -1305,6 +1307,9 @@ old_path = old_path.encode('utf-8') removals[file_id] = old_path if new_path is not None: + if inv_entry is None: + raise errors.InconsistentDelta(new_path, file_id, + "new_path with no entry") new_path = new_path.encode('utf-8') dirname, basename = osutils.split(new_path) dirname_utf8 = encode(dirname) @@ -1454,6 +1459,9 @@ raise errors.InconsistentDelta(new_path, file_id, "mismatched entry file_id %r" % inv_entry) if new_path is not None: + if inv_entry is None: + raise errors.InconsistentDelta(new_path, file_id, + "new_path with no entry") new_path_utf8 = encode(new_path) # note the parent for validation dirname_utf8, basename_utf8 = osutils.split(new_path_utf8) === modified file 'bzrlib/inventory.py' --- a/bzrlib/inventory.py 2009-07-13 04:51:34 +0000 +++ b/bzrlib/inventory.py 2009-07-13 05:44:06 +0000 @@ -1132,7 +1132,8 @@ # facility. list(_check_delta_unique_ids(_check_delta_unique_new_paths( _check_delta_unique_old_paths(_check_delta_ids_match_entry( - delta))))) + _check_delta_new_path_entry_both_or_None( + delta)))))) children = {} # Remove all affected items which were in the original inventory, @@ -1156,7 +1157,7 @@ # longest, ensuring that items which were modified and whose parents in # the resulting inventory were also modified, are inserted after their # parents. - for new_path, new_entry in sorted((np, e) for op, np, f, e in + for new_path, f, new_entry in sorted((np, f, e) for op, np, f, e in delta if np is not None): if new_entry.kind == 'directory': # Pop the child which to allow detection of children whose @@ -1636,6 +1637,9 @@ inventory_delta = _check_delta_unique_new_paths(inventory_delta) # Check for entries that don't match the fileid inventory_delta = _check_delta_ids_match_entry(inventory_delta) + # Check for new_path <-> entry consistency + inventory_delta = _check_delta_new_path_entry_both_or_None( + inventory_delta) # All changed entries need to have their parents be directories and be # at the right path. This set contains (path, id) tuples. parents = set() @@ -2170,3 +2174,20 @@ raise errors.InconsistentDelta(item[0] or item[1], item[2], "mismatched id with %r" % entry) yield item + + +def _check_delta_new_path_entry_both_or_None(delta): + """Decorate a delta and check that the new_path and entry are paired. + + :return: A generator over delta. + """ + for item in delta: + new_path = item[1] + entry = item[3] + if new_path is None and entry is not None: + raise errors.InconsistentDelta(item[0], item[1], + "Entry with no new_path") + if new_path is not None and entry is None: + raise errors.InconsistentDelta(new_path, item[1], + "new_path with no entry") + yield item === modified file 'bzrlib/tests/test_inv.py' --- a/bzrlib/tests/test_inv.py 2009-07-13 04:51:34 +0000 +++ b/bzrlib/tests/test_inv.py 2009-07-13 05:44:06 +0000 @@ -159,7 +159,7 @@ paths = {} parents = set() for old, new, id, entry in delta: - if entry is None: + if None in (new, entry): continue paths[new] = (entry.file_id, entry.kind) parents.add(osutils.dirname(new)) @@ -337,6 +337,22 @@ self.assertRaises(errors.InconsistentDelta, self.apply_delta, self, inv, delta) + def test_mismatched_new_path_entry_None(self): + inv = self.get_empty_inventory() + delta = [(None, u'path', 'id', None)] + self.assertRaises(errors.InconsistentDelta, self.apply_delta, self, + inv, delta) + + def test_mismatched_new_path_None_entry(self): + inv = self.get_empty_inventory() + file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id) + file1.revision = 'result' + file1.text_size = 0 + file1.text_sha1 = "" + delta = [(u"path", None, 'id1', file1)] + self.assertRaises(errors.InconsistentDelta, self.apply_delta, self, + inv, delta) + def test_parent_is_not_directory(self): inv = self.get_empty_inventory() file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id) -- bazaar-commits mailing list [email protected] https://lists.ubuntu.com/mailman/listinfo/bazaar-commits
