Sync job files with internal CI
Sync job files with platform-ci commit:
539c151d0cd99a5e6ca6c0e6966f6d8579fe864e
Signed-off-by: Zelalem <zelalem.aweke@arm.com>
Change-Id: Ida470e00da76188ce3987d1fa93ec758b5e0f23a
diff --git a/job/tf-github-autoreply/github_pr_bot.py b/job/tf-github-autoreply/github_pr_bot.py
new file mode 100755
index 0000000..b21da50
--- /dev/null
+++ b/job/tf-github-autoreply/github_pr_bot.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python3
+#
+# Copyright (c) 2019-2020, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+import argparse
+import datetime
+import sys
+import os.path
+import logging
+
+try:
+ from github import Github
+except ImportError:
+ print(
+ "Can not import from github. PyGitHub may be missing. Check requirements.txt."
+ )
+ sys.exit(1)
+
+SCRIPT_DIR = os.path.dirname(__file__)
+logger = logging.getLogger()
+
+
+def commented_already(comments, bots):
+ """Check if our bots have left a comment."""
+ return any(comment.user.login in bots for comment in comments)
+
+
+def readfile(path):
+ """Read a file into a python string"""
+ with open(os.path.join(SCRIPT_DIR, path), "r") as textfile:
+ return textfile.read()
+
+
+def reply_to_issues(repo, bots, dry_run):
+ """Reply to all new issues without a bot reply"""
+ body = readfile("issue_comment.md")
+ logging.info("Replying to new issues on {}/{}".format(repo.owner.login, repo.name))
+ for issue in repo.get_issues(since=datetime.datetime(2019, 10, 17, 12)):
+ if not commented_already(issue.get_comments(), bots):
+ logging.info("Repliyng to issue #{}: {}".format(issue.number, issue.title))
+ if not dry_run:
+ issue.create_comment(body.format(user_name=issue.user.login))
+
+
+def reply_to_pull_requests(repo, bots, dry_run):
+ """Reply to all new Pull Requests without a bot reply"""
+ body = readfile("pull_comment.md")
+ logging.info("Replying to PRs on {}/{}".format(repo.owner.login, repo.name))
+ for pr in repo.get_pulls("status=open"):
+ # get_issue_comments() returns top-level PR comments.
+ # While get_comments() or get_review_comments()
+ # return comments against diff in the PR.
+ if not commented_already(pr.get_issue_comments(), bots):
+ logging.info("Repling to pull request #{}: {}".format(pr.number, pr.title))
+ if not dry_run:
+ pr.create_issue_comment(body.format(user_name=pr.user.login))
+
+
+def to_repo(gh, owner, name):
+ """Construct a Repo from a logged in Github object an owner and a repo name"""
+ return gh.get_user(owner).get_repo(name)
+
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser()
+ parser.add_argument("user", help="Username to login to GitHub")
+ parser.add_argument("pass", help="Password of the GitHub user")
+ parser.add_argument(
+ "--dry-run",
+ help="Just print what would be done",
+ default=False,
+ action="store_true",
+ )
+ parser.add_argument('--verbose', '-v', action='count', default=0, help="Increase verbosity of the printing")
+ args = parser.parse_args()
+
+ if args.verbose <= 0:
+ logger.setLevel(logging.ERROR)
+ elif args.verbose <= 1:
+ logger.setLevel(logging.INFO)
+ else:
+ logger.setLevel(logging.DEBUG)
+
+ repository_owner = "ARM-software"
+ repository_name = "arm-trusted-firmware"
+ issues_name = "tf-issues"
+ bots = {"arm-tf-bot", "ssg-bot", args.user}
+
+ gh = Github(args.user, getattr(args, "pass"))
+ pr_repo = to_repo(gh, repository_owner, repository_name)
+ reply_to_pull_requests(pr_repo, bots, args.dry_run)
+ issue_repo = to_repo(gh, repository_owner, issues_name)
+ reply_to_pull_requests(issue_repo, bots, args.dry_run)
+ reply_to_issues(issue_repo, bots, args.dry_run)