From 251af651c93cfafd8cde0bb5779d471347a8ba9b Mon Sep 17 00:00:00 2001 From: Philip Sakievich Date: Fri, 7 Feb 2025 21:51:39 -0700 Subject: [PATCH] commit variant concretizes and check is commit --- lib/spack/spack/solver/asp.py | 36 +++++++++++++++++++++++++++++++++++ lib/spack/spack/spec.py | 2 +- lib/spack/spack/variant.py | 1 + 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py index 8fcc681c1cc..46d02bde053 100644 --- a/lib/spack/spack/solver/asp.py +++ b/lib/spack/spack/solver/asp.py @@ -3173,6 +3173,7 @@ def setup( self.gen.h1("Special variants") self.define_auto_variant("dev_path", multi=False) + self.define_auto_variant("commit", multi=False) self.define_auto_variant("patches", multi=True) self.gen.h1("Develop specs") @@ -4140,6 +4141,10 @@ def build_specs(self, function_tuples): spack.version.git_ref_lookup.GitRefLookup(spec.fullname) ) + # check for commits mush happen after all version adaptations are complete + for s in self._specs.values(): + _specs_with_commits(s) + specs = self.execute_explicit_splices() return specs @@ -4266,6 +4271,37 @@ def _ensure_external_path_if_external(spec: spack.spec.Spec) -> None: ) +def _specs_with_commits(spec): + has_commit_var = "commit" in spec.variants + has_git_version = isinstance(spec.version, vn.GitVersion) + + if not (has_commit_var or has_git_version): + return + + # Specs with commit variants + # - variant value satsifies commit regex + # - paired to a GitVersion or can create GitVersion from version that was selected + # - variant value should match GitVersion's commit value + if has_commit_var: + invalid_commit_msg = ( + f"Internal Error: {spec.name}'s assigned commit {spec.variants['commit'].value}" + " does not meet commit syntax requirements." + ) + + # TODO probably want a more specific function just for sha validation + assert vn.is_git_version(spec.variants["commit"].value), invalid_commit_msg + + # Specs with GitVersions + # - must have a commit variant, or add it here + # - must have a commit on the GitVersion (enforce after look up implemented) + if has_git_version: + if not spec.version.commit_sha: + # TODO(psakiev) this will be a failure when commit look up is automated + return + + spec.variants["commit"] = vt.SingleValuedVariant("commit", spec.version.commit_sha) + + def _develop_specs_from_env(spec, env): dev_info = env.dev_specs.get(spec.name, {}) if env else {} if not dev_info: diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index cf5c56f31a7..fe7526ae96d 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -4615,7 +4615,7 @@ def substitute_abstract_variants(spec: Spec): # in $spack/lib/spack/spack/spec_list.py unknown = [] for name, v in spec.variants.items(): - if name == "dev_path": + if name in ("dev_path", "commit"): spec.variants.substitute(vt.SingleValuedVariant(name, v._original_value)) continue elif name in vt.reserved_names: diff --git a/lib/spack/spack/variant.py b/lib/spack/spack/variant.py index ebd0e0faa4a..d55d04d3ba1 100644 --- a/lib/spack/spack/variant.py +++ b/lib/spack/spack/variant.py @@ -24,6 +24,7 @@ reserved_names = [ "arch", "architecture", + "commit", "dev_path", "namespace", "operating_system",