From e34e634a065635a60c996f057131e3e14ff847a7 Mon Sep 17 00:00:00 2001 From: tianshuo78520a <707759223@qq.com> Date: Wed, 28 Dec 2022 16:28:52 +0800 Subject: [PATCH] Add CheckPRTemplate.py (#49298) * Add CheckPRTemplate.py;test=document_fix;test=prtemplate * Add CheckPRTemplate.py;test=document_fix;test=prtemplate * Add CheckPRTemplate.py;test=document_fix;test=prtemplate --- tools/CheckPRTemplate.py | 153 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 153 insertions(+) create mode 100644 tools/CheckPRTemplate.py diff --git a/tools/CheckPRTemplate.py b/tools/CheckPRTemplate.py new file mode 100644 index 00000000000..9e019e30706 --- /dev/null +++ b/tools/CheckPRTemplate.py @@ -0,0 +1,153 @@ +# Copyright (c) 2022 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import re +import sys + +import requests + +PR_checkTemplate = ['Paddle'] + +REPO_TEMPLATE = { + "Paddle": r'''### PR types(.*[^\s].*)### PR changes(.*[^\s].*)### Describe(.*[^\s].*)''' +} + + +def re_rule(body, CHECK_TEMPLATE): + PR_RE = re.compile(CHECK_TEMPLATE, re.DOTALL) + result = PR_RE.search(body) + return result + + +def parameter_accuracy(body): + PR_dic = {} + PR_types = [ + 'New features', + 'Bug fixes', + 'Function optimization', + 'Performance optimization', + 'Breaking changes', + 'Others', + ] + PR_changes = ['OPs', 'APIs', 'Docs', 'Others'] + body = re.sub("\r\n", "", body) + type_end = body.find('### PR changes') + changes_end = body.find('### Describe') + PR_dic['PR types'] = body[len('### PR types') : type_end] + PR_dic['PR changes'] = body[type_end + 14 : changes_end] + message = '' + for key in PR_dic: + test_list = PR_types if key == 'PR types' else PR_changes + test_list_lower = [l.lower() for l in test_list] + value = PR_dic[key].strip().split(',') + single_mess = '' + if len(value) == 1 and value[0] == '': + message += '%s should be in %s. but now is None.' % (key, test_list) + else: + for i in value: + i = i.strip().lower() + if i not in test_list_lower: + single_mess += '%s.' % i + if len(single_mess) != 0: + message += '%s should be in %s. but now is [%s].' % ( + key, + test_list, + single_mess, + ) + return message + + +def checkComments(url): + headers = { + 'Authorization': 'token ' + GITHUB_API_TOKEN, + } + response = requests.get(url, headers=headers).json() + return response + + +def checkPRTemplate(repo, body, CHECK_TEMPLATE): + """ + Check if PR's description meet the standard of template + Args: + body: PR's Body. + CHECK_TEMPLATE: check template str. + Returns: + res: True or False + """ + res = False + note = r'\r\n|||' + if body is None: + body = '' + body = re.sub(note, "", body) + result = re_rule(body, CHECK_TEMPLATE) + message = '' + if len(CHECK_TEMPLATE) == 0 and len(body) == 0: + res = False + elif result is not None: + message = parameter_accuracy(body) + res = True if message == '' else False + elif result is None: + res = False + message = parameter_accuracy(body) + return res, message + + +def pull_request_event_template(event, repo, *args, **kwargs): + pr_effect_repos = PR_checkTemplate + pr_num = event['number'] + url = event["comments_url"] + BODY = event["body"] + sha = event["head"]["sha"] + title = event["title"] + pr_user = event["user"]["login"] + print(f'接收数据:pr_num: {pr_num}, title: {title}, user: {pr_user}') + if repo in pr_effect_repos: + CHECK_TEMPLATE = REPO_TEMPLATE[repo] + global check_pr_template + global check_pr_template_message + check_pr_template, check_pr_template_message = checkPRTemplate( + repo, BODY, CHECK_TEMPLATE + ) + print("check_pr_template: %s pr: %s" % (check_pr_template, pr_num)) + if check_pr_template is False: + print("ERROR MESSAGE:", check_pr_template_message) + sys.exit(7) + else: + sys.exit(0) + + +def get_a_pull(pull_id): + url = "https://api.github.com/repos/PaddlePaddle/Paddle/pulls/ " + str( + pull_id + ) + + payload = {} + headers = { + 'Authorization': 'token ' + GITHUB_API_TOKEN, + 'Accept': 'application/vnd.github+json', + } + response = requests.request("GET", url, headers=headers, data=payload) + return response.json() + + +def main(org, repo, pull_id): + pull_info = get_a_pull(pull_id) + pull_request_event_template(pull_info, repo) + + +if __name__ == "__main__": + AGILE_PULL_ID = os.getenv("AGILE_PULL_ID") + GITHUB_API_TOKEN = os.getenv("GITHUB_API_TOKEN") + main("PaddlePaddle", "Paddle", AGILE_PULL_ID) -- GitLab