forked from vuillaut/gitlab_release_notes
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgenerate.py
More file actions
118 lines (102 loc) · 4.4 KB
/
generate.py
File metadata and controls
118 lines (102 loc) · 4.4 KB
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
107
108
109
110
111
112
113
114
115
116
117
118
import datetime
import gitlab
import os.path
import sys
from .version import __version__
def generate_release_notes(project_id, endstr = ' <br>', since=None, quiet=False, target_branch=None, **config):
"""
Generate the release notes of a gitlab project from the last release
Parameters
----------
project_id: int
ID of the project
config: dict
url: Optional[str] = None,
private_token: Optional[str] = None,
oauth_token: Optional[str] = None,
job_token: Optional[str] = None,
ssl_verify: Union[bool, str] = True,
http_username: Optional[str] = None,
http_password: Optional[str] = None,
timeout: Optional[float] = None,
api_version: str = '4',
session: Optional[requests.sessions.Session] = None,
per_page: Optional[int] = None,
pagination: Optional[str] = None,
order_by: Optional[str] = None,
user_agent: str = 'python-gitlab/3.1.0',
retry_transient_errors: bool = False,
"""
gl = gitlab.Gitlab(**config)
project = gl.projects.get(project_id)
if not project.mergerequests.list(get_all=False,state='merged', target_branch=target_branch):
raise ValueError(f"There is no merged merge request for project {project_id} {project.name}")
log = ""
if since:
log_pending = f"Changelog of {project.name} since {since}:{endstr}"
last_date = since
elif not project.releases.list(get_all=False):
log_pending = f"Changelog of {project.name}:{endstr}"
last_date = '0000-01-01T00:00:00Z'
else:
last_release = project.releases.list(get_all=False)[0]
log_pending = f"Changelog since release {last_release.name} of {project.name}:{endstr}"
last_date = last_release.released_at
page = 1
list_mrs = project.mergerequests.list(state='merged',
get_all=False,
order_by='updated_at',
updated_after=last_date,
target_branch=target_branch,
page=page)
if not list_mrs:
if not quiet:
log += log_pending
log += f"There is no merged merge request after {last_date}{endstr}"
return log
log += log_pending
while list_mrs:
for mr in list_mrs:
line = f" * {mr.title} (@{mr.author['username']}){endstr}"
log += line
page += 1
list_mrs = project.mergerequests.list(state='merged',
get_all=False,
order_by='updated_at',
updated_after=last_date,
target_branch=target_branch,
page=page
)
return log
def main():
import argparse
parser = argparse.ArgumentParser(os.path.basename(sys.argv[0]),
description="Generate release notes for a gitlab repository \
based on merge requests titles since last release")
# Required
parser.add_argument("project_id", type=int)
# Optional
parser.add_argument("--url", default="https://gitlab.com", required=False)
parser.add_argument("--private_token", type=str, required=False, default=None)
parser.add_argument('--version', action='version', version=__version__)
parser.add_argument('--html', action='store_true')
parser.add_argument('--since', type=datetime.date.fromisoformat, required=False, default=None)
parser.add_argument('--target_branch', type=str, required=False, default=None)
parser.add_argument('--quiet', action='store_true')
args = parser.parse_args()
if args.html:
endstr = ' <br>'
else:
endstr = '\n'
notes = generate_release_notes(args.project_id,
url=args.url,
endstr=endstr,
since=args.since,
target_branch=args.target_branch,
quiet=args.quiet,
private_token=args.private_token,
)
if notes:
print(notes)
if __name__ == "__main__":
main()