From 21a7a0f136e4031f7407353c4bc94f86b7da38f7 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Mon, 4 Dec 2023 21:06:56 +0200 Subject: [PATCH] feat: Enhance link generation for relevant lines and refactor code in git providers and PR description tools --- pr_agent/git_providers/bitbucket_provider.py | 5 ++++- pr_agent/git_providers/github_provider.py | 4 +++- pr_agent/git_providers/gitlab_provider.py | 4 +++- pr_agent/settings/pr_description_prompts.toml | 8 ++++---- pr_agent/tools/pr_description.py | 11 ++++++++--- 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/pr_agent/git_providers/bitbucket_provider.py b/pr_agent/git_providers/bitbucket_provider.py index 386577a2..ee8ad48f 100644 --- a/pr_agent/git_providers/bitbucket_provider.py +++ b/pr_agent/git_providers/bitbucket_provider.py @@ -229,7 +229,10 @@ class BitbucketProvider(GitProvider): return response def get_line_link(self, relevant_file: str, relevant_line_start: int, relevant_line_end: int = None) -> str: - link = f"{self.pr_url}/#L{relevant_file}T{relevant_line_start}" + if relevant_line_start == -1: + link = f"{self.pr_url}/#L{relevant_file}" + else: + link = f"{self.pr_url}/#L{relevant_file}T{relevant_line_start}" return link def generate_link_to_relevant_line_number(self, suggestion) -> str: diff --git a/pr_agent/git_providers/github_provider.py b/pr_agent/git_providers/github_provider.py index c001f81e..ab4acb9a 100644 --- a/pr_agent/git_providers/github_provider.py +++ b/pr_agent/git_providers/github_provider.py @@ -506,7 +506,9 @@ class GithubProvider(GitProvider): def get_line_link(self, relevant_file: str, relevant_line_start: int, relevant_line_end: int = None) -> str: sha_file = hashlib.sha256(relevant_file.encode('utf-8')).hexdigest() - if relevant_line_end: + if relevant_line_start == -1: + link = f"https://github.com/{self.repo}/pull/{self.pr_num}/files#diff-{sha_file}" + elif relevant_line_end: link = f"https://github.com/{self.repo}/pull/{self.pr_num}/files#diff-{sha_file}R{relevant_line_start}-R{relevant_line_end}" else: link = f"https://github.com/{self.repo}/pull/{self.pr_num}/files#diff-{sha_file}R{relevant_line_start}" diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py index 3a593439..c583b087 100644 --- a/pr_agent/git_providers/gitlab_provider.py +++ b/pr_agent/git_providers/gitlab_provider.py @@ -424,7 +424,9 @@ class GitLabProvider(GitProvider): return "" def get_line_link(self, relevant_file: str, relevant_line_start: int, relevant_line_end: int = None) -> str: - if relevant_line_end: + if relevant_line_start == -1: + link = f"https://gitlab.com/codiumai/pr-agent/-/blob/{self.mr.source_branch}/{relevant_file}?ref_type=heads" + elif relevant_line_end: link = f"https://gitlab.com/codiumai/pr-agent/-/blob/{self.mr.source_branch}/{relevant_file}?ref_type=heads#L{relevant_line_start}-L{relevant_line_end}" else: link = f"https://gitlab.com/codiumai/pr-agent/-/blob/{self.mr.source_branch}/{relevant_file}?ref_type=heads#L{relevant_line_start}" diff --git a/pr_agent/settings/pr_description_prompts.toml b/pr_agent/settings/pr_description_prompts.toml index 3b430472..fa7c87a6 100644 --- a/pr_agent/settings/pr_description_prompts.toml +++ b/pr_agent/settings/pr_description_prompts.toml @@ -38,9 +38,9 @@ class FileWalkthrough(BaseModel): {%- endif %} {%- if enable_semantic_files_types %} -class SemanticLabelFiles(BaseModel): - label: PRType = Field(description="A label that represent a type of semantic code changes. Use the label value, not the name") - files: List[str] = Field(description="a list of files that are relevant to the label. A file may appear in multiple labels") +class SemanticLabel(BaseModel): + label: Any(PRType, str) = Field(description="a semantic label that represents a type of code changes that occurred in the PR. You can use a label from the $PRType enum, or use additional custom labels that you define.") + files: List[str] = Field(description="a list of file names related to the semantic label. A file may appear in multiple labels. Present the file full path, and nothing else.") {%- endif %} Class PRDescription(BaseModel): @@ -54,7 +54,7 @@ Class PRDescription(BaseModel): main_files_walkthrough: List[FileWalkthrough] = Field(max_items=10) {%- endif %} {%- if enable_semantic_files_types %} - pr_files_labels[SemanticLabelFiles] + pr_files_labels[List[SemanticLabel]] = Field(min_items=3, description="A list of semantic labels that describe the type of changes in the PR files.") {%- endif %} ===== diff --git a/pr_agent/tools/pr_description.py b/pr_agent/tools/pr_description.py index 96f01412..f9af0b4c 100644 --- a/pr_agent/tools/pr_description.py +++ b/pr_agent/tools/pr_description.py @@ -275,8 +275,7 @@ class PRDescription: pr_body +="\n" elif 'pr_files_labels' in key.lower(): pr_body += """\n| | Relevant Files """ - for i in range(60): - pr_body += "  " + pr_body += "  " * 60 pr_body += """|\n|-----------|-------------|\n""" for semantic_label in value: # for filename, description in value.items(): @@ -288,6 +287,12 @@ class PRDescription: filename = file.replace("'", "`") # description = file['changes_in_file'] # pr_body += f'- `{filename}`\n' + + # try to add line numbers link to code suggestions + if hasattr(self.git_provider, 'get_line_link'): + link = self.git_provider.get_line_link(filename, relevant_line_start=-1) + if link: + filename = f"[{filename}]({link})" if self.git_provider.is_supported("gfm_markdown"): pr_body += f"
  • {filename}
  • " else: @@ -296,7 +301,7 @@ class PRDescription: pr_body += "|\n" else: # if the value is a list, join its items by comma - if type(value) == list: + if isinstance(value, list): value = ', '.join(v for v in value) pr_body += f"{value}\n" if idx < len(self.data) - 1: