Add pre-rebase hook support

This commit is contained in:
Marcelo Galigniana 2023-01-27 16:18:06 -03:00 committed by Anthony Sottile
parent f2661bfc31
commit f39154f69f
9 changed files with 114 additions and 0 deletions

View file

@ -100,6 +100,8 @@ def test_run_legacy_recursive(tmpdir):
('commit-msg', ['.git/COMMIT_EDITMSG']),
('post-commit', []),
('post-merge', ['1']),
('pre-rebase', ['main', 'topic']),
('pre-rebase', ['main']),
('post-checkout', ['old_head', 'new_head', '1']),
('post-rewrite', ['amend']),
# multiple choices for commit-editmsg
@ -139,6 +141,13 @@ def test_check_args_length_prepare_commit_msg_error():
)
def test_check_args_length_pre_rebase_error():
with pytest.raises(SystemExit) as excinfo:
hook_impl._check_args_length('pre-rebase', [])
msg, = excinfo.value.args
assert msg == 'hook-impl for pre-rebase expected 1 or 2 arguments but got 0: []' # noqa: E501
def test_run_ns_pre_commit():
ns = hook_impl._run_ns('pre-commit', True, (), b'')
assert ns is not None
@ -146,6 +155,22 @@ def test_run_ns_pre_commit():
assert ns.color is True
def test_run_ns_pre_rebase():
ns = hook_impl._run_ns('pre-rebase', True, ('main', 'topic'), b'')
assert ns is not None
assert ns.hook_stage == 'pre-rebase'
assert ns.color is True
assert ns.pre_rebase_upstream == 'main'
assert ns.pre_rebase_branch == 'topic'
ns = hook_impl._run_ns('pre-rebase', True, ('main',), b'')
assert ns is not None
assert ns.hook_stage == 'pre-rebase'
assert ns.color is True
assert ns.pre_rebase_upstream == 'main'
assert ns.pre_rebase_branch is None
def test_run_ns_commit_msg():
ns = hook_impl._run_ns('commit-msg', False, ('.git/COMMIT_MSG',), b'')
assert ns is not None

View file

@ -810,6 +810,46 @@ def test_post_merge_integration(tempdir_factory, store):
assert os.path.exists('post-merge.tmp')
def test_pre_rebase_integration(tempdir_factory, store):
path = git_dir(tempdir_factory)
config = {
'repos': [
{
'repo': 'local',
'hooks': [{
'id': 'pre-rebase',
'name': 'Pre rebase',
'entry': 'touch pre-rebase.tmp',
'language': 'system',
'always_run': True,
'verbose': True,
'stages': ['pre-rebase'],
}],
},
],
}
write_config(path, config)
with cwd(path):
install(C.CONFIG_FILE, store, hook_types=['pre-rebase'])
open('foo', 'a').close()
cmd_output('git', 'add', '.')
git_commit()
cmd_output('git', 'checkout', '-b', 'branch')
open('bar', 'a').close()
cmd_output('git', 'add', '.')
git_commit()
cmd_output('git', 'checkout', 'master')
open('baz', 'a').close()
cmd_output('git', 'add', '.')
git_commit()
cmd_output('git', 'checkout', 'branch')
cmd_output('git', 'rebase', 'master', 'branch')
assert os.path.exists('pre-rebase.tmp')
def test_post_rewrite_integration(tempdir_factory, store):
path = git_dir(tempdir_factory)
config = {

View file

@ -563,6 +563,16 @@ def test_merge_conflict_resolved(cap_out, store, in_merge_conflict):
assert msg in printed
def test_rebase(cap_out, store, repo_with_passing_hook):
args = run_opts(pre_rebase_upstream='master', pre_rebase_branch='topic')
environ: MutableMapping[str, str] = {}
ret, printed = _do_run(
cap_out, store, repo_with_passing_hook, args, environ,
)
assert environ['PRE_COMMIT_PRE_REBASE_UPSTREAM'] == 'master'
assert environ['PRE_COMMIT_PRE_REBASE_BRANCH'] == 'topic'
@pytest.mark.parametrize(
('hooks', 'expected'),
(