|
24 | 24 | from dvc.hash_info import HashInfo |
25 | 25 | from dvc.main import main |
26 | 26 | from dvc.objects.db import ODBManager |
27 | | -from dvc.output import OutputAlreadyTrackedError, OutputIsStageFileError |
| 27 | +from dvc.output import ( |
| 28 | + OutputAlreadyTrackedError, |
| 29 | + OutputDoesNotExistError, |
| 30 | + OutputIsStageFileError, |
| 31 | +) |
28 | 32 | from dvc.stage import Stage |
29 | 33 | from dvc.stage.exceptions import ( |
30 | 34 | StageExternalOutputsError, |
@@ -1190,3 +1194,42 @@ def test_add_ignored(tmp_dir, scm, dvc): |
1190 | 1194 | assert str(exc.value) == ("bad DVC file name '{}' is git-ignored.").format( |
1191 | 1195 | os.path.join("dir", "subdir.dvc") |
1192 | 1196 | ) |
| 1197 | + |
| 1198 | + |
| 1199 | +def test_add_on_not_existing_file_should_not_remove_stage_file(tmp_dir, dvc): |
| 1200 | + (stage,) = tmp_dir.dvc_gen("foo", "foo") |
| 1201 | + (tmp_dir / "foo").unlink() |
| 1202 | + dvcfile_contents = (tmp_dir / stage.path).read_text() |
| 1203 | + |
| 1204 | + with pytest.raises(OutputDoesNotExistError): |
| 1205 | + dvc.add("foo") |
| 1206 | + assert (tmp_dir / "foo.dvc").exists() |
| 1207 | + assert (tmp_dir / stage.path).read_text() == dvcfile_contents |
| 1208 | + |
| 1209 | + |
| 1210 | +@pytest.mark.parametrize( |
| 1211 | + "target", |
| 1212 | + [ |
| 1213 | + "dvc.repo.Repo.check_modified_graph", |
| 1214 | + "dvc.stage.Stage.save", |
| 1215 | + "dvc.stage.Stage.commit", |
| 1216 | + ], |
| 1217 | +) |
| 1218 | +def test_add_does_not_remove_stage_file_on_failure( |
| 1219 | + tmp_dir, dvc, mocker, target |
| 1220 | +): |
| 1221 | + (stage,) = tmp_dir.dvc_gen("foo", "foo") |
| 1222 | + tmp_dir.gen("foo", "foobar") # update file |
| 1223 | + dvcfile_contents = (tmp_dir / stage.path).read_text() |
| 1224 | + |
| 1225 | + exc_msg = f"raising error from mocked '{target}'" |
| 1226 | + mocker.patch( |
| 1227 | + target, |
| 1228 | + side_effect=DvcException(exc_msg), |
| 1229 | + ) |
| 1230 | + |
| 1231 | + with pytest.raises(DvcException) as exc_info: |
| 1232 | + dvc.add("foo") |
| 1233 | + assert str(exc_info.value) == exc_msg |
| 1234 | + assert (tmp_dir / "foo.dvc").exists() |
| 1235 | + assert (tmp_dir / stage.path).read_text() == dvcfile_contents |
0 commit comments