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]: