Skip to content

Commit 51a0b0b

Browse files
committed
commit: make sure deps/outs exist
Fixes iterative#4266
1 parent 2f48bb4 commit 51a0b0b

File tree

4 files changed

+33
-6
lines changed

4 files changed

+33
-6
lines changed

dvc/dependency/repo.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def _get_checksum(self, locked=True):
6767
return self.repo.cache.local.tree.get_hash(path, tree=tree)
6868
return tree.get_file_hash(path)
6969

70-
def status(self):
70+
def workspace_status(self):
7171
current_checksum = self._get_checksum(locked=True)
7272
updated_checksum = self._get_checksum(locked=False)
7373

@@ -76,6 +76,9 @@ def status(self):
7676

7777
return {}
7878

79+
def status(self):
80+
return self.workspace_status()
81+
7982
def save(self):
8083
pass
8184

dvc/output/base.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,10 +199,7 @@ def changed_cache(self, filter_info=None):
199199

200200
return self.cache.changed_cache(self.checksum, filter_info=filter_info)
201201

202-
def status(self):
203-
if self.checksum and self.use_cache and self.changed_cache():
204-
return {str(self): "not in cache"}
205-
202+
def workspace_status(self):
206203
if not self.exists:
207204
return {str(self): "deleted"}
208205

@@ -214,6 +211,12 @@ def status(self):
214211

215212
return {}
216213

214+
def status(self):
215+
if self.checksum and self.use_cache and self.changed_cache():
216+
return {str(self): "not in cache"}
217+
218+
return self.workspace_status()
219+
217220
def changed(self):
218221
status = self.status()
219222
logger.debug(str(status))
@@ -280,6 +283,7 @@ def save(self):
280283
self.info = self.save_info()
281284

282285
def commit(self):
286+
assert self.info
283287
if self.use_cache:
284288
self.cache.save(self.path_info, self.cache.tree, self.info)
285289

dvc/stage/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ def ignore_outs(self):
396396

397397
@staticmethod
398398
def _changed_entries(entries):
399-
return [str(entry) for entry in entries if entry.changed_checksum()]
399+
return [str(entry) for entry in entries if entry.workspace_status()]
400400

401401
def _changed_stage_entry(self):
402402
return f"'md5' of {self} changed."

tests/func/test_commit.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import pytest
44

5+
from dvc.dependency.base import DependencyDoesNotExistError
56
from dvc.dvcfile import PIPELINE_FILE
7+
from dvc.output.base import OutputDoesNotExistError
68
from dvc.stage.exceptions import StageCommitError
79
from dvc.utils.yaml import dump_yaml, load_yaml
810

@@ -86,6 +88,24 @@ def test_commit_no_exec(tmp_dir, dvc):
8688
assert dvc.status(stage.path) == {}
8789

8890

91+
def test_commit_no_exec_missing_dep(tmp_dir, dvc):
92+
stage = dvc.run(
93+
name="my", cmd="mycmd", deps=["dep"], outs=["out"], no_exec=True
94+
)
95+
assert dvc.status(stage.path)
96+
97+
with pytest.raises(DependencyDoesNotExistError):
98+
dvc.commit(stage.path, force=True)
99+
100+
101+
def test_commit_no_exec_missing_out(tmp_dir, dvc):
102+
stage = dvc.run(name="my", cmd="mycmd", outs=["out"], no_exec=True)
103+
assert dvc.status(stage.path)
104+
105+
with pytest.raises(OutputDoesNotExistError):
106+
dvc.commit(stage.path, force=True)
107+
108+
89109
def test_commit_pipeline_stage(tmp_dir, dvc, run_copy):
90110
tmp_dir.gen("foo", "foo")
91111
stage = run_copy("foo", "bar", no_commit=True, name="copy-foo-bar")

0 commit comments

Comments
 (0)