Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions dvc/scm/git/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ def _install_hook(self, name, cmd):
def install(self):
self._install_hook("post-checkout", "checkout")
self._install_hook("pre-commit", "status")
self._install_hook("pre-push", "push")

def cleanup_ignores(self):
for path in self.ignored_paths:
Expand Down
72 changes: 53 additions & 19 deletions tests/func/test_install.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,67 @@
import os
import sys
import unittest

from dvc.main import main
import pytest
from dvc.utils import file_md5

from tests.basic_env import TestDvc
from dvc.main import main
from dvc.stage import Stage


@unittest.skipIf(
sys.platform == "win32", "Git hooks aren't supported on Windows"
@pytest.mark.skipif(
sys.platform == "win32", reason="Git hooks aren't supported on Windows"
)
class TestInstall(TestDvc):
def test(self):
class TestInstall(object):
def _hook(self, name):
return os.path.join(".git", "hooks", name)

@pytest.fixture(autouse=True)
def setUp(self, dvc):
ret = main(["install"])
self.assertEqual(ret, 0)
assert ret == 0

def test_should_not_install_twice(self, dvc):
ret = main(["install"])
self.assertNotEqual(ret, 0)
assert ret != 0

def test_should_create_hooks(self):
assert os.path.isfile(self._hook("post-checkout"))
assert os.path.isfile(self._hook("pre-commit"))
assert os.path.isfile(self._hook("pre-push"))

def test_should_post_checkout_hook_checkout(self, repo_dir, dvc):
stage_file = repo_dir.FOO + Stage.STAGE_FILE_SUFFIX

dvc.add(repo_dir.FOO)
dvc.scm.add([".gitignore", stage_file])
dvc.scm.commit("add")

os.unlink(repo_dir.FOO)
dvc.scm.checkout("new_branc", create_new=True)

assert os.path.isfile(repo_dir.FOO)

def test_should_pre_push_hook_push(self, repo_dir, dvc):
temp = repo_dir.mkdtemp()
git_remote = os.path.join(temp, "project.git")
storage_path = os.path.join(temp, "dvc_storage")

foo_checksum = file_md5(repo_dir.FOO)[0]
expected_cache_path = dvc.cache.local.get(foo_checksum)

ret = main(["remote", "add", "-d", "store", storage_path])
assert ret == 0

ret = main(["add", repo_dir.FOO])
assert ret == 0

def hook(name):
return os.path.join(".git", "hooks", name)
stage_file = repo_dir.FOO + Stage.STAGE_FILE_SUFFIX
dvc.scm.git.index.add([stage_file, ".gitignore"])
dvc.scm.git.index.commit("commit message")

self.assertTrue(os.path.isfile(hook("post-checkout")))
self.assertTrue(os.path.isfile(hook("pre-commit")))
dvc.scm.git.clone(git_remote)
dvc.scm.git.create_remote("origin", git_remote)

self.dvc.add(self.FOO)
self.dvc.scm.add([".gitignore", self.FOO + ".dvc"])
self.dvc.scm.commit("add")
os.unlink(self.FOO)
dvc.scm.git.git.push("origin", "master")

self.dvc.scm.checkout("branch", create_new=True)
self.assertTrue(os.path.isfile(self.FOO))
assert os.path.isfile(expected_cache_path)