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: