summaryrefslogtreecommitdiff
path: root/var
diff options
context:
space:
mode:
authorHarmen Stoppels <me@harmenstoppels.nl>2024-02-03 11:05:45 +0100
committerGitHub <noreply@github.com>2024-02-03 11:05:45 +0100
commitc44e854d05de6b4cea4736546317748d05e5d833 (patch)
treeecfa390971cdb2ba40c9a26c75ecb3113c4d8c44 /var
parent8fa8dbc26998bf5bd23b096b522e4d6258e9e75d (diff)
downloadspack-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.py23
-rw-r--r--var/spack/repos/builtin.mock/packages/view-resolve-conflict-middle/package.py23
-rw-r--r--var/spack/repos/builtin.mock/packages/view-resolve-conflict-top/package.py26
-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")