dvc: hooks only act in branches where dvc active (#2338)

* dvc: hooks only act in branches where dvc active

In a branch where DVC hasn't been initialized (as detected by
`git ls-files .dvc` not listing any files), don't invoke dvc in the git hooks.
This avoids trouble when switching between branches with and without dvc
initialized.

Fixes #2208

* dvc: simplify hooks per PR comment
This commit is contained in:
Gunnlaugur Thor Briem
2019-07-29 16:26:49 +03:00
committed by Ruslan Kuprieiev
parent df0359fad0
commit e917ce0ae8
2 changed files with 12 additions and 7 deletions
+3 -5
View File
@@ -216,19 +216,17 @@ class Git(Base):
return [t.name for t in self.git.tags]
def _install_hook(self, name, cmd):
command = "dvc {}".format(cmd)
command = '[ -z "$(git ls-files .dvc)" ] || exec dvc {}'.format(cmd)
hook = os.path.join(self.root_dir, self.GIT_DIR, "hooks", name)
if os.path.isfile(hook):
with open(hook, "r+") as fobj:
if command not in fobj.read():
fobj.write("exec {command}\n".format(command=command))
fobj.write("{command}\n".format(command=command))
else:
with open(hook, "w+") as fobj:
fobj.write(
"#!/bin/sh\n" "exec {command}\n".format(command=command)
)
fobj.write("#!/bin/sh\n" "{command}\n".format(command=command))
os.chmod(hook, 0o777)
+9 -2
View File
@@ -36,7 +36,11 @@ class TestInstall(object):
assert main(["install"]) == 0
expected_script = "#!/bin/sh\n" "echo hello\n" "exec dvc checkout\n"
expected_script = (
"#!/bin/sh\n"
"echo hello\n"
'[ -z "$(git ls-files .dvc)" ] || exec dvc checkout\n'
)
with open(self._hook("post-checkout"), "r") as fobj:
assert fobj.read() == expected_script
@@ -45,7 +49,10 @@ class TestInstall(object):
assert main(["install"]) == 0
assert main(["install"]) == 0
expected_script = "#!/bin/sh\n" "exec dvc checkout\n"
expected_script = (
"#!/bin/sh\n"
'[ -z "$(git ls-files .dvc)" ] || exec dvc checkout\n'
)
with open(self._hook("post-checkout"), "r") as fobj:
assert fobj.read() == expected_script