From 1b7eda274577ffae1f97e5fe134592fe185d099a Mon Sep 17 00:00:00 2001 From: Sujith H Date: Sun, 12 Jan 2020 22:29:01 +0530 Subject: [PATCH] Fix import issue without remote config in the target Fix the import issue when target does not have remote config. Signed-off-by: Sujith H --- dvc/dependency/repo.py | 10 +++++++++- tests/func/test_import.py | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/dvc/dependency/repo.py b/dvc/dependency/repo.py index 3bcfd3e65d..69ba25dad7 100644 --- a/dvc/dependency/repo.py +++ b/dvc/dependency/repo.py @@ -11,6 +11,7 @@ from dvc.exceptions import OutputNotFoundError from dvc.exceptions import NoOutputInExternalRepoError from dvc.exceptions import PathMissingError +from dvc.config import NoRemoteError from dvc.utils.fs import fs_copy from dvc.path_info import PathInfo from dvc.scm import SCM @@ -91,7 +92,14 @@ def fetch(self): out = repo.find_out_by_relpath(self.def_path) with repo.state: - repo.cloud.pull(out.get_used_cache()) + try: + repo.cloud.pull(out.get_used_cache()) + except NoRemoteError: + # It would not be good idea to raise exception if the + # file is already present in the cache + if not self.repo.cache.local.changed_cache(out.checksum): + return out + raise return out diff --git a/tests/func/test_import.py b/tests/func/test_import.py index 380eaeb886..f15d211420 100644 --- a/tests/func/test_import.py +++ b/tests/func/test_import.py @@ -10,10 +10,12 @@ from dvc.exceptions import DownloadError from dvc.exceptions import PathMissingError from dvc.exceptions import NoOutputInExternalRepoError +from dvc.config import NoRemoteError from dvc.stage import Stage from dvc.system import System from dvc.utils.fs import makedirs from dvc.compat import fspath +import dvc.data_cloud as cloud from tests.utils import trees_equal @@ -56,6 +58,26 @@ def test_import_git_file(erepo_dir, tmp_dir, dvc, scm, src_is_dvc): } +def test_import_cached_file(erepo_dir, tmp_dir, dvc, scm, monkeypatch): + src = "some_file" + dst = "some_file_imported" + + with erepo_dir.chdir(): + erepo_dir.dvc_gen({src: "hello"}, commit="add a regular file") + + tmp_dir.dvc_gen({dst: "hello"}) + (tmp_dir / dst).unlink() + + remote_exception = NoRemoteError("dvc import") + with patch.object(cloud.DataCloud, "pull", side_effect=remote_exception): + tmp_dir.dvc.imp(fspath(erepo_dir), src, dst) + + assert (tmp_dir / dst).is_file() + assert filecmp.cmp( + fspath(erepo_dir / src), fspath(tmp_dir / dst), shallow=False + ) + + @pytest.mark.parametrize("src_is_dvc", [True, False]) def test_import_git_dir(erepo_dir, tmp_dir, dvc, scm, src_is_dvc): if not src_is_dvc: