diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py index a9071ee1597..e465c7b842d 100644 --- a/lib/spack/spack/solver/asp.py +++ b/lib/spack/spack/solver/asp.py @@ -2049,8 +2049,7 @@ def define_ad_hoc_versions_from_specs( version = s.versions.concrete if version is None or ( - not isinstance(version, vn.GitVersion) - and any((v == version) for v in self.possible_versions[s.name]) + any((v == version) for v in self.possible_versions[s.name]) ): continue diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index 5136fd36d20..1aa4028ea49 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -2920,24 +2920,33 @@ def test_spec_filters(specs, include, exclude, expected): def test_git_ref_version_can_be_reused( install_mockery_mutable_config, do_not_check_runtimes_on_reuse ): - first_spec = spack.spec.Spec("git-ref-package@git.2.1.5=2.1.5").concretized() + first_spec = spack.spec.Spec("git-ref-package@git.2.1.5=2.1.5~opt").concretized() first_spec.package.do_install(fake=True, explicit=True) with spack.config.override("concretizer:reuse", True): - second_spec = spack.spec.Spec("git-ref-package@git.2.1.5=2.1.5~opt").concretized() + # reproducer of the issue is that spack will solve when there is a change to the base spec + second_spec = spack.spec.Spec("git-ref-package@git.2.1.5=2.1.5+opt").concretized() assert second_spec.dag_hash() != first_spec.dag_hash() + # we also want to confirm that reuse actually works so leave variant off to let solver reuse + third_spec = spack.spec.Spec("git-ref-package@git.2.1.5=2.1.5") + assert first_spec.satisfies(third_spec) + third_spec.concretize() + assert third_spec.dag_hash() == first_spec.dag_hash() @pytest.mark.only_clingo("clingo only reuse feature being tested") +@pytest.mark.parametrize( + "standard_version",["2.0.0", "2.1.5", "2.1.6"] +) def test_reuse_prefers_standard_over_git_versions( - install_mockery_mutable_config, do_not_check_runtimes_on_reuse + standard_version, install_mockery_mutable_config, do_not_check_runtimes_on_reuse ): """ order matters in this test. typically reuse would pick the last installed match but we want to prefer the standard version over git ref based versions so install git ref last and ensure it is not picked up by reuse """ - standard_spec = spack.spec.Spec("git-ref-package@2.1.5").concretized() + standard_spec = spack.spec.Spec(f"git-ref-package@{standard_version}").concretized() standard_spec.package.do_install(fake=True, explicit=True) git_spec = spack.spec.Spec("git-ref-package@git.2.1.5=2.1.5").concretized()