-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpull_request_fields.py
65 lines (41 loc) · 1.81 KB
/
pull_request_fields.py
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
from datetime import date
import re
MERGE_COMMIT_MESSAGE_REGEX = r"^Merge pull request #(\d+).*\n\n(.*)$"
MERGE_COMMIT_MESSAGE_PATTERN = re.compile(MERGE_COMMIT_MESSAGE_REGEX)
def matches_merge_commit_pattern(message):
return MERGE_COMMIT_MESSAGE_PATTERN.match(message)
def merge_commit_changelog_message(commit):
(
merge_commit_pull_request_number,
merge_commit_pull_request_title,
) = matches_merge_commit_pattern(commit.commit.message).groups()
author_login = commit.author.login
return "* @{author_login}: #{pull_request_number} - {pull_request_title}".format(
author_login=author_login,
pull_request_number=merge_commit_pull_request_number,
pull_request_title=merge_commit_pull_request_title,
)
def pull_request_title():
return "Release {today}".format(today=date.today())
def pull_request_body(merge_commits):
pull_request_body_lines = ["# Changelog"]
pull_request_body_lines.extend(
[merge_commit_changelog_message(commit) for commit in merge_commits]
)
return "\n".join(pull_request_body_lines)
def pull_request_reviewers(merge_commits, pull_request_creator):
author_logins = [commit.author.login for commit in merge_commits]
unique_logins = set(author_logins)
unique_logins.discard(pull_request_creator)
return list(unique_logins)
def pull_request_fields(repository, base, head, pull_request_creator):
compare = repository.compare(base, head)
merge_commits = [
commit
for commit in compare.commits
if matches_merge_commit_pattern(commit.commit.message)
]
title = pull_request_title()
body = pull_request_body(merge_commits)
reviewers = pull_request_reviewers(merge_commits, pull_request_creator)
return {"title": title, "body": body, "reviewers": reviewers}