This is an automated email from the ASF dual-hosted git repository. juergbi pushed a commit to branch jbilleter/digest-environment in repository https://gitbox.apache.org/repos/asf/buildstream.git
commit 91c399f9d9c66cda689713be013b494b3ec82ed3 Author: Abderrahim Kitouni <abderrahim.kito...@codethink.co.uk> AuthorDate: Tue Jun 17 17:02:10 2025 +0100 buildelement: Add the digest-environment config property This allows setting an environment variable inside the sandbox to the CAS digest of one or more dependencies. Co-authored by: Adrien Plazas <adrien.pla...@codethink.co.uk> --- src/buildstream/buildelement.py | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/buildstream/buildelement.py b/src/buildstream/buildelement.py index 40355f5cf..1b6c0bf0e 100644 --- a/src/buildstream/buildelement.py +++ b/src/buildstream/buildelement.py @@ -219,6 +219,7 @@ class BuildElement(Element): def configure_dependencies(self, dependencies): self.__layout = {} # pylint: disable=attribute-defined-outside-init + self.__digest_environment = {} # pylint: disable=attribute-defined-outside-init # FIXME: Currently this forcefully validates configurations # for all BuildElement subclasses so they are unable to @@ -227,9 +228,18 @@ class BuildElement(Element): for dep in dependencies: # Determine the location to stage each element, default is "/" location = "/" + if dep.config: - dep.config.validate_keys(["location"]) - location = dep.config.get_str("location") + dep.config.validate_keys(["digest-environment", "location"]) + + location = dep.config.get_str("location", "/") + + digest_var_name = dep.config.get_str("digest-environment", None) + + if digest_var_name is not None: + element_list = self.__digest_environment.setdefault(digest_var_name, []) + element_list.append((dep.element, dep.path)) + try: element_list = self.__layout[location] except KeyError: @@ -268,6 +278,16 @@ class BuildElement(Element): } dictionary["layout"] = layout_key + # Specify the layout in the key, if buildstream is to generate an environmenta + # variable with the digest + # + if self.__digest_environment: + sorted_envs = sorted(self.__digest_environment) + digest_key = { + env: [dependency_path for _, dependency_path in self.__digest_environment[env]] for env in sorted_envs + } + dictionary["digest-enviornment"] = digest_key + return dictionary def configure_sandbox(self, sandbox): @@ -285,10 +305,20 @@ class BuildElement(Element): command_dir = build_root sandbox.set_work_directory(command_dir) - # Setup environment - sandbox.set_environment(self.get_environment()) - def stage(self, sandbox): + # Setup environment + env = self.get_environment() + + # Add "CAS digest" environment variables + sorted_envs = sorted(self.__digest_environment) + for digest_variable in sorted_envs: + element_list = [element for element, _ in self.__digest_environment[digest_variable]] + subsandbox = sandbox.create_subsandbox() + self.stage_dependency_artifacts(subsandbox, element_list) + digest = subsandbox.get_virtual_directory()._get_digest() + env[digest_variable] = "{}/{}".format(digest.hash, digest.size_bytes) + + sandbox.set_environment(env) # First stage it all #