def remove_standalone(self, spec): """ Remove (unlink) a standalone package from this view. """ if not self.check_added(spec): tty.warn(self._croot + 'Skipping package not linked in view: %s' % spec.name) return tree = LinkTree(spec.prefix) tree.unmerge(self.root, ignore=ignore_metadata_dir) self.unlink_meta_folder(spec) if self.verbose: tty.info(self._croot + 'Removed package: %s' % colorize_spec(spec))
def deactivate(self, extension, **kwargs): extensions_layout = kwargs.get("extensions_layout", spack.store.extensions) if extensions_layout is not spack.store.extensions: raise ExtensionError( 'aspell does not support non-global extensions') aspell = which(self.prefix.bin.aspell) dest_dir = aspell('dump', 'config', 'dict-dir', output=str).strip() def ignore(filename): return (filename in spack.store.layout.hidden_file_paths or kwargs.get('ignore', lambda f: False)(filename)) tree = LinkTree(extension.prefix.lib) tree.unmerge(dest_dir, ignore=ignore)
class LinkTreeTest(unittest.TestCase): """Tests Spack's LinkTree class.""" def setUp(self): self.stage = Stage('link-tree-test') with working_dir(self.stage.path): touchp('source/1') touchp('source/a/b/2') touchp('source/a/b/3') touchp('source/c/4') touchp('source/c/d/5') touchp('source/c/d/6') touchp('source/c/d/e/7') source_path = os.path.join(self.stage.path, 'source') self.link_tree = LinkTree(source_path) def tearDown(self): if self.stage: self.stage.destroy() def check_file_link(self, filename): self.assertTrue(os.path.isfile(filename)) self.assertTrue(os.path.islink(filename)) def check_dir(self, filename): self.assertTrue(os.path.isdir(filename)) def test_merge_to_new_directory(self): with working_dir(self.stage.path): self.link_tree.merge('dest') self.check_file_link('dest/1') self.check_file_link('dest/a/b/2') self.check_file_link('dest/a/b/3') self.check_file_link('dest/c/4') self.check_file_link('dest/c/d/5') self.check_file_link('dest/c/d/6') self.check_file_link('dest/c/d/e/7') self.link_tree.unmerge('dest') self.assertFalse(os.path.exists('dest')) def test_merge_to_existing_directory(self): with working_dir(self.stage.path): touchp('dest/x') touchp('dest/a/b/y') self.link_tree.merge('dest') self.check_file_link('dest/1') self.check_file_link('dest/a/b/2') self.check_file_link('dest/a/b/3') self.check_file_link('dest/c/4') self.check_file_link('dest/c/d/5') self.check_file_link('dest/c/d/6') self.check_file_link('dest/c/d/e/7') self.assertTrue(os.path.isfile('dest/x')) self.assertTrue(os.path.isfile('dest/a/b/y')) self.link_tree.unmerge('dest') self.assertTrue(os.path.isfile('dest/x')) self.assertTrue(os.path.isfile('dest/a/b/y')) self.assertFalse(os.path.isfile('dest/1')) self.assertFalse(os.path.isfile('dest/a/b/2')) self.assertFalse(os.path.isfile('dest/a/b/3')) self.assertFalse(os.path.isfile('dest/c/4')) self.assertFalse(os.path.isfile('dest/c/d/5')) self.assertFalse(os.path.isfile('dest/c/d/6')) self.assertFalse(os.path.isfile('dest/c/d/e/7')) def test_merge_with_empty_directories(self): with working_dir(self.stage.path): mkdirp('dest/f/g') mkdirp('dest/a/b/h') self.link_tree.merge('dest') self.link_tree.unmerge('dest') self.assertFalse(os.path.exists('dest/1')) self.assertFalse(os.path.exists('dest/a/b/2')) self.assertFalse(os.path.exists('dest/a/b/3')) self.assertFalse(os.path.exists('dest/c/4')) self.assertFalse(os.path.exists('dest/c/d/5')) self.assertFalse(os.path.exists('dest/c/d/6')) self.assertFalse(os.path.exists('dest/c/d/e/7')) self.assertTrue(os.path.isdir('dest/a/b/h')) self.assertTrue(os.path.isdir('dest/f/g')) def test_ignore(self): with working_dir(self.stage.path): touchp('source/.spec') touchp('dest/.spec') self.link_tree.merge('dest', ignore=lambda x: x == '.spec') self.link_tree.unmerge('dest', ignore=lambda x: x == '.spec') self.assertFalse(os.path.exists('dest/1')) self.assertFalse(os.path.exists('dest/a')) self.assertFalse(os.path.exists('dest/c')) self.assertTrue(os.path.isfile('source/.spec')) self.assertTrue(os.path.isfile('dest/.spec'))