# HG changeset patch # User Peter Rowlands # Date 1607664621 -32400 # Fri Dec 11 14:30:21 2020 +0900 # Node ID 5ceae96b68008adb971ceb3dd6d8b7dc573ba875 # Parent 17ea193054b5d9489856746bcf8454d63f24b750 tests: add commit --no-verify test case diff --git a/dulwich/tests/test_porcelain.py b/dulwich/tests/test_porcelain.py --- a/dulwich/tests/test_porcelain.py +++ b/dulwich/tests/test_porcelain.py @@ -24,12 +24,14 @@ import os import re import shutil +import stat import tarfile import tempfile import time from dulwich import porcelain from dulwich.diff_tree import tree_changes +from dulwich.errors import CommitError from dulwich.objects import ( Blob, Tag, @@ -125,6 +127,52 @@ self.assertTrue(isinstance(sha, bytes)) self.assertEqual(len(sha), 40) + def test_no_verify(self): + if os.name != 'posix': + self.skipTest('shell hook tests requires POSIX shell') + self.assertTrue(os.path.exists('/bin/sh')) + + hooks_dir = os.path.join(self.repo.controldir(), "hooks") + os.makedirs(hooks_dir, exist_ok=True) + self.addCleanup(shutil.rmtree, hooks_dir) + + c1, c2, c3 = build_commit_graph( + self.repo.object_store, [[1], [2, 1], [3, 1, 2]]) + + hook_fail = "#!/bin/sh\nexit 1" + + # hooks are executed in pre-commit, commit-msg order + # test commit-msg failure first, then pre-commit failure, then + # no_verify to skip both hooks + commit_msg = os.path.join(hooks_dir, "commit-msg") + with open(commit_msg, 'w') as f: + f.write(hook_fail) + os.chmod(commit_msg, stat.S_IREAD | stat.S_IWRITE | stat.S_IEXEC) + + with self.assertRaises(CommitError): + porcelain.commit( + self.repo.path, message="Some message", + author="Joe ", + committer="Bob ") + + pre_commit = os.path.join(hooks_dir, "pre-commit") + with open(pre_commit, 'w') as f: + f.write(hook_fail) + os.chmod(pre_commit, stat.S_IREAD | stat.S_IWRITE | stat.S_IEXEC) + + with self.assertRaises(CommitError): + porcelain.commit( + self.repo.path, message="Some message", + author="Joe ", + committer="Bob ") + + sha = porcelain.commit( + self.repo.path, message="Some message", + author="Joe ", + committer="Bob ", no_verify=True) + self.assertTrue(isinstance(sha, bytes)) + self.assertEqual(len(sha), 40) + class CleanTests(PorcelainTestCase):