From ee90f385011164c7e05912dac18c82ec6bde1ef1 Mon Sep 17 00:00:00 2001 From: MarkRx Date: Thu, 30 May 2024 10:05:00 -0400 Subject: [PATCH] BB Server fixes. Fix ID not being retrieved, inline comments, url generation, and pr review not working --- .../bitbucket_server_provider.py | 49 +++++++++++-------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/pr_agent/git_providers/bitbucket_server_provider.py b/pr_agent/git_providers/bitbucket_server_provider.py index 0f9e58d4..f1c0a956 100644 --- a/pr_agent/git_providers/bitbucket_server_provider.py +++ b/pr_agent/git_providers/bitbucket_server_provider.py @@ -1,13 +1,13 @@ import json from typing import Optional, Tuple -from urllib.parse import urlparse +from urllib.parse import quote_plus, urlparse import requests from atlassian.bitbucket import Bitbucket from starlette_context import context from .git_provider import GitProvider -from pr_agent.algo.types import FilePatchInfo +from pr_agent.algo.types import EDIT_TYPE, FilePatchInfo from ..algo.utils import load_large_diff, find_line_number_of_relevant_line_in_file from ..config_loader import get_settings from ..log import get_logger @@ -58,6 +58,9 @@ class BitbucketServerProvider(GitProvider): return contents except Exception: return "" + + def get_pr_id(self): + return self.pr_num def publish_code_suggestions(self, code_suggestions: list) -> bool: """ @@ -140,14 +143,8 @@ class BitbucketServerProvider(GitProvider): if self.diff_files: return self.diff_files - commits_in_pr = self.bitbucket_client.get_pull_requests_commits( - self.workspace_slug, - self.repo_slug, - self.pr_num - ) - - commit_list = list(commits_in_pr) - base_sha, head_sha = commit_list[0]['parents'][0]['id'], commit_list[-1]['id'] + base_sha = self.pr.toRef['latestCommit'] + head_sha = self.pr.fromRef['latestCommit'] diff_files = [] original_file_content_str = "" @@ -242,7 +239,7 @@ class BitbucketServerProvider(GitProvider): } response = requests.post(url=self._get_pr_comments_url(), json=payload, headers=self.headers) - return response + response.raise_for_status() def generate_link_to_relevant_line_number(self, suggestion) -> str: try: @@ -256,7 +253,7 @@ class BitbucketServerProvider(GitProvider): (diff_files, relevant_file, relevant_line_str) if absolute_position != -1 and self.pr_url: - link = f"{self.pr_url}/#L{relevant_file}T{absolute_position}" + link = f"{self.pr_url}/diff#{quote_plus(relevant_file)}?t={absolute_position}" return link except Exception as e: if get_settings().config.verbosity_level >= 2: @@ -266,7 +263,15 @@ class BitbucketServerProvider(GitProvider): def publish_inline_comments(self, comments: list[dict]): for comment in comments: - self.publish_inline_comment(comment['body'], comment['position'], comment['path']) + if 'position' in comment: + self.publish_inline_comment(comment['body'], comment['position'], comment['path']) + elif 'start_line' in comment: # multi-line comment + # note that bitbucket does not seem to support range - only a comment on a single line - https://community.developer.atlassian.com/t/api-post-endpoint-for-inline-pull-request-comments/60452 + self.publish_inline_comment(comment['body'], comment['start_line'], comment['path']) + elif 'line' in comment: # single-line comment + self.publish_inline_comment(comment['body'], comment['line'], comment['path']) + else: + get_logger().error(f"Could not publish inline comment {comment}") def get_title(self): return self.pr.title @@ -278,7 +283,10 @@ class BitbucketServerProvider(GitProvider): return self.pr.fromRef['displayId'] def get_pr_description_full(self): - return self.pr.description + if hasattr(self.pr, "description"): + return self.pr.description + else: + return None def get_user_id(self): return 0 @@ -334,13 +342,14 @@ class BitbucketServerProvider(GitProvider): raise NotImplementedError("Get commit messages function not implemented yet.") # bitbucket does not support labels def publish_description(self, pr_title: str, description: str): - payload = json.dumps({ + payload = { + "version": self.pr.version, "description": description, - "title": pr_title - }) - - response = requests.put(url=self.bitbucket_pull_request_api_url, headers=self.headers, data=payload) - return response + "title": pr_title, + "reviewers": self.pr.reviewers # needs to be sent otherwise gets wiped + } + + self.bitbucket_client.update_pull_request(self.workspace_slug, self.repo_slug, str(self.pr_num), payload) # bitbucket does not support labels def publish_labels(self, pr_types: list):