Skip to content

Commit b9d5933

Browse files
committed
external repo: checkout rev before initializing repo
1 parent b788a99 commit b9d5933

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

dvc/external_repo.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,12 @@ def _external_repo(url=None, rev=None, cache_dir=None):
6161
REPO_CACHE[url, None, None] = clean_clone_path
6262

6363
# Adjust new clone/copy to fit rev and cache_dir
64+
65+
# Checkout first in case of non dvc master
66+
checkout_revision(new_path, rev)
67+
6468
repo = Repo(new_path)
6569
try:
66-
if rev is not None:
67-
repo.scm.checkout(rev)
68-
6970
if cache_dir is not None:
7071
cache_config = CacheConfig(repo.config)
7172
cache_config.set_dir(cache_dir, level=Config.LEVEL_LOCAL)
@@ -77,6 +78,14 @@ def _external_repo(url=None, rev=None, cache_dir=None):
7778
return new_path
7879

7980

81+
def checkout_revision(repo_path, revision):
82+
if revision is not None:
83+
from dvc.scm import Git
84+
85+
git = Git(repo_path)
86+
git.checkout(revision)
87+
88+
8089
def clean_repos():
8190
# Outside code should not see cache while we are removing
8291
repo_paths = list(REPO_CACHE.values())

tests/func/test_get.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from dvc.config import Config
99
from dvc.exceptions import GetDVCFileError
1010
from dvc.exceptions import UrlNotDvcRepoError
11+
from dvc.remote import RemoteConfig
1112
from dvc.repo import Repo
1213
from dvc.system import System
1314
from dvc.utils import makedirs
@@ -87,3 +88,33 @@ def test_get_to_dir(dname, erepo):
8788

8889
assert os.path.isdir(dname)
8990
assert filecmp.cmp(erepo.FOO, dst, shallow=False)
91+
92+
93+
@pytest.fixture
94+
def erepo_no_dvc_master(git_erepo):
95+
dvc_branch = "dvc_test"
96+
git_erepo.git.git.checkout("master", b=dvc_branch)
97+
git_erepo.dvc_branch = dvc_branch
98+
99+
dvc_repo = Repo.init(git_erepo._root_dir)
100+
stage, = dvc_repo.add([git_erepo.FOO])
101+
dvc_repo.scm.add([".dvc", stage.relpath])
102+
103+
rconfig = RemoteConfig(dvc_repo.config)
104+
rconfig.add("upstream", dvc_repo.cache.local.cache_dir, default=True)
105+
dvc_repo.scm.add([dvc_repo.config.config_file])
106+
107+
dvc_repo.scm.commit("dvc branch initial")
108+
109+
git_erepo.git.git.checkout("master")
110+
os.chdir(git_erepo._saved_dir)
111+
yield git_erepo
112+
113+
114+
def test_get_from_non_dvc_master(empty_dir, erepo_no_dvc_master):
115+
Repo.get(
116+
erepo_no_dvc_master._root_dir,
117+
"foo",
118+
out="foo",
119+
rev=erepo_no_dvc_master.dvc_branch,
120+
)

0 commit comments

Comments
 (0)