Skip to content

Commit

Permalink
support pre-merge-commit
Browse files Browse the repository at this point in the history
  • Loading branch information
asottile committed Dec 27, 2019
1 parent bf68512 commit c699e25
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 6 deletions.
5 changes: 4 additions & 1 deletion pre_commit/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
VERSION = importlib_metadata.version('pre_commit')

# `manual` is not invoked by any installed git hook. See #719
STAGES = ('commit', 'prepare-commit-msg', 'commit-msg', 'manual', 'push')
STAGES = (
'commit', 'merge-commit', 'prepare-commit-msg', 'commit-msg', 'manual',
'push',
)

DEFAULT = 'default'
3 changes: 2 additions & 1 deletion pre_commit/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ def __call__(self, parser, namespace, values, option_string=None):
def _add_hook_type_option(parser):
parser.add_argument(
'-t', '--hook-type', choices=(
'pre-commit', 'pre-push', 'prepare-commit-msg', 'commit-msg',
'pre-commit', 'pre-merge-commit', 'pre-push',
'prepare-commit-msg', 'commit-msg',
),
action=AppendReplaceDefault,
default=['pre-commit'],
Expand Down
1 change: 1 addition & 0 deletions pre_commit/resources/hook-tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ def _opts(stdin):
fns = {
'prepare-commit-msg': lambda _: ('--commit-msg-filename', sys.argv[1]),
'commit-msg': lambda _: ('--commit-msg-filename', sys.argv[1]),
'pre-merge-commit': lambda _: (),
'pre-commit': lambda _: (),
'pre-push': _pre_push,
}
Expand Down
5 changes: 2 additions & 3 deletions testing/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,15 @@ def cmd_output_mocked_pre_commit_home(*args, **kwargs):
os.name == 'nt' or not docker_is_running(),
reason="Docker isn't running or can't be accessed",
)

skipif_cant_run_swift = pytest.mark.skipif(
parse_shebang.find_executable('swift') is None,
reason='swift isn\'t installed or can\'t be found',
reason="swift isn't installed or can't be found",
)

xfailif_windows_no_ruby = pytest.mark.xfail(
os.name == 'nt',
reason='Ruby support not yet implemented on windows.',
)
xfailif_windows = pytest.mark.xfail(os.name == 'nt', reason='windows')


def broken_deep_listdir(): # pragma: no cover (platform specific)
Expand Down
28 changes: 28 additions & 0 deletions tests/commands/install_uninstall_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
from testing.util import cwd
from testing.util import git_commit
from testing.util import xfailif_no_symlink
from testing.util import xfailif_windows


def test_is_not_script():
Expand Down Expand Up @@ -742,6 +743,33 @@ def test_prepare_commit_msg_legacy(
assert 'Signed off by: ' in f.read()


@xfailif_windows # pragma: windows no cover (once AP has git 2.24)
def test_pre_merge_commit_integration(tempdir_factory, store):
expected = re.compile(
r'^\[INFO\] Initializing environment for .+\n'
r'Bash hook\.+Passed\n'
r"Merge made by the 'recursive' strategy.\n"
r' foo \| 0\n'
r' 1 file changed, 0 insertions\(\+\), 0 deletions\(-\)\n'
r' create mode 100644 foo\n$',
)

path = make_consuming_repo(tempdir_factory, 'script_hooks_repo')
with cwd(path):
ret = install(C.CONFIG_FILE, store, hook_types=['pre-merge-commit'])
assert ret == 0

cmd_output('git', 'checkout', 'master', '-b', 'feature')
_get_commit_output(tempdir_factory)
cmd_output('git', 'checkout', 'master')
ret, output, _ = cmd_output_mocked_pre_commit_home(
'git', 'merge', '--no-ff', '--no-edit', 'feature',
tempdir_factory=tempdir_factory,
)
assert ret == 0
assert expected.match(output)


def test_install_disallow_missing_config(tempdir_factory, store):
path = make_consuming_repo(tempdir_factory, 'script_hooks_repo')
with cwd(path):
Expand Down
3 changes: 2 additions & 1 deletion tests/repository_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -895,7 +895,8 @@ def test_manifest_hooks(tempdir_factory, store):
pass_filenames=True,
require_serial=False,
stages=(
'commit', 'prepare-commit-msg', 'commit-msg', 'manual', 'push',
'commit', 'merge-commit', 'prepare-commit-msg', 'commit-msg',
'manual', 'push',
),
types=['file'],
verbose=False,
Expand Down

0 comments on commit c699e25

Please sign in to comment.