@@ -27,31 +27,60 @@ def generate_release_notes(project_id, **config):
2727 user_agent: str = 'python-gitlab/3.1.0',
2828 retry_transient_errors: bool = False,
2929 """
30+ endstr = ' <br>'
31+
3032 gl = gitlab .Gitlab (** config )
3133 project = gl .projects .get (project_id )
3234
3335 if not project .mergerequests .list (state = 'merged' ):
3436 raise ValueError (f"There is not merged merge request for project { project_id } { project .name } " )
3537
36- last_mr_date = datetime .fromisoformat (project .mergerequests .list (state = 'merged' , order_by = 'updated_at' , per_page = 1 )[0 ].merged_at )
3738 if not project .releases .list ():
38- last_release_date = datetime (1900 , 1 , 1 )
39- log = f"Changelog of { project .name } :\n "
39+ log = f"Changelog of { project .name } :{ endstr } "
4040 else :
41- last_release = project .releases .list ()[0 ]
42- last_release_date = datetime .fromisoformat (last_release .created_at )
43- if last_mr_date < last_release_date :
44- raise ValueError (f"There is no merged merge request after the last release { last_release .name } " )
45- log = f"Changelog since release { last_release .name } of { project .name } :\n "
41+ last_release = project .releases .list ()[0 ]
42+ log = f"Changelog since release { last_release .name } of { project .name } :{ endstr } "
4643
4744 print (log )
4845 page = 0
49- while last_mr_date > last_release_date :
50- for imr , mr in enumerate (project .mergerequests .list (state = 'merged' , order_by = 'updated_at' , page = page )):
51- last_mr_date = datetime .fromisoformat (mr .merged_at )
52- if last_mr_date < last_release_date :
53- continue
54- line = f" * { mr .title } (@{ mr .author ['username' ]} )"
46+ list_mrs = project .mergerequests .list (state = 'merged' ,
47+ order_by = 'updated_at' ,
48+ updated_after = last_release .released_at ,
49+ page = page )
50+ if not list_mrs :
51+ raise ValueError (f"There is no merged merge request after the last release { last_release .name } " )
52+
53+ while list_mrs :
54+ for mr in list_mrs :
55+ line = f" * { mr .title } (@{ mr .author ['username' ]} ){ endstr } "
5556 log += line
5657 print (line )
57- page += 1
58+
59+ page += 1
60+ list_mrs = project .mergerequests .list (state = 'merged' ,
61+ order_by = 'updated_at' ,
62+ updated_after = last_release .released_at ,
63+ page = page
64+ )
65+
66+ return log
67+
68+
69+ def main ():
70+ import argparse
71+ parser = argparse .ArgumentParser ("Generate release notes for a gitlab repository \
72+ based on merge requests titles since last release" )
73+
74+ # Required
75+ parser .add_argument ("project_id" , type = int )
76+ # Optional
77+ parser .add_argument ("--url" , default = "https://gitlab.com" , required = False )
78+ parser .add_argument ("--private_token" , type = str , required = False , default = None )
79+
80+ args = parser .parse_args ()
81+
82+ notes = generate_release_notes (args .project_id , url = args .url , private_token = args .private_token )
83+
84+
85+ if __name__ == "__main__" :
86+ main ()
0 commit comments