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()