diff --git a/scripts/release_issue_status/main.py b/scripts/release_issue_status/main.py
index ef8f6b640988..ec98923120cf 100644
--- a/scripts/release_issue_status/main.py
+++ b/scripts/release_issue_status/main.py
@@ -11,8 +11,7 @@
import reply_generator as rg
from utils import update_issue_body, get_readme_and_output_folder, \
- get_python_pipelines, get_pipeline_url, auto_close_issue
-
+ get_python_pipelines, get_pipeline_url, auto_close_issue
_NULL = ' '
_FILE_OUT = 'release_issue_status.csv'
@@ -23,6 +22,7 @@
logging.basicConfig(level=logging.INFO,
format='[auto-reply log] - %(funcName)s[line:%(lineno)d] - %(levelname)s: %(message)s')
+
def my_print(cmd):
print('==' + cmd + ' ==\n')
@@ -39,12 +39,13 @@ def output_python_md(issue_status_python):
file_out.write('| ------ | ------ | ------ | ------ | ------ | ------ | ------ | :-----: |\n')
file_out.writelines([item.output_python() for item in sorted(issue_status_python, key=_key_select)])
+
def output_csv(issue_status):
with open(_FILE_OUT, 'w') as file_out:
file_out.write('language,issue,author,package,created date,delay from created date,latest update time,'
'delay from latest update,status,bot advice\n')
file_out.writelines([item.output() for item in sorted(issue_status, key=_key_select)])
-
+
class IssueStatus:
link = _NULL
@@ -75,7 +76,6 @@ def output(self):
self.delay_from_latest_update,
self.status, self.bot_advice)
-
def output_python(self):
package = self.package.split('-')[-1]
create_date = str(date.fromtimestamp(self.create_date).strftime('%m-%d'))
@@ -85,12 +85,13 @@ def output_python(self):
else:
days_from_target = ' '
- return '| [#{}]({}) | {} | {} | {} | {} | {} | {} | {} |\n'.format(self.link.split('/')[-1], self.link, self.author,
- package, self.assignee, self.bot_advice,
- create_date,
- target_date,
- days_from_target
- )
+ return '| [#{}]({}) | {} | {} | {} | {} | {} | {} | {} |\n'.format(self.link.split('/')[-1], self.link,
+ self.author,
+ package, self.assignee, self.bot_advice,
+ create_date,
+ target_date,
+ days_from_target
+ )
def _extract(str_list, key_word):
@@ -148,7 +149,8 @@ def auto_reply(item, request_repo, rest_repo, sdk_repo, duplicated_issue, python
if 'auto-link' not in item.labels:
item.issue_object.add_to_labels('auto-link')
try:
- package_name, readme_link, output_folder = update_issue_body(request_repo, rest_repo, item.issue_object.number)
+ package_name, readme_link, output_folder = update_issue_body(request_repo, rest_repo,
+ item.issue_object.number)
logging.info("pkname, readme", package_name, readme_link)
item.package = package_name
key = ('Python', item.package)
@@ -163,7 +165,7 @@ def auto_reply(item, request_repo, rest_repo, sdk_repo, duplicated_issue, python
readme_link, output_folder = get_readme_and_output_folder(request_repo, rest_repo, item.issue_object.number)
except Exception as e:
logging.info('Issue: {} get pkname and output folder failed'.format(item.issue_object.number))
- item.bot_advice = 'failed to find Readme link and output folder. Please check !!'
+ item.bot_advice = 'failed to find Readme link and output folder!
'
item.issue_object.add_to_labels('attention')
logging.info(e)
raise
@@ -176,7 +178,7 @@ def auto_reply(item, request_repo, rest_repo, sdk_repo, duplicated_issue, python
if 'Configured' in item.labels:
item.issue_object.remove_from_labels('Configured')
except Exception as e:
- item.bot_advice = 'auto reply failed, Please intervene manually !!'
+ item.bot_advice = 'auto reply failed!
'
logging.info('Error from auto reply')
logging.info('Issue:{}'.format(item.issue_object.number))
logging.info(traceback.format_exc())
@@ -208,7 +210,8 @@ def main():
issue.author = item.user.login
issue.package = _extract(item.body.split('\n'), 'azure-.*')
issue.target_date = [x.split(':')[-1].strip() for x in item.body.split('\n') if 'Target release date' in x][0]
- issue.days_from_target = int((time.mktime(time.strptime(issue.target_date, '%Y-%m-%d')) - time.time())/3600/24)
+ issue.days_from_target = int(
+ (time.mktime(time.strptime(issue.target_date, '%Y-%m-%d')) - time.time()) / 3600 / 24)
issue.create_date = item.created_at.timestamp()
issue.delay_from_create_date = int((time.time() - item.created_at.timestamp()) / 3600 / 24)
issue.latest_update = item.updated_at.timestamp()
@@ -220,10 +223,9 @@ def main():
issue.whether_author_comment = _whether_author_comment(item.get_comments())
issue.issue_object = item
issue.labels = [label.name for label in item.labels]
- issue.days_from_latest_commit = _latest_comment_time(item.get_comments(), issue.delay_from_create_date)
+ issue.days_from_latest_comment = _latest_comment_time(item.get_comments(), issue.delay_from_create_date)
if item.assignee:
issue.assignee = item.assignee.login
-
issue_status.append(issue)
key = (issue.language, issue.package)
duplicated_issue[key] = duplicated_issue.get(key, 0) + 1
@@ -239,51 +241,52 @@ def main():
# rule7: if delay from created date is over 15 days and owner never reply, remind owner to handle it.
for item in issue_status:
if item.language == 'Python':
- issue_status_python.append(item)
+ assigner_repo = assigner_repoes[item.assignee]
+ item.issue_object = assigner_repo.get_issue(number=item.issue_object.number)
+ issue_status_python.append(item)
if item.status == 'release':
item.bot_advice = 'better to release asap.'
elif (item.comment_num == 0 or 'Configured' in item.labels) and 'Python' in item.labels:
- item.bot_advice = 'new issue and better to confirm quickly.'
+ item.bot_advice = 'new issue !
'
if 'assigned' not in item.labels:
time.sleep(0.1)
assign_count = int(str(time.time())[-1]) % len(_PYTHON_SDK_ASSIGNEES)
item.issue_object.remove_from_assignees(item.assignee)
item.issue_object.add_to_assignees(_PYTHON_SDK_ASSIGNEES[assign_count])
- item.assignee=item.issue_object.assignee.login
+ item.assignee = item.issue_object.assignee.login
item.issue_object.add_to_labels('assigned')
try:
auto_reply(item, request_repo, rest_repo, sdk_repo, duplicated_issue, python_piplines, assigner_repoes)
except Exception as e:
continue
elif not item.author_latest_comment in _PYTHON_SDK_ADMINISTRATORS:
- item.bot_advice = 'new comment for author.'
- elif item.delay_from_latest_update >= 7:
- item.bot_advice = 'delay for a long time '
+ item.bot_advice = 'new comment.
'
if item.comment_num > 1 and item.language == 'Python':
try:
auto_close_issue(request_repo, item)
except Exception as e:
item.bot_advice = 'auto-close failed, please check!'
logging.info(f"=====issue: {item.issue_object.number}, {e}")
-
+
if 'base-branch-attention' in item.labels:
item.bot_advice = 'new version is 0.0.0, please check base branch! ' + item.bot_advice
if abs(item.days_from_target) < 3:
item.bot_advice += ' release date < 2 !
'
-
- if item.days_from_latest_commit >= 30 and item.language == 'Python' and '30days attention' not in item.labels:
- item.issue_object.add_to_labels('30days attention')
- item.issue_object.create_comment(f'hi @{item.author}, the issue is closed since there is no reply for a long time. Please reopen it if necessary or create new one.')
+
+ if item.days_from_latest_comment >= 15 and item.language == 'Python' and '7days attention' in item.labels and item.days_from_target < 0:
+ item.issue_object.create_comment(
+ f'hi @{item.author}, the issue is closed since there is no reply for a long time. Please reopen it if necessary or create new one.')
item.issue_object.edit(state='close')
- elif item.days_from_latest_commit >= 15 and item.language == 'Python' and '15days attention' not in item.labels:
- item.issue_object.create_comment(f'hi @{item.author}, this release-request has been delayed more than 15 days,'
- ' please deal with it ASAP. We will close the issue if there is still no response after 15 days!')
- item.issue_object.add_to_labels('15days attention')
+ elif item.days_from_latest_comment >= 7 and item.language == 'Python' and '7days attention' not in item.labels and item.days_from_target < 7:
+ item.issue_object.create_comment(
+ f'hi @{item.author}, this release-request has been delayed more than 7 days,'
+ ' please deal with it ASAP. We will close the issue if there is still no response after 7 days!')
+ item.issue_object.add_to_labels('7days attention')
# judge whether there is duplicated issue for same package
if item.package != _NULL and duplicated_issue.get((item.language, item.package)) > 1:
- item.bot_advice = f'duplicated issue for {item.package}. ' + item.bot_advice
+ item.bot_advice = f'duplicated issue
' + item.bot_advice
# output result
output_python_md(issue_status_python)
@@ -294,12 +297,11 @@ def main():
print_check('git commit -m \"update excel\"')
print_check('git push -f origin HEAD')
- # upload to storage account(it is created in advance)
+# upload to storage account(it is created in advance)
# blob = BlobClient.from_connection_string(conn_str=os.getenv('CONN_STR'), container_name=os.getenv('FILE'),
# blob_name=_FILE_OUT)
# with open(_FILE_OUT, 'rb') as data:
# blob.upload_blob(data, overwrite=True)
-
if __name__ == '__main__':
main()