=== modified file 'bzrlib/shelf.py' --- bzrlib/shelf.py 2008-12-02 05:54:11 +0000 +++ bzrlib/shelf.py 2009-02-06 02:44:18 +0000 @@ -264,7 +264,6 @@ tt.deserialize(records) return klass(tree, base_tree, tt, metadata.get('message')) - def make_merger(self): """Return a merger that can unshelve the changes.""" pb = ui.ui_factory.nested_progress_bar() === modified file 'bzrlib/tests/test_shelf.py' --- bzrlib/tests/test_shelf.py 2008-12-02 05:54:11 +0000 +++ bzrlib/tests/test_shelf.py 2009-02-06 03:42:45 +0000 @@ -315,6 +315,35 @@ unshelver.make_merger().do_merge() self.assertFileEqual('z\na\nb\nd\n', 'tree/foo') + def test_unshelve_deleted(self): + tree = self.make_branch_and_tree('tree') + tree.lock_write() + self.addCleanup(tree.unlock) + self.build_tree_contents([('tree/foo/',), ('tree/foo/bar', 'baz')]) + tree.add(['foo', 'foo/bar'], ['foo-id', 'bar-id']) + tree.commit('Added file and directory') + tree.unversion(['foo-id', 'bar-id']) + os.unlink('tree/foo/bar') + os.rmdir('tree/foo') + creator = shelf.ShelfCreator(tree, tree.basis_tree()) + list(creator.iter_shelvable()) + creator.shelve_deletion('foo-id') + creator.shelve_deletion('bar-id') + shelf_file = open('shelf', 'w+b') + self.addCleanup(shelf_file.close) + creator.write_shelf(shelf_file) + creator.transform() + creator.finalize() + # validate the test setup + self.assertTrue('foo-id' in tree) + self.assertTrue('bar-id' in tree) + self.assertFileEqual('baz', 'tree/foo/bar') + shelf_file.seek(0) + unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file) + unshelver.make_merger().do_merge() + self.assertFalse('foo-id' in tree) + self.assertFalse('bar-id' in tree) + def test_unshelve_base(self): tree = self.make_branch_and_tree('tree') tree.lock_write() === modified file 'bzrlib/transform.py' --- bzrlib/transform.py 2008-12-11 03:18:52 +0000 +++ bzrlib/transform.py 2009-02-06 03:42:29 +0000 @@ -121,7 +121,7 @@ self._non_present_ids = {} # Mapping of new file_id -> trans_id self._r_new_id = {} - # Set of file_ids that will be removed + # Set of trans_ids that will be removed self._removed_id = set() # Mapping of path in old tree -> trans_id self._tree_path_ids = {} @@ -1649,7 +1649,8 @@ def has_id(self, file_id): if file_id in self._transform._r_new_id: return True - elif file_id in self._transform._removed_id: + elif file_id in set([self._transform.tree_file_id(trans_id) for + trans_id in self._transform._removed_id]): return False else: return self._transform._tree.has_id(file_id)