5
5
from datetime import date , datetime
6
6
import subprocess as sp
7
7
from azure .storage .blob import BlobClient
8
+ import reply_generator as rg
9
+ from update_issue_body import update_issue_body , find_readme_link
10
+ import traceback
8
11
9
12
_NULL = ' '
10
13
_FILE_OUT = 'release_issue_status.csv'
14
+ _FILE_OUT_PYTHON = 'release_python_status.md'
11
15
_PYTHON_SDK_ADMINISTRATORS = {'msyyc' , 'RAY-316' , 'BigCat20196' }
12
16
13
-
14
17
def my_print (cmd ):
15
18
print ('==' + cmd + ' ==\n ' )
16
19
@@ -20,6 +23,20 @@ def print_check(cmd):
20
23
sp .check_call (cmd , shell = True )
21
24
22
25
26
+ def output_python_md (issue_status_python ):
27
+ with open (_FILE_OUT_PYTHON , 'w' ) as file_out :
28
+ file_out .write ('| issue | author | package | assignee | bot advice | created date of issue | delay from created date |\n ' )
29
+ file_out .write ('| ------ | ------ | ------ | ------ | ------ | ------ | :-----: |\n ' )
30
+ file_out .writelines ([item .output_python () for item in sorted (issue_status_python , key = _key_select )])
31
+
32
+
33
+ def output_csv (issue_status ):
34
+ with open (_FILE_OUT , 'w' ) as file_out :
35
+ file_out .write ('language,issue,author,package,created date,delay from created date,latest update time,'
36
+ 'delay from latest update,status,bot advice\n ' )
37
+ file_out .writelines ([item .output () for item in sorted (issue_status , key = _key_select )])
38
+
39
+
23
40
class IssueStatus :
24
41
link = _NULL
25
42
author = _NULL
@@ -36,6 +53,7 @@ class IssueStatus:
36
53
whether_author_comment = True
37
54
issue_object = _NULL
38
55
labels = _NULL
56
+ assignee = _NULL
39
57
40
58
def output (self ):
41
59
return '{},{},{},{},{},{},{},{},{},{}\n ' .format (self .language , self .link , self .author ,
@@ -46,6 +64,13 @@ def output(self):
46
64
self .delay_from_latest_update ,
47
65
self .status , self .bot_advice )
48
66
67
+
68
+ def output_python (self ):
69
+ return '| [#{}]({}) | {} | {} | {} | {} | {} | {} |\n ' .format (self .link .split ('/' )[- 1 ], self .link , self .author ,
70
+ self .package , self .assignee , self .bot_advice ,
71
+ str (date .fromtimestamp (self .create_date )),
72
+ self .delay_from_create_date )
73
+
49
74
50
75
def _extract (str_list , key_word ):
51
76
for item in str_list :
@@ -86,8 +111,7 @@ def _extract_author_latest_comment(comments):
86
111
def _whether_author_comment (comments ):
87
112
q = set (comment .user .login for comment in comments )
88
113
diff = q .difference (_PYTHON_SDK_ADMINISTRATORS )
89
-
90
- return len (diff ) > 0
114
+ return len (diff ) > 0
91
115
92
116
def _latest_comment_time (comments , delay_from_create_date ):
93
117
q = [(comment .updated_at .timestamp (), comment .user .login )
@@ -96,13 +120,50 @@ def _latest_comment_time(comments, delay_from_create_date):
96
120
97
121
return delay_from_create_date if not q else int ((time .time () - q [- 1 ][0 ]) / 3600 / 24 )
98
122
123
+
124
+ def auto_reply (item , sdk_repo , rest_repo , duplicated_issue ):
125
+ print ("==========new issue number: {}" .format (item .issue_object .number ))
126
+ if 'auto-link' not in item .labels :
127
+ try :
128
+ package_name , readme_link = update_issue_body (sdk_repo , rest_repo , item .issue_object .number )
129
+ print ("pkname, readme" , package_name , readme_link )
130
+ item .package = package_name
131
+ key = ('Python' , item .package )
132
+ duplicated_issue [key ] = duplicated_issue .get (key , 0 ) + 1
133
+ except Exception as e :
134
+ item .bot_advice = 'failed to modify the body of the new issue. Please modify manually'
135
+ item .labels .append ('attention' )
136
+ print (e )
137
+ raise
138
+ item .labels .append ('auto-link' )
139
+ item .issue_object .set_labels (* item .labels )
140
+ else :
141
+ try :
142
+ readme_link = find_readme_link (sdk_repo , item .issue_object .number )
143
+ except Exception as e :
144
+ print ('Issue: {} updates body failed' .format (item .issue_object .number ))
145
+ item .bot_advice = 'failed to find Readme link, Please check !!'
146
+ item .labels .append ('attention' )
147
+ raise
148
+ try :
149
+ reply = rg .begin_reply_generate (item = item , rest_repo = rest_repo , readme_link = readme_link )
150
+ except Exception as e :
151
+ item .bot_advice = 'auto reply failed, Please intervene manually !!'
152
+ print ('Error from auto reply ========================' )
153
+ print ('Issue:{}' .format (item .issue_object .number ))
154
+ print (traceback .format_exc ())
155
+ print ('==============================================' )
156
+
157
+
99
158
def main ():
100
159
# get latest issue status
101
160
g = Github (os .getenv ('TOKEN' )) # please fill user_token
102
- repo = g .get_repo ('Azure/sdk-release-request' )
103
- label1 = repo .get_label ('ManagementPlane' )
104
- open_issues = repo .get_issues (state = 'open' , labels = [label1 ])
161
+ sdk_repo = g .get_repo ('Azure/sdk-release-request' )
162
+ rest_repo = g .get_repo ('Azure/azure-rest-api-specs' )
163
+ label1 = sdk_repo .get_label ('ManagementPlane' )
164
+ open_issues = sdk_repo .get_issues (state = 'open' , labels = [label1 ])
105
165
issue_status = []
166
+ issue_status_python = []
106
167
duplicated_issue = dict ()
107
168
start_time = time .time ()
108
169
for item in open_issues :
@@ -124,7 +185,9 @@ def main():
124
185
issue .issue_object = item
125
186
issue .labels = [label .name for label in item .labels ]
126
187
issue .days_from_latest_commit = _latest_comment_time (item .get_comments (), issue .delay_from_create_date )
127
-
188
+ if item .assignee :
189
+ issue .assignee = item .assignee .login
190
+
128
191
issue_status .append (issue )
129
192
key = (issue .language , issue .package )
130
193
duplicated_issue [key ] = duplicated_issue .get (key , 0 ) + 1
@@ -135,18 +198,23 @@ def main():
135
198
# rule2: if latest comment is from author, need response asap
136
199
# rule3: if comment num is 0, it is new issue, better to deal with it asap
137
200
# rule4: if delay from latest update is over 7 days, better to deal with it soon.
138
- # rule5: if delay from created date is over 30 days and owner never reply, close it.
139
- # rule6: if delay from created date is over 15 days and owner never reply, remind owner to handle it.
201
+ # rule5: if delay from created date is over 30 days, better to close.
202
+ # rule6: if delay from created date is over 30 days and owner never reply, close it.
203
+ # rule7: if delay from created date is over 15 days and owner never reply, remind owner to handle it.
140
204
for item in issue_status :
141
205
if item .status == 'release' :
142
206
item .bot_advice = 'better to release asap.'
143
- elif item .author == item .author_latest_comment :
144
- item .bot_advice = 'new comment for author.'
145
- elif item .comment_num == 0 :
207
+ elif item .comment_num == 0 and 'Python' in item .labels :
146
208
item .bot_advice = 'new issue and better to confirm quickly.'
209
+ try :
210
+ auto_reply (item , sdk_repo , rest_repo , duplicated_issue )
211
+ except Exception as e :
212
+ continue
213
+ elif not item .author_latest_comment in _PYTHON_SDK_ADMINISTRATORS :
214
+ item .bot_advice = 'new comment for author.'
147
215
elif item .delay_from_latest_update >= 7 :
148
216
item .bot_advice = 'delay for a long time and better to handle now.'
149
-
217
+
150
218
if item .days_from_latest_commit >= 30 and item .language == 'Python' and '30days attention' not in item .labels :
151
219
item .labels .append ('30days attention' )
152
220
item .issue_object .set_labels (* item .labels )
@@ -157,17 +225,17 @@ def main():
157
225
' please deal with it ASAP. We will close the issue if there is still no response after 15 days!' )
158
226
item .labels .append ('15days attention' )
159
227
item .issue_object .set_labels (* item .labels )
160
-
161
-
228
+
162
229
# judge whether there is duplicated issue for same package
163
230
if item .package != _NULL and duplicated_issue .get ((item .language , item .package )) > 1 :
164
231
item .bot_advice = f'Warning:There is duplicated issue for { item .package } . ' + item .bot_advice
232
+
233
+ if item .language == 'Python' :
234
+ issue_status_python .append (item )
165
235
166
236
# output result
167
- with open (_FILE_OUT , 'w' ) as file_out :
168
- file_out .write ('language,issue,author,package,created date,delay from created date,latest update time,'
169
- 'delay from latest update,status,bot advice\n ' )
170
- file_out .writelines ([item .output () for item in sorted (issue_status , key = _key_select )])
237
+ output_python_md (issue_status_python )
238
+ output_csv (issue_status )
171
239
172
240
# commit to github
173
241
print_check ('git add .' )
@@ -179,7 +247,7 @@ def main():
179
247
blob_name = _FILE_OUT )
180
248
with open (_FILE_OUT , 'rb' ) as data :
181
249
blob .upload_blob (data , overwrite = True )
182
-
250
+
183
251
184
252
if __name__ == '__main__' :
185
253
main ()
0 commit comments