|
4 | 4 | import collections |
5 | 5 | import logging |
6 | 6 |
|
| 7 | +import pytest |
| 8 | + |
7 | 9 | from dvc.main import main |
8 | 10 | from dvc.repo import Repo as DvcRepo |
9 | 11 | from dvc.system import System |
|
23 | 25 |
|
24 | 26 | from mock import patch |
25 | 27 |
|
| 28 | +from tests.utils import spy |
26 | 29 |
|
27 | 30 | logger = logging.getLogger("dvc") |
28 | 31 |
|
@@ -475,3 +478,56 @@ def test_checkout_no_checksum(repo_dir, dvc_repo): |
475 | 478 | stage = dvc_repo.run(outs=[repo_dir.FOO], no_exec=True, cmd="somecmd") |
476 | 479 | dvc_repo.checkout(stage.path, force=True) |
477 | 480 | 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