summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMassimiliano Culpo <massimiliano.culpo@gmail.com>2021-01-31 11:31:57 +0100
committerMassimiliano Culpo <massimiliano.culpo@gmail.com>2021-05-21 17:59:50 +0200
commit0678d5df90f8cb9207536d77f00cb8a0eee6a373 (patch)
tree1ef1572bd67b15f892aec245e55f8a2ba75207a4
parent2a4d2f905cdc4e65839fdcf0075e822d64d0f0a5 (diff)
downloadspack-0678d5df90f8cb9207536d77f00cb8a0eee6a373.tar.gz
spack-0678d5df90f8cb9207536d77f00cb8a0eee6a373.tar.bz2
spack-0678d5df90f8cb9207536d77f00cb8a0eee6a373.tar.xz
spack-0678d5df90f8cb9207536d77f00cb8a0eee6a373.zip
repo: generalize "swap" context manager to also accept paths
The method is now called "use_repositories" and makes it clear in the docstring that it accepts as arguments either Repo objects or paths. Since there was some duplication between this contextmanager and "use_repo" in the testing framework, remove the latter and use spack.repo.use_repositories across the entire code base. Make a few adjustment to MockPackageMultiRepo, since it was stating in the docstring that it was supposed to mock spack.repo.Repo and was instead mocking spack.repo.RepoPath. (cherry picked from commit 1a8963b0f4c11c4b7ddd347e6cd95cdc68ddcbe0)
-rw-r--r--lib/spack/spack/repo.py45
-rw-r--r--lib/spack/spack/test/cmd/ci.py2
-rw-r--r--lib/spack/spack/test/cmd/env.py12
-rw-r--r--lib/spack/spack/test/cmd/module.py4
-rw-r--r--lib/spack/spack/test/cmd/pkg.py2
-rw-r--r--lib/spack/spack/test/concretize.py2
-rw-r--r--lib/spack/spack/test/conftest.py24
-rw-r--r--lib/spack/spack/test/database.py12
-rw-r--r--lib/spack/spack/test/directory_layout.py2
-rw-r--r--lib/spack/spack/test/installer.py4
-rw-r--r--lib/spack/spack/test/package_sanity.py2
-rw-r--r--lib/spack/spack/test/spec_dag.py8
-rw-r--r--lib/spack/spack/test/spec_yaml.py2
-rw-r--r--lib/spack/spack/test/test_activations.py2
-rw-r--r--lib/spack/spack/test/util/mock_package.py2
-rw-r--r--lib/spack/spack/util/mock_package.py7
16 files changed, 71 insertions, 61 deletions
diff --git a/lib/spack/spack/repo.py b/lib/spack/spack/repo.py
index 4af7b382f0..52b44e0120 100644
--- a/lib/spack/spack/repo.py
+++ b/lib/spack/spack/repo.py
@@ -1256,23 +1256,6 @@ def set_path(repo):
@contextlib.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
-
-
-@contextlib.contextmanager
def additional_repository(repository):
"""Adds temporarily a repository to the default one.
@@ -1284,6 +1267,34 @@ def additional_repository(repository):
path.remove(repository)
+@contextlib.contextmanager
+def use_repositories(*paths_and_repos):
+ """Use the repositories passed as arguments within the context manager.
+
+ Args:
+ *paths_and_repos: paths to the repositories to be used, or
+ already constructed Repo objects
+
+ Returns:
+ Corresponding RepoPath object
+ """
+ global path
+
+ # Construct a temporary RepoPath object from
+ temporary_repositories = RepoPath(*paths_and_repos)
+
+ # Swap the current repository out
+ saved = path
+ remove_from_meta = set_path(temporary_repositories)
+
+ yield temporary_repositories
+
+ # Restore _path and sys.meta_path
+ if remove_from_meta:
+ sys.meta_path.remove(temporary_repositories)
+ path = saved
+
+
class RepoError(spack.error.SpackError):
"""Superclass for repository-related errors."""
diff --git a/lib/spack/spack/test/cmd/ci.py b/lib/spack/spack/test/cmd/ci.py
index 4d8468c66c..16af0e99e6 100644
--- a/lib/spack/spack/test/cmd/ci.py
+++ b/lib/spack/spack/test/cmd/ci.py
@@ -73,7 +73,7 @@ and then 'd', 'b', and 'a' to be put in the next three stages, respectively.
b = mock_repo.add_package('b', [d, e], [default, default])
mock_repo.add_package('a', [b, c], [default, default])
- with repo.swap(mock_repo):
+ with repo.use_repositories(mock_repo):
spec_a = Spec('a')
spec_a.concretize()
diff --git a/lib/spack/spack/test/cmd/env.py b/lib/spack/spack/test/cmd/env.py
index c2d75d9d1f..72f1b86347 100644
--- a/lib/spack/spack/test/cmd/env.py
+++ b/lib/spack/spack/test/cmd/env.py
@@ -330,7 +330,7 @@ def test_env_status_broken_view(
# switch to a new repo that doesn't include the installed package
# test that Spack detects the missing package and warns the user
new_repo = MockPackageMultiRepo()
- with spack.repo.swap(new_repo):
+ with spack.repo.use_repositories(new_repo):
output = env('status')
assert 'In environment test' in output
assert 'Environment test includes out of date' in output
@@ -351,7 +351,7 @@ def test_env_activate_broken_view(
# switch to a new repo that doesn't include the installed package
# test that Spack detects the missing package and fails gracefully
new_repo = MockPackageMultiRepo()
- with spack.repo.swap(new_repo):
+ with spack.repo.use_repositories(new_repo):
with pytest.raises(SpackCommandError):
env('activate', '--sh', 'test')
@@ -929,7 +929,7 @@ def test_read_old_lock_and_write_new(tmpdir):
y = mock_repo.add_package('y', [], [])
mock_repo.add_package('x', [y], [build_only])
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
x = Spec('x')
x.concretize()
@@ -960,7 +960,7 @@ def test_read_old_lock_creates_backup(tmpdir):
mock_repo = MockPackageMultiRepo()
y = mock_repo.add_package('y', [], [])
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
y = Spec('y')
y.concretize()
@@ -997,7 +997,7 @@ def test_indirect_build_dep():
pass
setattr(mock_repo, 'dump_provenance', noop)
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
x_spec = Spec('x')
x_concretized = x_spec.concretized()
@@ -1038,7 +1038,7 @@ def test_store_different_build_deps():
pass
setattr(mock_repo, 'dump_provenance', noop)
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
y_spec = Spec('y ^z@3')
y_concretized = y_spec.concretized()
diff --git a/lib/spack/spack/test/cmd/module.py b/lib/spack/spack/test/cmd/module.py
index c3fe279306..9a34368fce 100644
--- a/lib/spack/spack/test/cmd/module.py
+++ b/lib/spack/spack/test/cmd/module.py
@@ -10,7 +10,7 @@ import pytest
import spack.main
import spack.modules
-from spack.test.conftest import use_store, use_configuration, use_repo
+from spack.test.conftest import use_store, use_configuration
module = spack.main.SpackCommand('module')
@@ -23,7 +23,7 @@ def ensure_module_files_are_there(
module = spack.main.SpackCommand('module')
with use_store(mock_store):
with use_configuration(mock_configuration):
- with use_repo(mock_repo_path):
+ with spack.repo.use_repositories(mock_repo_path):
module('tcl', 'refresh', '-y')
diff --git a/lib/spack/spack/test/cmd/pkg.py b/lib/spack/spack/test/cmd/pkg.py
index ca9e3a1a3e..52127e8605 100644
--- a/lib/spack/spack/test/cmd/pkg.py
+++ b/lib/spack/spack/test/cmd/pkg.py
@@ -82,7 +82,7 @@ def mock_pkg_git_repo(tmpdir_factory):
git('-c', 'commit.gpgsign=false', 'commit',
'-m', 'change pkg-b, remove pkg-c, add pkg-d')
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
yield mock_repo_packages
diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py
index a54a65970f..e5eaa7b7fb 100644
--- a/lib/spack/spack/test/concretize.py
+++ b/lib/spack/spack/test/concretize.py
@@ -304,7 +304,7 @@ class TestConcretize(object):
barpkg = mock_repo.add_package('barpkg', [bazpkg], [default_dep])
mock_repo.add_package('foopkg', [barpkg], [default_dep])
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
spec = Spec('foopkg %gcc@4.5.0 os=CNL target=nocona' +
' ^barpkg os=SuSE11 ^bazpkg os=be')
spec.concretize()
diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py
index d4f38f2c1b..f214c78c18 100644
--- a/lib/spack/spack/test/conftest.py
+++ b/lib/spack/spack/test/conftest.py
@@ -382,19 +382,12 @@ def use_store(store):
spack.store.store = saved
-@contextlib.contextmanager
-def use_repo(repo):
- """Context manager to swap out the global Spack repo path."""
- with spack.repo.swap(repo):
- yield
-
-
#
# Test-specific fixtures
#
@pytest.fixture(scope='session')
def mock_repo_path():
- yield spack.repo.RepoPath(spack.paths.mock_packages_path)
+ yield spack.repo.Repo(spack.paths.mock_packages_path)
def _pkg_install_fn(pkg, spec, prefix):
@@ -411,15 +404,15 @@ def mock_pkg_install(monkeypatch):
@pytest.fixture(scope='function')
def mock_packages(mock_repo_path, mock_pkg_install):
"""Use the 'builtin.mock' repository instead of 'builtin'"""
- with use_repo(mock_repo_path):
- yield mock_repo_path
+ with spack.repo.use_repositories(mock_repo_path) as mock_repo:
+ yield mock_repo
@pytest.fixture(scope='function')
def mutable_mock_repo(mock_repo_path):
"""Function-scoped mock packages, for tests that need to modify them."""
- mock_repo_path = spack.repo.RepoPath(spack.paths.mock_packages_path)
- with use_repo(mock_repo_path):
+ mock_repo = spack.repo.Repo(spack.paths.mock_packages_path)
+ with spack.repo.use_repositories(mock_repo) as mock_repo_path:
yield mock_repo_path
@@ -644,7 +637,7 @@ def mock_store(tmpdir_factory, mock_repo_path, mock_configuration,
if not os.path.exists(str(store_cache.join('.spack-db'))):
with use_configuration(mock_configuration):
with use_store(store):
- with use_repo(mock_repo_path):
+ with spack.repo.use_repositories(mock_repo_path):
_populate(store.db)
store_path.copy(store_cache, mode=True, stat=True)
@@ -674,7 +667,7 @@ def mutable_mock_store(tmpdir_factory, mock_repo_path, mock_configuration,
if not os.path.exists(str(store_cache.join('.spack-db'))):
with use_configuration(mock_configuration):
with use_store(store):
- with use_repo(mock_repo_path):
+ with spack.repo.use_repositories(mock_repo_path):
_populate(store.db)
store_path.copy(store_cache, mode=True, stat=True)
@@ -1250,8 +1243,7 @@ repo:
namespace: mock_test_repo
""")
- repo = spack.repo.RepoPath(str(repodir))
- with spack.repo.swap(repo):
+ with spack.repo.use_repositories(str(repodir)) as repo:
yield repo, repodir
shutil.rmtree(str(repodir))
diff --git a/lib/spack/spack/test/database.py b/lib/spack/spack/test/database.py
index 4682c9850d..8e0eac7cc0 100644
--- a/lib/spack/spack/test/database.py
+++ b/lib/spack/spack/test/database.py
@@ -81,7 +81,7 @@ def test_installed_upstream(upstream_and_downstream_db):
y = mock_repo.add_package('y', [z], [default])
mock_repo.add_package('w', [x, y], [default, default])
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
spec = spack.spec.Spec('w')
spec.concretize()
@@ -122,7 +122,7 @@ def test_removed_upstream_dep(upstream_and_downstream_db):
z = mock_repo.add_package('z', [], [])
mock_repo.add_package('y', [z], [default])
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
spec = spack.spec.Spec('y')
spec.concretize()
@@ -155,7 +155,7 @@ def test_add_to_upstream_after_downstream(upstream_and_downstream_db):
mock_repo = MockPackageMultiRepo()
mock_repo.add_package('x', [], [])
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
spec = spack.spec.Spec('x')
spec.concretize()
@@ -197,7 +197,7 @@ def test_cannot_write_upstream(tmpdir_factory, test_store, gen_mock_layout):
upstream_dbs = spack.store._construct_upstream_dbs_from_install_roots(
[roots[1]], _test=True)
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
spec = spack.spec.Spec('x')
spec.concretize()
@@ -216,7 +216,7 @@ def test_recursive_upstream_dbs(tmpdir_factory, test_store, gen_mock_layout):
y = mock_repo.add_package('y', [z], [default])
mock_repo.add_package('x', [y], [default])
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
spec = spack.spec.Spec('x')
spec.concretize()
db_c = spack.database.Database(roots[2])
@@ -694,7 +694,7 @@ def test_115_reindex_with_packages_not_in_repo(mutable_database):
# Dont add any package definitions to this repository, the idea is that
# packages should not have to be defined in the repository once they
# are installed
- with spack.repo.swap(MockPackageMultiRepo()):
+ with spack.repo.use_repositories(MockPackageMultiRepo()):
spack.store.store.reindex()
_check_db_sanity(mutable_database)
diff --git a/lib/spack/spack/test/directory_layout.py b/lib/spack/spack/test/directory_layout.py
index 3a144621eb..3cb976a077 100644
--- a/lib/spack/spack/test/directory_layout.py
+++ b/lib/spack/spack/test/directory_layout.py
@@ -194,7 +194,7 @@ def test_handle_unknown_package(layout_and_dir, config, mock_packages):
layout.create_install_directory(spec)
installed_specs[spec] = layout.path_for_spec(spec)
- with spack.repo.swap(mock_db):
+ with spack.repo.use_repositories(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():
diff --git a/lib/spack/spack/test/installer.py b/lib/spack/spack/test/installer.py
index 3bf818544e..590c4a4a1a 100644
--- a/lib/spack/spack/test/installer.py
+++ b/lib/spack/spack/test/installer.py
@@ -474,14 +474,14 @@ def test_packages_needed_to_bootstrap_compiler_packages(install_mockery,
assert packages
-def test_dump_packages_deps_ok(install_mockery, tmpdir, mock_repo_path):
+def test_dump_packages_deps_ok(install_mockery, tmpdir, mock_packages):
"""Test happy path for dump_packages with dependencies."""
spec_name = 'simple-inheritance'
spec = spack.spec.Spec(spec_name).concretized()
inst.dump_packages(spec, str(tmpdir))
- repo = mock_repo_path.repos[0]
+ repo = mock_packages.repos[0]
dest_pkg = repo.filename_for_package_name(spec_name)
assert os.path.isfile(dest_pkg)
diff --git a/lib/spack/spack/test/package_sanity.py b/lib/spack/spack/test/package_sanity.py
index d50169a1a4..ded4d1c485 100644
--- a/lib/spack/spack/test/package_sanity.py
+++ b/lib/spack/spack/test/package_sanity.py
@@ -73,7 +73,7 @@ def test_repo_getpkg_names_and_classes():
def test_get_all_mock_packages():
"""Get the mock packages once each too."""
db = spack.repo.RepoPath(spack.paths.mock_packages_path)
- with spack.repo.swap(db):
+ with spack.repo.use_repositories(db):
check_repo()
diff --git a/lib/spack/spack/test/spec_dag.py b/lib/spack/spack/test/spec_dag.py
index 2ac5bec4d9..854495988b 100644
--- a/lib/spack/spack/test/spec_dag.py
+++ b/lib/spack/spack/test/spec_dag.py
@@ -75,7 +75,7 @@ w->y deptypes are (link, build), w->x and y->z deptypes are (test)
y = mock_repo.add_package('y', [z], [test_only])
w = mock_repo.add_package('w', [x, y], [test_only, default])
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
spec = Spec('w')
spec.concretize(tests=(w.name,))
@@ -114,7 +114,7 @@ def test_installed_deps():
b = mock_repo.add_package('b', [d, e], [default, default])
mock_repo.add_package('a', [b, c], [default, default])
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
c_spec = Spec('c')
c_spec.concretize()
assert c_spec['d'].version == spack.version.Version('2')
@@ -143,7 +143,7 @@ def test_specify_preinstalled_dep():
b = mock_repo.add_package('b', [c], [default])
mock_repo.add_package('a', [b], [default])
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
b_spec = Spec('b')
b_spec.concretize()
for spec in b_spec.traverse():
@@ -186,7 +186,7 @@ def test_conditional_dep_with_user_constraints(spec_str, expr_str, expected):
}
mock_repo.add_package('x', [y], [default], conditions=x_on_y_conditions)
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
spec = Spec(spec_str)
spec.concretize()
diff --git a/lib/spack/spack/test/spec_yaml.py b/lib/spack/spack/test/spec_yaml.py
index 12a3982f06..b32fe09e03 100644
--- a/lib/spack/spack/test/spec_yaml.py
+++ b/lib/spack/spack/test/spec_yaml.py
@@ -315,7 +315,7 @@ def test_save_dependency_spec_yamls_subset(tmpdir, config):
b = mock_repo.add_package('b', [d, e], [default, default])
mock_repo.add_package('a', [b, c], [default, default])
- with repo.swap(mock_repo):
+ with repo.use_repositories(mock_repo):
spec_a = Spec('a')
spec_a.concretize()
b_spec = spec_a['b']
diff --git a/lib/spack/spack/test/test_activations.py b/lib/spack/spack/test/test_activations.py
index d1780b8963..e8ce6c55ed 100644
--- a/lib/spack/spack/test/test_activations.py
+++ b/lib/spack/spack/test/test_activations.py
@@ -54,7 +54,7 @@ def builtin_and_mock_packages():
repo_dirs = [spack.paths.packages_path, spack.paths.mock_packages_path]
path = RepoPath(*repo_dirs)
- with spack.repo.swap(path):
+ with spack.repo.use_repositories(path):
yield
diff --git a/lib/spack/spack/test/util/mock_package.py b/lib/spack/spack/test/util/mock_package.py
index 376ac581bd..cca55bb534 100644
--- a/lib/spack/spack/test/util/mock_package.py
+++ b/lib/spack/spack/test/util/mock_package.py
@@ -15,7 +15,7 @@ def test_mock_package_possible_dependencies():
b = mock_repo.add_package('b', [d])
a = mock_repo.add_package('a', [b, c])
- with spack.repo.swap(mock_repo):
+ with spack.repo.use_repositories(mock_repo):
assert set(a.possible_dependencies()) == set(['a', 'b', 'c', 'd', 'e'])
assert set(b.possible_dependencies()) == set(['b', 'd', 'e'])
assert set(c.possible_dependencies()) == set(['c', 'd', 'e'])
diff --git a/lib/spack/spack/util/mock_package.py b/lib/spack/spack/util/mock_package.py
index 5286b50464..734a93c469 100644
--- a/lib/spack/spack/util/mock_package.py
+++ b/lib/spack/spack/util/mock_package.py
@@ -8,6 +8,7 @@
import ordereddict_backport
import spack.util.naming
+import spack.provider_index
from spack.dependency import Dependency
from spack.spec import Spec
from spack.version import Version
@@ -80,6 +81,8 @@ class MockPackageMultiRepo(object):
def __init__(self):
self.spec_to_pkg = {}
+ self.namespace = ''
+ self.full_namespace = 'spack.pkg.mock'
def get(self, spec):
if not isinstance(spec, spack.spec.Spec):
@@ -171,3 +174,7 @@ class MockPackageMultiRepo(object):
self.spec_to_pkg["mockrepo." + name] = mock_package
return mock_package
+
+ @property
+ def provider_index(self):
+ return spack.provider_index.ProviderIndex()