Skip to content

Commit 516e3b1

Browse files
authored
Merge pull request #2852 from pared/2848_get_no_dvc_master
external repo: checkout revision before initializing dvc repo
2 parents e63bc01 + ca85217 commit 516e3b1

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

dvc/external_repo.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,14 @@ 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 needs to be done first because current branch might not be
66+
# DVC repository
67+
if rev is not None:
68+
_git_checkout(new_path, rev)
69+
6470
repo = Repo(new_path)
6571
try:
66-
if rev is not None:
67-
repo.scm.checkout(rev)
68-
6972
if cache_dir is not None:
7073
cache_config = CacheConfig(repo.config)
7174
cache_config.set_dir(cache_dir, level=Config.LEVEL_LOCAL)
@@ -77,6 +80,16 @@ def _external_repo(url=None, rev=None, cache_dir=None):
7780
return new_path
7881

7982

83+
def _git_checkout(repo_path, revision):
84+
from dvc.scm import Git
85+
86+
git = Git(repo_path)
87+
try:
88+
git.checkout(revision)
89+
finally:
90+
git.close()
91+
92+
8093
def clean_repos():
8194
# Outside code should not see cache while we are removing
8295
repo_paths = list(REPO_CACHE.values())

tests/func/test_get.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import unicode_literals
22

33
import filecmp
4+
import logging
45
import os
56

67
import pytest
@@ -11,6 +12,7 @@
1112
from dvc.repo import Repo
1213
from dvc.system import System
1314
from dvc.utils import makedirs
15+
from dvc.utils.compat import fspath
1416
from tests.utils import trees_equal
1517

1618

@@ -87,3 +89,19 @@ def test_get_to_dir(dname, erepo):
8789

8890
assert os.path.isdir(dname)
8991
assert filecmp.cmp(erepo.FOO, dst, shallow=False)
92+
93+
94+
def test_get_from_non_dvc_master(erepo, tmp_path, monkeypatch, caplog):
95+
monkeypatch.chdir(fspath(tmp_path))
96+
erepo.dvc.scm.repo.index.remove([".dvc"], r=True)
97+
erepo.dvc.scm.commit("remove .dvc")
98+
99+
caplog.clear()
100+
imported_file = "foo_imported"
101+
with caplog.at_level(logging.INFO, logger="dvc"):
102+
Repo.get(erepo._root_dir, erepo.FOO, out=imported_file, rev="branch")
103+
104+
assert caplog.text == ""
105+
assert filecmp.cmp(
106+
os.path.join(erepo._root_dir, erepo.FOO), imported_file, shallow=False
107+
)

0 commit comments

Comments
 (0)