diff --git a/advisors/gitee.py b/advisors/gitee.py index 47b45012682705b4916013b4ae6c7f4b14c345f6..46ecffb7fe05777974e7fb2336d4556c2fc11a1c 100755 --- a/advisors/gitee.py +++ b/advisors/gitee.py @@ -55,11 +55,12 @@ class Gitee(object): print("WARNING:" + str(err.headers)) return False - def fork_repo(self, repo): + def fork_repo(self, repo, owner="src-openeuler"): """ Fork repository in gitee """ - url = "https://gitee.com/api/v5/repos/src-openeuler/{repo}/forks".format(repo=repo) + url_template = "https://gitee.com/api/v5/repos/{owner}/{repo}/forks" + url = url_template.format(owner=owner, repo=repo) values = {} values["access_token"] = self.token["access_token"] #headers["User-Agent"] = "curl/7.66.0" @@ -79,14 +80,15 @@ class Gitee(object): Yours openEuler-Advisor.""" self.post_issue(repo, title, body) - def get_reviewers(self, repo): + def get_reviewers(self, repo, owner="src-openeuler"): """ Get reviewers of pkg """ - url = "https://gitee.com/api/v5/repos/src-openeuler/{pkg}/collaborators".format(pkg=repo) + url_template = "https://gitee.com/api/v5/repos/{owner}/{pkg}/collaborators" + url = url_template.format(owner=owner, pkg=repo) return self.get_gitee(url) - def create_pr(self, head, repo, version, branch): + def create_pr(self, head, repo, version, branch, owner="src-openeuler"): """ Create PR in gitee """ @@ -95,7 +97,8 @@ class Gitee(object): if reviewer_info: reviewer_list = json.loads(reviewer_info) assignees = ",".join(reviewer["login"] for reviewer in reviewer_list) - url = "https://gitee.com/api/v5/repos/src-openeuler/{pkg}/pulls".format(pkg=repo) + url_template = "https://gitee.com/api/v5/repos/{owner}/{pkg}/pulls" + url = url_template.format(owner=owner, pkg=repo) values = {} values["access_token"] = self.token["access_token"] values["title"] = "Upgrade {pkg} to {ver}".format(pkg=repo, ver=version) @@ -109,6 +112,17 @@ class Gitee(object): Yours openEuler-Advisor.""" return self.post_gitee(url, values) + def create_pr_comment(self, repo, number, body, owner="src-openeuler"): + """ + Post comment to the given specific PR + """ + url_template = "https://gitee.com/api/v5/repos/{owner}/{repo}/pulls/{number}/comments" + url = url_template.format(owner=owner, repo=repo, number=number) + values = {} + values["access_token"] = self.token["access_token"] + values["body"] = body + return self.post_gitee(url, values) + def get_gitee(self, url, headers=None): """ GET from gitee api @@ -123,6 +137,14 @@ class Gitee(object): except urllib.error.HTTPError: return None + def get_pr(self, repo, num, owner="src-openeuler"): + """ + Get detailed information of the given specific PR + """ + url_template = "https://gitee.com/api/v5/repos/{owner}/{repo}/pulls/{number}" + url = url_template.format(owner=owner,repo=repo,number=num) + return self.get_gitee_json(url) + def get_gitee_json(self, url): """ Get and load gitee json response diff --git a/advisors/tc_review b/advisors/tc_review new file mode 100755 index 0000000000000000000000000000000000000000..1922a02b5d8f3e0412eae251651515b24dc6eb01 --- /dev/null +++ b/advisors/tc_review @@ -0,0 +1,91 @@ +#!/usr/bin/python3 +#****************************************************************************** +# Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved. +# licensed under the Mulan PSL v2. +# You can use this software according to the terms and conditions of the Mulan PSL v2. +# You may obtain a copy of Mulan PSL v2 at: +# http://license.coscl.org.cn/MulanPSL2 +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR +# PURPOSE. +# See the Mulan PSL v2 for more details. +# ******************************************************************************/ +""" +Review tool for openEuler submission +""" +import os +import argparse +import subprocess + +import gitee + +def check_repository_changes(): + lst_files = subprocess.getoutput("git diff --name-only remotes/origin/master..") + for item in lst_files.splitlines(): + if item.startswith("sig/sigs.yaml"): + return True + else: + return False + +def check_maintainer_changes(): + """ + return a list of SIGs with changed maintainer + """ + sigs = [] + lst_files = subprocess.getoutput("git diff --name-only remotes/origin/master..") + for item in lst_files.splitlines(): + if item.startswith("sig") and item.endswith("OWNERS"): + sigs.append(item.split("/")[1]) + return sigs + + +def review(pr): + review_body = "" + review_body += "[ ] Is the Title of this PR self-explain ?\n" + review_body += "[ ] Is the description of this PR detailed ?\n" + review_body += "[ ] Does the PR match the code changes ?\n" + sigs = check_maintainer_changes() + if sigs: + review_body += "Changes in maintainship detected: \n" + review_body += "[ ] If new maintainer added, are there any assertion on his/her capability on maintainship ?\n" + for sig in sigs: + review_body += "[ ] Do other maintainers of {sig} also agree to add/remove his/her as a maintainer ?\n".format(sig=sig) + if check_repository_changes(): + review_body += "Changes in sigs.yaml detected: \n" + review_body += "[ ] Are all changed repositories managed by proper SIG ?\n" + review_body += "[ ] Do all affected SIG maintainers agree the change ?\n" + return review_body + +def main(): + """ + Main entrance of the functionality + """ + pars = argparse.ArgumentParser() + pars.add_argument("-p", "--pull", type=str, help="Number ID of Pull Request", required=True) + pars.add_argument("-r", "--reuse", help="Reuse current local git dirctory", action="store_true") + + args = pars.parse_args() + + user_gitee = gitee.Gitee() + + gitee_url = "git@gitee.com:openeuler/community" + + if not args.reuse: + subprocess.call(["git", "clone", gitee_url]) + os.chdir(args.repo.split('/')[1]) + + subprocess.call(["git", "fetch", gitee_url, + "pull/{n}/head:pr_{n}".format(n=args.pull)]) + + print("You are reviewing pull {n}".format(n=args.pull)) + + subprocess.call(["git", "checkout", "pr_{n}".format(n=args.pull)]) + subprocess.call(["git", "merge", "--no-edit", "master"]) + + pr = user_gitee.get_pr("community", args.pull, "openeuler") + review_comment = review(pr) + + user_gitee.create_pr_comment("community", args.pull, review_comment, "openeuler") + +if __name__ == "__main__": + main()