From 8f16c4601269703d2e750a5c356731be746fdd9c Mon Sep 17 00:00:00 2001 From: mrT23 Date: Fri, 28 Jul 2023 10:52:49 +0300 Subject: [PATCH 1/3] try-except --- pr_agent/tools/pr_code_suggestions.py | 34 ++++++++++++++++----------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py index f9d0efe4..a3b388d9 100644 --- a/pr_agent/tools/pr_code_suggestions.py +++ b/pr_agent/tools/pr_code_suggestions.py @@ -91,22 +91,28 @@ class PRCodeSuggestions: def push_inline_code_suggestions(self, data): code_suggestions = [] for d in data['Code suggestions']: - if settings.config.verbosity_level >= 2: - logging.info(f"suggestion: {d}") - relevant_file = d['relevant file'].strip() - relevant_lines_str = d['relevant lines'].strip() - relevant_lines_start = int(relevant_lines_str.split('-')[0]) # absolute position - relevant_lines_end = int(relevant_lines_str.split('-')[-1]) - content = d['suggestion content'] - new_code_snippet = d['improved code'] + try: + if settings.config.verbosity_level >= 2: + logging.info(f"suggestion: {d}") + relevant_file = d['relevant file'].strip() + relevant_lines_str = d['relevant lines'].strip() + if ',' in relevant_lines_str: # 'relevant lines': '181, 190' + relevant_lines_str = int(relevant_lines_str.split(',')[0]) + relevant_lines_start = int(relevant_lines_str.split('-')[0]) # absolute position + relevant_lines_end = int(relevant_lines_str.split('-')[-1]) + content = d['suggestion content'] + new_code_snippet = d['improved code'] - if new_code_snippet: - new_code_snippet = self.dedent_code(relevant_file, relevant_lines_start, new_code_snippet) + if new_code_snippet: + new_code_snippet = self.dedent_code(relevant_file, relevant_lines_start, new_code_snippet) - body = f"**Suggestion:** {content}\n```suggestion\n" + new_code_snippet + "\n```" - code_suggestions.append({'body': body,'relevant_file': relevant_file, - 'relevant_lines_start': relevant_lines_start, - 'relevant_lines_end': relevant_lines_end}) + body = f"**Suggestion:** {content}\n```suggestion\n" + new_code_snippet + "\n```" + code_suggestions.append({'body': body, 'relevant_file': relevant_file, + 'relevant_lines_start': relevant_lines_start, + 'relevant_lines_end': relevant_lines_end}) + except: + if settings.config.verbosity_level >= 2: + logging.info(f"Could not parse suggestion: {d}") self.git_provider.publish_code_suggestions(code_suggestions) From 4664d9184439f9c21a6829b933bfec2f1d9d3458 Mon Sep 17 00:00:00 2001 From: mrT23 Date: Fri, 28 Jul 2023 11:24:14 +0300 Subject: [PATCH 2/3] bug fixes in gitlab code suggestion --- pr_agent/git_providers/gitlab_provider.py | 46 ++++++++++++++--------- pr_agent/tools/pr_code_suggestions.py | 4 +- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py index 9e27d694..b88ba28a 100644 --- a/pr_agent/git_providers/gitlab_provider.py +++ b/pr_agent/git_providers/gitlab_provider.py @@ -140,32 +140,42 @@ class GitLabProvider(GitProvider): else: 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}) def publish_code_suggestions(self, code_suggestions: list): for suggestion in code_suggestions: - body = suggestion['body'] - relevant_file = suggestion['relevant_file'] - relevant_lines_start = suggestion['relevant_lines_start'] - relevant_lines_end = suggestion['relevant_lines_end'] + try: + body = suggestion['body'] + relevant_file = suggestion['relevant_file'] + relevant_lines_start = suggestion['relevant_lines_start'] + relevant_lines_end = suggestion['relevant_lines_end'] - self.diff_files = self.diff_files if self.diff_files else self.get_diff_files() - target_file = None - for file in self.diff_files: - if file.filename == relevant_file: + self.diff_files = self.diff_files if self.diff_files else self.get_diff_files() + target_file = None + for file in self.diff_files: if file.filename == relevant_file: - target_file = file - break - range = relevant_lines_end - relevant_lines_start + 1 - body = body.replace('```suggestion', f'```suggestion:-0+{range}') + if file.filename == relevant_file: + target_file = file + break + range = relevant_lines_end - relevant_lines_start # no need to add 1 + body = body.replace('```suggestion', f'```suggestion:-0+{range}') + lines = target_file.head_file.splitlines() + relevant_line_in_file = lines[relevant_lines_start - 1] - lines = target_file.head_file.splitlines() - relevant_line_in_file = lines[relevant_lines_start - 1] - edit_type, found, source_line_no, target_file, target_line_no = self.find_in_file(target_file, - relevant_line_in_file) - self.send_inline_comment(body, edit_type, found, relevant_file, relevant_line_in_file, source_line_no, - target_file, target_line_no) + # edit_type, found, source_line_no, target_file, target_line_no = self.find_in_file(target_file, + # relevant_line_in_file) + # for code suggestions, we want to edit the new code + source_line_no = None + target_line_no = relevant_lines_start + 1 + found = True + edit_type = 'addition' + + self.send_inline_comment(body, edit_type, found, relevant_file, relevant_line_in_file, source_line_no, + target_file, target_line_no) + except Exception as e: + logging.exception(f"Could not publish code suggestion:\nsuggestion: {suggestion}\nerror: {e}") def search_line(self, relevant_file, relevant_line_in_file): target_file = None diff --git a/pr_agent/tools/pr_code_suggestions.py b/pr_agent/tools/pr_code_suggestions.py index a3b388d9..6ec80ec0 100644 --- a/pr_agent/tools/pr_code_suggestions.py +++ b/pr_agent/tools/pr_code_suggestions.py @@ -96,8 +96,8 @@ class PRCodeSuggestions: logging.info(f"suggestion: {d}") relevant_file = d['relevant file'].strip() relevant_lines_str = d['relevant lines'].strip() - if ',' in relevant_lines_str: # 'relevant lines': '181, 190' - relevant_lines_str = int(relevant_lines_str.split(',')[0]) + if ',' in relevant_lines_str: # handling 'relevant lines': '181, 190' or '178-184, 188-194' + relevant_lines_str = relevant_lines_str.split(',')[0] relevant_lines_start = int(relevant_lines_str.split('-')[0]) # absolute position relevant_lines_end = int(relevant_lines_str.split('-')[-1]) content = d['suggestion content'] From 07fe91e57bc4c66aecc17ebadcd2ea1c63423cf4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 28 Jul 2023 08:39:42 +0000 Subject: [PATCH 3/3] Update CHANGELOG.md --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a905f38..52927c7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 2023-07-28 + +### Improved +- Enhanced error handling and logging in the GitLab provider. +- Improved handling of inline comments and code suggestions in GitLab. +- Fixed a bug where an additional unneeded line was added to code suggestions in GitLab. + ## 2023-07-26 ### Added