init: move spack.repo global variable into its own module

- spack.repository module is now spack.repo

- `spack.repo` is now `spack.repo.path()` and loaded lazily

- Added `spack.repo.get()` and `spack.repo.all_package_names()` as
  convenience functions to simplify the new lazy interface.

- updated tests and code
This commit is contained in:
Todd Gamblin 2018-04-28 23:23:16 -07:00 committed by scheibelp
parent 2a09b627c9
commit c615d2be06
63 changed files with 257 additions and 233 deletions

View file

@ -445,7 +445,7 @@ Spack repo namespaces are actually Python namespaces tacked on under
``spack.pkg``. The search semantics of ``repos.yaml`` are actually ``spack.pkg``. The search semantics of ``repos.yaml`` are actually
implemented using Python's built-in `sys.path implemented using Python's built-in `sys.path
<https://docs.python.org/2/library/sys.html#sys.path>`_ search. The <https://docs.python.org/2/library/sys.html#sys.path>`_ search. The
:py:mod:`spack.repository` module implements a custom `Python importer :py:mod:`spack.repo` module implements a custom `Python importer
<https://docs.python.org/2/library/imp.html>`_. <https://docs.python.org/2/library/imp.html>`_.
.. warning:: .. warning::

View file

@ -23,7 +23,6 @@
# License along with this program; if not, write to the Free Software # License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
############################################################################## ##############################################################################
import sys
#: major, minor, patch version for Spack, in a tuple #: major, minor, patch version for Spack, in a tuple
spack_version_info = (0, 11, 2) spack_version_info = (0, 11, 2)
@ -32,29 +31,9 @@
spack_version = '.'.join(str(v) for v in spack_version_info) spack_version = '.'.join(str(v) for v in spack_version_info)
# Set up the default packages database.
import spack.error
try:
import spack.repository
repo = spack.repository.RepoPath()
sys.meta_path.append(repo)
except spack.error.SpackError as e:
import llnl.util.tty as tty
tty.die('while initializing Spack RepoPath:', e.message)
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# When packages call 'from spack import *', we import a set of things that # When packages call 'from spack import *', we import a set of things that
# should be useful for builds. # should be useful for builds.
#
# Spack internal code should call 'import spack' and accesses other
# variables (spack.repo, paths, etc.) directly.
#
# TODO: maybe this should be separated out to build_environment.py?
# TODO: it's not clear where all the stuff that needs to be included in
# packages should live. This file is overloaded for spack core vs.
# for packages.
#
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
__all__ = [] __all__ = []

View file

@ -587,8 +587,8 @@ def setup_package(pkg, dirty):
for dspec in pkg.spec.traverse(order='post', root=False, for dspec in pkg.spec.traverse(order='post', root=False,
deptype=('build', 'test')): deptype=('build', 'test')):
# If a user makes their own package repo, e.g. # If a user makes their own package repo, e.g.
# spack.repos.mystuff.libelf.Libelf, and they inherit from # spack.pkg.mystuff.libelf.Libelf, and they inherit from
# an existing class like spack.repos.original.libelf.Libelf, # an existing class like spack.pkg.original.libelf.Libelf,
# then set the module variables for both classes so the # then set the module variables for both classes so the
# parent class can still use them if it gets called. # parent class can still use them if it gets called.
spkg = dspec.package spkg = dspec.package

View file

@ -31,6 +31,7 @@
from llnl.util.tty.colify import colify_table from llnl.util.tty.colify import colify_table
import spack.paths import spack.paths
import spack.repo
from spack.util.executable import which from spack.util.executable import which
from spack.cmd import spack_is_git_repo from spack.cmd import spack_is_git_repo

View file

@ -23,7 +23,8 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
############################################################################## ##############################################################################
import llnl.util.tty as tty import llnl.util.tty as tty
import spack
import spack.repo
import spack.cmd import spack.cmd
import spack.cmd.common.arguments as arguments import spack.cmd.common.arguments as arguments

View file

@ -26,8 +26,10 @@
import llnl.util.tty as tty import llnl.util.tty as tty
import spack
import spack.cmd import spack.cmd
import spack.repo
import spack.store
import spack.spec
import spack.binary_distribution as bindist import spack.binary_distribution as bindist
description = "create, download and install binary packages" description = "create, download and install binary packages"

View file

@ -27,8 +27,9 @@
import argparse import argparse
import llnl.util.tty as tty import llnl.util.tty as tty
import spack
import spack.cmd import spack.cmd
import spack.repo
import spack.util.crypto import spack.util.crypto
import spack.util.web import spack.util.web
from spack.util.naming import valid_fully_qualified_module_name from spack.util.naming import valid_fully_qualified_module_name

View file

@ -26,9 +26,10 @@
import llnl.util.tty as tty import llnl.util.tty as tty
import spack
import spack.caches import spack.caches
import spack.cmd import spack.cmd
import spack.repo
import spack.stage
description = "remove temporary build files and/or downloaded archives" description = "remove temporary build files and/or downloaded archives"
section = "build" section = "build"

View file

@ -32,7 +32,7 @@
import spack.cmd import spack.cmd
import spack.util.web import spack.util.web
from llnl.util.filesystem import mkdirp from llnl.util.filesystem import mkdirp
from spack.repository import Repo import spack.repo
from spack.spec import Spec from spack.spec import Spec
from spack.util.executable import which, ProcessError from spack.util.executable import which, ProcessError
from spack.util.naming import mod_to_class from spack.util.naming import mod_to_class
@ -648,17 +648,17 @@ def get_repository(args, name):
# Figure out where the new package should live # Figure out where the new package should live
repo_path = args.repo repo_path = args.repo
if repo_path is not None: if repo_path is not None:
repo = Repo(repo_path) repo = spack.repo.Repo(repo_path)
if spec.namespace and spec.namespace != repo.namespace: if spec.namespace and spec.namespace != repo.namespace:
tty.die("Can't create package with namespace {0} in repo with " tty.die("Can't create package with namespace {0} in repo with "
"namespace {1}".format(spec.namespace, repo.namespace)) "namespace {1}".format(spec.namespace, repo.namespace))
else: else:
if spec.namespace: if spec.namespace:
repo = spack.repo.get_repo(spec.namespace, None) repo = spack.repo.path().get_repo(spec.namespace, None)
if not repo: if not repo:
tty.die("Unknown namespace: '{0}'".format(spec.namespace)) tty.die("Unknown namespace: '{0}'".format(spec.namespace))
else: else:
repo = spack.repo.first_repo() repo = spack.repo.path().first_repo()
# Set the namespace on the spec if it's not there already # Set the namespace on the spec if it's not there already
if not spec.namespace: if not spec.namespace:

View file

@ -27,8 +27,8 @@
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.tty.colify import colify from llnl.util.tty.colify import colify
import spack
import spack.store import spack.store
import spack.repo
import spack.cmd import spack.cmd
description = "show dependencies of a package" description = "show dependencies of a package"
@ -73,8 +73,9 @@ def dependencies(parser, args):
if not spec.virtual: if not spec.virtual:
packages = [spec.package] packages = [spec.package]
else: else:
packages = [spack.repo.get(s.name) packages = [
for s in spack.repo.providers_for(spec)] spack.repo.get(s.name)
for s in spack.repo.path().providers_for(spec)]
dependencies = set() dependencies = set()
for pkg in packages: for pkg in packages:

View file

