From c98e736e3b2354d8bbe91c56fc3698a491c0f60b Mon Sep 17 00:00:00 2001 From: mrT23 Date: Fri, 16 Feb 2024 14:49:01 +0200 Subject: [PATCH] added github action support --- .../git_providers/azuredevops_provider.py | 2 +- pr_agent/git_providers/bitbucket_provider.py | 2 +- .../bitbucket_server_provider.py | 2 +- pr_agent/git_providers/codecommit_provider.py | 2 +- pr_agent/git_providers/gerrit_provider.py | 2 +- pr_agent/git_providers/git_provider.py | 2 +- pr_agent/git_providers/github_provider.py | 4 +++- pr_agent/git_providers/gitlab_provider.py | 2 +- pr_agent/servers/github_action_runner.py | 23 ++++++++++++------- pr_agent/servers/github_app.py | 8 +++++-- 10 files changed, 31 insertions(+), 18 deletions(-) diff --git a/pr_agent/git_providers/azuredevops_provider.py b/pr_agent/git_providers/azuredevops_provider.py index 75fa6001..0b7e76ee 100644 --- a/pr_agent/git_providers/azuredevops_provider.py +++ b/pr_agent/git_providers/azuredevops_provider.py @@ -444,7 +444,7 @@ class AzureDevopsProvider(GitProvider): "Azure DevOps provider does not support issue comments yet" ) - def add_eyes_reaction(self, issue_comment_id: int) -> Optional[int]: + def add_eyes_reaction(self, issue_comment_id: int, disable_eyes: bool = False) -> Optional[int]: return True def remove_reaction(self, issue_comment_id: int, reaction_id: int) -> bool: diff --git a/pr_agent/git_providers/bitbucket_provider.py b/pr_agent/git_providers/bitbucket_provider.py index 342f592c..62ea46c7 100644 --- a/pr_agent/git_providers/bitbucket_provider.py +++ b/pr_agent/git_providers/bitbucket_provider.py @@ -298,7 +298,7 @@ class BitbucketProvider(GitProvider): "Bitbucket provider does not support issue comments yet" ) - def add_eyes_reaction(self, issue_comment_id: int) -> Optional[int]: + def add_eyes_reaction(self, issue_comment_id: int, disable_eyes: bool = False) -> Optional[int]: return True def remove_reaction(self, issue_comment_id: int, reaction_id: int) -> bool: diff --git a/pr_agent/git_providers/bitbucket_server_provider.py b/pr_agent/git_providers/bitbucket_server_provider.py index c8ac30f2..3b8168ea 100644 --- a/pr_agent/git_providers/bitbucket_server_provider.py +++ b/pr_agent/git_providers/bitbucket_server_provider.py @@ -288,7 +288,7 @@ class BitbucketServerProvider(GitProvider): "Bitbucket provider does not support issue comments yet" ) - def add_eyes_reaction(self, issue_comment_id: int) -> Optional[int]: + def add_eyes_reaction(self, issue_comment_id: int, disable_eyes: bool = False) -> Optional[int]: return True def remove_reaction(self, issue_comment_id: int, reaction_id: int) -> bool: diff --git a/pr_agent/git_providers/codecommit_provider.py b/pr_agent/git_providers/codecommit_provider.py index 50398c17..cbaf75f1 100644 --- a/pr_agent/git_providers/codecommit_provider.py +++ b/pr_agent/git_providers/codecommit_provider.py @@ -297,7 +297,7 @@ class CodeCommitProvider(GitProvider): settings_filename = ".pr_agent.toml" return self.codecommit_client.get_file(self.repo_name, settings_filename, self.pr.source_commit, optional=True) - def add_eyes_reaction(self, issue_comment_id: int) -> Optional[int]: + def add_eyes_reaction(self, issue_comment_id: int, disable_eyes: bool = False) -> Optional[int]: get_logger().info("CodeCommit provider does not support eyes reaction yet") return True diff --git a/pr_agent/git_providers/gerrit_provider.py b/pr_agent/git_providers/gerrit_provider.py index a1491c78..5a6da1a2 100644 --- a/pr_agent/git_providers/gerrit_provider.py +++ b/pr_agent/git_providers/gerrit_provider.py @@ -212,7 +212,7 @@ class GerritProvider(GitProvider): raise NotImplementedError( 'Getting labels is not implemented for the gerrit provider') - def add_eyes_reaction(self, issue_comment_id: int): + def add_eyes_reaction(self, issue_comment_id: int, disable_eyes: bool = False): raise NotImplementedError( 'Adding reactions is not implemented for the gerrit provider') diff --git a/pr_agent/git_providers/git_provider.py b/pr_agent/git_providers/git_provider.py index 69454f0e..35511382 100644 --- a/pr_agent/git_providers/git_provider.py +++ b/pr_agent/git_providers/git_provider.py @@ -162,7 +162,7 @@ class GitProvider(ABC): pass @abstractmethod - def add_eyes_reaction(self, issue_comment_id: int) -> Optional[int]: + def add_eyes_reaction(self, issue_comment_id: int, disable_eyes: bool = False) -> Optional[int]: pass @abstractmethod diff --git a/pr_agent/git_providers/github_provider.py b/pr_agent/git_providers/github_provider.py index b4e530a0..f7f1e529 100644 --- a/pr_agent/git_providers/github_provider.py +++ b/pr_agent/git_providers/github_provider.py @@ -452,7 +452,9 @@ class GithubProvider(GitProvider): except Exception: return "" - def add_eyes_reaction(self, issue_comment_id: int) -> Optional[int]: + def add_eyes_reaction(self, issue_comment_id: int, disable_eyes: bool = False) -> Optional[int]: + if disable_eyes: + return None try: reaction = self.pr.get_issue_comment(issue_comment_id).create_reaction("eyes") return reaction.id diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py index 7e604c40..d0e8d575 100644 --- a/pr_agent/git_providers/gitlab_provider.py +++ b/pr_agent/git_providers/gitlab_provider.py @@ -368,7 +368,7 @@ class GitLabProvider(GitProvider): except Exception: return "" - def add_eyes_reaction(self, issue_comment_id: int) -> Optional[int]: + def add_eyes_reaction(self, issue_comment_id: int, disable_eyes: bool = False) -> Optional[int]: return True def remove_reaction(self, issue_comment_id: int, reaction_id: int) -> bool: diff --git a/pr_agent/servers/github_action_runner.py b/pr_agent/servers/github_action_runner.py index b4004dd8..d4278156 100644 --- a/pr_agent/servers/github_action_runner.py +++ b/pr_agent/servers/github_action_runner.py @@ -103,31 +103,38 @@ async def run_action(): await PRCodeSuggestions(pr_url).run() # Handle issue comment event - elif GITHUB_EVENT_NAME == "issue_comment": + elif GITHUB_EVENT_NAME == "issue_comment" or GITHUB_EVENT_NAME == "pull_request_review_comment": action = event_payload.get("action") if action in ["created", "edited"]: comment_body = event_payload.get("comment", {}).get("body") + try: + if GITHUB_EVENT_NAME == "pull_request_review_comment": + if '/ask' in comment_body: + comment_body = handle_line_comments(event_payload, comment_body) + except Exception as e: + get_logger().error(f"Failed to handle line comments: {e}") + return if comment_body: is_pr = False + disable_eyes = False # check if issue is pull request if event_payload.get("issue", {}).get("pull_request"): url = event_payload.get("issue", {}).get("pull_request", {}).get("url") is_pr = True + elif event_payload.get("comment", {}).get("pull_request_url"): # for 'pull_request_review_comment + url = event_payload.get("comment", {}).get("pull_request_url") + is_pr = True + disable_eyes = True else: url = event_payload.get("issue", {}).get("url") - try: - if 'subject_type' in event_payload["comment"] and event_payload["comment"]["subject_type"] == "line": - comment_body = handle_line_comments(event_payload, comment_body) - except Exception as e: - get_logger().error(f"Failed to handle line comments: {e}") - if url: body = comment_body.strip().lower() comment_id = event_payload.get("comment", {}).get("id") provider = get_git_provider()(pr_url=url) if is_pr: - await PRAgent().handle_request(url, body, notify=lambda: provider.add_eyes_reaction(comment_id)) + await PRAgent().handle_request(url, body, + notify=lambda: provider.add_eyes_reaction(comment_id, disable_eyes=disable_eyes)) else: await PRAgent().handle_request(url, body) diff --git a/pr_agent/servers/github_app.py b/pr_agent/servers/github_app.py index 91939ec0..a218f191 100644 --- a/pr_agent/servers/github_app.py +++ b/pr_agent/servers/github_app.py @@ -96,13 +96,16 @@ async def handle_request(body: Dict[str, Any], event: str): get_logger().info(f"Ignoring comment from {bot_user} user") return {} get_logger().info(f"Processing comment from {sender} user") + disable_eyes = False if "issue" in body and "pull_request" in body["issue"] and "url" in body["issue"]["pull_request"]: api_url = body["issue"]["pull_request"]["url"] elif "comment" in body and "pull_request_url" in body["comment"]: api_url = body["comment"]["pull_request_url"] try: - if 'subject_type' in body["comment"] and body["comment"]["subject_type"] == "line": + if ('/ask' in comment_body and + 'subject_type' in body["comment"] and body["comment"]["subject_type"] == "line"): comment_body = handle_line_comments(body, comment_body) + disable_eyes = True except Exception as e: get_logger().error(f"Failed to handle line comments: {e}") @@ -114,7 +117,8 @@ async def handle_request(body: Dict[str, Any], event: str): comment_id = body.get("comment", {}).get("id") provider = get_git_provider()(pr_url=api_url) with get_logger().contextualize(**log_context): - await agent.handle_request(api_url, comment_body, notify=lambda: provider.add_eyes_reaction(comment_id)) + await agent.handle_request(api_url, comment_body, + notify=lambda: provider.add_eyes_reaction(comment_id, disable_eyes=disable_eyes)) # handle pull_request event: # automatically review opened/reopened/ready_for_review PRs as long as they're not in draft,