def _test_shelve_symlink_creation(self, link_name, link_target, shelve_change=False): self.requireFeature(features.SymlinkFeature) tree = self.make_branch_and_tree('.') tree.lock_write() self.addCleanup(tree.unlock) tree.commit('Empty tree') os.symlink(link_target, link_name) tree.add(link_name, 'foo-id') creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) self.assertEqual([('add file', 'foo-id', 'symlink', link_name)], list(creator.iter_shelvable())) if shelve_change: creator.shelve_change(('add file', 'foo-id', 'symlink', link_name)) else: creator.shelve_creation('foo-id') creator.transform() s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id') self.assertPathDoesNotExist(link_name) limbo_name = creator.shelf_transform._limbo_name(s_trans_id) self.assertEqual(link_target, osutils.readlink(limbo_name)) ptree = creator.shelf_transform.get_preview_tree() self.assertEqual(link_target, ptree.get_symlink_target('foo-id'))
def _test_shelve_symlink_target_change(self, link_name, old_target, new_target, shelve_change=False): self.requireFeature(features.SymlinkFeature) tree = self.make_branch_and_tree('.') tree.lock_write() self.addCleanup(tree.unlock) os.symlink(old_target, link_name) tree.add(link_name, 'foo-id') tree.commit("commit symlink") os.unlink(link_name) os.symlink(new_target, link_name) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) self.assertEqual( [('modify target', 'foo-id', link_name, old_target, new_target)], list(creator.iter_shelvable())) if shelve_change: creator.shelve_change( ('modify target', 'foo-id', link_name, old_target, new_target)) else: creator.shelve_modify_target('foo-id') creator.transform() self.assertEqual(old_target, osutils.readlink(link_name)) s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id') limbo_name = creator.shelf_transform._limbo_name(s_trans_id) self.assertEqual(new_target, osutils.readlink(limbo_name)) ptree = creator.shelf_transform.get_preview_tree() self.assertEqual(new_target, ptree.get_symlink_target('foo-id'))
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') with open('shelf', 'w+b') as shelf_file: creator.write_shelf(shelf_file) creator.transform() creator.finalize() # validate the test setup self.assertTrue(tree.has_id('foo-id')) self.assertTrue(tree.has_id('bar-id')) self.assertFileEqual('baz', 'tree/foo/bar') with open('shelf', 'r+b') as shelf_file: unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file) self.addCleanup(unshelver.finalize) unshelver.make_merger().do_merge() self.assertFalse(tree.has_id('foo-id')) self.assertFalse(tree.has_id('bar-id'))
def test_write_shelf(self): tree = self.make_branch_and_tree('tree') self.build_tree(['tree/foo']) tree.add('foo', 'foo-id') tree.lock_tree_write() self.addCleanup(tree.unlock) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) list(creator.iter_shelvable()) creator.shelve_creation('foo-id') shelf_file = open('shelf', 'wb') try: creator.write_shelf(shelf_file) finally: shelf_file.close() parser = pack.ContainerPushParser() shelf_file = open('shelf', 'rb') try: parser.accept_bytes(shelf_file.read()) finally: shelf_file.close() tt = transform.TransformPreview(tree) self.addCleanup(tt.finalize) records = iter(parser.read_pending_records()) #skip revision-id records.next() tt.deserialize(records)
def test_shelve_skips_added_root(self): """Skip adds of the root when iterating through shelvable changes.""" tree = self.make_branch_and_tree('tree') tree.lock_tree_write() self.addCleanup(tree.unlock) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) self.assertEqual([], list(creator.iter_shelvable()))
def test_shelve_change_unknown_change(self): tree = self.make_branch_and_tree('tree') tree.lock_tree_write() self.addCleanup(tree.unlock) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) e = self.assertRaises(ValueError, creator.shelve_change, ('unknown', )) self.assertEqual('Unknown change kind: "unknown"', str(e))
def test_remove_tree_shelved_changes_force(self): tree = self.make_branch_and_tree('.') creator = shelf.ShelfCreator(tree, tree.basis_tree(), []) self.addCleanup(creator.finalize) shelf_id = tree.get_shelf_manager().shelve_changes(creator, 'Foo') self.run_bzr('remove-tree --force') self.run_bzr('checkout') # Ensure shelf is empty self.assertIs(None, tree.get_shelf_manager().last_shelf())
def test_remove_tree_shelved_changes(self): # https://bugs.launchpad.net/bzr/+bug/586639 tree = self.make_branch_and_tree('.') creator = shelf.ShelfCreator(tree, tree.basis_tree(), []) self.addCleanup(creator.finalize) shelf_id = tree.get_shelf_manager().shelve_changes(creator, 'Foo') output = self.run_bzr_error(["Working tree .* has shelved changes"], 'remove-tree', retcode=3)
def test_get_metadata(self): tree = self.make_branch_and_tree('.') tree.lock_tree_write() self.addCleanup(tree.unlock) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) shelf_manager = tree.get_shelf_manager() shelf_id = shelf_manager.shelve_changes(creator, 'foo') metadata = shelf_manager.get_metadata(shelf_id) self.assertEqual('foo', metadata['message']) self.assertEqual('null:', metadata['revision_id'])
def prepare_content_change(self): tree = self.make_branch_and_tree('.') tree.lock_write() self.addCleanup(tree.unlock) self.build_tree_contents([('foo', 'a\n')]) tree.add('foo', 'foo-id') tree.commit('Committed foo') self.build_tree_contents([('foo', 'b\na\nc\n')]) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) return creator
def prepare_shelve_creation(self): tree = self.make_branch_and_tree('.') tree.lock_write() self.addCleanup(tree.unlock) tree.commit('Empty tree') self.build_tree_contents([('foo', 'a\n'), ('bar/', )]) tree.add(['foo', 'bar'], ['foo-id', 'bar-id']) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) self.assertEqual([('add file', 'bar-id', 'directory', 'bar'), ('add file', 'foo-id', 'file', 'foo')], sorted(list(creator.iter_shelvable()))) return creator, tree
def test_shelve_serialization(self): tree = self.make_branch_and_tree('.') tree.lock_tree_write() self.addCleanup(tree.unlock) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) shelf_file = open('shelf', 'wb') self.addCleanup(shelf_file.close) try: creator.write_shelf(shelf_file) finally: shelf_file.close() self.assertFileEqual(EMPTY_SHELF, 'shelf')
def prepare_shelve_move(self): tree = self.make_branch_and_tree('.') self.build_tree(['foo/', 'bar/', 'foo/baz']) tree.add(['foo', 'bar', 'foo/baz'], ['foo-id', 'bar-id', 'baz-id']) tree.commit('foo') tree.rename_one('foo/baz', 'bar/baz') tree.lock_tree_write() self.addCleanup(tree.unlock) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) self.assertEqual([('rename', 'baz-id', 'foo/baz', 'bar/baz')], list(creator.iter_shelvable())) return creator, tree
def prepare_shelve_change_kind(self): tree = self.make_branch_and_tree('tree') self.build_tree_contents([('tree/foo', 'bar')]) tree.add('foo', 'foo-id') tree.commit('Added file and directory') os.unlink('tree/foo') os.mkdir('tree/foo') tree.lock_tree_write() self.addCleanup(tree.unlock) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) self.assertEqual( [('change kind', 'foo-id', 'file', 'directory', 'foo')], sorted(list(creator.iter_shelvable()))) return creator
def prepare_shelve_deletion(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()) self.addCleanup(creator.finalize) self.assertEqual([('delete file', 'bar-id', 'file', 'foo/bar'), ('delete file', 'foo-id', 'directory', 'foo')], sorted(list(creator.iter_shelvable()))) return creator, tree
def test_shelve_unversion(self): tree = self.make_branch_and_tree('tree') self.build_tree([ 'tree/foo', ]) tree.add('foo', 'foo-id') tree.commit('Added file and directory') tree.unversion(['foo-id']) tree.lock_tree_write() self.addCleanup(tree.unlock) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) self.assertEqual([('delete file', 'foo-id', 'file', 'foo')], sorted(list(creator.iter_shelvable()))) creator.shelve_deletion('foo-id') creator.transform() self.assertPathExists('tree/foo')
def test_shelve_changes(self): tree = self.make_branch_and_tree('tree') tree.commit('no-change commit') tree.lock_write() self.addCleanup(tree.unlock) self.build_tree_contents([('tree/foo', 'bar')]) self.assertFileEqual('bar', 'tree/foo') tree.add('foo', 'foo-id') creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) list(creator.iter_shelvable()) creator.shelve_creation('foo-id') shelf_manager = tree.get_shelf_manager() shelf_id = shelf_manager.shelve_changes(creator) self.assertPathDoesNotExist('tree/foo') unshelver = shelf_manager.get_unshelver(shelf_id) self.addCleanup(unshelver.finalize) unshelver.make_merger().do_merge() self.assertFileEqual('bar', 'tree/foo')
def test_unshelve_base(self): tree = self.make_branch_and_tree('tree') tree.lock_write() self.addCleanup(tree.unlock) tree.commit('rev1', rev_id='rev1') creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) manager = tree.get_shelf_manager() shelf_id, shelf_file = manager.new_shelf() try: creator.write_shelf(shelf_file) finally: shelf_file.close() tree.commit('rev2', rev_id='rev2') shelf_file = manager.read_shelf(1) self.addCleanup(shelf_file.close) unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file) self.addCleanup(unshelver.finalize) self.assertEqual('rev1', unshelver.base_tree.get_revision_id())
def test_shelve_creation_no_contents(self): tree = self.make_branch_and_tree('.') tree.lock_write() self.addCleanup(tree.unlock) tree.commit('Empty tree') self.build_tree(['foo']) tree.add('foo', 'foo-id') os.unlink('foo') creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) self.assertEqual([('add file', 'foo-id', None, 'foo')], sorted(list(creator.iter_shelvable()))) creator.shelve_creation('foo-id') creator.transform() self.assertRaises(StopIteration, tree.iter_entries_by_dir(['foo-id']).next) self.assertShelvedFileEqual('', creator, 'foo-id') s_trans_id = creator.shelf_transform.trans_id_file_id('foo-id') self.assertEqual('foo-id', creator.shelf_transform.final_file_id(s_trans_id)) self.assertPathDoesNotExist('foo')
def test_unshelve_changed(self): tree = self.make_branch_and_tree('tree') tree.lock_write() self.addCleanup(tree.unlock) self.build_tree_contents([('tree/foo', 'a\nb\nc\n')]) tree.add('foo', 'foo-id') tree.commit('first commit') self.build_tree_contents([('tree/foo', 'a\nb\nd\n')]) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) list(creator.iter_shelvable()) creator.shelve_lines('foo-id', ['a\n', 'b\n', 'c\n']) shelf_file = open('shelf', 'w+b') self.addCleanup(shelf_file.close) creator.write_shelf(shelf_file) creator.transform() self.build_tree_contents([('tree/foo', 'z\na\nb\nc\n')]) shelf_file.seek(0) unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file) self.addCleanup(unshelver.finalize) unshelver.make_merger().do_merge() self.assertFileEqual('z\na\nb\nd\n', 'tree/foo')
def test_make_merger(self): tree = self.make_branch_and_tree('tree') tree.commit('first commit') self.build_tree_contents([('tree/foo', 'bar')]) tree.lock_write() self.addCleanup(tree.unlock) tree.add('foo', 'foo-id') creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) list(creator.iter_shelvable()) creator.shelve_creation('foo-id') shelf_file = open('shelf-file', 'w+b') try: creator.write_shelf(shelf_file) creator.transform() shelf_file.seek(0) unshelver = shelf.Unshelver.from_tree_and_shelf(tree, shelf_file) unshelver.make_merger().do_merge() self.addCleanup(unshelver.finalize) self.assertFileEqual('bar', 'tree/foo') finally: shelf_file.close()
def test_unshelve_subdir_in_now_removed_dir(self): tree = self.make_branch_and_tree('.') self.addCleanup(tree.lock_write().unlock) self.build_tree(['dir/', 'dir/subdir/', 'dir/subdir/foo']) tree.add(['dir'], ['dir-id']) tree.commit('versioned dir') tree.add(['dir/subdir', 'dir/subdir/foo'], ['subdir-id', 'foo-id']) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) for change in creator.iter_shelvable(): creator.shelve_change(change) shelf_manager = tree.get_shelf_manager() shelf_id = shelf_manager.shelve_changes(creator) self.assertPathDoesNotExist('dir/subdir') tree.remove(['dir']) unshelver = shelf_manager.get_unshelver(shelf_id) self.addCleanup(unshelver.finalize) unshelver.make_merger().do_merge() self.assertPathExists('dir/subdir/foo') self.assertEqual('dir-id', tree.path2id('dir')) self.assertEqual('subdir-id', tree.path2id('dir/subdir')) self.assertEqual('foo-id', tree.path2id('dir/subdir/foo'))
def run(self): """Interactively shelve the changes.""" creator = shelf.ShelfCreator(self.work_tree, self.target_tree, self.file_list) self.tempdir = tempfile.mkdtemp() changes_shelved = 0 try: for change in creator.iter_shelvable(): if change[0] == 'modify text': try: changes_shelved += self.handle_modify_text( creator, change[1]) except errors.BinaryFile: if self.prompt_bool(self.reporter.vocab['binary']): changes_shelved += 1 creator.shelve_content_change(change[1]) else: if self.prompt_bool(self.reporter.prompt_change(change)): creator.shelve_change(change) changes_shelved += 1 if changes_shelved > 0: self.reporter.selected_changes(creator.work_transform) if (self.auto_apply or self.prompt_bool( self.reporter.vocab['final'] % changes_shelved)): if self.destroy: creator.transform() self.reporter.changes_destroyed() else: shelf_id = self.manager.shelve_changes( creator, self.message) self.reporter.shelved_id(shelf_id) else: self.reporter.no_changes() finally: shutil.rmtree(self.tempdir) creator.finalize()
def test_shelve_changed_root_id(self): tree = self.make_branch_and_tree('.') self.build_tree(['foo']) tree.set_root_id('first-root-id') tree.add(['foo'], ['foo-id']) tree.commit('foo') tree.set_root_id('second-root-id') tree.lock_tree_write() self.addCleanup(tree.unlock) creator = shelf.ShelfCreator(tree, tree.basis_tree()) self.addCleanup(creator.finalize) self.expectFailure( 'shelf doesn\'t support shelving root changes yet', self.assertEqual, [ ('delete file', 'first-root-id', 'directory', ''), ('add file', 'second-root-id', 'directory', ''), ('rename', 'foo-id', u'foo', u'foo'), ], list(creator.iter_shelvable())) self.assertEqual([ ('delete file', 'first-root-id', 'directory', ''), ('add file', 'second-root-id', 'directory', ''), ('rename', 'foo-id', u'foo', u'foo'), ], list(creator.iter_shelvable()))