diff --git a/dvc/external_repo.py b/dvc/external_repo.py index 9d9096300..d43770834 100644 --- a/dvc/external_repo.py +++ b/dvc/external_repo.py @@ -61,11 +61,12 @@ def _external_repo(url=None, rev=None, cache_dir=None): REPO_CACHE[url, None, None] = clean_clone_path # Adjust new clone/copy to fit rev and cache_dir + + # Checkout first in case of non dvc master + checkout_revision(new_path, rev) + repo = Repo(new_path) try: - if rev is not None: - repo.scm.checkout(rev) - if cache_dir is not None: cache_config = CacheConfig(repo.config) cache_config.set_dir(cache_dir, level=Config.LEVEL_LOCAL) @@ -77,6 +78,14 @@ def _external_repo(url=None, rev=None, cache_dir=None): return new_path +def checkout_revision(repo_path, revision): + if revision is not None: + from dvc.scm import Git + + git = Git(repo_path) + git.checkout(revision) + + def clean_repos(): # Outside code should not see cache while we are removing repo_paths = list(REPO_CACHE.values()) diff --git a/tests/func/test_get.py b/tests/func/test_get.py index 2b65d5136..94ce1717c 100644 --- a/tests/func/test_get.py +++ b/tests/func/test_get.py @@ -8,6 +8,7 @@ import pytest from dvc.config import Config from dvc.exceptions import GetDVCFileError from dvc.exceptions import UrlNotDvcRepoError +from dvc.remote import RemoteConfig from dvc.repo import Repo from dvc.system import System from dvc.utils import makedirs @@ -87,3 +88,33 @@ def test_get_to_dir(dname, erepo): assert os.path.isdir(dname) assert filecmp.cmp(erepo.FOO, dst, shallow=False) + + +@pytest.fixture +def erepo_no_dvc_master(git_erepo): + dvc_branch = "dvc_test" + git_erepo.git.git.checkout("master", b=dvc_branch) + git_erepo.dvc_branch = dvc_branch + + dvc_repo = Repo.init(git_erepo._root_dir) + stage, = dvc_repo.add([git_erepo.FOO]) + dvc_repo.scm.add([".dvc", stage.relpath]) + + rconfig = RemoteConfig(dvc_repo.config) + rconfig.add("upstream", dvc_repo.cache.local.cache_dir, default=True) + dvc_repo.scm.add([dvc_repo.config.config_file]) + + dvc_repo.scm.commit("dvc branch initial") + + git_erepo.git.git.checkout("master") + os.chdir(git_erepo._saved_dir) + yield git_erepo + + +def test_get_from_non_dvc_master(empty_dir, erepo_no_dvc_master): + Repo.get( + erepo_no_dvc_master._root_dir, + "foo", + out="foo", + rev=erepo_no_dvc_master.dvc_branch, + )