Skip to content

Commit 702ebf4

Browse files
M-Whitakerasottile
authored andcommitted
Expose prepare-commit-msg arguments as environment vars
1 parent 44cb80f commit 702ebf4

File tree

6 files changed

+87
-2
lines changed

6 files changed

+87
-2
lines changed

pre_commit/commands/hook_impl.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ def _ns(
7676
remote_name: str | None = None,
7777
remote_url: str | None = None,
7878
commit_msg_filename: str | None = None,
79+
prepare_commit_message_source: str | None = None,
80+
commit_object_name: str | None = None,
7981
checkout_type: str | None = None,
8082
is_squash_merge: str | None = None,
8183
rewrite_command: str | None = None,
@@ -90,6 +92,8 @@ def _ns(
9092
remote_name=remote_name,
9193
remote_url=remote_url,
9294
commit_msg_filename=commit_msg_filename,
95+
prepare_commit_message_source=prepare_commit_message_source,
96+
commit_object_name=commit_object_name,
9397
all_files=all_files,
9498
checkout_type=checkout_type,
9599
is_squash_merge=is_squash_merge,
@@ -202,8 +206,20 @@ def _run_ns(
202206
_check_args_length(hook_type, args)
203207
if hook_type == 'pre-push':
204208
return _pre_push_ns(color, args, stdin)
205-
elif hook_type in {'commit-msg', 'prepare-commit-msg'}:
209+
elif hook_type in 'commit-msg':
206210
return _ns(hook_type, color, commit_msg_filename=args[0])
211+
elif hook_type == 'prepare-commit-msg' and len(args) == 1:
212+
return _ns(hook_type, color, commit_msg_filename=args[0])
213+
elif hook_type == 'prepare-commit-msg' and len(args) == 2:
214+
return _ns(
215+
hook_type, color, commit_msg_filename=args[0],
216+
prepare_commit_message_source=args[1],
217+
)
218+
elif hook_type == 'prepare-commit-msg' and len(args) == 3:
219+
return _ns(
220+
hook_type, color, commit_msg_filename=args[0],
221+
prepare_commit_message_source=args[1], commit_object_name=args[2],
222+
)
207223
elif hook_type in {'post-commit', 'pre-merge-commit', 'pre-commit'}:
208224
return _ns(hook_type, color)
209225
elif hook_type == 'post-checkout':

pre_commit/commands/run.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,16 @@ def run(
361361
):
362362
return 0
363363

364+
# Expose prepare_commit_message_source / commit_object_name
365+
# as environment variables for the hooks
366+
if args.prepare_commit_message_source:
367+
environ['PRE_COMMIT_COMMIT_MSG_SOURCE'] = (
368+
args.prepare_commit_message_source
369+
)
370+
371+
if args.commit_object_name:
372+
environ['PRE_COMMIT_COMMIT_OBJECT_NAME'] = args.commit_object_name
373+
364374
# Expose from-ref / to-ref as environment variables for hooks to consume
365375
if args.from_ref and args.to_ref:
366376
# legacy names

pre_commit/main.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,20 @@ def _add_run_options(parser: argparse.ArgumentParser) -> None:
107107
'--commit-msg-filename',
108108
help='Filename to check when running during `commit-msg`',
109109
)
110+
parser.add_argument(
111+
'--prepare-commit-message-source',
112+
help=(
113+
'Source of the commit message '
114+
'(typically the second argument to .git/hooks/prepare-commit-msg)'
115+
),
116+
)
117+
parser.add_argument(
118+
'--commit-object-name',
119+
help=(
120+
'Commit object name '
121+
'(typically the third argument to .git/hooks/prepare-commit-msg)'
122+
),
123+
)
110124
parser.add_argument(
111125
'--remote-name', help='Remote name used by `git push`.',
112126
)

testing/util.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ def run_opts(
7676
hook_stage='commit',
7777
show_diff_on_failure=False,
7878
commit_msg_filename='',
79+
prepare_commit_message_source='',
80+
commit_object_name='',
7981
checkout_type='',
8082
is_squash_merge='',
8183
rewrite_command='',
@@ -97,6 +99,8 @@ def run_opts(
9799
hook_stage=hook_stage,
98100
show_diff_on_failure=show_diff_on_failure,
99101
commit_msg_filename=commit_msg_filename,
102+
prepare_commit_message_source=prepare_commit_message_source,
103+
commit_object_name=commit_object_name,
100104
checkout_type=checkout_type,
101105
is_squash_merge=is_squash_merge,
102106
rewrite_command=rewrite_command,

tests/commands/hook_impl_test.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,42 @@ def test_run_ns_commit_msg():
154154
assert ns.commit_msg_filename == '.git/COMMIT_MSG'
155155

156156

157+
def test_run_ns_prepare_commit_msg_one_arg():
158+
ns = hook_impl._run_ns(
159+
'prepare-commit-msg', False,
160+
('.git/COMMIT_MSG',), b'',
161+
)
162+
assert ns is not None
163+
assert ns.hook_stage == 'prepare-commit-msg'
164+
assert ns.color is False
165+
assert ns.commit_msg_filename == '.git/COMMIT_MSG'
166+
167+
168+
def test_run_ns_prepare_commit_msg_two_arg():
169+
ns = hook_impl._run_ns(
170+
'prepare-commit-msg', False,
171+
('.git/COMMIT_MSG', 'message'), b'',
172+
)
173+
assert ns is not None
174+
assert ns.hook_stage == 'prepare-commit-msg'
175+
assert ns.color is False
176+
assert ns.commit_msg_filename == '.git/COMMIT_MSG'
177+
assert ns.prepare_commit_message_source == 'message'
178+
179+
180+
def test_run_ns_prepare_commit_msg_three_arg():
181+
ns = hook_impl._run_ns(
182+
'prepare-commit-msg', False,
183+
('.git/COMMIT_MSG', 'message', 'HEAD'), b'',
184+
)
185+
assert ns is not None
186+
assert ns.hook_stage == 'prepare-commit-msg'
187+
assert ns.color is False
188+
assert ns.commit_msg_filename == '.git/COMMIT_MSG'
189+
assert ns.prepare_commit_message_source == 'message'
190+
assert ns.commit_object_name == 'HEAD'
191+
192+
157193
def test_run_ns_post_commit():
158194
ns = hook_impl._run_ns('post-commit', True, (), b'')
159195
assert ns is not None

tests/commands/run_test.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,12 @@ def test_prepare_commit_msg_hook(cap_out, store, prepare_commit_msg_repo):
810810
cap_out,
811811
store,
812812
prepare_commit_msg_repo,
813-
{'hook_stage': 'prepare-commit-msg', 'commit_msg_filename': filename},
813+
{
814+
'hook_stage': 'prepare-commit-msg',
815+
'commit_msg_filename': filename,
816+
'prepare_commit_message_source': 'commit',
817+
'commit_object_name': 'HEAD',
818+
},
814819
expected_outputs=[b'Add "Signed off by:"', b'Passed'],
815820
expected_ret=0,
816821
stage=False,

0 commit comments

Comments
 (0)