get-url/import-url: save dependency before downloading (#4049)

This allows us to properly process the errors like missing target.

Fixes #3897
This commit is contained in:
Ruslan Kuprieiev
2020-06-16 13:05:21 +03:00
committed by GitHub
parent 0fb9870de6
commit 613ca0bdb5
6 changed files with 20 additions and 3 deletions
+2 -2
View File
@@ -35,14 +35,14 @@ class LocalOutput(BaseOutput):
# FIXME: if we have Windows path containing / or posix one with \
# then we have #2059 bug and can't really handle that.
p = self.TREE_CLS.PATH_CLS(path)
if not p.is_absolute():
if self.stage and not p.is_absolute():
p = self.stage.wdir / p
abs_p = os.path.abspath(os.path.normpath(p))
return self.TREE_CLS.PATH_CLS(abs_p)
def __str__(self):
if not self.is_in_repo:
if not self.repo or not self.is_in_repo:
return str(self.def_path)
cur_dir = os.getcwd()
+3 -1
View File
@@ -56,7 +56,9 @@ class LocalRemoteTree(BaseRemoteTree):
@property
def state(self):
return self.repo.state
from dvc.state import StateNoop
return self.repo.state if self.repo else StateNoop()
@cached_property
def work_tree(self):
+2
View File
@@ -16,4 +16,6 @@ def get_url(url, out=None):
(dep,) = dependency.loads_from(None, [url])
(out,) = output.loads_from(None, [out], use_cache=False)
dep.save()
dep.download(out)
out.save()
+1
View File
@@ -26,4 +26,5 @@ def sync_import(stage, dry=False, force=False):
if not force and stage.already_cached():
stage.outs[0].checkout()
else:
stage.save_deps()
stage.deps[0].download(stage.outs[0])
+6
View File
@@ -1,5 +1,6 @@
import pytest
from dvc.dependency.base import DependencyDoesNotExistError
from dvc.repo import Repo
@@ -20,3 +21,8 @@ def test_get_url_to_dir(tmp_dir, dname):
assert (tmp_dir / dname).is_dir()
assert (tmp_dir / dname / "foo").read_text() == "foo contents"
def test_get_url_nonexistent(tmp_dir):
with pytest.raises(DependencyDoesNotExistError):
Repo.get_url("nonexistent")
+6
View File
@@ -3,6 +3,7 @@ from uuid import uuid4
import pytest
from dvc.dependency.base import DependencyDoesNotExistError
from dvc.main import main
from dvc.stage import Stage
from dvc.utils.fs import makedirs
@@ -97,3 +98,8 @@ def test_import_stage_accompanies_target(tmp_dir, dvc, erepo_dir):
assert (tmp_dir / "dir" / "imported_file").exists()
assert (tmp_dir / "dir" / "imported_file.dvc").exists()
def test_import_url_nonexistent(dvc, erepo_dir):
with pytest.raises(DependencyDoesNotExistError):
dvc.imp_url(os.fspath(erepo_dir / "non-existent"))