diff options
author | Greg Becker <becker33@llnl.gov> | 2024-11-08 17:07:40 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-08 18:07:40 -0700 |
commit | da1d533877f90610571b72f070c01e13b9729108 (patch) | |
tree | db1e39d1daba082fcec630e61e7f4423c9c63a87 /lib | |
parent | c6997e11a74e5dedbeabf93ea1df3f8d2a4601e8 (diff) | |
download | spack-da1d533877f90610571b72f070c01e13b9729108.tar.gz spack-da1d533877f90610571b72f070c01e13b9729108.tar.bz2 spack-da1d533877f90610571b72f070c01e13b9729108.tar.xz spack-da1d533877f90610571b72f070c01e13b9729108.zip |
fix patched dependencies across repositories (#42463)
Currently, if a package has a dependency from another repository and patches it,
generation of the patch cache will fail. Concretization succeeds if a fixed patch
cache is in place.
- [x] don't assume that patched dependencies are in the same repo when indexing
- [x] add some test fixtures to support multi-repo tests.
---------
Signed-off-by: Todd Gamblin <tgamblin@llnl.gov>
Co-authored-by: Todd Gamblin <tgamblin@llnl.gov>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/spack/spack/main.py | 2 | ||||
-rw-r--r-- | lib/spack/spack/patch.py | 9 | ||||
-rw-r--r-- | lib/spack/spack/paths.py | 1 | ||||
-rw-r--r-- | lib/spack/spack/test/conftest.py | 16 | ||||
-rw-r--r-- | lib/spack/spack/test/patch.py | 6 |
5 files changed, 22 insertions, 12 deletions
diff --git a/lib/spack/spack/main.py b/lib/spack/spack/main.py index 7cab47d77f..28567f26e8 100644 --- a/lib/spack/spack/main.py +++ b/lib/spack/spack/main.py @@ -547,7 +547,7 @@ def setup_main_options(args): key = syaml.syaml_str("repos") key.override = True spack.config.CONFIG.scopes["command_line"].sections["repos"] = syaml.syaml_dict( - [(key, [spack.paths.mock_packages_path])] + [(key, [spack.paths.mock_packages_path, spack.paths.mock_packages_path2])] ) spack.repo.PATH = spack.repo.create(spack.config.CONFIG) diff --git a/lib/spack/spack/patch.py b/lib/spack/spack/patch.py index a0f4152317..d4bc9fb4f4 100644 --- a/lib/spack/spack/patch.py +++ b/lib/spack/spack/patch.py @@ -530,7 +530,7 @@ class PatchCache: # update the index with per-package patch indexes pkg_cls = self.repository.get_pkg_class(pkg_fullname) - partial_index = self._index_patches(pkg_cls, self.repository) + partial_index = self._index_patches(pkg_cls) for sha256, package_to_patch in partial_index.items(): p2p = self.index.setdefault(sha256, {}) p2p.update(package_to_patch) @@ -546,14 +546,11 @@ class PatchCache: p2p.update(package_to_patch) @staticmethod - def _index_patches( - pkg_class: Type["spack.package_base.PackageBase"], repository: "spack.repo.RepoPath" - ) -> Dict[Any, Any]: + def _index_patches(pkg_class: Type["spack.package_base.PackageBase"]) -> Dict[Any, Any]: """Patch index for a specific patch. Args: pkg_class: package object to get patches for - repository: repository containing the package Returns: The patch index for that package. @@ -571,7 +568,7 @@ class PatchCache: for dependency in deps_by_name.values(): for patch_list in dependency.patches.values(): for patch in patch_list: - dspec_cls = repository.get_pkg_class(dependency.spec.name) + dspec_cls = spack.repo.PATH.get_pkg_class(dependency.spec.fullname) patch_dict = patch.to_dict() patch_dict.pop("sha256") # save some space index[patch.sha256] = {dspec_cls.fullname: patch_dict} diff --git a/lib/spack/spack/paths.py b/lib/spack/spack/paths.py index 84583cd552..aeca3a9899 100644 --- a/lib/spack/spack/paths.py +++ b/lib/spack/spack/paths.py @@ -60,6 +60,7 @@ var_path = os.path.join(prefix, "var", "spack") repos_path = os.path.join(var_path, "repos") packages_path = os.path.join(repos_path, "builtin") mock_packages_path = os.path.join(repos_path, "builtin.mock") +mock_packages_path2 = os.path.join(repos_path, "builtin.mock2") # # Writable things in $spack/var/spack diff --git a/lib/spack/spack/test/conftest.py b/lib/spack/spack/test/conftest.py index f6670157ed..b66e1edb35 100644 --- a/lib/spack/spack/test/conftest.py +++ b/lib/spack/spack/test/conftest.py @@ -575,6 +575,11 @@ def mock_repo_path(): yield spack.repo.from_path(spack.paths.mock_packages_path) +@pytest.fixture(scope="session") +def mock_repo_path2(): + yield spack.repo.from_path(spack.paths.mock_packages_path2) + + def _pkg_install_fn(pkg, spec, prefix): # sanity_check_prefix requires something in the install directory mkdirp(prefix.bin) @@ -588,19 +593,20 @@ def mock_pkg_install(monkeypatch): @pytest.fixture(scope="function") -def mock_packages(mock_repo_path, mock_pkg_install, request): - """Use the 'builtin.mock' repository instead of 'builtin'""" +def mock_packages(mock_repo_path, mock_repo_path2, mock_pkg_install, request): + """Use the 'builtin.mock' and 'builtin.mock2' repositories instead of 'builtin'""" ensure_configuration_fixture_run_before(request) - with spack.repo.use_repositories(mock_repo_path) as mock_repo: + with spack.repo.use_repositories(mock_repo_path, mock_repo_path2) as mock_repo: yield mock_repo @pytest.fixture(scope="function") -def mutable_mock_repo(mock_repo_path, request): +def mutable_mock_repo(request): """Function-scoped mock packages, for tests that need to modify them.""" ensure_configuration_fixture_run_before(request) mock_repo = spack.repo.from_path(spack.paths.mock_packages_path) - with spack.repo.use_repositories(mock_repo) as mock_repo_path: + mock_repo2 = spack.repo.from_path(spack.paths.mock_packages_path2) + with spack.repo.use_repositories(mock_repo, mock_repo2) as mock_repo_path: yield mock_repo_path diff --git a/lib/spack/spack/test/patch.py b/lib/spack/spack/test/patch.py index 4b5f31b904..1088b1f24b 100644 --- a/lib/spack/spack/test/patch.py +++ b/lib/spack/spack/test/patch.py @@ -499,3 +499,9 @@ def test_invalid_from_dict(mock_packages, config): } with pytest.raises(spack.fetch_strategy.ChecksumError, match="sha256 checksum failed for"): spack.patch.from_dict(dictionary) + + +@pytest.mark.regression("43097") +def test_cross_repo_patch(mock_packages, config): + cross_repo_patch = Spec("patch-a-foreign-dependency") + cross_repo_patch.concretize() |