From 33d4ead8b673f74cb8b1eea353f49d2c04002c7b Mon Sep 17 00:00:00 2001 From: Peter Rowlands Date: Tue, 1 Nov 2022 16:49:37 +0900 Subject: [PATCH] import-url: save `files` for version-aware dir --- dvc/dependency/__init__.py | 10 +++-- dvc/dependency/base.py | 5 +++ dvc/output.py | 76 ++++++++++++++++++-------------------- 3 files changed, 47 insertions(+), 44 deletions(-) diff --git a/dvc/dependency/__init__.py b/dvc/dependency/__init__.py index 8962dc302..8c70bf878 100644 --- a/dvc/dependency/__init__.py +++ b/dvc/dependency/__init__.py @@ -1,7 +1,7 @@ from collections import defaultdict from typing import Any, Mapping -from dvc.output import ARTIFACT_SCHEMA, Output +from dvc.output import ARTIFACT_SCHEMA, DIR_FILES_SCHEMA, Output from .base import Dependency from .param import ParamsDependency @@ -15,10 +15,11 @@ SCHEMA: Mapping[str, Any] = { **ARTIFACT_SCHEMA, **RepoDependency.REPO_SCHEMA, **ParamsDependency.PARAM_SCHEMA, + Output.PARAM_FILES: [DIR_FILES_SCHEMA], } -def _get(stage, p, info, fs_config=None): +def _get(stage, p, info, **kwargs): if info and info.get(RepoDependency.PARAM_REPO): repo = info.pop(RepoDependency.PARAM_REPO) return RepoDependency(repo, stage, p, info) @@ -27,14 +28,15 @@ def _get(stage, p, info, fs_config=None): params = info.pop(ParamsDependency.PARAM_PARAMS) return ParamsDependency(stage, p, params) - return Dependency(stage, p, info, fs_config=fs_config) + return Dependency(stage, p, info, **kwargs) def loadd_from(stage, d_list): ret = [] for d in d_list: p = d.pop(Output.PARAM_PATH, None) - ret.append(_get(stage, p, d)) + files = d.pop(Output.PARAM_FILES, None) + ret.append(_get(stage, p, d, files=files)) return ret diff --git a/dvc/dependency/base.py b/dvc/dependency/base.py index e71b372bf..25f3b72fd 100644 --- a/dvc/dependency/base.py +++ b/dvc/dependency/base.py @@ -62,3 +62,8 @@ class Dependency(Output): self.fs_path = self.fs.path.version_path( self.fs_path, self.meta.version_id ) + + def dumpd(self, **kwargs): + if self.fs.version_aware: + kwargs["with_files"] = True + return super().dumpd(**kwargs) diff --git a/dvc/output.py b/dvc/output.py index 3fde55eae..4283db373 100644 --- a/dvc/output.py +++ b/dvc/output.py @@ -631,8 +631,16 @@ class Output: if self.metric: self.verify_metric() - if not self.use_cache: - _, self.meta, obj = build( + if self.use_cache: + _, self.meta, self.obj = build( + self.odb, + self.fs_path, + self.fs, + self.hash_name, + ignore=self.dvcignore, + ) + else: + _, self.meta, self.obj = build( self.repo.odb.local, self.fs_path, self.fs, @@ -640,23 +648,11 @@ class Output: ignore=self.dvcignore, dry_run=True, ) - self.hash_info = obj.hash_info - self.files = None if not self.IS_DEPENDENCY: logger.debug( "Output '%s' doesn't use cache. Skipping saving.", self ) - return - assert not self.IS_DEPENDENCY - - _, self.meta, self.obj = build( - self.odb, - self.fs_path, - self.fs, - self.hash_name, - ignore=self.dvcignore, - ) self.hash_info = self.obj.hash_info self.files = None @@ -754,40 +750,40 @@ class Output: ret[self.PARAM_PATH] = path - if self.IS_DEPENDENCY: - return ret + if not self.IS_DEPENDENCY: + ret.update(self.annot.to_dict()) + if not self.use_cache: + ret[self.PARAM_CACHE] = self.use_cache - ret.update(self.annot.to_dict()) - if not self.use_cache: - ret[self.PARAM_CACHE] = self.use_cache + if isinstance(self.metric, dict): + if ( + self.PARAM_METRIC_XPATH in self.metric + and not self.metric[self.PARAM_METRIC_XPATH] + ): + del self.metric[self.PARAM_METRIC_XPATH] - if isinstance(self.metric, dict): - if ( - self.PARAM_METRIC_XPATH in self.metric - and not self.metric[self.PARAM_METRIC_XPATH] - ): - del self.metric[self.PARAM_METRIC_XPATH] + if self.metric: + ret[self.PARAM_METRIC] = self.metric - if self.metric: - ret[self.PARAM_METRIC] = self.metric + if self.plot: + ret[self.PARAM_PLOT] = self.plot - if self.plot: - ret[self.PARAM_PLOT] = self.plot + if self.persist: + ret[self.PARAM_PERSIST] = self.persist - if self.persist: - ret[self.PARAM_PERSIST] = self.persist + if self.checkpoint: + ret[self.PARAM_CHECKPOINT] = self.checkpoint - if self.checkpoint: - ret[self.PARAM_CHECKPOINT] = self.checkpoint + if self.live: + ret[self.PARAM_LIVE] = self.live - if self.live: - ret[self.PARAM_LIVE] = self.live + if self.remote: + ret[self.PARAM_REMOTE] = self.remote - if self.remote: - ret[self.PARAM_REMOTE] = self.remote - - if self.hash_info.isdir and ( - kwargs.get("with_files") or self.files is not None + if ( + (not self.IS_DEPENDENCY or self.stage.is_import) + and self.hash_info.isdir + and (kwargs.get("with_files") or self.files is not None) ): if self.obj: obj = self.obj