From 82710c2d15c2f549ab80904a6924a21ec5d29ab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Sz=C3=A9csi?= Date: Sun, 13 Aug 2023 22:56:50 +0200 Subject: [PATCH 1/8] add AzureDevopsProvider to __init__.py --- pr_agent/git_providers/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pr_agent/git_providers/__init__.py b/pr_agent/git_providers/__init__.py index e7c2aa0f..f65553b0 100644 --- a/pr_agent/git_providers/__init__.py +++ b/pr_agent/git_providers/__init__.py @@ -3,12 +3,14 @@ from pr_agent.git_providers.bitbucket_provider import BitbucketProvider from pr_agent.git_providers.github_provider import GithubProvider from pr_agent.git_providers.gitlab_provider import GitLabProvider from pr_agent.git_providers.local_git_provider import LocalGitProvider +from pr_agent.git_providers.azuredevops_provider import AzureDevopsProvider _GIT_PROVIDERS = { 'github': GithubProvider, 'gitlab': GitLabProvider, 'bitbucket': BitbucketProvider, - 'local' : LocalGitProvider + 'local': LocalGitProvider, + 'azure': AzureDevopsProvider } def get_git_provider(): From 524faadffb1dc013542be96fd22e562b0265d52e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Sz=C3=A9csi?= Date: Sun, 13 Aug 2023 23:00:45 +0200 Subject: [PATCH 2/8] init AzureDevopsProvider --- .../git_providers/azuredevops_provider.py | 191 ++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 pr_agent/git_providers/azuredevops_provider.py diff --git a/pr_agent/git_providers/azuredevops_provider.py b/pr_agent/git_providers/azuredevops_provider.py new file mode 100644 index 00000000..1af45cd4 --- /dev/null +++ b/pr_agent/git_providers/azuredevops_provider.py @@ -0,0 +1,191 @@ +import logging +from typing import Optional, Tuple +from urllib.parse import urlparse + +import os + +import requests + +from msrest.authentication import BasicAuthentication +from azure.devops.connection import Connection + +from ..algo.pr_processing import clip_tokens +from ..config_loader import get_settings +from .git_provider import FilePatchInfo + +class AzureDevopsProvider: + def __init__(self, pr_url: Optional[str] = None, incremental: Optional[bool] = False): + + self.azure_devops_client = self._get_azure_devops_client() + logging.info(self.azure_devops_client) + + self.workspace_slug = None + self.repo_slug = None + self.repo = None + self.pr_num = None + self.pr = None + self.temp_comments = [] + self.incremental = incremental + if pr_url: + self.set_pr(pr_url) + + def is_supported(self, capability: str) -> bool: + if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments', 'get_labels']: + return False + return True + + def set_pr(self, pr_url: str): + self.workspace_slug, self.repo_slug, self.pr_num = self._parse_pr_url(pr_url) + self.pr = self._get_pr() + + def get_repo_settings(self): + try: + contents = self.azure_devops_client.get_item_content(repository_id=self.repo_slug, project=self.workspace_slug, download=False, include_content_metadata=False, include_content=True, path=".pr_agent.toml") + logging.info("get repo settings") + logging.info(contents) + return contents + except Exception as e: + logging.info("get repo settings error") + logging.info(e) + return "" + + def get_files(self): + files = [] + for i in self.azure_devops_client.get_pull_request_commits(project=self.workspace_slug, repository_id=self.repo_slug, pull_request_id=self.pr_num): + #logging.info(i) + changes_obj = self.azure_devops_client.get_changes(project=self.workspace_slug, repository_id=self.repo_slug, commit_id=i.commit_id) + #logging.info(changes_obj) + #logging.info("***********") + for c in changes_obj.changes: + files.append(c['item']['path']) + #logging.info("###########") + return files + + def get_diff_files(self) -> list[FilePatchInfo]: + diffs = self.pr.diffstat() + diff_split = ['diff --git%s' % x for x in self.pr.diff().split('diff --git') if x.strip()] + + diff_files = [] + for index, diff in enumerate(diffs): + original_file_content_str = self._get_pr_file_content(diff.old.get_data('links')) + new_file_content_str = self._get_pr_file_content(diff.new.get_data('links')) + diff_files.append(FilePatchInfo(original_file_content_str, new_file_content_str, + diff_split[index], diff.new.path)) + return diff_files + + def publish_comment(self, pr_comment: str, is_temporary: bool = False): + comment = self.pr.comment(pr_comment) + if is_temporary: + self.temp_comments.append(comment['id']) + + def remove_initial_comment(self): + try: + for comment in self.temp_comments: + self.pr.delete(f'comments/{comment}') + except Exception as e: + logging.exception(f"Failed to remove temp comments, error: {e}") + + def publish_inline_comment(self, body: str, relevant_file: str, relevant_line_in_file: str): + pass + + def create_inline_comment(self, body: str, relevant_file: str, relevant_line_in_file: str): + raise NotImplementedError("Azure DevOps provider does not support creating inline comments yet") + + def publish_inline_comments(self, comments: list[dict]): + raise NotImplementedError("Azure DevOps provider does not support publishing inline comments yet") + + def get_title(self): + return self.pr.title + + def get_languages(self): + languages = [] + files = self.azure_devops_client.get_items(project=self.workspace_slug, repository_id=self.repo_slug, recursion_level="Full", include_content_metadata=True, include_links=False, download=False) + for f in files: + if f.git_object_type == 'blob': + file_name, file_extension = os.path.splitext(f.path) + languages.append(file_extension[1:]) + + extension_counts = {} + for ext in languages: + if ext != '': + extension_counts[ext] = extension_counts.get(ext, 0) + 1 + + total_extensions = sum(extension_counts.values()) + + extension_percentages = {ext: (count / total_extensions) * 100 for ext, count in extension_counts.items()} + logging.info(extension_percentages) + + return extension_percentages + + def get_pr_branch(self): + return self.pr.source_branch + + def get_pr_description(self): + max_tokens = get_settings().get("CONFIG.MAX_DESCRIPTION_TOKENS", None) + if max_tokens: + return clip_tokens(self.pr.description, max_tokens) + return self.pr.description + + def get_user_id(self): + return 0 + + def get_issue_comments(self): + raise NotImplementedError("Azure DevOps provider does not support issue comments yet") + + def add_eyes_reaction(self, issue_comment_id: int) -> Optional[int]: + return True + + def remove_reaction(self, issue_comment_id: int, reaction_id: int) -> bool: + return True + + @staticmethod + def _parse_pr_url(pr_url: str) -> Tuple[str, int]: + parsed_url = urlparse(pr_url) + + if 'azure.com' not in parsed_url.netloc: + raise ValueError("The provided URL is not a valid Azure DevOps URL") + + path_parts = parsed_url.path.strip('/').split('/') + logging.info(path_parts) + + if len(path_parts) < 6 or path_parts[4] != 'pullrequest': + raise ValueError("The provided URL does not appear to be a Azure DevOps PR URL") + + workspace_slug = path_parts[1] + repo_slug = path_parts[3] + try: + pr_number = int(path_parts[5]) + except ValueError as e: + raise ValueError("Unable to convert PR number to integer") from e + + return workspace_slug, repo_slug, pr_number + + def _get_azure_devops_client(self): + try: + pat = get_settings().azure_devops.pat + org = get_settings().azure_devops.org + except AttributeError as e: + raise ValueError( + "Azure DevOps PAT token is required ") from e + + credentials = BasicAuthentication('', pat) + azure_devops_connection = Connection(base_url=org, creds=credentials) + azure_devops_client = azure_devops_connection.clients.get_git_client() + + return azure_devops_client + + def _get_repo(self): + if self.repo is None: + self.repo = self.azure_devops_client.get_repository(project=self.workspace_slug, repository_id=self.repo_slug) + #logging.info(self.repo) + return self.repo + + def _get_pr(self): + logging.info(self.azure_devops_client.get_pull_request_by_id(pull_request_id=self.pr_num, project=self.workspace_slug)) + return self.azure_devops_client.get_pull_request_by_id(pull_request_id=self.pr_num, project=self.workspace_slug) + + def _get_pr_file_content(self, remote_link: str): + return "" + + def get_commit_messages(self): + return "" # not implemented yet From 52ba2793cd67c4850c64aeda4f0bc0ee104f4eaa Mon Sep 17 00:00:00 2001 From: szecsip Date: Wed, 23 Aug 2023 15:59:49 +0000 Subject: [PATCH 3/8] modify get_main_pr_language to handle azuredevops provided language format --- pr_agent/git_providers/git_provider.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pr_agent/git_providers/git_provider.py b/pr_agent/git_providers/git_provider.py index 2a891938..e8c1c8a8 100644 --- a/pr_agent/git_providers/git_provider.py +++ b/pr_agent/git_providers/git_provider.py @@ -1,3 +1,4 @@ +import logging from abc import ABC, abstractmethod from dataclasses import dataclass @@ -112,6 +113,8 @@ def get_main_pr_language(languages, files) -> str: # validate that the specific commit uses the main language extension_list = [] for file in files: + if isinstance(file, str): + file = FilePatchInfo(base_file=None, head_file=None, patch=None, filename=file) extension_list.append(file.filename.rsplit('.')[-1]) # get the most common extension @@ -133,10 +136,12 @@ def get_main_pr_language(languages, files) -> str: most_common_extension == 'scala' and top_language == 'scala' or \ most_common_extension == 'kt' and top_language == 'kotlin' or \ most_common_extension == 'pl' and top_language == 'perl' or \ - most_common_extension == 'swift' and top_language == 'swift': + most_common_extension == 'swift' and top_language == 'swift' or \ + most_common_extension == top_language: main_language_str = top_language - except Exception: + except Exception as e: + logging.info(e) pass return main_language_str From 01d1cf98f4be1b4cdefb1ebbee1ed0d5e1b17749 Mon Sep 17 00:00:00 2001 From: szecsip Date: Wed, 23 Aug 2023 16:01:10 +0000 Subject: [PATCH 4/8] init Azure DevOps git provider --- .../git_providers/azuredevops_provider.py | 161 +++++++++++++----- 1 file changed, 123 insertions(+), 38 deletions(-) diff --git a/pr_agent/git_providers/azuredevops_provider.py b/pr_agent/git_providers/azuredevops_provider.py index 1af45cd4..7290810c 100644 --- a/pr_agent/git_providers/azuredevops_provider.py +++ b/pr_agent/git_providers/azuredevops_provider.py @@ -1,23 +1,25 @@ +import json import logging from typing import Optional, Tuple from urllib.parse import urlparse import os -import requests - from msrest.authentication import BasicAuthentication from azure.devops.connection import Connection +from azure.devops.v7_0.git.models import Comment, CommentThread, GitVersionDescriptor, GitPullRequest from ..algo.pr_processing import clip_tokens from ..config_loader import get_settings -from .git_provider import FilePatchInfo +from ..algo.utils import load_large_diff +from ..algo.language_handler import is_valid_file +from .git_provider import EDIT_TYPE, FilePatchInfo + class AzureDevopsProvider: def __init__(self, pr_url: Optional[str] = None, incremental: Optional[bool] = False): self.azure_devops_client = self._get_azure_devops_client() - logging.info(self.azure_devops_client) self.workspace_slug = None self.repo_slug = None @@ -40,9 +42,10 @@ class AzureDevopsProvider: def get_repo_settings(self): try: - contents = self.azure_devops_client.get_item_content(repository_id=self.repo_slug, project=self.workspace_slug, download=False, include_content_metadata=False, include_content=True, path=".pr_agent.toml") - logging.info("get repo settings") - logging.info(contents) + contents = self.azure_devops_client.get_item_content(repository_id=self.repo_slug, + project=self.workspace_slug, download=False, + include_content_metadata=False, include_content=True, + path=".pr_agent.toml") return contents except Exception as e: logging.info("get repo settings error") @@ -51,42 +54,121 @@ class AzureDevopsProvider: def get_files(self): files = [] - for i in self.azure_devops_client.get_pull_request_commits(project=self.workspace_slug, repository_id=self.repo_slug, pull_request_id=self.pr_num): - #logging.info(i) - changes_obj = self.azure_devops_client.get_changes(project=self.workspace_slug, repository_id=self.repo_slug, commit_id=i.commit_id) - #logging.info(changes_obj) - #logging.info("***********") + for i in self.azure_devops_client.get_pull_request_commits(project=self.workspace_slug, + repository_id=self.repo_slug, + pull_request_id=self.pr_num): + + changes_obj = self.azure_devops_client.get_changes(project=self.workspace_slug, + repository_id=self.repo_slug, commit_id=i.commit_id) + for c in changes_obj.changes: files.append(c['item']['path']) - #logging.info("###########") - return files + return list(set(files)) def get_diff_files(self) -> list[FilePatchInfo]: - diffs = self.pr.diffstat() - diff_split = ['diff --git%s' % x for x in self.pr.diff().split('diff --git') if x.strip()] - - diff_files = [] - for index, diff in enumerate(diffs): - original_file_content_str = self._get_pr_file_content(diff.old.get_data('links')) - new_file_content_str = self._get_pr_file_content(diff.new.get_data('links')) - diff_files.append(FilePatchInfo(original_file_content_str, new_file_content_str, - diff_split[index], diff.new.path)) - return diff_files + try: + base_sha = self.pr.last_merge_target_commit + head_sha = self.pr.last_merge_source_commit + + commits = self.azure_devops_client.get_pull_request_commits(project=self.workspace_slug, + repository_id=self.repo_slug, + pull_request_id=self.pr_num) + + diff_files = [] + diffs = [] + diff_types = {} + + for c in commits: + changes_obj = self.azure_devops_client.get_changes(project=self.workspace_slug, + repository_id=self.repo_slug, commit_id=c.commit_id) + for i in changes_obj.changes: + logging.info(i) + diffs.append(i['item']['path']) + diff_types[i['item']['path']] = i['changeType'] + + diffs = list(set(diffs)) + + for file in diffs: + if not is_valid_file(file): + continue + + version = GitVersionDescriptor(version=head_sha.commit_id, version_type='commit') + new_file_content_str = self.azure_devops_client.get_item(repository_id=self.repo_slug, + path=file, + project=self.workspace_slug, + version_descriptor=version, + download=False, + include_content=True) + + new_file_content_str = new_file_content_str.content + + edit_type = EDIT_TYPE.MODIFIED + if diff_types[file] == 'add': + edit_type = EDIT_TYPE.ADDED + elif diff_types[file] == 'delete': + edit_type = EDIT_TYPE.DELETED + elif diff_types[file] == 'rename': + edit_type = EDIT_TYPE.RENAMED + + version = GitVersionDescriptor(version=base_sha.commit_id, version_type='commit') + original_file_content_str = self.azure_devops_client.get_item(repository_id=self.repo_slug, + path=file, + project=self.workspace_slug, + version_descriptor=version, + download=False, + include_content=True) + original_file_content_str = original_file_content_str.content + + patch = load_large_diff(file, new_file_content_str, original_file_content_str) + + diff_files.append(FilePatchInfo(original_file_content_str, new_file_content_str, + patch=patch, + filename=file, + edit_type=edit_type)) + + self.diff_files = diff_files + return diff_files + except Exception as e: + print(f"Error: {str(e)}") + return [] def publish_comment(self, pr_comment: str, is_temporary: bool = False): - comment = self.pr.comment(pr_comment) + comment = Comment(content=pr_comment) + thread = CommentThread(comments=[comment]) + thread_response = self.azure_devops_client.create_thread(comment_thread=thread, project=self.workspace_slug, + repository_id=self.repo_slug, + pull_request_id=self.pr_num) if is_temporary: - self.temp_comments.append(comment['id']) + self.temp_comments.append({'thread_id': thread_response.id, 'comment_id': comment.id}) + + def publish_description(self, pr_title: str, pr_body: str): + try: + updated_pr = GitPullRequest() + updated_pr.title = pr_title + updated_pr.description = pr_body + self.azure_devops_client.update_pull_request(project=self.workspace_slug, + repository_id=self.repo_slug, + pull_request_id=self.pr_num, + git_pull_request_to_update=updated_pr) + except Exception as e: + logging.exception(f"Could not update pull request {self.pr_num} description: {e}") def remove_initial_comment(self): try: for comment in self.temp_comments: - self.pr.delete(f'comments/{comment}') + new_comment_thread = CommentThread(comments=[Comment(content='bumm')]) + # self.azure_devops_client.delete_comment(project=self.workspace_slug, repository_id=self.repo_slug, thread_id=comment['thread_id'], comment_id=comment['comment_id'], pull_request_id=self.pr_num) + + res = self.azure_devops_client.update_thread(project=self.workspace_slug, repository_id=self.repo_slug, + thread_id=comment['thread_id'], + pull_request_id=self.pr_num, + comment_thread=new_comment_thread) + logging.info(res) except Exception as e: logging.exception(f"Failed to remove temp comments, error: {e}") def publish_inline_comment(self, body: str, relevant_file: str, relevant_line_in_file: str): - pass + raise NotImplementedError("Azure DevOps provider does not support publishing inline comment yet") def create_inline_comment(self, body: str, relevant_file: str, relevant_line_in_file: str): raise NotImplementedError("Azure DevOps provider does not support creating inline comments yet") @@ -99,7 +181,9 @@ class AzureDevopsProvider: def get_languages(self): languages = [] - files = self.azure_devops_client.get_items(project=self.workspace_slug, repository_id=self.repo_slug, recursion_level="Full", include_content_metadata=True, include_links=False, download=False) + files = self.azure_devops_client.get_items(project=self.workspace_slug, repository_id=self.repo_slug, + recursion_level="Full", include_content_metadata=True, + include_links=False, download=False) for f in files: if f.git_object_type == 'blob': file_name, file_extension = os.path.splitext(f.path) @@ -113,12 +197,14 @@ class AzureDevopsProvider: total_extensions = sum(extension_counts.values()) extension_percentages = {ext: (count / total_extensions) * 100 for ext, count in extension_counts.items()} - logging.info(extension_percentages) return extension_percentages def get_pr_branch(self): - return self.pr.source_branch + pr_info = self.azure_devops_client.get_pull_request_by_id(project=self.workspace_slug, + pull_request_id=self.pr_num) + source_branch = pr_info.source_ref_name.split('/')[-1] + return source_branch def get_pr_description(self): max_tokens = get_settings().get("CONFIG.MAX_DESCRIPTION_TOKENS", None) @@ -141,13 +227,12 @@ class AzureDevopsProvider: @staticmethod def _parse_pr_url(pr_url: str) -> Tuple[str, int]: parsed_url = urlparse(pr_url) - + if 'azure.com' not in parsed_url.netloc: raise ValueError("The provided URL is not a valid Azure DevOps URL") path_parts = parsed_url.path.strip('/').split('/') - logging.info(path_parts) - + if len(path_parts) < 6 or path_parts[4] != 'pullrequest': raise ValueError("The provided URL does not appear to be a Azure DevOps PR URL") @@ -176,13 +261,13 @@ class AzureDevopsProvider: def _get_repo(self): if self.repo is None: - self.repo = self.azure_devops_client.get_repository(project=self.workspace_slug, repository_id=self.repo_slug) - #logging.info(self.repo) + self.repo = self.azure_devops_client.get_repository(project=self.workspace_slug, + repository_id=self.repo_slug) return self.repo def _get_pr(self): - logging.info(self.azure_devops_client.get_pull_request_by_id(pull_request_id=self.pr_num, project=self.workspace_slug)) - return self.azure_devops_client.get_pull_request_by_id(pull_request_id=self.pr_num, project=self.workspace_slug) + self.pr = self.azure_devops_client.get_pull_request_by_id(pull_request_id=self.pr_num, project=self.workspace_slug) + return self.pr def _get_pr_file_content(self, remote_link: str): return "" From 5d529a71ada04095395248da310462a3f7f89f9f Mon Sep 17 00:00:00 2001 From: szecsip Date: Thu, 24 Aug 2023 15:20:00 +0000 Subject: [PATCH 5/8] some minor changes in Azure DevOps git provider --- .../git_providers/azuredevops_provider.py | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/pr_agent/git_providers/azuredevops_provider.py b/pr_agent/git_providers/azuredevops_provider.py index 7290810c..3669bae6 100644 --- a/pr_agent/git_providers/azuredevops_provider.py +++ b/pr_agent/git_providers/azuredevops_provider.py @@ -7,7 +7,8 @@ import os from msrest.authentication import BasicAuthentication from azure.devops.connection import Connection -from azure.devops.v7_0.git.models import Comment, CommentThread, GitVersionDescriptor, GitPullRequest + +from azure.devops.v7_1.git.models import Comment, CommentThread, GitVersionDescriptor, GitPullRequest from ..algo.pr_processing import clip_tokens from ..config_loader import get_settings @@ -32,7 +33,7 @@ class AzureDevopsProvider: self.set_pr(pr_url) def is_supported(self, capability: str) -> bool: - if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments', 'get_labels']: + if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments', 'get_labels', 'remove_initial_comment']: return False return True @@ -48,8 +49,7 @@ class AzureDevopsProvider: path=".pr_agent.toml") return contents except Exception as e: - logging.info("get repo settings error") - logging.info(e) + logging.exception("get repo settings error") return "" def get_files(self): @@ -82,7 +82,6 @@ class AzureDevopsProvider: changes_obj = self.azure_devops_client.get_changes(project=self.workspace_slug, repository_id=self.repo_slug, commit_id=c.commit_id) for i in changes_obj.changes: - logging.info(i) diffs.append(i['item']['path']) diff_types[i['item']['path']] = i['changeType'] @@ -154,18 +153,7 @@ class AzureDevopsProvider: logging.exception(f"Could not update pull request {self.pr_num} description: {e}") def remove_initial_comment(self): - try: - for comment in self.temp_comments: - new_comment_thread = CommentThread(comments=[Comment(content='bumm')]) - # self.azure_devops_client.delete_comment(project=self.workspace_slug, repository_id=self.repo_slug, thread_id=comment['thread_id'], comment_id=comment['comment_id'], pull_request_id=self.pr_num) - - res = self.azure_devops_client.update_thread(project=self.workspace_slug, repository_id=self.repo_slug, - thread_id=comment['thread_id'], - pull_request_id=self.pr_num, - comment_thread=new_comment_thread) - logging.info(res) - except Exception as e: - logging.exception(f"Failed to remove temp comments, error: {e}") + return "" # not implemented yet def publish_inline_comment(self, body: str, relevant_file: str, relevant_line_in_file: str): raise NotImplementedError("Azure DevOps provider does not support publishing inline comment yet") @@ -224,6 +212,9 @@ class AzureDevopsProvider: def remove_reaction(self, issue_comment_id: int, reaction_id: int) -> bool: return True + def get_issue_comments(self): + raise NotImplementedError("Azure DevOps provider does not support issue comments yet") + @staticmethod def _parse_pr_url(pr_url: str) -> Tuple[str, int]: parsed_url = urlparse(pr_url) @@ -269,8 +260,5 @@ class AzureDevopsProvider: self.pr = self.azure_devops_client.get_pull_request_by_id(pull_request_id=self.pr_num, project=self.workspace_slug) return self.pr - def _get_pr_file_content(self, remote_link: str): - return "" - def get_commit_messages(self): return "" # not implemented yet From c163d47a631d8ba5210c23947e4c8850a7271a33 Mon Sep 17 00:00:00 2001 From: szecsip Date: Thu, 24 Aug 2023 15:22:14 +0000 Subject: [PATCH 6/8] fix imports --- pr_agent/git_providers/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pr_agent/git_providers/__init__.py b/pr_agent/git_providers/__init__.py index f65553b0..061ff048 100644 --- a/pr_agent/git_providers/__init__.py +++ b/pr_agent/git_providers/__init__.py @@ -1,5 +1,6 @@ from pr_agent.config_loader import get_settings from pr_agent.git_providers.bitbucket_provider import BitbucketProvider +from pr_agent.git_providers.codecommit_provider import CodeCommitProvider from pr_agent.git_providers.github_provider import GithubProvider from pr_agent.git_providers.gitlab_provider import GitLabProvider from pr_agent.git_providers.local_git_provider import LocalGitProvider @@ -9,8 +10,9 @@ _GIT_PROVIDERS = { 'github': GithubProvider, 'gitlab': GitLabProvider, 'bitbucket': BitbucketProvider, - 'local': LocalGitProvider, - 'azure': AzureDevopsProvider + 'codecommit': CodeCommitProvider, + 'azure': AzureDevopsProvider, + 'local': LocalGitProvider } def get_git_provider(): From 12167bc3a1feae8156368fd87627830d7edc7657 Mon Sep 17 00:00:00 2001 From: szecsip Date: Thu, 24 Aug 2023 16:34:20 +0000 Subject: [PATCH 7/8] fix imports --- pr_agent/git_providers/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pr_agent/git_providers/__init__.py b/pr_agent/git_providers/__init__.py index 061ff048..e5aca2fb 100644 --- a/pr_agent/git_providers/__init__.py +++ b/pr_agent/git_providers/__init__.py @@ -1,6 +1,5 @@ from pr_agent.config_loader import get_settings from pr_agent.git_providers.bitbucket_provider import BitbucketProvider -from pr_agent.git_providers.codecommit_provider import CodeCommitProvider from pr_agent.git_providers.github_provider import GithubProvider from pr_agent.git_providers.gitlab_provider import GitLabProvider from pr_agent.git_providers.local_git_provider import LocalGitProvider @@ -10,9 +9,8 @@ _GIT_PROVIDERS = { 'github': GithubProvider, 'gitlab': GitLabProvider, 'bitbucket': BitbucketProvider, - 'codecommit': CodeCommitProvider, 'azure': AzureDevopsProvider, - 'local': LocalGitProvider + 'local' : LocalGitProvider } def get_git_provider(): From ceaff2a269701a404d8f73942f630ab403d65761 Mon Sep 17 00:00:00 2001 From: szecsip Date: Thu, 24 Aug 2023 16:35:34 +0000 Subject: [PATCH 8/8] fix exception printing --- pr_agent/git_providers/git_provider.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pr_agent/git_providers/git_provider.py b/pr_agent/git_providers/git_provider.py index e8c1c8a8..3329631e 100644 --- a/pr_agent/git_providers/git_provider.py +++ b/pr_agent/git_providers/git_provider.py @@ -141,7 +141,7 @@ def get_main_pr_language(languages, files) -> str: main_language_str = top_language except Exception as e: - logging.info(e) + logging.exception(e) pass return main_language_str