Source code for spack.hash_types

# Copyright Spack Project Developers. See COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
"""Definitions that control how Spack creates Spec hashes."""

from typing import TYPE_CHECKING, Callable, List, Optional

import spack.deptypes as dt
import spack.repo

if TYPE_CHECKING:
    import spack.spec


[docs] class SpecHashDescriptor: """This class defines how hashes are generated on Spec objects. Spec hashes in Spack are generated from a serialized (e.g., with YAML) representation of the Spec graph. The representation may only include certain dependency types, and it may optionally include a canonicalized hash of the package.py for each node in the graph. We currently use different hashes for different use cases.""" __slots__ = "depflag", "package_hash", "name", "attr", "override" def __init__( self, depflag: dt.DepFlag, package_hash: bool, name: str, override: Optional[Callable[["spack.spec.Spec"], str]] = None, ) -> None: self.depflag = depflag self.package_hash = package_hash self.name = name self.attr = f"_{name}" # Allow spec hashes to have an alternate computation method self.override = override def __call__(self, spec: "spack.spec.Spec") -> str: """Run this hash on the provided spec.""" return spec.spec_hash(self) def __repr__(self) -> str: return ( f"SpecHashDescriptor(depflag={self.depflag!r}, " f"package_hash={self.package_hash!r}, name={self.name!r}, override={self.override!r})" )
#: The DAG hash includes all inputs that can affect how a package is built. dag_hash = SpecHashDescriptor( depflag=dt.BUILD | dt.LINK | dt.RUN | dt.TEST, package_hash=True, name="hash" ) def _content_hash_override(spec: "spack.spec.Spec") -> str: pkg_cls = spack.repo.PATH.get_pkg_class(spec.name) pkg = pkg_cls(spec) return pkg.content_hash() #: Package hash used as part of dag hash package_hash = SpecHashDescriptor( depflag=0, package_hash=True, name="package_hash", override=_content_hash_override ) # Deprecated hash types, no longer used, but needed to understand old serialized # spec formats full_hash = SpecHashDescriptor( depflag=dt.BUILD | dt.LINK | dt.RUN, package_hash=True, name="full_hash" ) build_hash = SpecHashDescriptor( depflag=dt.BUILD | dt.LINK | dt.RUN, package_hash=False, name="build_hash" ) HASHES: List["SpecHashDescriptor"] = [dag_hash, package_hash, full_hash, build_hash]