summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMassimiliano Culpo <massimiliano.culpo@gmail.com>2023-03-17 11:36:29 +0100
committerGitHub <noreply@github.com>2023-03-17 11:36:29 +0100
commit97193a25ce0c0df6a03cc7d719b0e6e25a37d3a1 (patch)
tree5faa6313da7035996dc49a9282655a03933105b7
parent5bf96561eeaec8728e86634a049074175ec017ec (diff)
downloadspack-97193a25ce0c0df6a03cc7d719b0e6e25a37d3a1.tar.gz
spack-97193a25ce0c0df6a03cc7d719b0e6e25a37d3a1.tar.bz2
spack-97193a25ce0c0df6a03cc7d719b0e6e25a37d3a1.tar.xz
spack-97193a25ce0c0df6a03cc7d719b0e6e25a37d3a1.zip
Mitigation for GitVersion bug when no `=reference` is given (#36159)
* ASP-based solver: use satisfies instead of intersects They are semantically equivalent for concrete versions, but the GitVersion.intersects implementation is buggy * Mitigation for git version bug fixes #36134 This commit works around the issue in #36134, by using GitVersion.satisfies instead of GitVersion.intersects There are still underlying issues when trying to infer the "reference version" when no explicit one is given, but: 1. They are not reproducible with our synthetic repo 2. They occur only when the `git.<xxx>` form of Git version is used Here we just work around the user facing issue and ensure the tests are correct with our synthetic repository.
-rw-r--r--lib/spack/spack/solver/asp.py3
-rw-r--r--lib/spack/spack/test/versions.py37
2 files changed, 39 insertions, 1 deletions
diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py
index b4da31c3c1..ea839e15e1 100644
--- a/lib/spack/spack/solver/asp.py
+++ b/lib/spack/spack/solver/asp.py
@@ -1877,8 +1877,9 @@ class SpackSolverSetup(object):
"""Define what version_satisfies(...) means in ASP logic."""
for pkg_name, versions in sorted(self.version_constraints):
# version must be *one* of the ones the spec allows.
+ # Also, "possible versions" contain only concrete versions, so satisfies is appropriate
allowed_versions = [
- v for v in sorted(self.possible_versions[pkg_name]) if v.intersects(versions)
+ v for v in sorted(self.possible_versions[pkg_name]) if v.satisfies(versions)
]
# This is needed to account for a variable number of
diff --git a/lib/spack/spack/test/versions.py b/lib/spack/spack/test/versions.py
index f39340c529..d10ade63ca 100644
--- a/lib/spack/spack/test/versions.py
+++ b/lib/spack/spack/test/versions.py
@@ -771,3 +771,40 @@ def test_version_intersects_satisfies_semantic(lhs_str, rhs_str, expected):
assert lhs.intersects(rhs) is rhs.intersects(lhs)
assert lhs.satisfies(rhs) is lhs_sat_rhs
assert rhs.satisfies(lhs) is rhs_sat_lhs
+
+
+@pytest.mark.parametrize(
+ "spec_str,tested_intersects,tested_satisfies",
+ [
+ (
+ "git-test-commit@git.1.x",
+ [("@:2", True), ("@:1", True), ("@:0", False), ("@1.3:", False)],
+ [("@:2", True), ("@:1", True), ("@:0", False), ("@1.3:", False)],
+ ),
+ (
+ "git-test-commit@git.v2.0",
+ [("@:2", True), ("@:1", False), ("@:0", False), ("@1.3:", True)],
+ [("@:2", True), ("@:1", False), ("@:0", False), ("@1.3:", True)],
+ ),
+ ],
+)
+@pytest.mark.skipif(sys.platform == "win32", reason="Not supported on Windows (yet)")
+def test_git_versions_without_explicit_reference(
+ spec_str,
+ tested_intersects,
+ tested_satisfies,
+ mock_git_version_info,
+ mock_packages,
+ monkeypatch,
+):
+ repo_path, filename, commits = mock_git_version_info
+ monkeypatch.setattr(
+ spack.package_base.PackageBase, "git", "file://%s" % repo_path, raising=False
+ )
+ spec = spack.spec.Spec(spec_str)
+
+ for test_str, expected in tested_intersects:
+ assert spec.intersects(test_str) is expected, test_str
+
+ for test_str, expected in tested_intersects:
+ assert spec.intersects(test_str) is expected, test_str