diff options
author | Harmen Stoppels <me@harmenstoppels.nl> | 2024-02-03 11:05:45 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-03 11:05:45 +0100 |
commit | c44e854d05de6b4cea4736546317748d05e5d833 (patch) | |
tree | ecfa390971cdb2ba40c9a26c75ecb3113c4d8c44 /var | |
parent | 8fa8dbc26998bf5bd23b096b522e4d6258e9e75d (diff) | |
download | spack-c44e854d05de6b4cea4736546317748d05e5d833.tar.gz spack-c44e854d05de6b4cea4736546317748d05e5d833.tar.bz2 spack-c44e854d05de6b4cea4736546317748d05e5d833.tar.xz spack-c44e854d05de6b4cea4736546317748d05e5d833.zip |
Environment views: dependents before dependencies, resolve identical file conflicts (#42350)
Fix two separate problems:
1. We want to always visit parents before children while creating views
(when it comes to ignoring conflicts, the first instance generated in
the view is chosen, and we want the parent instance to have precedence).
Our preorder traversal does not guarantee that, but our topological-
order traversal does.
2. For copy style views with packages x depending on y, where
<x-prefix>/foo is a symlink to <y-prefix>/foo, we want to guarantee
that:
* A conflict is not registered
* <y-prefix>/foo is chosen (otherwise, the "foo" symlink would become
self-referential if relocated relative to the view root)
Note that
* This is an exception to [1] (in this case the dependency instance
overrides the dependent)
* Prior to this change, if "foo" was ignored as a conflict, it was
possible to create this self-referential symlink
Add tests for each of these cases
Diffstat (limited to 'var')
-rw-r--r-- | var/spack/repos/builtin.mock/packages/view-dir/package.py (renamed from var/spack/repos/builtin.mock/packages/view-dir-dir/package.py) | 6 | ||||
-rw-r--r-- | var/spack/repos/builtin.mock/packages/view-file/package.py (renamed from var/spack/repos/builtin.mock/packages/view-dir-file/package.py) | 6 | ||||
-rw-r--r-- | var/spack/repos/builtin.mock/packages/view-ignore-conflict/package.py | 23 | ||||
-rw-r--r-- | var/spack/repos/builtin.mock/packages/view-resolve-conflict-middle/package.py | 23 | ||||
-rw-r--r-- | var/spack/repos/builtin.mock/packages/view-resolve-conflict-top/package.py | 26 | ||||
-rw-r--r-- | var/spack/repos/builtin.mock/packages/view-symlinked-dir/package.py (renamed from var/spack/repos/builtin.mock/packages/view-dir-symlinked-dir/package.py) | 6 |
6 files changed, 78 insertions, 12 deletions
diff --git a/var/spack/repos/builtin.mock/packages/view-dir-dir/package.py b/var/spack/repos/builtin.mock/packages/view-dir/package.py index 545735cec5..9bc13aa639 100644 --- a/var/spack/repos/builtin.mock/packages/view-dir-dir/package.py +++ b/var/spack/repos/builtin.mock/packages/view-dir/package.py @@ -8,11 +8,9 @@ import os from spack.package import * -class ViewDirDir(Package): - """Installs a <prefix>/bin/x where x is a dir, in contrast to view-dir-file.""" +class ViewDir(Package): + """Installs a <prefix>/bin/x where x is a dir, in contrast to view-file.""" - homepage = "http://www.spack.org" - url = "http://www.spack.org/downloads/aml-1.0.tar.gz" has_code = False version("0.1.0") diff --git a/var/spack/repos/builtin.mock/packages/view-dir-file/package.py b/var/spack/repos/builtin.mock/packages/view-file/package.py index 55e94ac498..ee9f4c7134 100644 --- a/var/spack/repos/builtin.mock/packages/view-dir-file/package.py +++ b/var/spack/repos/builtin.mock/packages/view-file/package.py @@ -8,11 +8,9 @@ import os from spack.package import * -class ViewDirFile(Package): - """Installs a <prefix>/bin/x where x is a file, in contrast to view-dir-dir""" +class ViewFile(Package): + """Installs a <prefix>/bin/x where x is a file, in contrast to view-dir""" - homepage = "http://www.spack.org" - url = "http://www.spack.org/downloads/aml-1.0.tar.gz" has_code = False version("0.1.0") diff --git a/var/spack/repos/builtin.mock/packages/view-ignore-conflict/package.py b/var/spack/repos/builtin.mock/packages/view-ignore-conflict/package.py new file mode 100644 index 0000000000..7830d35aec --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/view-ignore-conflict/package.py @@ -0,0 +1,23 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import os + +from spack.package import * + + +class ViewIgnoreConflict(Package): + """Installs a file in <prefix>/bin/x, conflicting with the file <dep>/bin/x in a view. In + a view, we should find this package's file, not the dependency's file.""" + + has_code = False + + version("0.1.0") + depends_on("view-file") + + def install(self, spec, prefix): + os.mkdir(os.path.join(prefix, "bin")) + with open(os.path.join(prefix, "bin", "x"), "wb") as f: + f.write(b"file") diff --git a/var/spack/repos/builtin.mock/packages/view-resolve-conflict-middle/package.py b/var/spack/repos/builtin.mock/packages/view-resolve-conflict-middle/package.py new file mode 100644 index 0000000000..c32762acf7 --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/view-resolve-conflict-middle/package.py @@ -0,0 +1,23 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import os + +from spack.package import * + + +class ViewResolveConflictMiddle(Package): + """See view-resolve-conflict-top""" + + has_code = False + + version("0.1.0") + depends_on("view-file") + + def install(self, spec, prefix): + bottom = spec["view-file"].prefix + os.mkdir(os.path.join(prefix, "bin")) + os.symlink(os.path.join(bottom, "bin", "x"), os.path.join(prefix, "bin", "x")) + os.symlink(os.path.join(bottom, "bin", "x"), os.path.join(prefix, "bin", "y")) diff --git a/var/spack/repos/builtin.mock/packages/view-resolve-conflict-top/package.py b/var/spack/repos/builtin.mock/packages/view-resolve-conflict-top/package.py new file mode 100644 index 0000000000..22ddde633b --- /dev/null +++ b/var/spack/repos/builtin.mock/packages/view-resolve-conflict-top/package.py @@ -0,0 +1,26 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import os + +from spack.package import * + + +class ViewResolveConflictTop(Package): + """Package for testing edge cases for views, such as spec ordering and clashing files referring + to the same file on disk. See test_env_view_resolves_identical_file_conflicts.""" + + has_code = False + + version("0.1.0") + depends_on("view-file") + depends_on("view-resolve-conflict-middle") + + def install(self, spec, prefix): + middle = spec["view-resolve-conflict-middle"].prefix + bottom = spec["view-file"].prefix + os.mkdir(os.path.join(prefix, "bin")) + os.symlink(os.path.join(bottom, "bin", "x"), os.path.join(prefix, "bin", "x")) + os.symlink(os.path.join(middle, "bin", "y"), os.path.join(prefix, "bin", "y")) diff --git a/var/spack/repos/builtin.mock/packages/view-dir-symlinked-dir/package.py b/var/spack/repos/builtin.mock/packages/view-symlinked-dir/package.py index 249e776606..ef92e89ceb 100644 --- a/var/spack/repos/builtin.mock/packages/view-dir-symlinked-dir/package.py +++ b/var/spack/repos/builtin.mock/packages/view-symlinked-dir/package.py @@ -8,12 +8,10 @@ import os from spack.package import * -class ViewDirSymlinkedDir(Package): +class ViewSymlinkedDir(Package): """Installs <prefix>/bin/x/file_in_symlinked_dir where x -> y is a symlinked dir. - This should be mergeable with view-dir-dir, but not with view-dir-file.""" + This should be mergeable with view-dir, but not with view-file.""" - homepage = "http://www.spack.org" - url = "http://www.spack.org/downloads/aml-1.0.tar.gz" has_code = False version("0.1.0") |