diff --git a/dvc/output/local.py b/dvc/output/local.py index 259253bdb9..9dcebbdc12 100644 --- a/dvc/output/local.py +++ b/dvc/output/local.py @@ -35,14 +35,14 @@ def _parse_path(self, remote, path): # 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() diff --git a/dvc/remote/local.py b/dvc/remote/local.py index 38889d35fe..2c559ad7ae 100644 --- a/dvc/remote/local.py +++ b/dvc/remote/local.py @@ -56,7 +56,9 @@ def __init__(self, repo, config): @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): diff --git a/dvc/repo/get_url.py b/dvc/repo/get_url.py index 5718b20ecd..7aad361e8e 100644 --- a/dvc/repo/get_url.py +++ b/dvc/repo/get_url.py @@ -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() diff --git a/dvc/stage/imports.py b/dvc/stage/imports.py index 96a626e35a..3ca25e2d7e 100644 --- a/dvc/stage/imports.py +++ b/dvc/stage/imports.py @@ -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]) diff --git a/tests/func/test_get_url.py b/tests/func/test_get_url.py index 16abbde12a..4d9969162e 100644 --- a/tests/func/test_get_url.py +++ b/tests/func/test_get_url.py @@ -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") diff --git a/tests/func/test_import_url.py b/tests/func/test_import_url.py index 4157df3b55..52e7edd2f7 100644 --- a/tests/func/test_import_url.py +++ b/tests/func/test_import_url.py @@ -3,6 +3,7 @@ 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"))