def dump(self, stage, **kwargs): stage_data = serialize.to_lockfile(stage) with modify_yaml(self.path, fs=self.repo.fs) as data: version = LOCKFILE_VERSION.from_dict(data) if version == LOCKFILE_VERSION.V1: logger.info("Migrating lock file '%s' from v1 to v2", self.relpath) migrate_lock_v1_to_v2(data, self.latest_version_info) else: if not data: data.update(self.latest_version_info) # order is important, meta should always be at the top logger.info("Generating lock file '%s'", self.relpath) data["stages"] = data.get("stages", {}) modified = data["stages"].get(stage.name, {}) != stage_data.get( stage.name, {}) if modified: logger.info("Updating lock file '%s'", self.relpath) data["stages"].update(stage_data) if modified: self.repo.scm.track_file(self.relpath)
def __init__(self, dvcfile, data, lockfile_data=None): self.dvcfile = dvcfile self.data = data or {} self.stages_data = self.data.get("stages", {}) self.repo = self.dvcfile.repo lockfile_data = lockfile_data or {} version = LOCKFILE_VERSION.from_dict(lockfile_data) if version == LOCKFILE_VERSION.V1: self._lockfile_data = lockfile_data else: self._lockfile_data = lockfile_data.get("stages", {})
def get_lockfile_schema(d): from dvc.schema import ( COMPILED_LOCKFILE_V1_SCHEMA, COMPILED_LOCKFILE_V2_SCHEMA, ) schema = { LOCKFILE_VERSION.V1: COMPILED_LOCKFILE_V1_SCHEMA, LOCKFILE_VERSION.V2: COMPILED_LOCKFILE_V2_SCHEMA, } version = LOCKFILE_VERSION.from_dict(d) return schema[version]
def remove_stage(self, stage): if not self.exists(): return d, _ = self._load_yaml(round_trip=True) version = LOCKFILE_VERSION.from_dict(d) data = d if version == LOCKFILE_VERSION.V1 else d.get("stages", {}) if stage.name not in data: return logger.debug("Removing '%s' from '%s'", stage.name, self.path) del data[stage.name] if data: dump_yaml(self.path, d) else: self.remove()
def remove_stage(self, stage): if not self.exists(): return with open(self.path, encoding="utf-8") as f: d = parse_yaml_for_update(f.read(), self.path) self.validate(d, self.path) version = LOCKFILE_VERSION.from_dict(d) data = d if version == LOCKFILE_VERSION.V1 else d.get("stages", {}) if stage.name not in data: return logger.debug("Removing '%s' from '%s'", stage.name, self.path) del data[stage.name] if data: dump_yaml(self.path, d) else: self.remove()