-
Notifications
You must be signed in to change notification settings - Fork 0
/
prepare-commit-msg
106 lines (97 loc) · 4.19 KB
/
prepare-commit-msg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env python3.7
import sys
import hook_utils
# Taken from: https://chris.beams.io/posts/git-commit/
# Reordered for line length visibility at top
GOOD_COMMIT_RULES = [
"1: Limit the subject line to 50 characters: ~~~^",
"2: Wrap the body at 72 characters: " + 34 * "~" + "^",
"3: Separate subject from body with a blank line",
"4: Capitalize the subject line",
"5: Do not end the subject line with a period",
"6: Use the imperative mood in the subject line",
"7: Use the body to explain what and why vs. how",
]
def prepend_commit_msg(text: str) -> None:
"""Prepend the commit message with `text`"""
message_file = sys.argv[1]
with open(message_file) as f:
contents = f.read()
with open(message_file, "w") as f:
# Don't append if it's already there
if not contents.startswith(text):
f.write(text)
f.write(contents)
def check_commit_header(text: str) -> str:
message_file = sys.argv[1]
with open(message_file) as f:
first_line = f.readline()
if not first_line.startswith(text):
msg = (
"The supplied commit message does not contain a reference "
"to an issue number in a known format. Please make sure to "
"reference TFS issue numbers in commit messages. Do you want to "
)
return msg
else:
return ""
if __name__ == "__main__":
# 1-3 arguments are passed to this hook, the file id, the source and commit-SHA1
if len(sys.argv) > 2:
# In case of merge or flag (-c, -t, -m)
# Second argument can be 'message', 'template', 'merge', 'squash' or 'commit'
if sys.argv[2] == "message":
# For a message supplied via '-m' flag, check if issue is referenced
issue_number, number_msg = hook_utils.get_issue_num_by_branch()
comment_char, comment_msg = hook_utils.get_git_comment_char()
if issue_number:
if comment_char == hook_utils.GIT_DEFAULT_COMMENT_CHAR:
header = " #" + issue_number + "\n"
else:
header = "#" + issue_number + "\n"
# Check existing commit message
header_msg = check_commit_header(header)
else:
header_msg = ""
# Print possible error messages and let user decide on progression
err_msg = "\n".join(filter(None, [number_msg, comment_msg, header_msg]))
if err_msg:
# Needed for user input in git-hooks
hook_utils.open_console_input()
options = ["continue", "abort"]
user_choice = hook_utils.ask_user_choice(
err_msg + "\n Do you want to ", options
)
if user_choice == "abort":
sys.exit(1)
else:
# Currently no further checks
pass
else:
# Normal commit procedure with only 1 input
# Fail silently
try:
# Try to determine issue number and catch any messages
issue_number, number_msg = hook_utils.get_issue_num_by_branch()
comment_char, comment_msg = hook_utils.get_git_comment_char()
# For a valid issue number prepend to commit message
if issue_number:
# Trick issue number reference in case the # is used for git comments
if comment_char == hook_utils.GIT_DEFAULT_COMMENT_CHAR:
header = " #" + issue_number + "\n"
else:
header = "#" + issue_number + "\n"
else:
# In case no issue number could be found prepend error messages
header = f"{comment_char} Error: {number_msg}{comment_char}\n"
if comment_msg:
header += f"{comment_char} Error: {comment_msg}{comment_char}\n"
# Add good commit rules
header += "\n".join(
f"{comment_char} {rule}" for rule in GOOD_COMMIT_RULES
)
header += f"\n{comment_char}"
prepend_commit_msg(header)
except Exception:
print("Error in preparing commit message, you're on your own")
pass