forked from iterative/dvc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_install.py
70 lines (52 loc) · 2.11 KB
/
test_install.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import os
import pathlib
import sys
import pytest
from dvc.exceptions import GitHookAlreadyExistsError
from dvc.utils import file_md5, fspath
@pytest.mark.skipif(
sys.platform == "win32", reason="Git hooks aren't supported on Windows"
)
class TestInstall(object):
def _hook(self, name):
return pathlib.Path(".git") / "hooks" / name
def test_create_hooks(self, scm, dvc):
scm.install()
hooks_with_commands = [
("post-checkout", "exec dvc checkout"),
("pre-commit", "exec dvc status"),
("pre-push", "exec dvc push"),
]
for fname, command in hooks_with_commands:
hook_path = self._hook(fname)
assert hook_path.is_file()
assert command in hook_path.read_text()
def test_fail_if_hook_exists(self, scm):
self._hook("post-checkout").write_text("hook content")
with pytest.raises(GitHookAlreadyExistsError):
scm.install()
def test_post_checkout(self, tmp_dir, scm, dvc):
scm.install()
tmp_dir.dvc_gen({"file": "file content"}, commit="add")
os.unlink("file")
scm.checkout("new_branch", create_new=True)
assert os.path.isfile("file")
def test_pre_push_hook(self, tmp_dir, scm, dvc, tmp_path_factory):
scm.install()
temp = tmp_path_factory.mktemp("external")
git_remote = temp / "project.git"
storage_path = temp / "dvc_storage"
with dvc.config.edit() as conf:
conf["remote"]["store"] = {"url": fspath(storage_path)}
conf["core"]["remote"] = "store"
tmp_dir.dvc_gen("file", "file_content", "commit message")
file_checksum = file_md5("file")[0]
expected_storage_path = (
storage_path / file_checksum[:2] / file_checksum[2:]
)
scm.repo.clone(fspath(git_remote))
scm.repo.create_remote("origin", fspath(git_remote))
assert not expected_storage_path.is_file()
scm.repo.git.push("origin", "master")
assert expected_storage_path.is_file()
assert expected_storage_path.read_text() == "file_content"