in src/buildstream/element.py [0:0]
def _cache_artifact(self, sandbox, collect):
context = self._get_context()
buildresult = self.__build_result
with self.__dynamic_public_guard:
publicdata = self.__dynamic_public
sandbox_vroot = sandbox.get_virtual_directory()
collectvdir = None
sandbox_build_dir = None
sourcesvdir = None
buildrootvdir = None
cache_buildtrees = context.cache_buildtrees
build_success = buildresult[0]
# cache_buildtrees defaults to 'auto', only caching buildtrees
# when necessary, which includes failed builds.
# If only caching failed artifact buildtrees, then query the build
# result. Element types without a build-root dir will be cached
# with an empty buildtreedir regardless of this configuration.
if cache_buildtrees == _CacheBuildTrees.ALWAYS or (
cache_buildtrees == _CacheBuildTrees.AUTO and (not build_success or self._get_workspace())
):
try:
sandbox_build_dir = sandbox_vroot.open_directory(self.get_variable("build-root").lstrip(os.sep))
sandbox._fetch_missing_blobs(sandbox_build_dir)
except DirectoryError:
# Directory could not be found. Pre-virtual
# directory behaviour was to continue silently
# if the directory could not be found.
pass
buildrootvdir = sandbox_vroot
sourcesvdir = self.__sources.get_files()
if collect is not None:
try:
collectvdir = sandbox_vroot.open_directory(collect.lstrip(os.sep))
sandbox._fetch_missing_blobs(collectvdir)
except DirectoryError:
pass
# We should always have cache keys already set when caching an artifact
assert self.__cache_key is not None
assert self.__artifact._cache_key is not None
with self.timed_activity("Caching artifact"):
self.__artifact.cache(
buildrootvdir=buildrootvdir,
sandbox_build_dir=sandbox_build_dir,
collectvdir=collectvdir,
sourcesvdir=sourcesvdir,
buildresult=buildresult,
publicdata=publicdata,
variables=self.__variables,
environment=self.__environment,
sandboxconfig=self.__sandbox_config,
)
if collect is not None and collectvdir is None:
raise ElementError(
"Directory '{}' was not found inside the sandbox, "
"unable to collect artifact contents".format(collect)
)