@ -27,7 +27,7 @@
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.tty.colify import colify from llnl.util.tty.colify import colify
import spack import spack.repo
import spack.store import spack.store
import spack.cmd import spack.cmd
@ -57,14 +57,14 @@ def inverted_dependencies():
actual dependents. actual dependents.
""" """
dag = {} dag = {}
for pkg in spack.repo.all_packages(): for pkg in spack.repo.path().all_packages():
dag.setdefault(pkg.name, set()) dag.setdefault(pkg.name, set())
for dep in pkg.dependencies: for dep in pkg.dependencies:
deps = [dep] deps = [dep]
# expand virtuals if necessary # expand virtuals if necessary
if spack.repo.is_virtual(dep): if spack.repo.path().is_virtual(dep):
deps += [s.name for s in spack.repo.providers_for(dep)] deps += [s.name for s in spack.repo.path().providers_for(dep)]
for d in deps: for d in deps:
dag.setdefault(d, set()).add(pkg.name) dag.setdefault(d, set()).add(pkg.name)

View file

@ -28,9 +28,9 @@
import llnl.util.tty as tty import llnl.util.tty as tty
import spack
import spack.config import spack.config
import spack.cmd import spack.cmd
import spack.repo
import spack.cmd.common.arguments as arguments import spack.cmd.common.arguments as arguments
from spack.stage import DIYStage from spack.stage import DIYStage
@ -78,7 +78,7 @@ def diy(self, args):
tty.die("spack diy only takes one spec.") tty.die("spack diy only takes one spec.")
spec = specs[0] spec = specs[0]
if not spack.repo.exists(spec.name): if not spack.repo.path().exists(spec.name):
tty.die("No package for '{0}' was found.".format(spec.name), tty.die("No package for '{0}' was found.".format(spec.name),
" Use `spack create` to create a new package") " Use `spack create` to create a new package")

View file

@ -29,8 +29,8 @@
import spack.cmd import spack.cmd
import spack.paths import spack.paths
import spack.repo
from spack.spec import Spec from spack.spec import Spec
from spack.repository import Repo
from spack.util.editor import editor from spack.util.editor import editor
description = "open package files in $EDITOR" description = "open package files in $EDITOR"
@ -48,11 +48,11 @@ def edit_package(name, repo_path, namespace):
""" """
# Find the location of the package # Find the location of the package
if repo_path: if repo_path:
repo = Repo(repo_path) repo = spack.repo.Repo(repo_path)
elif namespace: elif namespace:
repo = spack.repo.get_repo(namespace) repo = spack.repo.path().get_repo(namespace)
else: else:
repo = spack.repo repo = spack.repo.path()
path = repo.filename_for_package_name(name) path = repo.filename_for_package_name(name)
spec = Spec(name) spec = Spec(name)

View file

@ -27,9 +27,9 @@
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.tty.colify import colify from llnl.util.tty.colify import colify
import spack
import spack.cmd import spack.cmd
import spack.cmd.find import spack.cmd.find
import spack.repo
import spack.store import spack.store
from spack.directory_layout import YamlViewExtensionsLayout from spack.directory_layout import YamlViewExtensionsLayout
@ -105,7 +105,7 @@ def extensions(parser, args):
if show_packages: if show_packages:
# #
# List package names of extensions # List package names of extensions
extensions = spack.repo.extensions_for(spec) extensions = spack.repo.path().extensions_for(spec)
if not extensions: if not extensions:
tty.msg("%s has no extensions." % spec.cshort_spec) tty.msg("%s has no extensions." % spec.cshort_spec)
else: else:

View file

@ -26,8 +26,9 @@
import llnl.util.tty as tty import llnl.util.tty as tty
import spack
import spack.cmd import spack.cmd
import spack.config
import spack.repo
import spack.cmd.common.arguments as arguments import spack.cmd.common.arguments as arguments
description = "fetch archives for packages" description = "fetch archives for packages"

View file

@ -26,8 +26,8 @@
import llnl.util.tty as tty import llnl.util.tty as tty
import llnl.util.lang import llnl.util.lang
import spack
import spack.database import spack.repo
import spack.cmd.common.arguments as arguments import spack.cmd.common.arguments as arguments
from spack.cmd import display_specs from spack.cmd import display_specs
@ -147,7 +147,7 @@ def find(parser, args):
# If tags have been specified on the command line, filter by tags # If tags have been specified on the command line, filter by tags
if args.tags: if args.tags:
packages_with_tags = spack.repo.packages_with_tags(*args.tags) packages_with_tags = spack.repo.path().packages_with_tags(*args.tags)
query_specs = [x for x in query_specs if x.name in packages_with_tags] query_specs = [x for x in query_specs if x.name in packages_with_tags]
# Display the result # Display the result

View file

@ -25,15 +25,15 @@
from __future__ import print_function from __future__ import print_function
import textwrap import textwrap
from six.moves import zip_longest from six.moves import zip_longest
import llnl.util.tty.color as color
from llnl.util.tty.colify import colify from llnl.util.tty.colify import colify
import llnl.util.tty.color as color import spack.repo
import spack
import spack.fetch_strategy as fs
import spack.spec import spack.spec
import spack.fetch_strategy as fs
description = 'get detailed information on a particular package' description = 'get detailed information on a particular package'
section = 'basic' section = 'basic'

View file

@ -37,7 +37,8 @@
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.tty.colify import colify from llnl.util.tty.colify import colify
import spack import spack.dependency
import spack.repo
import spack.cmd.common.arguments as arguments import spack.cmd.common.arguments as arguments
description = "list and search available packages" description = "list and search available packages"
@ -184,7 +185,7 @@ def rst(pkg_names):
reversed(sorted(pkg.versions)))) reversed(sorted(pkg.versions))))
print() print()
for deptype in spack.all_deptypes: for deptype in spack.dependency.all_deptypes:
deps = pkg.dependencies_of_type(deptype) deps = pkg.dependencies_of_type(deptype)
if deps: if deps:
print('%s Dependencies' % deptype.capitalize()) print('%s Dependencies' % deptype.capitalize())
@ -272,7 +273,7 @@ def head(n, span_id, title, anchor=None):
print(', '.join(str(v) for v in reversed(sorted(pkg.versions)))) print(', '.join(str(v) for v in reversed(sorted(pkg.versions))))
print('</dd>') print('</dd>')
for deptype in spack.all_deptypes: for deptype in spack.dependency.all_deptypes:
deps = pkg.dependencies_of_type(deptype) deps = pkg.dependencies_of_type(deptype)
if deps: if deps:
print('<dt>%s Dependencies:</dt>' % deptype.capitalize()) print('<dt>%s Dependencies:</dt>' % deptype.capitalize())
@ -301,7 +302,8 @@ def list(parser, args):
# Filter by tags # Filter by tags
if args.tags: if args.tags:
packages_with_tags = set(spack.repo.packages_with_tags(*args.tags)) packages_with_tags = set(
spack.repo.path().packages_with_tags(*args.tags))
sorted_packages = set(sorted_packages) & packages_with_tags sorted_packages = set(sorted_packages) & packages_with_tags
sorted_packages = sorted(sorted_packages) sorted_packages = sorted(sorted_packages)

View file

@ -29,6 +29,7 @@
import spack.paths import spack.paths
import spack.cmd import spack.cmd
import spack.repo
description = "print out locations of various directories used by Spack" description = "print out locations of various directories used by Spack"
section = "environment" section = "environment"
@ -79,7 +80,7 @@ def location(parser, args):
print(spack.paths.prefix) print(spack.paths.prefix)
elif args.packages: elif args.packages:
print(spack.repo.first_repo().root) print(spack.repo.path().first_repo().root)
elif args.stages: elif args.stages:
print(spack.paths.stage_path) print(spack.paths.stage_path)
@ -101,7 +102,7 @@ def location(parser, args):
if args.package_dir: if args.package_dir:
# This one just needs the spec name. # This one just needs the spec name.
print(spack.repo.dirname_for_package_name(spec.name)) print(spack.repo.path().dirname_for_package_name(spec.name))
else: else:
# These versions need concretized specs. # These versions need concretized specs.

