From 088f256415ce7cdf85651870ff253c3c2f445b3e Mon Sep 17 00:00:00 2001 From: mrT23 Date: Thu, 5 Oct 2023 17:03:10 +0300 Subject: [PATCH 1/5] stable --- Usage.md | 7 +++++++ pr_agent/algo/utils.py | 2 ++ pr_agent/git_providers/gitlab_provider.py | 3 +-- pr_agent/tools/pr_code_suggestions.py | 6 +++--- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Usage.md b/Usage.md index e80fea7b..9f4af800 100644 --- a/Usage.md +++ b/Usage.md @@ -122,6 +122,13 @@ keep_original_user_title = false ``` When a new PR is opened, PR-Agent will run the `describe` tool with the above parameters. +To cancel the automatic run of all the tools, set: +``` +[github_app] +pr_commands = [] +``` + + Note that a local `.pr_agent.toml` file enables you to edit and customize the default parameters of any tool, not just the ones that are run automatically. #### Editing the prompts diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py index c7923d16..6460c31d 100644 --- a/pr_agent/algo/utils.py +++ b/pr_agent/algo/utils.py @@ -99,6 +99,8 @@ def parse_code_suggestion(code_suggestions: dict) -> str: markdown_text += f"\n - **{sub_key}:** {sub_value}\n" else: markdown_text += f" **{sub_key}:** {sub_value}\n" + if "relevant line" not in sub_key.lower(): # nicer presentation + markdown_text = markdown_text.rstrip('\n') + "\\\n" markdown_text += "\n" return markdown_text diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py index 33cbee2b..350efcfc 100644 --- a/pr_agent/git_providers/gitlab_provider.py +++ b/pr_agent/git_providers/gitlab_provider.py @@ -175,8 +175,7 @@ class GitLabProvider(GitProvider): pos_obj['new_line'] = target_line_no - 1 pos_obj['old_line'] = source_line_no - 1 logging.debug(f"Creating comment in {self.id_mr} with body {body} and position {pos_obj}") - self.mr.discussions.create({'body': body, - 'position': pos_obj}) + self.mr.discussions.create({'body': body, 'position': pos_obj}) def get_relevant_diff(self, relevant_file: str, relevant_line_in_file: int) -> Optional[dict]: changes = self.mr.changes() # Retrieve the changes for the merge request once diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py index 7f0b1264..e1d5206c 100644 --- a/pr_agent/tools/pr_code_suggestions.py +++ b/pr_agent/tools/pr_code_suggestions.py @@ -138,9 +138,9 @@ class PRCodeSuggestions: if get_settings().config.verbosity_level >= 2: logging.info(f"Could not parse suggestion: {d}") - is_successful = self.git_provider.publish_code_suggestions(code_suggestions) - if not is_successful: - logging.info("Failed to publish code suggestions, trying to publish each suggestion separately") + # is_successful = self.git_provider.publish_code_suggestions(code_suggestions) + if True: + # logging.info("Failed to publish code suggestions, trying to publish each suggestion separately") for code_suggestion in code_suggestions: self.git_provider.publish_code_suggestions([code_suggestion]) From 989c56220b1d00a5cecc089b4e34d8f5fac9712a Mon Sep 17 00:00:00 2001 From: mrT23 Date: Thu, 5 Oct 2023 17:48:36 +0300 Subject: [PATCH 2/5] add line number --- pr_agent/git_providers/gitlab_provider.py | 25 +++++++++++++++++++++++ pr_agent/tools/pr_reviewer.py | 15 ++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py index 350efcfc..15b76dd8 100644 --- a/pr_agent/git_providers/gitlab_provider.py +++ b/pr_agent/git_providers/gitlab_provider.py @@ -385,3 +385,28 @@ class GitLabProvider(GitProvider): return pr_id except: return "" + + # def generate_link_to_relevant_line_number(self, suggestion) -> str: + # try: + # relevant_file = suggestion['relevant file'].strip('`').strip("'") + # relevant_line_str = suggestion['relevant line'] + # if not relevant_line_str: + # return "" + # + # position, absolute_position = find_line_number_of_relevant_line_in_file \ + # (self.diff_files, relevant_file, relevant_line_str) + # + # if absolute_position != -1: + # # # link to right file only + # # link = f"https://github.com/{self.repo}/blob/{self.pr.head.sha}/{relevant_file}" \ + # # + "#" + f"L{absolute_position}" + # + # # link to diff + # sha_file = hashlib.sha1(relevant_file.encode('utf-8')).hexdigest() + # link = f"{self.pr.web_url}/diffs#{sha_file}_{absolute_position}_{absolute_position}" + # return link + # except Exception as e: + # if get_settings().config.verbosity_level >= 2: + # logging.info(f"Failed adding line link, error: {e}") + # + # return "" diff --git a/pr_agent/tools/pr_reviewer.py b/pr_agent/tools/pr_reviewer.py index 01e3f276..a0d9394c 100644 --- a/pr_agent/tools/pr_reviewer.py +++ b/pr_agent/tools/pr_reviewer.py @@ -209,6 +209,21 @@ class PRReviewer: link = self.git_provider.generate_link_to_relevant_line_number(suggestion) if link: suggestion['relevant line'] = f"[{suggestion['relevant line']}]({link})" + else: + try: + relevant_file = suggestion['relevant file'].strip('`').strip("'") + relevant_line_str = suggestion['relevant line'] + if not relevant_line_str: + return "" + + position, absolute_position = find_line_number_of_relevant_line_in_file( + self.git_provider.diff_files, relevant_file, relevant_line_str) + if absolute_position != -1: + suggestion[ + 'relevant line'] = f"{suggestion['relevant line']} (line {absolute_position})" + except: + pass + # Add incremental review section if self.incremental.is_incremental: From 72eecbbf616ecc1879ebaf74c75a784bef9256fd Mon Sep 17 00:00:00 2001 From: mrT23 Date: Thu, 5 Oct 2023 17:59:08 +0300 Subject: [PATCH 3/5] add line number --- pr_agent/git_providers/gitlab_provider.py | 50 +++++++++++------------ pr_agent/tools/pr_reviewer.py | 27 ++++++------ 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py index 15b76dd8..7a8e6bf9 100644 --- a/pr_agent/git_providers/gitlab_provider.py +++ b/pr_agent/git_providers/gitlab_provider.py @@ -1,3 +1,4 @@ +import hashlib import logging import re from typing import Optional, Tuple @@ -7,7 +8,7 @@ import gitlab from gitlab import GitlabGetError from ..algo.language_handler import is_valid_file -from ..algo.pr_processing import clip_tokens +from ..algo.pr_processing import clip_tokens, find_line_number_of_relevant_line_in_file from ..algo.utils import load_large_diff from ..config_loader import get_settings from .git_provider import EDIT_TYPE, FilePatchInfo, GitProvider @@ -386,27 +387,26 @@ class GitLabProvider(GitProvider): except: return "" - # def generate_link_to_relevant_line_number(self, suggestion) -> str: - # try: - # relevant_file = suggestion['relevant file'].strip('`').strip("'") - # relevant_line_str = suggestion['relevant line'] - # if not relevant_line_str: - # return "" - # - # position, absolute_position = find_line_number_of_relevant_line_in_file \ - # (self.diff_files, relevant_file, relevant_line_str) - # - # if absolute_position != -1: - # # # link to right file only - # # link = f"https://github.com/{self.repo}/blob/{self.pr.head.sha}/{relevant_file}" \ - # # + "#" + f"L{absolute_position}" - # - # # link to diff - # sha_file = hashlib.sha1(relevant_file.encode('utf-8')).hexdigest() - # link = f"{self.pr.web_url}/diffs#{sha_file}_{absolute_position}_{absolute_position}" - # return link - # except Exception as e: - # if get_settings().config.verbosity_level >= 2: - # logging.info(f"Failed adding line link, error: {e}") - # - # return "" + def generate_link_to_relevant_line_number(self, suggestion) -> str: + try: + relevant_file = suggestion['relevant file'].strip('`').strip("'") + relevant_line_str = suggestion['relevant line'] + if not relevant_line_str: + return "" + + position, absolute_position = find_line_number_of_relevant_line_in_file \ + (self.diff_files, relevant_file, relevant_line_str) + + if absolute_position != -1: + # link to right file only + link = f"https://gitlab.com/codiumai/pr-agent/-/blob/{self.mr.target_branch}/{relevant_file}?ref_type=heads#L{absolute_position}" + + # # link to diff + # sha_file = hashlib.sha1(relevant_file.encode('utf-8')).hexdigest() + # link = f"{self.pr.web_url}/diffs#{sha_file}_{absolute_position}_{absolute_position}" + return link + except Exception as e: + if get_settings().config.verbosity_level >= 2: + logging.info(f"Failed adding line link, error: {e}") + + return "" diff --git a/pr_agent/tools/pr_reviewer.py b/pr_agent/tools/pr_reviewer.py index a0d9394c..b96d5379 100644 --- a/pr_agent/tools/pr_reviewer.py +++ b/pr_agent/tools/pr_reviewer.py @@ -210,19 +210,20 @@ class PRReviewer: if link: suggestion['relevant line'] = f"[{suggestion['relevant line']}]({link})" else: - try: - relevant_file = suggestion['relevant file'].strip('`').strip("'") - relevant_line_str = suggestion['relevant line'] - if not relevant_line_str: - return "" - - position, absolute_position = find_line_number_of_relevant_line_in_file( - self.git_provider.diff_files, relevant_file, relevant_line_str) - if absolute_position != -1: - suggestion[ - 'relevant line'] = f"{suggestion['relevant line']} (line {absolute_position})" - except: - pass + pass + # try: + # relevant_file = suggestion['relevant file'].strip('`').strip("'") + # relevant_line_str = suggestion['relevant line'] + # if not relevant_line_str: + # return "" + # + # position, absolute_position = find_line_number_of_relevant_line_in_file( + # self.git_provider.diff_files, relevant_file, relevant_line_str) + # if absolute_position != -1: + # suggestion[ + # 'relevant line'] = f"{suggestion['relevant line']} (line {absolute_position})" + # except: + # pass # Add incremental review section From 1bab26f1c57676f3c9cad801a935ff828244562a Mon Sep 17 00:00:00 2001 From: mrT23 Date: Thu, 5 Oct 2023 18:08:02 +0300 Subject: [PATCH 4/5] gfm_supported --- pr_agent/algo/utils.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pr_agent/algo/utils.py b/pr_agent/algo/utils.py index 6460c31d..11f28e38 100644 --- a/pr_agent/algo/utils.py +++ b/pr_agent/algo/utils.py @@ -62,7 +62,7 @@ def convert_to_markdown(output_data: dict, gfm_supported: bool=True) -> str: markdown_text += f"- {emoji} **{key}:**\n\n" for item in value: if isinstance(item, dict) and key.lower() == 'code feedback': - markdown_text += parse_code_suggestion(item) + markdown_text += parse_code_suggestion(item, gfm_supported) elif item: markdown_text += f" - {item}\n" if key.lower() == 'code feedback': @@ -76,7 +76,7 @@ def convert_to_markdown(output_data: dict, gfm_supported: bool=True) -> str: return markdown_text -def parse_code_suggestion(code_suggestions: dict) -> str: +def parse_code_suggestion(code_suggestions: dict, gfm_supported: bool=True) -> str: """ Convert a dictionary of data into markdown format. @@ -99,8 +99,9 @@ def parse_code_suggestion(code_suggestions: dict) -> str: markdown_text += f"\n - **{sub_key}:** {sub_value}\n" else: markdown_text += f" **{sub_key}:** {sub_value}\n" - if "relevant line" not in sub_key.lower(): # nicer presentation - markdown_text = markdown_text.rstrip('\n') + "\\\n" + if not gfm_supported: + if "relevant line" not in sub_key.lower(): # nicer presentation + markdown_text = markdown_text.rstrip('\n') + "\\\n" markdown_text += "\n" return markdown_text From 2945c36899a1b4d6d9b450c2748af3f58de2f4a7 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Thu, 5 Oct 2023 18:21:52 +0300 Subject: [PATCH 5/5] source_branch --- pr_agent/git_providers/gitlab_provider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py index 7a8e6bf9..2e6f2140 100644 --- a/pr_agent/git_providers/gitlab_provider.py +++ b/pr_agent/git_providers/gitlab_provider.py @@ -399,7 +399,7 @@ class GitLabProvider(GitProvider): if absolute_position != -1: # link to right file only - link = f"https://gitlab.com/codiumai/pr-agent/-/blob/{self.mr.target_branch}/{relevant_file}?ref_type=heads#L{absolute_position}" + link = f"https://gitlab.com/codiumai/pr-agent/-/blob/{self.mr.source_branch}/{relevant_file}?ref_type=heads#L{absolute_position}" # # link to diff # sha_file = hashlib.sha1(relevant_file.encode('utf-8')).hexdigest()