Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Expose prepare-commit-msg arguments as environment vars #2407

Merged
merged 1 commit into from Jun 11, 2022
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 17 additions & 1 deletion pre_commit/commands/hook_impl.py
Expand Up @@ -76,6 +76,8 @@ def _ns(
remote_name: str | None = None,
remote_url: str | None = None,
commit_msg_filename: str | None = None,
prepare_commit_message_source: str | None = None,
commit_object_name: str | None = None,
checkout_type: str | None = None,
is_squash_merge: str | None = None,
rewrite_command: str | None = None,
Expand All @@ -90,6 +92,8 @@ def _ns(
remote_name=remote_name,
remote_url=remote_url,
commit_msg_filename=commit_msg_filename,
prepare_commit_message_source=prepare_commit_message_source,
commit_object_name=commit_object_name,
all_files=all_files,
checkout_type=checkout_type,
is_squash_merge=is_squash_merge,
Expand Down Expand Up @@ -202,8 +206,20 @@ def _run_ns(
_check_args_length(hook_type, args)
if hook_type == 'pre-push':
return _pre_push_ns(color, args, stdin)
elif hook_type in {'commit-msg', 'prepare-commit-msg'}:
elif hook_type in 'commit-msg':
return _ns(hook_type, color, commit_msg_filename=args[0])
elif hook_type == 'prepare-commit-msg' and len(args) == 1:
return _ns(hook_type, color, commit_msg_filename=args[0])
elif hook_type == 'prepare-commit-msg' and len(args) == 2:
return _ns(
hook_type, color, commit_msg_filename=args[0],
prepare_commit_message_source=args[1],
)
elif hook_type == 'prepare-commit-msg' and len(args) == 3:
return _ns(
hook_type, color, commit_msg_filename=args[0],
prepare_commit_message_source=args[1], commit_object_name=args[2],
)
elif hook_type in {'post-commit', 'pre-merge-commit', 'pre-commit'}:
return _ns(hook_type, color)
elif hook_type == 'post-checkout':
Expand Down
10 changes: 10 additions & 0 deletions pre_commit/commands/run.py
Expand Up @@ -361,6 +361,16 @@ def run(
):
return 0

# Expose prepare_commit_message_source / commit_object_name
# as environment variables for the hooks
if args.prepare_commit_message_source:
environ['PRE_COMMIT_COMMIT_MSG_SOURCE'] = (
args.prepare_commit_message_source
)

if args.commit_object_name:
environ['PRE_COMMIT_COMMIT_OBJECT_NAME'] = args.commit_object_name

# Expose from-ref / to-ref as environment variables for hooks to consume
if args.from_ref and args.to_ref:
# legacy names
Expand Down
14 changes: 14 additions & 0 deletions pre_commit/main.py
Expand Up @@ -107,6 +107,20 @@ def _add_run_options(parser: argparse.ArgumentParser) -> None:
'--commit-msg-filename',
help='Filename to check when running during `commit-msg`',
)
parser.add_argument(
'--prepare-commit-message-source',
help=(
'Source of the commit message '
'(typically the second argument to .git/hooks/prepare-commit-msg)'
),
)
parser.add_argument(
'--commit-object-name',
help=(
'Commit object name '
'(typically the third argument to .git/hooks/prepare-commit-msg)'
),
)
parser.add_argument(
'--remote-name', help='Remote name used by `git push`.',
)
Expand Down
4 changes: 4 additions & 0 deletions testing/util.py
Expand Up @@ -76,6 +76,8 @@ def run_opts(
hook_stage='commit',
show_diff_on_failure=False,
commit_msg_filename='',
prepare_commit_message_source='',
commit_object_name='',
checkout_type='',
is_squash_merge='',
rewrite_command='',
Expand All @@ -97,6 +99,8 @@ def run_opts(
hook_stage=hook_stage,
show_diff_on_failure=show_diff_on_failure,
commit_msg_filename=commit_msg_filename,
prepare_commit_message_source=prepare_commit_message_source,
commit_object_name=commit_object_name,
checkout_type=checkout_type,
is_squash_merge=is_squash_merge,
rewrite_command=rewrite_command,
Expand Down
36 changes: 36 additions & 0 deletions tests/commands/hook_impl_test.py
Expand Up @@ -154,6 +154,42 @@ def test_run_ns_commit_msg():
assert ns.commit_msg_filename == '.git/COMMIT_MSG'


def test_run_ns_prepare_commit_msg_one_arg():
ns = hook_impl._run_ns(
'prepare-commit-msg', False,
('.git/COMMIT_MSG',), b'',
)
assert ns is not None
assert ns.hook_stage == 'prepare-commit-msg'
assert ns.color is False
assert ns.commit_msg_filename == '.git/COMMIT_MSG'


def test_run_ns_prepare_commit_msg_two_arg():
ns = hook_impl._run_ns(
'prepare-commit-msg', False,
('.git/COMMIT_MSG', 'message'), b'',
)
assert ns is not None
assert ns.hook_stage == 'prepare-commit-msg'
assert ns.color is False
assert ns.commit_msg_filename == '.git/COMMIT_MSG'
assert ns.prepare_commit_message_source == 'message'


def test_run_ns_prepare_commit_msg_three_arg():
ns = hook_impl._run_ns(
'prepare-commit-msg', False,
('.git/COMMIT_MSG', 'message', 'HEAD'), b'',
)
assert ns is not None
assert ns.hook_stage == 'prepare-commit-msg'
assert ns.color is False
assert ns.commit_msg_filename == '.git/COMMIT_MSG'
assert ns.prepare_commit_message_source == 'message'
assert ns.commit_object_name == 'HEAD'


def test_run_ns_post_commit():
ns = hook_impl._run_ns('post-commit', True, (), b'')
assert ns is not None
Expand Down
7 changes: 6 additions & 1 deletion tests/commands/run_test.py
Expand Up @@ -810,7 +810,12 @@ def test_prepare_commit_msg_hook(cap_out, store, prepare_commit_msg_repo):
cap_out,
store,
prepare_commit_msg_repo,
{'hook_stage': 'prepare-commit-msg', 'commit_msg_filename': filename},
{
'hook_stage': 'prepare-commit-msg',
'commit_msg_filename': filename,
'prepare_commit_message_source': 'commit',
'commit_object_name': 'HEAD',
},
expected_outputs=[b'Add "Signed off by:"', b'Passed'],
expected_ret=0,
stage=False,
Expand Down