diff --git a/pr_agent/git_providers/bitbucket_provider.py b/pr_agent/git_providers/bitbucket_provider.py index 76313ddf..affe7a46 100644 --- a/pr_agent/git_providers/bitbucket_provider.py +++ b/pr_agent/git_providers/bitbucket_provider.py @@ -1,4 +1,6 @@ +import difflib import json +import re from typing import Optional, Tuple from urllib.parse import urlparse @@ -72,24 +74,38 @@ class BitbucketProvider(GitProvider): post_parameters_list = [] for suggestion in code_suggestions: body = suggestion["body"] + original_suggestion = suggestion.get('original_suggestion', None) # needed for diff code + if original_suggestion: + try: + existing_code = original_suggestion['existing_code'].rstrip() + "\n" + improved_code = original_suggestion['improved_code'].rstrip() + "\n" + diff = difflib.unified_diff(existing_code.split('\n'), + improved_code.split('\n'), n=999) + patch_orig = "\n".join(diff) + patch = "\n".join(patch_orig.splitlines()[5:]).strip('\n') + diff_code = f"\n\n```diff\n{patch.rstrip()}\n```" + # replace ```suggestion ... ``` with diff_code, using regex: + body = re.sub(r'```suggestion.*?```', diff_code, body, flags=re.DOTALL) + except Exception as e: + get_logger().exception(f"Bitbucket failed to get diff code for publishing, error: {e}") + continue + relevant_file = suggestion["relevant_file"] relevant_lines_start = suggestion["relevant_lines_start"] relevant_lines_end = suggestion["relevant_lines_end"] if not relevant_lines_start or relevant_lines_start == -1: - if get_settings().config.verbosity_level >= 2: - get_logger().exception( - f"Failed to publish code suggestion, relevant_lines_start is {relevant_lines_start}" - ) + get_logger().exception( + f"Failed to publish code suggestion, relevant_lines_start is {relevant_lines_start}" + ) continue if relevant_lines_end < relevant_lines_start: - if get_settings().config.verbosity_level >= 2: - get_logger().exception( - f"Failed to publish code suggestion, " - f"relevant_lines_end is {relevant_lines_end} and " - f"relevant_lines_start is {relevant_lines_start}" - ) + get_logger().exception( + f"Failed to publish code suggestion, " + f"relevant_lines_end is {relevant_lines_end} and " + f"relevant_lines_start is {relevant_lines_start}" + ) continue if relevant_lines_end > relevant_lines_start: @@ -113,8 +129,7 @@ class BitbucketProvider(GitProvider): self.publish_inline_comments(post_parameters_list) return True except Exception as e: - if get_settings().config.verbosity_level >= 2: - get_logger().error(f"Failed to publish code suggestion, error: {e}") + get_logger().error(f"Bitbucket failed to publish code suggestion, error: {e}") return False def publish_file_comments(self, file_comments: list) -> bool: @@ -122,7 +137,7 @@ class BitbucketProvider(GitProvider): def is_supported(self, capability: str) -> bool: if capability in ['get_issue_comments', 'publish_inline_comments', 'get_labels', 'gfm_markdown', - 'publish_file_comments']: + 'publish_file_comments']: return False return True diff --git a/pr_agent/git_providers/bitbucket_server_provider.py b/pr_agent/git_providers/bitbucket_server_provider.py index 9dc38099..4dfa8226 100644 --- a/pr_agent/git_providers/bitbucket_server_provider.py +++ b/pr_agent/git_providers/bitbucket_server_provider.py @@ -1,3 +1,6 @@ +import difflib +import re + from packaging.version import parse as parse_version from typing import Optional, Tuple from urllib.parse import quote_plus, urlparse @@ -67,24 +70,37 @@ class BitbucketServerProvider(GitProvider): post_parameters_list = [] for suggestion in code_suggestions: body = suggestion["body"] + original_suggestion = suggestion.get('original_suggestion', None) # needed for diff code + if original_suggestion: + try: + existing_code = original_suggestion['existing_code'].rstrip() + "\n" + improved_code = original_suggestion['improved_code'].rstrip() + "\n" + diff = difflib.unified_diff(existing_code.split('\n'), + improved_code.split('\n'), n=999) + patch_orig = "\n".join(diff) + patch = "\n".join(patch_orig.splitlines()[5:]).strip('\n') + diff_code = f"\n\n```diff\n{patch.rstrip()}\n```" + # replace ```suggestion ... ``` with diff_code, using regex: + body = re.sub(r'```suggestion.*?```', diff_code, body, flags=re.DOTALL) + except Exception as e: + get_logger().exception(f"Bitbucket failed to get diff code for publishing, error: {e}") + continue relevant_file = suggestion["relevant_file"] relevant_lines_start = suggestion["relevant_lines_start"] relevant_lines_end = suggestion["relevant_lines_end"] if not relevant_lines_start or relevant_lines_start == -1: - if get_settings().config.verbosity_level >= 2: - get_logger().exception( - f"Failed to publish code suggestion, relevant_lines_start is {relevant_lines_start}" - ) + get_logger().warning( + f"Failed to publish code suggestion, relevant_lines_start is {relevant_lines_start}" + ) continue if relevant_lines_end < relevant_lines_start: - if get_settings().config.verbosity_level >= 2: - get_logger().exception( - f"Failed to publish code suggestion, " - f"relevant_lines_end is {relevant_lines_end} and " - f"relevant_lines_start is {relevant_lines_start}" - ) + get_logger().warning( + f"Failed to publish code suggestion, " + f"relevant_lines_end is {relevant_lines_end} and " + f"relevant_lines_start is {relevant_lines_start}" + ) continue if relevant_lines_end > relevant_lines_start: