Ejemplo n.º 1
0
 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'))
Ejemplo n.º 2
0
 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'))
Ejemplo n.º 3
0
 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'))
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
 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()))
Ejemplo n.º 6
0
 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))
Ejemplo n.º 7
0
 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())
Ejemplo n.º 8
0
 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)
Ejemplo n.º 9
0
 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'])
Ejemplo n.º 10
0
 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
Ejemplo n.º 11
0
 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
Ejemplo n.º 12
0
 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')
Ejemplo n.º 13
0
 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
Ejemplo n.º 14
0
 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
Ejemplo n.º 15
0
 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
Ejemplo n.º 16
0
 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')
Ejemplo n.º 17
0
 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')
Ejemplo n.º 18
0
 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())
Ejemplo n.º 19
0
 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')
Ejemplo n.º 20
0
 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')
Ejemplo n.º 21
0
 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()
Ejemplo n.º 22
0
 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'))
Ejemplo n.º 23
0
 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()
Ejemplo n.º 24
0
    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()))