1
1
from github import Github
2
2
from github .Label import Label
3
3
from github .PullRequest import PullRequest
4
+ from github .Repository import Repository
5
+
4
6
from typing import List
5
7
import re
8
+ import os
9
+ import argparse
10
+
11
+ from .ghutil import find_milestone_by_name , get_prs
12
+ from .util import pr_link , author_link , human_list
6
13
7
- REPO = "PrismLauncher/PrismLauncher"
8
- MILESTONE = "8.0"
9
- TOKEN = os .environ ["GITHUB_TOKEN" ]
10
14
11
15
LABEL_PREFIX = "changelog:"
12
16
MERGED_CATEGORY = "merged"
20
24
]
21
25
22
26
23
- def pr_link (pr : PullRequest ):
24
- return f"[#{ pr .number } ](https://github.com/{ REPO } /pull/{ pr .number } )"
25
-
26
-
27
- def author_link (author : str ):
28
- return f"[@{ author } ](https://github.com/{ author } )"
29
-
30
-
31
- def human_list (x : List [str ]):
32
- if len (x ) < 1 :
33
- return "WTF??"
34
- elif len (x ) == 1 :
35
- return x [0 ]
36
- y = ", " .join (x [:- 1 ])
37
- y += f" and { x [- 1 ]} "
38
- return y
39
-
40
-
41
27
entries = []
42
28
43
29
@@ -46,6 +32,9 @@ def __init__(self, prs: List[PullRequest], category: str):
46
32
self .prs = prs
47
33
self .category = category
48
34
35
+ def merge (self , other : Change ):
36
+ this .prs += change .prs
37
+
49
38
def pr (self ):
50
39
return self .prs [0 ]
51
40
@@ -87,27 +76,38 @@ def categorize_pr(pr: PullRequest):
87
76
return Change ([pr ], category )
88
77
89
78
90
- if __name__ == "__main__" :
91
- output = []
79
+ def merge_child_changes (children : List [Change ], parents : List [Change ]):
80
+ for change in merged_changes :
81
+ m = re .match (PARENT_PATTERN , change .pr ().body )
82
+
83
+ assert m , f"'{ change } ' does not define a parent"
84
+
85
+ parent_number = int (m .group (1 ))
92
86
93
- g = Github (TOKEN )
87
+ found_parent = False
88
+ for other_change in top_level_changes :
89
+ if other_change .number () == parent_number :
90
+ other_change .merge (change )
91
+ found_parent = True
92
+ break
93
+ assert (
94
+ found_parent
95
+ ), f"'{ change } ' parent (#{ parent_number } ) was not found in this milestone"
94
96
95
- repo = g .get_repo (REPO )
96
97
97
- release_milestone = None
98
+ def generate (repo_name : str , milestone : str , token : str ):
99
+ g = Github (token )
98
100
99
- for milestone in repo .get_milestones ():
100
- if milestone .title == MILESTONE :
101
- release_milestone = milestone
102
- break
101
+ repo = g .get_repo (repo_name )
103
102
104
- issues = repo .get_issues (milestone = release_milestone , state = "all" )
105
- prs = map (
106
- lambda issue : issue .as_pull_request (),
107
- [* filter (lambda issue : issue .pull_request , issues )],
108
- )
109
- merged_prs = [* filter (lambda pr : pr .merged , prs )]
110
- changes = [* map (categorize_pr , merged_prs )]
103
+ release_milestone = find_milestone_by_name (repo , milestone )
104
+
105
+ assert (
106
+ release_milestone is not None
107
+ ), f"Milestone { milestone } not found in repository { repo .url } "
108
+
109
+ prs = get_prs (repo , milestone = release_milestone , state = "all" )
110
+ changes = [* map (categorize_pr , prs )]
111
111
112
112
merged_changes = [
113
113
* filter (lambda change : change .category == MERGED_CATEGORY , changes )
@@ -116,24 +116,7 @@ def categorize_pr(pr: PullRequest):
116
116
* filter (lambda change : change .category != MERGED_CATEGORY , changes )
117
117
]
118
118
119
- for change in merged_changes :
120
- m = re .match (PARENT_PATTERN , change .pr ().body )
121
-
122
- if m is not None :
123
- parent_number = int (m .group (1 ))
124
-
125
- found_parent = False
126
- for other_change in top_level_changes :
127
- if other_change .number () == parent_number :
128
- other_change .prs += change .prs
129
- found_parent = True
130
- break
131
- if not found_parent :
132
- print (
133
- f"'{ change } ' parent (#{ parent_number } ) was not found in this milestone"
134
- )
135
- else :
136
- print (f"'{ change } ' does not define a parent" )
119
+ merge_child_changes (merged_changes , top_level_changes )
137
120
138
121
final_changes = sorted (top_level_changes , key = lambda x : x .title ())
139
122
print ("---" )
@@ -147,3 +130,19 @@ def categorize_pr(pr: PullRequest):
147
130
print (change .changelog_entry ())
148
131
149
132
print ()
133
+
134
+
135
+ def main ():
136
+ parser = argparse .ArgumentParser ()
137
+ parser .add_argument ("repo" )
138
+ parser .add_argument ("milestone" )
139
+
140
+ args = parser .parse_args ()
141
+
142
+ token = os .environ ["GITHUB_TOKEN" ]
143
+
144
+ generate (args .repo , args .milestone , token )
145
+
146
+
147
+ if __name__ == "__main__" :
148
+ main ()
0 commit comments