diff --git a/pr_agent/git_providers/github_provider.py b/pr_agent/git_providers/github_provider.py index ae3eaeba..a985b1d2 100644 --- a/pr_agent/git_providers/github_provider.py +++ b/pr_agent/git_providers/github_provider.py @@ -1,4 +1,6 @@ import logging +import os +import tempfile from datetime import datetime from typing import Optional, Tuple from urllib.parse import urlparse @@ -31,6 +33,17 @@ class GithubProvider(GitProvider): if pr_url: self.set_pr(pr_url) self.last_commit_id = list(self.pr.get_commits())[-1] + if get_settings().config.use_repo_settings_file: + repo_settings = self.get_repo_settings() + if repo_settings: + repo_settings_file = None + try: + fd, repo_settings_file = tempfile.mkstemp(suffix='.toml') + os.write(fd, repo_settings) + get_settings().load_file(repo_settings_file) + finally: + if repo_settings_file: + os.remove(repo_settings_file) def is_supported(self, capability: str) -> bool: return True @@ -251,6 +264,13 @@ class GithubProvider(GitProvider): def get_issue_comments(self): return self.pr.get_issue_comments() + def get_repo_settings(self): + try: + contents = self.repo_obj.get_contents(".pr_agent.yaml", ref=self.pr.head.sha).decoded_content + return contents + except Exception: + return "" + @staticmethod def _parse_pr_url(pr_url: str) -> Tuple[str, int]: parsed_url = urlparse(pr_url) diff --git a/pr_agent/git_providers/gitlab_provider.py b/pr_agent/git_providers/gitlab_provider.py index 10363ec1..01cf7666 100644 --- a/pr_agent/git_providers/gitlab_provider.py +++ b/pr_agent/git_providers/gitlab_provider.py @@ -1,5 +1,7 @@ import logging +import os import re +import tempfile from typing import Optional, Tuple from urllib.parse import urlparse @@ -35,6 +37,17 @@ class GitLabProvider(GitProvider): self.RE_HUNK_HEADER = re.compile( r"^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@[ ]?(.*)") self.incremental = incremental + if get_settings().config.use_repo_settings_file: + repo_settings = self.get_repo_settings() + if repo_settings: + repo_settings_file = None + try: + fd, repo_settings_file = tempfile.mkstemp(suffix='.yaml') + os.write(fd, repo_settings.encode()) + get_settings().load_file(repo_settings_file) + finally: + if repo_settings_file: + os.remove(repo_settings_file) def is_supported(self, capability: str) -> bool: if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments']: @@ -253,6 +266,13 @@ class GitLabProvider(GitProvider): def get_issue_comments(self): raise NotImplementedError("GitLab provider does not support issue comments yet") + def get_repo_settings(self): + try: + contents = self.gl.projects.get(self.id_project).files.get(file_path='.pr_agent.yaml', ref=self.mr.source_branch).decode() + return contents + except Exception: + return "" + def _parse_merge_request_url(self, merge_request_url: str) -> Tuple[str, int]: parsed_url = urlparse(merge_request_url) diff --git a/pr_agent/settings/configuration.toml b/pr_agent/settings/configuration.toml index 5d9c0846..fe7f1ec2 100644 --- a/pr_agent/settings/configuration.toml +++ b/pr_agent/settings/configuration.toml @@ -6,6 +6,7 @@ publish_output=true publish_output_progress=true verbosity_level=0 # 0,1,2 use_extra_bad_extensions=false +use_repo_settings_file=true [pr_reviewer] # /review # require_focused_review=true