diff --git a/pr_agent/git_providers/bitbucket_provider.py b/pr_agent/git_providers/bitbucket_provider.py index a5b9d801..751c413d 100644 --- a/pr_agent/git_providers/bitbucket_provider.py +++ b/pr_agent/git_providers/bitbucket_provider.py @@ -187,6 +187,13 @@ class BitbucketProvider(GitProvider): comment = self.pr.comment(pr_comment) if is_temporary: self.temp_comments.append(comment["id"]) + return comment + + def edit_comment(self, comment, body: str): + try: + comment.update(body) + except Exception as e: + get_logger().exception(f"Failed to update comment, error: {e}") def remove_initial_comment(self): try: diff --git a/pr_agent/git_providers/git_provider.py b/pr_agent/git_providers/git_provider.py index 98efcf23..58d2adf7 100644 --- a/pr_agent/git_providers/git_provider.py +++ b/pr_agent/git_providers/git_provider.py @@ -41,6 +41,9 @@ class GitProvider(ABC): def get_pr_description_full(self) -> str: pass + def edit_comment(self, comment, body: str): + pass + def get_pr_description(self, *, full: bool = True) -> str: from pr_agent.config_loader import get_settings from pr_agent.algo.utils import clip_tokens diff --git a/pr_agent/git_providers/github_provider.py b/pr_agent/git_providers/github_provider.py index f5ec7129..375e46ec 100644 --- a/pr_agent/git_providers/github_provider.py +++ b/pr_agent/git_providers/github_provider.py @@ -202,6 +202,7 @@ class GithubProvider(GitProvider): if not hasattr(self.pr, 'comments_list'): self.pr.comments_list = [] self.pr.comments_list.append(response) + return response def publish_inline_comment(self, body: str, relevant_file: str, relevant_line_in_file: str): self.publish_inline_comments([self.create_inline_comment(body, relevant_file, relevant_line_in_file)]) @@ -380,6 +381,9 @@ class GithubProvider(GitProvider): get_logger().error(f"Failed to publish code suggestion, error: {e}") return False + def edit_comment(self, comment, body: str): + comment.edit(body=body) + def remove_initial_comment(self): try: for comment in getattr(self.pr, 'comments_list', []): diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py index f5d9f8e6..5c1cf8e9 100644 --- a/pr_agent/git_providers/gitlab_provider.py +++ b/pr_agent/git_providers/gitlab_provider.py @@ -176,6 +176,10 @@ class GitLabProvider(GitProvider): comment = self.mr.notes.create({'body': mr_comment}) if is_temporary: self.temp_comments.append(comment) + return comment + + def edit_comment(self, comment, body: str): + self.mr.notes.update(comment.id,{'body': body} ) def publish_inline_comment(self, body: str, relevant_file: str, relevant_line_in_file: str): edit_type, found, source_line_no, target_file, target_line_no = self.search_line(relevant_file, diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py index b944047e..2d4036f6 100644 --- a/pr_agent/tools/pr_code_suggestions.py +++ b/pr_agent/tools/pr_code_suggestions.py @@ -65,11 +65,19 @@ class PRCodeSuggestions: get_settings().pr_code_suggestions_prompt.system, get_settings().pr_code_suggestions_prompt.user) + self.progress = f"## Generating PR code suggestions\n\n" + self.progress += f"""\nWork in progress ...
\n""" + self.progress_response = None + async def run(self): try: get_logger().info('Generating code suggestions for PR...') + if get_settings().config.publish_output: - self.git_provider.publish_comment("Preparing suggestions...", is_temporary=True) + if self.git_provider.is_supported("gfm_markdown"): + self.progress_response = self.git_provider.publish_comment(self.progress) + else: + self.git_provider.publish_comment("Preparing suggestions...", is_temporary=True) get_logger().info('Preparing PR code suggestions...') if not self.is_extended: @@ -103,12 +111,20 @@ class PRCodeSuggestions: pr_body += HelpMessage.get_improve_usage_guide() pr_body += "\n\n" - self.git_provider.publish_comment(pr_body) + if self.progress_response: + self.git_provider.edit_comment(self.progress_response, body=pr_body) + else: + self.git_provider.publish_comment(pr_body) + else: get_logger().info('Pushing inline code suggestions...') self.push_inline_code_suggestions(data) + if self.progress_response: + self.progress_response.delete() except Exception as e: get_logger().error(f"Failed to generate code suggestions for PR, error: {e}") + if self.progress_response: + self.progress_response.delete() async def _prepare_prediction(self, model: str): get_logger().info('Getting PR diff...') @@ -162,7 +178,10 @@ class PRCodeSuggestions: if not data['code_suggestions']: get_logger().info('No suggestions found to improve this PR.') - return self.git_provider.publish_comment('No suggestions found to improve this PR.') + if self.progress_response: + return self.git_provider.edit_comment(self.progress_response, body='No suggestions found to improve this PR.') + else: + return self.git_provider.publish_comment('No suggestions found to improve this PR.') for d in data['code_suggestions']: try: