Support repo-specific configuration file

This commit is contained in:
Ori Kotek
2023-08-01 17:22:03 +03:00
parent 08a3f033cb
commit 450f410e3c
3 changed files with 41 additions and 0 deletions

View File

@ -1,4 +1,6 @@
import logging import logging
import os
import tempfile
from datetime import datetime from datetime import datetime
from typing import Optional, Tuple from typing import Optional, Tuple
from urllib.parse import urlparse from urllib.parse import urlparse
@ -31,6 +33,17 @@ class GithubProvider(GitProvider):
if pr_url: if pr_url:
self.set_pr(pr_url) self.set_pr(pr_url)
self.last_commit_id = list(self.pr.get_commits())[-1] 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: def is_supported(self, capability: str) -> bool:
return True return True
@ -251,6 +264,13 @@ class GithubProvider(GitProvider):
def get_issue_comments(self): def get_issue_comments(self):
return self.pr.get_issue_comments() 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 @staticmethod
def _parse_pr_url(pr_url: str) -> Tuple[str, int]: def _parse_pr_url(pr_url: str) -> Tuple[str, int]:
parsed_url = urlparse(pr_url) parsed_url = urlparse(pr_url)

View File

@ -1,5 +1,7 @@
import logging import logging
import os
import re import re
import tempfile
from typing import Optional, Tuple from typing import Optional, Tuple
from urllib.parse import urlparse from urllib.parse import urlparse
@ -35,6 +37,17 @@ class GitLabProvider(GitProvider):
self.RE_HUNK_HEADER = re.compile( self.RE_HUNK_HEADER = re.compile(
r"^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@[ ]?(.*)") r"^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@[ ]?(.*)")
self.incremental = incremental 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: def is_supported(self, capability: str) -> bool:
if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments']: if capability in ['get_issue_comments', 'create_inline_comment', 'publish_inline_comments']:
@ -253,6 +266,13 @@ class GitLabProvider(GitProvider):
def get_issue_comments(self): def get_issue_comments(self):
raise NotImplementedError("GitLab provider does not support issue comments yet") 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]: def _parse_merge_request_url(self, merge_request_url: str) -> Tuple[str, int]:
parsed_url = urlparse(merge_request_url) parsed_url = urlparse(merge_request_url)

View File

@ -6,6 +6,7 @@ publish_output=true
publish_output_progress=true publish_output_progress=true
verbosity_level=0 # 0,1,2 verbosity_level=0 # 0,1,2
use_extra_bad_extensions=false use_extra_bad_extensions=false
use_repo_settings_file=true
[pr_reviewer] # /review # [pr_reviewer] # /review #
require_focused_review=true require_focused_review=true