diff --git a/dvc/dependency/repo.py b/dvc/dependency/repo.py index eb3c58b5ce..7dffd2eca5 100644 --- a/dvc/dependency/repo.py +++ b/dvc/dependency/repo.py @@ -67,7 +67,7 @@ def _get_checksum(self, locked=True): return self.repo.cache.local.tree.get_hash(path, tree=tree) return tree.get_file_hash(path) - def status(self): + def workspace_status(self): current_checksum = self._get_checksum(locked=True) updated_checksum = self._get_checksum(locked=False) @@ -76,6 +76,9 @@ def status(self): return {} + def status(self): + return self.workspace_status() + def save(self): pass diff --git a/dvc/output/base.py b/dvc/output/base.py index 242499fc55..f17e3df9e5 100644 --- a/dvc/output/base.py +++ b/dvc/output/base.py @@ -199,10 +199,7 @@ def changed_cache(self, filter_info=None): return self.cache.changed_cache(self.checksum, filter_info=filter_info) - def status(self): - if self.checksum and self.use_cache and self.changed_cache(): - return {str(self): "not in cache"} - + def workspace_status(self): if not self.exists: return {str(self): "deleted"} @@ -214,6 +211,12 @@ def status(self): return {} + def status(self): + if self.checksum and self.use_cache and self.changed_cache(): + return {str(self): "not in cache"} + + return self.workspace_status() + def changed(self): status = self.status() logger.debug(str(status)) @@ -280,6 +283,7 @@ def save(self): self.info = self.save_info() def commit(self): + assert self.info if self.use_cache: self.cache.save(self.path_info, self.cache.tree, self.info) diff --git a/dvc/stage/__init__.py b/dvc/stage/__init__.py index 6316793bb5..0048c94fb9 100644 --- a/dvc/stage/__init__.py +++ b/dvc/stage/__init__.py @@ -396,7 +396,7 @@ def ignore_outs(self): @staticmethod def _changed_entries(entries): - return [str(entry) for entry in entries if entry.changed_checksum()] + return [str(entry) for entry in entries if entry.workspace_status()] def _changed_stage_entry(self): return f"'md5' of {self} changed." diff --git a/tests/func/test_commit.py b/tests/func/test_commit.py index 6c91abff31..958a29c539 100644 --- a/tests/func/test_commit.py +++ b/tests/func/test_commit.py @@ -2,7 +2,9 @@ import pytest +from dvc.dependency.base import DependencyDoesNotExistError from dvc.dvcfile import PIPELINE_FILE +from dvc.output.base import OutputDoesNotExistError from dvc.stage.exceptions import StageCommitError from dvc.utils.yaml import dump_yaml, load_yaml @@ -86,6 +88,24 @@ def test_commit_no_exec(tmp_dir, dvc): assert dvc.status(stage.path) == {} +def test_commit_no_exec_missing_dep(tmp_dir, dvc): + stage = dvc.run( + name="my", cmd="mycmd", deps=["dep"], outs=["out"], no_exec=True + ) + assert dvc.status(stage.path) + + with pytest.raises(DependencyDoesNotExistError): + dvc.commit(stage.path, force=True) + + +def test_commit_no_exec_missing_out(tmp_dir, dvc): + stage = dvc.run(name="my", cmd="mycmd", outs=["out"], no_exec=True) + assert dvc.status(stage.path) + + with pytest.raises(OutputDoesNotExistError): + dvc.commit(stage.path, force=True) + + def test_commit_pipeline_stage(tmp_dir, dvc, run_copy): tmp_dir.gen("foo", "foo") stage = run_copy("foo", "bar", no_commit=True, name="copy-foo-bar")