diff --git a/dvc/dependency/repo.py b/dvc/dependency/repo.py index 3bcfd3e65d..66c8b278fc 100644 --- a/dvc/dependency/repo.py +++ b/dvc/dependency/repo.py @@ -142,5 +142,10 @@ def download(self, to): ) def update(self): - with self._make_repo(rev_lock=None) as repo: - self.def_repo[self.PARAM_REV_LOCK] = repo.scm.get_rev() + try: + with self._make_repo(rev_lock=None) as repo: + rev = repo.scm.get_rev() + except NotDvcRepoError: + clone_path = cached_clone(**self.def_repo) + rev = SCM(clone_path).get_rev() + self.def_repo[self.PARAM_REV_LOCK] = rev diff --git a/tests/dir_helpers.py b/tests/dir_helpers.py index c531e4b8cc..a108d5b285 100644 --- a/tests/dir_helpers.py +++ b/tests/dir_helpers.py @@ -54,7 +54,15 @@ from dvc.compat import fspath, fspath_py35 -__all__ = ["tmp_dir", "scm", "dvc", "repo_template", "run_copy", "erepo_dir"] +__all__ = [ + "tmp_dir", + "scm", + "dvc", + "repo_template", + "run_copy", + "erepo_dir", + "external_git_dir", +] REPO_TEMPLATE = { "foo": "foo", "bar": "bar", @@ -285,3 +293,21 @@ def erepo_dir(tmp_path_factory, monkeypatch): path.dvc.close() return path + + +@pytest.fixture +def external_git_dir(tmp_path_factory, monkeypatch): + from dvc.scm.git import Git + + path = TmpDir(fspath_py35(tmp_path_factory.mktemp("external_git_dir"))) + + # Create git repo + with path.chdir(): + _git_init() + + try: + path.scm = Git(fspath(path)) + path.scm.commit("initial commit to create the master branch") + yield path + finally: + path.scm.close() diff --git a/tests/func/test_status.py b/tests/func/test_status.py index 8b8d3d2ba9..b9bca28a34 100644 --- a/tests/func/test_status.py +++ b/tests/func/test_status.py @@ -61,27 +61,25 @@ def test_status_non_dvc_repo_import(tmp_dir, dvc, erepo_dir): } -def test_status_before_and_after_dvc_init(tmp_dir, dvc, erepo_dir): - with erepo_dir.chdir(): - erepo_dir.scm.repo.index.remove([".dvc"], r=True) - shutil.rmtree(".dvc") - erepo_dir.scm_gen("file", "first version") - erepo_dir.scm.add(["file"]) - erepo_dir.scm.commit("first version") - old_rev = erepo_dir.scm.get_rev() +def test_status_before_and_after_dvc_init(tmp_dir, dvc, external_git_dir): + with external_git_dir.chdir(): + external_git_dir.scm_gen( + "file", "first version", commit="first version" + ) + old_rev = external_git_dir.scm.get_rev() - dvc.imp(fspath(erepo_dir), "file", "file") + dvc.imp(fspath(external_git_dir), "file", "file") assert dvc.status(["file.dvc"]) == {} - with erepo_dir.chdir(): - Repo.init() - erepo_dir.scm.repo.index.remove(["file"]) + with external_git_dir.chdir(): + external_git_dir.dvc = Repo.init() + external_git_dir.scm.repo.index.remove(["file"]) os.remove("file") - erepo_dir.dvc_gen("file", "second version") - erepo_dir.scm.add([".dvc", "file.dvc"]) - erepo_dir.scm.commit("version with dvc") - new_rev = erepo_dir.scm.get_rev() + external_git_dir.dvc_gen("file", "second version") + external_git_dir.scm.add([".dvc", "file.dvc"]) + external_git_dir.scm.commit("version with dvc") + new_rev = external_git_dir.scm.get_rev() assert old_rev != new_rev @@ -93,6 +91,6 @@ def test_status_before_and_after_dvc_init(tmp_dir, dvc, erepo_dir): assert status == { "changed deps": { - "file ({})".format(fspath(erepo_dir)): "update available" + "file ({})".format(fspath(external_git_dir)): "update available" } } diff --git a/tests/func/test_update.py b/tests/func/test_update.py index 6f483fff0a..4e846a2bb2 100644 --- a/tests/func/test_update.py +++ b/tests/func/test_update.py @@ -172,3 +172,28 @@ def test_update_import_url(tmp_dir, dvc, tmp_path_factory): assert dst.is_file() assert dst.read_text() == "updated file content" + + +def test_update_git_tracked(tmp_dir, dvc, external_git_dir): + with external_git_dir.chdir(): + external_git_dir.scm_gen("file", "first version", commit="create") + + tmp_dir.dvc.imp(fspath(external_git_dir), "file", "file") + + # Just to make sure it doesn't crash + tmp_dir.dvc.update("file.dvc") + + assert (tmp_dir / "file").read_text() == "first version" + + with external_git_dir.chdir(): + external_git_dir.scm_gen( + "file", "second version", commit="update file" + ) + + # Caching in external repos doesn't see upstream updates within single + # cli call, so we need to clean the caches to see the changes. + clean_repos() + + tmp_dir.dvc.update("file.dvc") + + assert (tmp_dir / "file").read_text() == "second version"