View file

@ -29,11 +29,11 @@
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.tty.colify import colify from llnl.util.tty.colify import colify
import spack
import spack.cmd import spack.cmd
import spack.concretize import spack.concretize
import spack.config import spack.config
import spack.mirror import spack.mirror
import spack.repo
import spack.cmd.common.arguments as arguments import spack.cmd.common.arguments as arguments
from spack.spec import Spec from spack.spec import Spec
from spack.error import SpackError from spack.error import SpackError

View file

@ -27,10 +27,12 @@
import collections import collections
import os import os
import shutil import shutil
import spack.modules
from llnl.util import filesystem, tty
import spack.cmd import spack.cmd
from llnl.util import filesystem, tty import spack.modules
import spack.repo
from spack.cmd.common import arguments from spack.cmd.common import arguments
description = "manipulate module files" description = "manipulate module files"
@ -278,9 +280,10 @@ def refresh(module_types, specs, args):
cls = spack.modules.module_types[module_type] cls = spack.modules.module_types[module_type]
# skip unknown packages.
writers = [ writers = [
cls(spec) for spec in specs if spack.repo.exists(spec.name) cls(spec) for spec in specs
] # skip unknown packages. if spack.repo.path().exists(spec.name)]
# Filter blacklisted packages early # Filter blacklisted packages early
writers = [x for x in writers if not x.conf.blacklisted] writers = [x for x in writers if not x.conf.blacklisted]

View file

@ -26,7 +26,7 @@
import llnl.util.tty as tty import llnl.util.tty as tty
import spack import spack.repo
import spack.cmd import spack.cmd
import spack.cmd.common.arguments as arguments import spack.cmd.common.arguments as arguments

View file

@ -25,13 +25,14 @@
from __future__ import print_function from __future__ import print_function
import os import os
import argparse import argparse
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.tty.colify import colify from llnl.util.tty.colify import colify
from llnl.util.filesystem import working_dir from llnl.util.filesystem import working_dir
import spack.paths import spack.paths
import spack.repo
from spack.util.executable import which from spack.util.executable import which
from spack.cmd import spack_is_git_repo from spack.cmd import spack_is_git_repo
@ -90,7 +91,7 @@ def list_packages(rev):
def pkg_add(args): def pkg_add(args):
for pkg_name in args.packages: for pkg_name in args.packages:
filename = spack.repo.filename_for_package_name(pkg_name) filename = spack.repo.path().filename_for_package_name(pkg_name)
if not os.path.isfile(filename): if not os.path.isfile(filename):
tty.die("No such package: %s. Path does not exist:" % tty.die("No such package: %s. Path does not exist:" %
pkg_name, filename) pkg_name, filename)

View file

@ -27,8 +27,8 @@
import llnl.util.tty.colify as colify import llnl.util.tty.colify as colify
import spack
import spack.cmd import spack.cmd
import spack.repo
description = "list packages that provide a particular virtual package" description = "list packages that provide a particular virtual package"
section = "basic" section = "basic"
@ -46,7 +46,7 @@ def setup_parser(subparser):
def providers(parser, args): def providers(parser, args):
valid_virtuals = sorted(spack.repo.provider_index.providers.keys()) valid_virtuals = sorted(spack.repo.path().provider_index.providers.keys())
buffer = six.StringIO() buffer = six.StringIO()
isatty = sys.stdout.isatty() isatty = sys.stdout.isatty()
@ -77,5 +77,5 @@ def providers(parser, args):
for spec in specs: for spec in specs:
if sys.stdout.isatty(): if sys.stdout.isatty():
print("{0}:".format(spec)) print("{0}:".format(spec))
spack.cmd.display_specs(sorted(spack.repo.providers_for(spec))) spack.cmd.display_specs(sorted(spack.repo.path().providers_for(spec)))
print('') print('')

View file

@ -30,7 +30,7 @@
import spack.spec import spack.spec
import spack.config import spack.config
from spack.repository import Repo, create_repo, canonicalize_path, RepoError from spack.repo import Repo, create_repo, canonicalize_path, RepoError
description = "manage package source repositories" description = "manage package source repositories"
section = "config" section = "config"

View file

@ -26,8 +26,8 @@
import llnl.util.tty as tty import llnl.util.tty as tty
import spack
import spack.cmd import spack.cmd
import spack.repo
description = "revert checked out package source code" description = "revert checked out package source code"
section = "build" section = "build"

View file

@ -29,13 +29,15 @@
import sys import sys
import llnl.util.tty as tty import llnl.util.tty as tty
import spack from llnl.util.filesystem import set_executable
import spack.repo
import spack.store import spack.store
import spack.cmd import spack.cmd
import spack.cmd.install as install import spack.cmd.install as install
import spack.cmd.common.arguments as arguments import spack.cmd.common.arguments as arguments
from llnl.util.filesystem import set_executable from spack.util.executable import which
from spack import which
from spack.stage import DIYStage from spack.stage import DIYStage
description = "create a configuration script and module, but don't build" description = "create a configuration script and module, but don't build"
@ -135,7 +137,7 @@ def setup(self, args):
# Take a write lock before checking for existence. # Take a write lock before checking for existence.
with spack.store.db.write_transaction(): with spack.store.db.write_transaction():
spec = specs[0] spec = specs[0]
if not spack.repo.exists(spec.name): if not spack.repo.path().exists(spec.name):
tty.die("No package for '{0}' was found.".format(spec.name), tty.die("No package for '{0}' was found.".format(spec.name),
" Use `spack create` to create a new package") " Use `spack create` to create a new package")
if not spec.versions.concrete: if not spec.versions.concrete:

View file

@ -26,7 +26,7 @@
import llnl.util.tty as tty import llnl.util.tty as tty
import spack import spack.repo
import spack.cmd import spack.cmd
import spack.cmd.common.arguments as arguments import spack.cmd.common.arguments as arguments

View file

@ -29,7 +29,7 @@
import spack import spack
import spack.cmd import spack.cmd
import spack.store import spack.store
import spack.repository import spack.repo
from llnl.util import tty from llnl.util import tty
@ -149,7 +149,7 @@ def do_uninstall(specs, force):
try: try:
# should work if package is known to spack # should work if package is known to spack
packages.append(item.package) packages.append(item.package)
except spack.repository.UnknownEntityError: except spack.repo.UnknownEntityError:
# The package.py file has gone away -- but still # The package.py file has gone away -- but still
# want to uninstall. # want to uninstall.
spack.Package.uninstall_by_spec(item, force=True) spack.Package.uninstall_by_spec(item, force=True)

View file

@ -26,7 +26,7 @@
from collections import defaultdict from collections import defaultdict
import spack import spack.repo
from llnl.util import tty from llnl.util import tty
from spack.url import parse_version_offset, parse_name_offset from spack.url import parse_version_offset, parse_name_offset
@ -144,7 +144,7 @@ def url_list(args):
urls = set() urls = set()
# Gather set of URLs from all packages # Gather set of URLs from all packages
for pkg in spack.repo.all_packages(): for pkg in spack.repo.path().all_packages():
url = getattr(pkg.__class__, 'url', None) url = getattr(pkg.__class__, 'url', None)
urls = url_list_parsing(args, urls, url, pkg) urls = url_list_parsing(args, urls, url, pkg)
@ -178,7 +178,7 @@ def url_summary(args):
tty.msg('Generating a summary of URL parsing in Spack...') tty.msg('Generating a summary of URL parsing in Spack...')
# Loop through all packages # Loop through all packages
for pkg in spack.repo.all_packages(): for pkg in spack.repo.path().all_packages():
urls = set() urls = set()
url = getattr(pkg.__class__, 'url', None) url = getattr(pkg.__class__, 'url', None)

View file

@ -26,7 +26,8 @@
from llnl.util.tty.colify import colify from llnl.util.tty.colify import colify
import llnl.util.tty as tty import llnl.util.tty as tty
import spack
import spack.repo
description = "list available versions of a package" description = "list available versions of a package"
section = "packaging" section = "packaging"

View file

@ -39,7 +39,7 @@
from contextlib import contextmanager from contextlib import contextmanager
from six import iteritems from six import iteritems
import spack import spack.repo
import spack.abi import spack.abi
import spack.spec import spack.spec
import spack.compilers import spack.compilers
@ -102,7 +102,7 @@ def _valid_virtuals_and_externals(self, spec):
pref_key = lambda spec: 0 # no-op pref key pref_key = lambda spec: 0 # no-op pref key
if spec.virtual: if spec.virtual:
candidates = spack.repo.providers_for(spec) candidates = spack.repo.path().providers_for(spec)
if not candidates: if not candidates:
raise spack.spec.UnsatisfiableProviderSpecError( raise spack.spec.UnsatisfiableProviderSpecError(
candidates[0], spec) candidates[0], spec)

View file

@ -55,7 +55,7 @@
from llnl.util.lock import Lock, WriteTransaction, ReadTransaction from llnl.util.lock import Lock, WriteTransaction, ReadTransaction
import spack.store import spack.store
import spack.repository import spack.repo
import spack.spec import spack.spec
import spack.util.spack_yaml as syaml import spack.util.spack_yaml as syaml
import spack.util.spack_json as sjson import spack.util.spack_json as sjson
@ -903,7 +903,7 @@ def query(
if explicit is not any and rec.explicit != explicit: if explicit is not any and rec.explicit != explicit:
continue continue
if known is not any and spack.repo.exists( if known is not any and spack.repo.path().exists(
rec.spec.name) != known: rec.spec.name) != known:
continue continue

View file

@ -43,6 +43,8 @@
import spack import spack
import spack.config import spack.config
import spack.paths import spack.paths
import spack.repo
import spack.util.debug
from spack.error import SpackError from spack.error import SpackError
@ -347,13 +349,12 @@ def setup_main_options(args):
tty.set_stacktrace(args.stacktrace) tty.set_stacktrace(args.stacktrace)
if args.debug: if args.debug:
import spack.util.debug as debug spack.util.debug.register_interrupt_handler()
debug.register_interrupt_handler()
spack.config.set('config:debug', True, scope='command_line') spack.config.set('config:debug', True, scope='command_line')
if args.mock: if args.mock:
from spack.repository import RepoPath rp = spack.repo.RepoPath(spack.paths.mock_packages_path)
spack.repo.swap(RepoPath(spack.paths.mock_packages_path)) spack.repo.set_path(rp)
# If the user asked for it, don't check ssl certs. # If the user asked for it, don't check ssl certs.
if args.insecure: if args.insecure:

View file

@ -53,7 +53,6 @@
import llnl.util.tty as tty import llnl.util.tty as tty
import spack
import spack.config import spack.config
import spack.paths import spack.paths
import spack.store import spack.store
@ -64,7 +63,7 @@
import spack.hooks import spack.hooks
import spack.mirror import spack.mirror
import spack.mixins import spack.mixins
import spack.repository import spack.repo
import spack.url import spack.url
import spack.util.web import spack.util.web
import spack.multimethod import spack.multimethod
@ -662,9 +661,9 @@ def possible_dependencies(
visited = set([self.name]) visited = set([self.name])
for i, name in enumerate(self.dependencies): for i, name in enumerate(self.dependencies):
if spack.repo.is_virtual(name): if spack.repo.path().is_virtual(name):
if expand_virtuals: if expand_virtuals:
providers = spack.repo.providers_for(name) providers = spack.repo.path().providers_for(name)
dep_names = [spec.name for spec in providers] dep_names = [spec.name for spec in providers]
else: else:
visited.add(name) visited.add(name)
@ -1934,7 +1933,7 @@ def uninstall_by_spec(spec, force=False):
# Try to get the pcakage for the spec # Try to get the pcakage for the spec
try: try:
pkg = spec.package pkg = spec.package
except spack.repository.UnknownEntityError: except spack.repo.UnknownEntityError:
pkg = None pkg = None
# Pre-uninstall hook runs first. # Pre-uninstall hook runs first.
@ -2313,25 +2312,25 @@ def dump_packages(spec, path):
# Create a source repo and get the pkg directory out of it. # Create a source repo and get the pkg directory out of it.
try: try:
source_repo = spack.repository.Repo(source_repo_root) source_repo = spack.repo.Repo(source_repo_root)
source_pkg_dir = source_repo.dirname_for_package_name( source_pkg_dir = source_repo.dirname_for_package_name(
node.name) node.name)
except spack.repository.RepoError: except spack.repo.RepoError:
tty.warn("Warning: Couldn't copy in provenance for %s" % tty.warn("Warning: Couldn't copy in provenance for %s" %
node.name) node.name)
# Create a destination repository # Create a destination repository
dest_repo_root = join_path(path, node.namespace) dest_repo_root = join_path(path, node.namespace)
if not os.path.exists(dest_repo_root): if not os.path.exists(dest_repo_root):
spack.repository.create_repo(dest_repo_root) spack.repo.create_repo(dest_repo_root)
repo = spack.repository.Repo(dest_repo_root) repo = spack.repo.Repo(dest_repo_root)
# Get the location of the package in the dest repo. # Get the location of the package in the dest repo.
dest_pkg_dir = repo.dirname_for_package_name(node.name) dest_pkg_dir = repo.dirname_for_package_name(node.name)
if node is not spec: if node is not spec:
install_tree(source_pkg_dir, dest_pkg_dir) install_tree(source_pkg_dir, dest_pkg_dir)
else: else:
spack.repo.dump_provenance(node, dest_pkg_dir) spack.repo.path().dump_provenance(node, dest_pkg_dir)
def print_pkg(message): def print_pkg(message):

View file

@ -27,7 +27,7 @@
from llnl.util.lang import classproperty from llnl.util.lang import classproperty
import spack import spack.repo
import spack.error import spack.error
from spack.util.path import canonicalize_path from spack.util.path import canonicalize_path
from spack.version import VersionList from spack.version import VersionList
@ -51,7 +51,7 @@ def get_packages_config():
# by sometihng, not just packages/names that don't exist. # by sometihng, not just packages/names that don't exist.
# So, this won't include, e.g., 'all'. # So, this won't include, e.g., 'all'.
virtuals = [(pkg_name, pkg_name._start_mark) for pkg_name in config virtuals = [(pkg_name, pkg_name._start_mark) for pkg_name in config
if spack.repo.is_virtual(pkg_name)] if spack.repo.path().is_virtual(pkg_name)]
# die if there are virtuals in `packages.py` # die if there are virtuals in `packages.py`
if virtuals: if virtuals:

View file

@ -26,7 +26,7 @@
import os import os
import platform import platform
import re import re
import spack import spack.repo
import spack.cmd import spack.cmd
from spack.util.executable import Executable, ProcessError from spack.util.executable import Executable, ProcessError
from llnl.util.filesystem import filter_file from llnl.util.filesystem import filter_file

View file

@ -33,6 +33,8 @@
import re import re
import traceback import traceback
import json import json
from contextlib import contextmanager
from six import string_types
try: try:
from collections.abc import Mapping from collections.abc import Mapping
@ -222,8 +224,7 @@ def update_package(self, pkg_name):
pkg_name (str): name of the package to be removed from the index pkg_name (str): name of the package to be removed from the index
""" """
package = path().get(pkg_name)
package = spack.repo.get(pkg_name)
# Remove the package from the list of packages, if present # Remove the package from the list of packages, if present
for pkg_list in self._tag_dict.values(): for pkg_list in self._tag_dict.values():
@ -345,13 +346,19 @@ def make_tag_index_cache(packages_path, namespace):
class RepoPath(object): class RepoPath(object):
"""A RepoPath is a list of repos that function as one. """A RepoPath is a list of repos that function as one.
It functions exactly like a Repo, but it operates on the It functions exactly like a Repo, but it operates on the combined
combined results of the Repos in its list instead of on a results of the Repos in its list instead of on a single package
single package repository. repository.
Args:
repos (list): list Repo objects or paths to put in this RepoPath
Optional Args:
repo_namespace (str): super-namespace for all packages in this
RepoPath (used when importing repos as modules)
""" """
def __init__(self, *repo_dirs, **kwargs): def __init__(self, *repos, **kwargs):
# super-namespace for all packages in the RepoPath
self.super_namespace = kwargs.get('namespace', repo_namespace) self.super_namespace = kwargs.get('namespace', repo_namespace)
self.repos = [] self.repos = []
@ -361,41 +368,17 @@ def __init__(self, *repo_dirs, **kwargs):
self._all_package_names = None self._all_package_names = None
self._provider_index = None self._provider_index = None
# If repo_dirs is empty, just use the configuration
if not repo_dirs:
import spack.config
repo_dirs = spack.config.get('repos')
if not repo_dirs:
raise NoRepoConfiguredError(
"Spack configuration contains no package repositories.")
# Add each repo to this path. # Add each repo to this path.
for root in repo_dirs: for repo in repos:
try: try:
repo = Repo(root, self.super_namespace) if isinstance(repo, string_types):
repo = Repo(repo, self.super_namespace)
self.put_last(repo) self.put_last(repo)
except RepoError as e: except RepoError as e:
tty.warn("Failed to initialize repository at '%s'." % root, tty.warn("Failed to initialize repository: '%s'." % repo,
e.message, e.message,
"To remove the bad repository, run this command:", "To remove the bad repository, run this command:",
" spack repo rm %s" % root) " spack repo rm %s" % repo)
def swap(self, other):
"""Convenience function to make swapping repositories easier.
This is currently used by mock tests.
TODO: Maybe there is a cleaner way.
"""
attrs = ['repos',
'by_namespace',
'by_path',
'_all_package_names',
'_provider_index']
for attr in attrs:
tmp = getattr(self, attr)
setattr(self, attr, getattr(other, attr))
setattr(other, attr, tmp)
def _add(self, repo): def _add(self, repo):
"""Add a repository to the namespace and path indexes. """Add a repository to the namespace and path indexes.
@ -1096,6 +1079,70 @@ def create_repo(root, namespace=None):
return full_path, namespace return full_path, namespace
#: Singleton repo path instance
_path = None
def set_path(repo):
"""Set the path() singleton to a specific value.
Overwrite _path and register it as an importer in sys.meta_path if
it is a ``Repo`` or ``RepoPath``.
"""
global _path
_path = repo
# make the new repo_path an importer if needed
append = isinstance(repo, (Repo, RepoPath))
if append:
sys.meta_path.append(_path)
return append
def path():
"""Get the singleton RepoPath instance for Spack.
Create a RepoPath, add it to sys.meta_path, and return it.
TODO: consider not making this a singleton.
"""
if _path is None:
repo_dirs = spack.config.get('repos')
if not repo_dirs:
raise NoRepoConfiguredError(
"Spack configuration contains no package repositories.")
set_path(RepoPath(*repo_dirs))
return _path
def get(spec):
"""Convenience wrapper around ``spack.repo.get()``."""
return path().get(spec)
def all_package_names():
"""Convenience wrapper around ``spack.repo.all_package_names()``."""
return path().all_package_names()
@contextmanager
def swap(repo_path):
"""Temporarily use another RepoPath."""
global _path
# swap out _path for repo_path
saved = _path
remove_from_meta = set_path(repo_path)
yield
# restore _path and sys.meta_path
if remove_from_meta:
sys.meta_path.remove(repo_path)
_path = saved
class RepoError(spack.error.SpackError): class RepoError(spack.error.SpackError):
"""Superclass for repository-related errors.""" """Superclass for repository-related errors."""

View file

@ -114,12 +114,11 @@
from llnl.util.lang import check_kwargs from llnl.util.lang import check_kwargs
from llnl.util.tty.color import cwrite, colorize, cescape, get_color_when from llnl.util.tty.color import cwrite, colorize, cescape, get_color_when
import spack
import spack.architecture import spack.architecture
import spack.compilers as compilers import spack.compilers as compilers
import spack.error import spack.error
import spack.parse import spack.parse
import spack.repo
import spack.store import spack.store
import spack.util.spack_json as sjson import spack.util.spack_json as sjson
import spack.util.spack_yaml as syaml import spack.util.spack_yaml as syaml
@ -1229,7 +1228,7 @@ def package_class(self):
"""Internal package call gets only the class object for a package. """Internal package call gets only the class object for a package.
Use this to just get package metadata. Use this to just get package metadata.
""" """
return spack.repo.get_pkg_class(self.fullname) return spack.repo.path().get_pkg_class(self.fullname)
@property @property
def virtual(self): def virtual(self):
@ -1245,7 +1244,7 @@ def virtual(self):
@staticmethod @staticmethod
def is_virtual(name): def is_virtual(name):
"""Test if a name is virtual without requiring a Spec.""" """Test if a name is virtual without requiring a Spec."""
return (name is not None) and (not spack.repo.exists(name)) return (name is not None) and (not spack.repo.path().exists(name))
@property @property
def concrete(self): def concrete(self):
@ -1850,7 +1849,7 @@ def concretize(self, tests=False):
# we can do it as late as possible to allow as much # we can do it as late as possible to allow as much
# compatibility across repositories as possible. # compatibility across repositories as possible.
if s.namespace is None: if s.namespace is None:
s.namespace = spack.repo.repo_for_pkg(s.name).namespace s.namespace = spack.repo.path().repo_for_pkg(s.name).namespace
if s.concrete: if s.concrete:
continue continue
@ -2456,7 +2455,7 @@ def satisfies(self, other, deps=True, strict=False, strict_deps=False):
if not self.virtual and other.virtual: if not self.virtual and other.virtual:
try: try:
pkg = spack.repo.get(self.fullname) pkg = spack.repo.get(self.fullname)
except spack.repository.UnknownEntityError: except spack.repo.UnknownEntityError:
# If we can't get package info on this spec, don't treat # If we can't get package info on this spec, don't treat
# it as a provider of this vdep. # it as a provider of this vdep.
return False return False

View file

@ -26,6 +26,7 @@
import spack import spack
import pytest import pytest
import spack.repo
from spack.build_environment import get_std_cmake_args from spack.build_environment import get_std_cmake_args
from spack.spec import Spec from spack.spec import Spec

View file

@ -31,7 +31,7 @@
import spack.paths import spack.paths
from spack.cmd.flake8 import flake8, setup_parser, changed_files from spack.cmd.flake8 import flake8, setup_parser, changed_files
from spack.repository import Repo from spack.repo import Repo
from spack.util.executable import which from spack.util.executable import which

View file

@ -165,8 +165,8 @@ def test_install_output_on_build_error(mock_packages, mock_archive, mock_fetch,
@pytest.mark.disable_clean_stage_check @pytest.mark.disable_clean_stage_check
def test_install_output_on_python_error(mock_packages, mock_archive, mock_fetch, def test_install_output_on_python_error(
config, install_mockery): mock_packages, mock_archive, mock_fetch, config, install_mockery):
out = install('failing-build', fail_on_error=False) out = install('failing-build', fail_on_error=False)
assert isinstance(install.error, spack.build_environment.ChildError) assert isinstance(install.error, spack.build_environment.ChildError)
assert install.error.name == 'InstallError' assert install.error.name == 'InstallError'

View file

@ -24,8 +24,9 @@
############################################################################## ##############################################################################
import pytest import pytest
import llnl.util.lang import llnl.util.lang
import spack
import spack.architecture import spack.architecture
import spack.repo
from spack.concretize import find_spec from spack.concretize import find_spec
from spack.spec import Spec, CompilerSpec from spack.spec import Spec, CompilerSpec
@ -161,7 +162,7 @@ def test_concretize_with_provides_when(self):
"""Make sure insufficient versions of MPI are not in providers list when """Make sure insufficient versions of MPI are not in providers list when
we ask for some advanced version. we ask for some advanced version.
""" """
repo = spack.repo repo = spack.repo.path()
assert not any( assert not any(
s.satisfies('mpich2@:1.0') for s in repo.providers_for('mpi@2.1') s.satisfies('mpich2@:1.0') for s in repo.providers_for('mpi@2.1')
) )
@ -181,7 +182,7 @@ def test_concretize_with_provides_when(self):
def test_provides_handles_multiple_providers_of_same_vesrion(self): def test_provides_handles_multiple_providers_of_same_vesrion(self):
""" """
""" """
providers = spack.repo.providers_for('mpi@3.0') providers = spack.repo.path().providers_for('mpi@3.0')
# Note that providers are repo-specific, so we don't misinterpret # Note that providers are repo-specific, so we don't misinterpret
# providers, but vdeps are not namespace-specific, so we can # providers, but vdeps are not namespace-specific, so we can
@ -216,8 +217,6 @@ def test_architecture_deep_inheritance(self):
information from the root even when partial architecture information information from the root even when partial architecture information
is provided by an intermediate dependency. is provided by an intermediate dependency.
""" """
saved_repo = spack.repo
default_dep = ('link', 'build') default_dep = ('link', 'build')
bazpkg = MockPackage('bazpkg', [], []) bazpkg = MockPackage('bazpkg', [], [])
@ -225,9 +224,7 @@ def test_architecture_deep_inheritance(self):
foopkg = MockPackage('foopkg', [barpkg], [default_dep]) foopkg = MockPackage('foopkg', [barpkg], [default_dep])
mock_repo = MockPackageMultiRepo([foopkg, barpkg, bazpkg]) mock_repo = MockPackageMultiRepo([foopkg, barpkg, bazpkg])
spack.repo = mock_repo with spack.repo.swap(mock_repo):
try:
spec = Spec('foopkg %clang@3.3 os=CNL target=footar' + spec = Spec('foopkg %clang@3.3 os=CNL target=footar' +
' ^barpkg os=SuSE11 ^bazpkg os=be') ' ^barpkg os=SuSE11 ^bazpkg os=be')
spec.concretize() spec.concretize()
@ -235,9 +232,6 @@ def test_architecture_deep_inheritance(self):
for s in spec.traverse(root=False): for s in spec.traverse(root=False):
assert s.architecture.target == spec.architecture.target assert s.architecture.target == spec.architecture.target
finally:
spack.repo = saved_repo
def test_compiler_flags_from_user_are_grouped(self): def test_compiler_flags_from_user_are_grouped(self):
spec = Spec('a%gcc cflags="-O -foo-flag foo-val" platform=test') spec = Spec('a%gcc cflags="-O -foo-flag foo-val" platform=test')
spec.concretize() spec.concretize()

View file

@ -25,6 +25,7 @@
import pytest import pytest
import spack.package_prefs import spack.package_prefs
import spack.repo
import spack.util.spack_yaml as syaml import spack.util.spack_yaml as syaml
from spack.config import ConfigScope from spack.config import ConfigScope
from spack.spec import Spec from spack.spec import Spec
@ -41,7 +42,7 @@ def concretize_scope(config, tmpdir):
config.pop_scope() config.pop_scope()
spack.package_prefs.PackagePrefs.clear_caches() spack.package_prefs.PackagePrefs.clear_caches()
spack.repo._provider_index = None spack.repo.path()._provider_index = None
def concretize(abstract_spec): def concretize(abstract_spec):

View file

@ -33,7 +33,6 @@
from llnl.util.filesystem import remove_linked_tree from llnl.util.filesystem import remove_linked_tree
import spack
import spack.architecture import spack.architecture
import spack.config import spack.config
import spack.caches import spack.caches
@ -41,7 +40,7 @@
import spack.directory_layout import spack.directory_layout
import spack.paths import spack.paths
import spack.platforms.test import spack.platforms.test
import spack.repository import spack.repo
import spack.stage import spack.stage
import spack.util.ordereddict import spack.util.ordereddict
import spack.util.executable import spack.util.executable
@ -173,25 +172,23 @@ def __str__(self):
@pytest.fixture(scope='session') @pytest.fixture(scope='session')
def repo_path(): def repo_path():
"""Session scoped RepoPath object pointing to the mock repository""" """Session scoped RepoPath object pointing to the mock repository"""
return spack.repository.RepoPath(spack.paths.mock_packages_path) return spack.repo.RepoPath(spack.paths.mock_packages_path)
@pytest.fixture(scope='module') @pytest.fixture(scope='module')
def mock_packages(repo_path): def mock_packages(repo_path):
"""Use the 'builtin.mock' repository instead of 'builtin'""" """Use the 'builtin.mock' repository instead of 'builtin'"""
mock_repo = copy.deepcopy(repo_path) mock_repo = copy.deepcopy(repo_path)
spack.repo.swap(mock_repo) with spack.repo.swap(mock_repo):
yield yield
spack.repo.swap(mock_repo)
@pytest.fixture(scope='function') @pytest.fixture(scope='function')
def mutable_mock_packages(mock_packages, repo_path): def mutable_mock_packages(mock_packages, repo_path):
"""Function-scoped mock packages, for tests that need to modify them.""" """Function-scoped mock packages, for tests that need to modify them."""
mock_repo = copy.deepcopy(repo_path) mock_repo = copy.deepcopy(repo_path)
spack.repo.swap(mock_repo) with spack.repo.swap(mock_repo):
yield yield
spack.repo.swap(mock_repo)
@pytest.fixture(scope='session') @pytest.fixture(scope='session')
@ -221,6 +218,7 @@ def configuration_dir(tmpdir_factory, linux_os):
compilers_yaml = test_path.join('data', 'compilers.yaml') compilers_yaml = test_path.join('data', 'compilers.yaml')
packages_yaml = test_path.join('data', 'packages.yaml') packages_yaml = test_path.join('data', 'packages.yaml')
config_yaml = test_path.join('data', 'config.yaml') config_yaml = test_path.join('data', 'config.yaml')
repos_yaml = test_path.join('data', 'repos.yaml')
# Create temporary 'site' and 'user' folders # Create temporary 'site' and 'user' folders
tmpdir.ensure('site', dir=True) tmpdir.ensure('site', dir=True)
@ -229,6 +227,7 @@ def configuration_dir(tmpdir_factory, linux_os):
# Copy the configurations that don't need further work # Copy the configurations that don't need further work
packages_yaml.copy(tmpdir.join('site', 'packages.yaml')) packages_yaml.copy(tmpdir.join('site', 'packages.yaml'))
config_yaml.copy(tmpdir.join('site', 'config.yaml')) config_yaml.copy(tmpdir.join('site', 'config.yaml'))
repos_yaml.copy(tmpdir.join('site', 'repos.yaml'))
# Write the one that needs modifications # Write the one that needs modifications
content = ''.join(compilers_yaml.read()).format(linux_os) content = ''.join(compilers_yaml.read()).format(linux_os)
@ -245,8 +244,6 @@ def config(configuration_dir):
real_configuration = spack.config._configuration real_configuration = spack.config._configuration
print real_configuration
scopes = [ scopes = [
spack.config.ConfigScope(name, str(configuration_dir.join(name))) spack.config.ConfigScope(name, str(configuration_dir.join(name)))
for name in ['site', 'system', 'user']] for name in ['site', 'system', 'user']]

View file

@ -0,0 +1,2 @@
repos:
- $spack/var/spack/repos/builtin

View file

@ -33,7 +33,7 @@
from llnl.util.tty.colify import colify from llnl.util.tty.colify import colify
import spack import spack.repo
import spack.store import spack.store
from spack.test.conftest import MockPackageMultiRepo from spack.test.conftest import MockPackageMultiRepo
from spack.util.executable import Executable from spack.util.executable import Executable
@ -432,17 +432,12 @@ def fail_while_writing():
def test_115_reindex_with_packages_not_in_repo(database, refresh_db_on_exit): def test_115_reindex_with_packages_not_in_repo(database, refresh_db_on_exit):
install_db = database.mock.db install_db = database.mock.db
saved_repo = spack.repo
# Dont add any package definitions to this repository, the idea is that # Dont add any package definitions to this repository, the idea is that
# packages should not have to be defined in the repository once they # packages should not have to be defined in the repository once they
# are installed # are installed
mock_repo = MockPackageMultiRepo([]) with spack.repo.swap(MockPackageMultiRepo([])):
try:
spack.repo = mock_repo
spack.store.db.reindex(spack.store.layout) spack.store.db.reindex(spack.store.layout)
_check_db_sanity(install_db) _check_db_sanity(install_db)
finally:
spack.repo = saved_repo
def test_external_entries_in_db(database): def test_external_entries_in_db(database):

View file

@ -30,11 +30,10 @@
from llnl.util.filesystem import join_path from llnl.util.filesystem import join_path
import spack
import spack.paths import spack.paths
import spack.repo
from spack.directory_layout import YamlDirectoryLayout from spack.directory_layout import YamlDirectoryLayout
from spack.directory_layout import InvalidDirectoryLayoutParametersError from spack.directory_layout import InvalidDirectoryLayoutParametersError
from spack.repository import RepoPath
from spack.spec import Spec from spack.spec import Spec
# number of packages to test (to reduce test time) # number of packages to test (to reduce test time)
@ -105,7 +104,7 @@ def test_read_and_write_spec(
layout. layout.
""" """
layout, tmpdir = layout_and_dir layout, tmpdir = layout_and_dir
packages = list(spack.repo.all_packages())[:max_packages] packages = list(spack.repo.path().all_packages())[:max_packages]
for pkg in packages: for pkg in packages:
if pkg.name.startswith('external'): if pkg.name.startswith('external'):
@ -187,7 +186,7 @@ def test_handle_unknown_package(
or query them again if the package goes away. or query them again if the package goes away.
""" """
layout, _ = layout_and_dir layout, _ = layout_and_dir
mock_db = RepoPath(spack.paths.mock_packages_path) mock_db = spack.repo.RepoPath(spack.paths.mock_packages_path)
not_in_mock = set.difference( not_in_mock = set.difference(
set(spack.repo.all_package_names()), set(spack.repo.all_package_names()),
@ -209,28 +208,25 @@ def test_handle_unknown_package(
layout.create_install_directory(spec) layout.create_install_directory(spec)
installed_specs[spec] = layout.path_for_spec(spec) installed_specs[spec] = layout.path_for_spec(spec)
spack.repo.swap(mock_db) with spack.repo.swap(mock_db):
# Now check that even without the package files, we know
# enough to read a spec from the spec file.
for spec, path in installed_specs.items():
spec_from_file = layout.read_spec(
join_path(path, '.spack', 'spec.yaml'))
# Now check that even without the package files, we know # To satisfy these conditions, directory layouts need to
# enough to read a spec from the spec file. # read in concrete specs from their install dirs somehow.
for spec, path in installed_specs.items(): assert path == layout.path_for_spec(spec_from_file)
spec_from_file = layout.read_spec( assert spec == spec_from_file
join_path(path, '.spack', 'spec.yaml') assert spec.eq_dag(spec_from_file)
) assert spec.dag_hash() == spec_from_file.dag_hash()
# To satisfy these conditions, directory layouts need to
# read in concrete specs from their install dirs somehow.
assert path == layout.path_for_spec(spec_from_file)
assert spec == spec_from_file
assert spec.eq_dag(spec_from_file)
assert spec.dag_hash() == spec_from_file.dag_hash()
spack.repo.swap(mock_db)
def test_find(layout_and_dir, config, mock_packages): def test_find(layout_and_dir, config, mock_packages):
"""Test that finding specs within an install layout works.""" """Test that finding specs within an install layout works."""
layout, _ = layout_and_dir layout, _ = layout_and_dir
packages = list(spack.repo.all_packages())[:max_packages] packages = list(spack.repo.path().all_packages())[:max_packages]
# Create install prefixes for all packages in the list # Create install prefixes for all packages in the list
installed_specs = {} installed_specs = {}

View file

@ -26,6 +26,7 @@
import os import os
import spack.spec import spack.spec
import spack.repo
import spack.build_environment import spack.build_environment

View file

@ -28,7 +28,7 @@
from llnl.util.filesystem import working_dir, join_path, touch from llnl.util.filesystem import working_dir, join_path, touch
import spack import spack.repo
import spack.config import spack.config
from spack.spec import Spec from spack.spec import Spec
from spack.version import ver from spack.version import ver

View file

@ -28,7 +28,7 @@
from llnl.util.filesystem import working_dir, join_path, touch from llnl.util.filesystem import working_dir, join_path, touch
import spack import spack.repo
import spack.config import spack.config
from spack.spec import Spec from spack.spec import Spec
from spack.version import ver from spack.version import ver

View file

@ -25,7 +25,7 @@
import os import os
import pytest import pytest
import spack import spack.repo
import spack.store import spack.store
from spack.spec import Spec from spack.spec import Spec

View file

@ -28,7 +28,7 @@
from llnl.util.filesystem import join_path from llnl.util.filesystem import join_path
import spack import spack.repo
import spack.mirror import spack.mirror
import spack.util.executable import spack.util.executable
from spack.spec import Spec from spack.spec import Spec

View file

@ -23,8 +23,9 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
############################################################################## ##############################################################################
"""Test for multi_method dispatch.""" """Test for multi_method dispatch."""
import spack
import pytest import pytest
import spack.repo
from spack.multimethod import NoSuchMethodError from spack.multimethod import NoSuchMethodError

View file

@ -27,9 +27,9 @@
import pytest import pytest
import spack import spack.repo
from spack.paths import mock_packages_path from spack.paths import mock_packages_path
from spack.repository import RepoPath from spack.repo import RepoPath
def check_db(): def check_db():
@ -47,9 +47,8 @@ def test_get_all_packages():
def test_get_all_mock_packages(): def test_get_all_mock_packages():
"""Get the mock packages once each too.""" """Get the mock packages once each too."""
db = RepoPath(mock_packages_path) db = RepoPath(mock_packages_path)
spack.repo.swap(db) with spack.repo.swap(db):
check_db() check_db()
spack.repo.swap(db)
def test_all_versions_are_lowercase(): def test_all_versions_are_lowercase():
@ -66,7 +65,7 @@ def test_all_virtual_packages_have_default_providers():
"""All virtual packages must have a default provider explicitly set.""" """All virtual packages must have a default provider explicitly set."""
defaults = spack.config.get('packages', scope='defaults') defaults = spack.config.get('packages', scope='defaults')
default_providers = defaults['all']['providers'] default_providers = defaults['all']['providers']
providers = spack.repo.provider_index.providers providers = spack.repo.path().provider_index.providers
for provider in providers: for provider in providers:
assert provider in default_providers assert provider in default_providers

View file

@ -26,9 +26,8 @@
from llnl.util.filesystem import join_path from llnl.util.filesystem import join_path
import spack import spack.repo
from spack.paths import mock_packages_path from spack.paths import mock_packages_path
from spack.repository import Repo
from spack.util.naming import mod_to_class from spack.util.naming import mod_to_class
from spack.spec import Spec from spack.spec import Spec
from spack.util.package_hash import package_content from spack.util.package_hash import package_content
@ -44,7 +43,7 @@ def test_package_name(self):
assert pkg.name == 'mpich' assert pkg.name == 'mpich'
def test_package_filename(self): def test_package_filename(self):
repo = Repo(mock_packages_path) repo = spack.repo.Repo(mock_packages_path)
filename = repo.filename_for_package_name('mpich') filename = repo.filename_for_package_name('mpich')
assert filename == join_path( assert filename == join_path(
mock_packages_path, mock_packages_path,
@ -54,7 +53,7 @@ def test_package_filename(self):
) )
def test_nonexisting_package_filename(self): def test_nonexisting_package_filename(self):
repo = Repo(mock_packages_path) repo = spack.repo.Repo(mock_packages_path)
filename = repo.filename_for_package_name('some-nonexisting-package') filename = repo.filename_for_package_name('some-nonexisting-package')
assert filename == join_path( assert filename == join_path(
mock_packages_path, mock_packages_path,

View file

@ -34,7 +34,7 @@
from llnl.util.filesystem import mkdirp from llnl.util.filesystem import mkdirp
import spack import spack.repo
import spack.store import spack.store
import spack.binary_distribution as bindist import spack.binary_distribution as bindist
import spack.cmd.buildcache as buildcache import spack.cmd.buildcache as buildcache

View file

@ -39,7 +39,7 @@
""" """
from six import StringIO from six import StringIO
import spack import spack.repo
from spack.provider_index import ProviderIndex from spack.provider_index import ProviderIndex
from spack.spec import Spec from spack.spec import Spec

View file

@ -24,7 +24,7 @@
############################################################################## ##############################################################################
import pytest import pytest
import spack.repository import spack.repo
import spack.paths import spack.paths
@ -33,7 +33,7 @@
# given RepoPath # given RepoPath
@pytest.fixture() @pytest.fixture()
def repo_for_test(): def repo_for_test():
return spack.repository.RepoPath(spack.paths.mock_packages_path) return spack.repo.RepoPath(spack.paths.mock_packages_path)
@pytest.fixture() @pytest.fixture()
@ -47,7 +47,7 @@ def extra_repo(tmpdir_factory):
repo: repo:
namespace: extra_test_repo namespace: extra_test_repo
""") """)
return spack.repository.Repo(str(repo_dir)) return spack.repo.Repo(str(repo_dir))
def test_repo_getpkg(repo_for_test): def test_repo_getpkg(repo_for_test):
@ -68,10 +68,10 @@ def test_repo_multi_getpkgclass(repo_for_test, extra_repo):
def test_repo_pkg_with_unknown_namespace(repo_for_test): def test_repo_pkg_with_unknown_namespace(repo_for_test):
with pytest.raises(spack.repository.UnknownNamespaceError): with pytest.raises(spack.repo.UnknownNamespaceError):
repo_for_test.get('unknown.a') repo_for_test.get('unknown.a')
def test_repo_unknown_pkg(repo_for_test): def test_repo_unknown_pkg(repo_for_test):
with pytest.raises(spack.repository.UnknownPackageError): with pytest.raises(spack.repo.UnknownPackageError):
repo_for_test.get('builtin.mock.nonexistentpackage') repo_for_test.get('builtin.mock.nonexistentpackage')

View file

@ -86,8 +86,6 @@ def test_test_deptype():
w->y deptypes are (link, build), w->x and y->z deptypes are (test) w->y deptypes are (link, build), w->x and y->z deptypes are (test)
""" """
saved_repo = spack.repo
default = ('build', 'link') default = ('build', 'link')
test_only = ('test',) test_only = ('test',)
@ -97,15 +95,12 @@ def test_test_deptype():
w = MockPackage('w', [x, y], [test_only, default]) w = MockPackage('w', [x, y], [test_only, default])
mock_repo = MockPackageMultiRepo([w, x, y, z]) mock_repo = MockPackageMultiRepo([w, x, y, z])
try: with spack.repo.swap(mock_repo):
spack.repo = mock_repo
spec = Spec('w') spec = Spec('w')
spec.concretize(tests=(w.name,)) spec.concretize(tests=(w.name,))
assert ('x' in spec) assert ('x' in spec)
assert ('z' not in spec) assert ('z' not in spec)
finally:
spack.repo = saved_repo
@pytest.mark.usefixtures('mutable_mock_packages') @pytest.mark.usefixtures('mutable_mock_packages')

View file

@ -28,7 +28,7 @@
from llnl.util.filesystem import join_path, touch, working_dir from llnl.util.filesystem import join_path, touch, working_dir
import spack import spack.repo
import spack.config import spack.config
from spack.spec import Spec from spack.spec import Spec
from spack.version import ver from spack.version import ver

View file

@ -27,7 +27,7 @@
from llnl.util.filesystem import working_dir, is_exe from llnl.util.filesystem import working_dir, is_exe
import spack import spack.repo
import spack.config import spack.config
from spack.fetch_strategy import from_list_url, URLFetchStrategy from spack.fetch_strategy import from_list_url, URLFetchStrategy
from spack.spec import Spec from spack.spec import Spec

View file

@ -22,7 +22,7 @@
# along with this program; if not, write to the Free Software Foundation, # along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
############################################################################## ##############################################################################
import spack import spack.repo
from spack import directives from spack import directives
from spack.error import SpackError from spack.error import SpackError
from spack.spec import Spec from spack.spec import Spec
@ -131,7 +131,7 @@ def package_hash(spec, content=None):
def package_ast(spec): def package_ast(spec):
spec = Spec(spec) spec = Spec(spec)
filename = spack.repo.filename_for_package_name(spec.name) filename = spack.repo.path().filename_for_package_name(spec.name)
with open(filename) as f: with open(filename) as f:
text = f.read() text = f.read()
root = ast.parse(text) root = ast.parse(text)