diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py index ebf340e172d..d3f16f31f37 100644 --- a/lib/spack/spack/solver/asp.py +++ b/lib/spack/spack/solver/asp.py @@ -114,7 +114,9 @@ class Provenance(enum.IntEnum): # A 'package.py' file PACKAGE_PY = enum.auto() # An installed spec - INSTALLED = enum.auto() + INSTALLED_STANDARD_VERSION = enum.auto() + # lower provenance for installed git refs so concretizer prefers StandardVersion installs + INSTALLED_GIT_VERSION = enum.auto() # A runtime injected from another package (e.g. a compiler) RUNTIME = enum.auto() @@ -1999,10 +2001,10 @@ def define_ad_hoc_versions_from_specs( # best possible, so they're guaranteed to be used preferentially. 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] - )): + if version is None or ( + not isinstance(version, vn.GitVersion) + and any((v == version) for v in self.possible_versions[s.name]) + ): continue if require_checksum and not _is_checksummed_git_version(version): @@ -2316,9 +2318,20 @@ def concrete_specs(self): # - Add OS to possible OS's for dep in spec.traverse(): self.possible_versions[dep.name].add(dep.version) - self.declared_versions[dep.name].append( - DeclaredVersion(version=dep.version, idx=0, origin=Provenance.INSTALLED) - ) + if isinstance(dep.version, vn.GitVersion): + self.declared_versions[dep.name].append( + DeclaredVersion( + version=dep.version, idx=0, origin=Provenance.INSTALLED_GIT_VERSION + ) + ) + else: + self.declared_versions[dep.name].append( + DeclaredVersion( + version=dep.version, + idx=0, + origin=Provenance.INSTALLED_STANDARD_VERSION, + ) + ) self.possible_oses.add(dep.os) def define_concrete_input_specs(self, specs, possible):