def save(self, stage): from .serialize import to_single_stage_lockfile if not _can_hash(stage): return cache_key = _get_stage_hash(stage) cache = to_single_stage_lockfile(stage) cache_value = _get_cache_hash(cache) existing_cache = self._load_cache(cache_key, cache_value) cache = existing_cache or cache for out in self._uncached_outs(stage, cache): out.commit() if existing_cache: return from dvc.schema import COMPILED_LOCK_FILE_STAGE_SCHEMA from dvc.utils.serialize import dump_yaml # sanity check COMPILED_LOCK_FILE_STAGE_SCHEMA(cache) path = self._get_cache_path(cache_key, cache_value) parent = self.repo.odb.local.fs.path.parent(path) self.repo.odb.local.makedirs(parent) tmp = tempfile.NamedTemporaryFile(delete=False, dir=parent).name assert os.path.exists(parent) assert os.path.isdir(parent) dump_yaml(tmp, cache) self.repo.odb.local.move(tmp, path)
def save(self, stage): cache_key = _get_stage_hash(stage) if not cache_key: return cache = to_single_stage_lockfile(stage) cache_value = _get_cache_hash(cache) existing_cache = self._load_cache(cache_key, cache_value) cache = existing_cache or cache for out in self._uncached_outs(stage, cache): out.commit() if existing_cache: return # sanity check COMPILED_LOCK_FILE_STAGE_SCHEMA(cache) path = PathInfo(self._get_cache_path(cache_key, cache_value)) self.tree.makedirs(path.parent) tmp = tempfile.NamedTemporaryFile(delete=False, dir=path.parent).name assert os.path.exists(path.parent) assert os.path.isdir(path.parent) dump_yaml(tmp, cache) self.tree.move(PathInfo(tmp), path)
def _load_cache(self, key, value): path = self._get_cache_path(key, value) try: return COMPILED_LOCK_FILE_STAGE_SCHEMA(load_yaml(path)) except FileNotFoundError: return None except (YAMLFileCorruptedError, Invalid): logger.warning("corrupted cache file '%s'.", relpath(path)) os.unlink(path) return None
def _load_cache(self, key, value): path = self._get_cache_path(key, value) try: with open(path, "r") as fobj: return COMPILED_LOCK_FILE_STAGE_SCHEMA(yaml.safe_load(fobj)) except FileNotFoundError: return None except (yaml.error.YAMLError, Invalid): logger.warning("corrupted cache file '%s'.", relpath(path)) os.unlink(path) return None
def _load_cache(self, key, value): from voluptuous import Invalid from dvc.schema import COMPILED_LOCK_FILE_STAGE_SCHEMA from dvc.utils.serialize import YAMLFileCorruptedError, load_yaml path = self._get_cache_path(key, value) try: return COMPILED_LOCK_FILE_STAGE_SCHEMA(load_yaml(path)) except FileNotFoundError: return None except (YAMLFileCorruptedError, Invalid): logger.warning("corrupted cache file '%s'.", relpath(path)) os.unlink(path) return None
def save(self, stage): cache_key = _get_stage_hash(stage) if not cache_key: return cache = to_single_stage_lockfile(stage) cache_value = _get_cache_hash(cache) if self._load_cache(cache_key, cache_value): return # sanity check COMPILED_LOCK_FILE_STAGE_SCHEMA(cache) path = self._get_cache_path(cache_key, cache_value) dpath = os.path.dirname(path) makedirs(dpath, exist_ok=True) dump_stage_file(path, cache)
def save(self, stage): cache_key = _get_stage_hash(stage) if not cache_key: return cache = to_single_stage_lockfile(stage) cache_value = _get_cache_hash(cache) existing_cache = self._load_cache(cache_key, cache_value) cache = existing_cache or cache for out in self._uncached_outs(stage, cache): out.commit() if existing_cache: return # sanity check COMPILED_LOCK_FILE_STAGE_SCHEMA(cache) path = self._get_cache_path(cache_key, cache_value) dpath = os.path.dirname(path) makedirs(dpath, exist_ok=True) dump_yaml(path, cache)