diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py
index 1259a46e..c874de9b 100644
--- a/pr_agent/algo/utils.py
+++ b/pr_agent/algo/utils.py
@@ -20,7 +20,7 @@ def get_setting(key: str) -> Any:
except Exception:
return global_settings.get(key, None)
-def convert_to_markdown(output_data: dict) -> str:
+def convert_to_markdown(output_data: dict, gfm_supported: bool) -> str:
"""
Convert a dictionary of data into markdown format.
Args:
@@ -49,11 +49,14 @@ def convert_to_markdown(output_data: dict) -> str:
continue
if isinstance(value, dict):
markdown_text += f"## {key}\n\n"
- markdown_text += convert_to_markdown(value)
+ markdown_text += convert_to_markdown(value, gfm_supported)
elif isinstance(value, list):
emoji = emojis.get(key, "")
if key.lower() == 'code feedback':
- markdown_text += f"\n\n- ** { emoji } Code feedback:**
\n\n"
+ if gfm_supported:
+ markdown_text += f"\n\n- ** { emoji } Code feedback:**
\n\n"
+ else:
+ markdown_text += f"\n\n- **{emoji} Code feedback:**\n\n"
else:
markdown_text += f"- {emoji} **{key}:**\n\n"
for item in value:
@@ -62,7 +65,10 @@ def convert_to_markdown(output_data: dict) -> str:
elif item:
markdown_text += f" - {item}\n"
if key.lower() == 'code feedback':
- markdown_text += " \n\n"
+ if gfm_supported:
+ markdown_text += " \n\n"
+ else:
+ markdown_text += "\n\n"
elif value != 'n/a':
emoji = emojis.get(key, "")
markdown_text += f"- {emoji} **{key}:** {value}\n"
diff --git a/pr_agent/git_providers/azuredevops_provider.py b/pr_agent/git_providers/azuredevops_provider.py
index 71ae0947..8a7693ce 100644
--- a/pr_agent/git_providers/azuredevops_provider.py
+++ b/pr_agent/git_providers/azuredevops_provider.py
@@ -38,7 +38,8 @@ class AzureDevopsProvider:
self.set_pr(pr_url)
def is_supported(self, capability: str) -> bool:
- if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments', 'get_labels', 'remove_initial_comment']:
+ if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments', 'get_labels',
+ 'remove_initial_comment', 'gfm_markdown']:
return False
return True
diff --git a/pr_agent/git_providers/bitbucket_provider.py b/pr_agent/git_providers/bitbucket_provider.py
index e2b06feb..56b9f711 100644
--- a/pr_agent/git_providers/bitbucket_provider.py
+++ b/pr_agent/git_providers/bitbucket_provider.py
@@ -101,8 +101,7 @@ class BitbucketProvider(GitProvider):
return False
def is_supported(self, capability: str) -> bool:
- if capability in ['get_issue_comments', 'publish_inline_comments', 'get_labels']:
-
+ if capability in ['get_issue_comments', 'publish_inline_comments', 'get_labels', 'gfm_markdown']:
return False
return True
@@ -180,11 +179,6 @@ class BitbucketProvider(GitProvider):
for comment in comments:
self.publish_inline_comment(comment['body'], comment['start_line'], comment['path'])
- def publish_bitbucket_inline_comments(self, comments: list[dict]):
- for comment in comments:
- self.publish_inline_comment(comment['body'],comment['position'], comment['path'])
-
-
def get_title(self):
return self.pr.title
diff --git a/pr_agent/git_providers/codecommit_client.py b/pr_agent/git_providers/codecommit_client.py
index 1112ee22..5f18c90d 100644
--- a/pr_agent/git_providers/codecommit_client.py
+++ b/pr_agent/git_providers/codecommit_client.py
@@ -54,11 +54,16 @@ class CodeCommitClient:
def __init__(self):
self.boto_client = None
+ def is_supported(self, capability: str) -> bool:
+ if capability in ["gfm_markdown"]:
+ return False
+ return True
+
def _connect_boto_client(self):
try:
self.boto_client = boto3.client("codecommit")
except Exception as e:
- raise ValueError(f"Failed to connect to AWS CodeCommit: {e}")
+ raise ValueError(f"Failed to connect to AWS CodeCommit: {e}") from e
def get_differences(self, repo_name: int, destination_commit: str, source_commit: str):
"""
diff --git a/pr_agent/git_providers/codecommit_provider.py b/pr_agent/git_providers/codecommit_provider.py
index 1f570a1a..5361f665 100644
--- a/pr_agent/git_providers/codecommit_provider.py
+++ b/pr_agent/git_providers/codecommit_provider.py
@@ -74,6 +74,7 @@ class CodeCommitProvider(GitProvider):
"create_inline_comment",
"publish_inline_comments",
"get_labels",
+ "gfm_markdown"
]:
return False
return True
diff --git a/pr_agent/git_providers/gerrit_provider.py b/pr_agent/git_providers/gerrit_provider.py
index 03faf2a1..8399d14e 100644
--- a/pr_agent/git_providers/gerrit_provider.py
+++ b/pr_agent/git_providers/gerrit_provider.py
@@ -304,7 +304,8 @@ class GerritProvider(GitProvider):
# 'get_issue_comments',
'create_inline_comment',
'publish_inline_comments',
- 'get_labels'
+ 'get_labels',
+ 'gfm_markdown'
]:
return False
return True
diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py
index 2deae177..a1d0b334 100644
--- a/pr_agent/git_providers/gitlab_provider.py
+++ b/pr_agent/git_providers/gitlab_provider.py
@@ -43,7 +43,7 @@ class GitLabProvider(GitProvider):
self.incremental = incremental
def is_supported(self, capability: str) -> bool:
- if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments']:
+ if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments', 'gfm_markdown']:
return False
return True
diff --git a/pr_agent/git_providers/local_git_provider.py b/pr_agent/git_providers/local_git_provider.py
index e6ee1456..ac750371 100644
--- a/pr_agent/git_providers/local_git_provider.py
+++ b/pr_agent/git_providers/local_git_provider.py
@@ -56,7 +56,8 @@ class LocalGitProvider(GitProvider):
raise KeyError(f'Branch: {self.target_branch_name} does not exist')
def is_supported(self, capability: str) -> bool:
- if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments', 'get_labels']:
+ if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments', 'get_labels',
+ 'gfm_markdown']:
return False
return True
diff --git a/pr_agent/settings/.secrets_template.toml b/pr_agent/settings/.secrets_template.toml
index 0ac75519..0bfdc4e4 100644
--- a/pr_agent/settings/.secrets_template.toml
+++ b/pr_agent/settings/.secrets_template.toml
@@ -43,5 +43,10 @@ webhook_secret = "" # Optional, may be commented out.
personal_access_token = ""
[bitbucket]
-# Bitbucket personal bearer token
+# For Bitbucket personal/repository bearer token
bearer_token = ""
+
+# For Bitbucket app
+app_key = ""
+base_url = ""
+
diff --git a/pr_agent/tools/pr_description.py b/pr_agent/tools/pr_description.py
index e5430f92..f30b0165 100644
--- a/pr_agent/tools/pr_description.py
+++ b/pr_agent/tools/pr_description.py
@@ -75,17 +75,12 @@ class PRDescription:
if get_settings().pr_description.publish_description_as_comment:
self.git_provider.publish_comment(pr_body)
else:
- # bitbucket does not support publishing PR labels yet
- if get_settings().config.git_provider == 'bitbucket':
- self.git_provider.publish_description(pr_title, description)
- return
- else:
- self.git_provider.publish_description(pr_title, pr_body)
- if self.git_provider.is_supported("get_labels"):
- current_labels = self.git_provider.get_labels()
- if current_labels is None:
- current_labels = []
- self.git_provider.publish_labels(pr_types + current_labels)
+ self.git_provider.publish_description(pr_title, pr_body)
+ if self.git_provider.is_supported("get_labels"):
+ current_labels = self.git_provider.get_labels()
+ if current_labels is None:
+ current_labels = []
+ self.git_provider.publish_labels(pr_types + current_labels)
self.git_provider.remove_initial_comment()
return ""
diff --git a/pr_agent/tools/pr_reviewer.py b/pr_agent/tools/pr_reviewer.py
index a00fe360..7f790d3b 100644
--- a/pr_agent/tools/pr_reviewer.py
+++ b/pr_agent/tools/pr_reviewer.py
@@ -214,7 +214,7 @@ class PRReviewer:
"⏮️ Review for commits since previous PR-Agent review": f"Starting from commit {last_commit_url}"}})
data.move_to_end('Incremental PR Review', last=False)
- markdown_text = convert_to_markdown(data)
+ markdown_text = convert_to_markdown(data, self.git_provider.is_supported("gfm_markdown"))
user = self.git_provider.get_user_id()
# Add help text if not in CLI mode
@@ -266,9 +266,6 @@ class PRReviewer:
self.git_provider.publish_inline_comment(content, relevant_file, relevant_line_in_file)
if comments:
- if get_settings().config.git_provider == 'bitbucket':
- self.git_provider.publish_bitbucket_inline_comments(comments)
- else:
self.git_provider.publish_inline_comments(comments)
def _get_user_answers(self) -> Tuple[str, str]: