Skip to content

Commit 8338d45

Browse files
authored
Merge pull request #2488 from pared/2444
remote: checkout: reuse _checkout_file functionality
2 parents 09f6b1c + d4c9c71 commit 8338d45

File tree

2 files changed

+56
-5
lines changed

2 files changed

+56
-5
lines changed

dvc/remote/base.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -851,11 +851,6 @@ def checkout(
851851
self.safe_remove(path_info, force=force)
852852
skip = True
853853

854-
elif not self.changed(path_info, checksum_info):
855-
msg = "Data '{}' didn't change."
856-
logger.debug(msg.format(str(path_info)))
857-
skip = True
858-
859854
elif self.changed_cache(checksum):
860855
msg = "Cache '{}' not found. File '{}' won't be created."
861856
logger.warning(msg.format(checksum, str(path_info)))

tests/func/test_checkout.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import collections
55
import logging
66

7+
import pytest
8+
79
from dvc.main import main
810
from dvc.repo import Repo as DvcRepo
911
from dvc.system import System
@@ -23,6 +25,7 @@
2325

2426
from mock import patch
2527

28+
from tests.utils import spy
2629

2730
logger = logging.getLogger("dvc")
2831

@@ -475,3 +478,56 @@ def test_checkout_no_checksum(repo_dir, dvc_repo):
475478
stage = dvc_repo.run(outs=[repo_dir.FOO], no_exec=True, cmd="somecmd")
476479
dvc_repo.checkout(stage.path, force=True)
477480
assert not os.path.exists(repo_dir.FOO)
481+
482+
483+
@pytest.mark.parametrize(
484+
"link, link_test_func",
485+
[("hardlink", System.is_hardlink), ("symlink", System.is_symlink)],
486+
)
487+
def test_should_relink_on_checkout(link, link_test_func, repo_dir, dvc_repo):
488+
dvc_repo.cache.local.cache_types = [link]
489+
490+
dvc_repo.add(repo_dir.DATA_DIR)
491+
dvc_repo.unprotect(repo_dir.DATA_SUB)
492+
493+
dvc_repo.checkout(repo_dir.DATA_DIR + Stage.STAGE_FILE_SUFFIX)
494+
495+
assert link_test_func(repo_dir.DATA_SUB)
496+
497+
498+
@pytest.mark.parametrize("link", ["hardlink", "symlink", "copy"])
499+
def test_should_protect_on_checkout(link, dvc_repo, repo_dir):
500+
dvc_repo.cache.local.cache_types = [link]
501+
dvc_repo.cache.local.protected = True
502+
503+
dvc_repo.add(repo_dir.FOO)
504+
dvc_repo.unprotect(repo_dir.FOO)
505+
506+
dvc_repo.checkout(repo_dir.FOO + Stage.STAGE_FILE_SUFFIX)
507+
508+
assert not os.access(repo_dir.FOO, os.W_OK)
509+
510+
511+
def test_should_relink_only_one_file_in_dir(dvc_repo, repo_dir):
512+
dvc_repo.cache.local.cache_types = ["symlink"]
513+
514+
dvc_repo.add(repo_dir.DATA_DIR)
515+
dvc_repo.unprotect(repo_dir.DATA_SUB)
516+
517+
link_spy = spy(System.symlink)
518+
with patch.object(dvc_repo.cache.local, "symlink", link_spy):
519+
dvc_repo.checkout(repo_dir.DATA_DIR + Stage.STAGE_FILE_SUFFIX)
520+
521+
assert link_spy.mock.call_count == 1
522+
523+
524+
@pytest.mark.parametrize("link", ["hardlink", "symlink", "copy"])
525+
def test_should_not_relink_on_unchanged_dependency(link, dvc_repo, repo_dir):
526+
dvc_repo.cache.local.cache_types = [link]
527+
528+
dvc_repo.add(repo_dir.DATA_DIR)
529+
530+
with patch.object(dvc_repo.cache.local, "link") as mock_link:
531+
dvc_repo.checkout(repo_dir.DATA_DIR + Stage.STAGE_FILE_SUFFIX)
532+
533+
assert not mock_link.called

0 commit comments

Comments
 (0)