mirror of
https://github.com/qodo-ai/pr-agent.git
synced 2025-07-04 04:40:38 +08:00
Refactor repo-specific settings application into a utility function, fix merge bug
This commit is contained in:
@ -6,6 +6,7 @@ import tempfile
|
|||||||
from pr_agent.algo.utils import update_settings_from_args
|
from pr_agent.algo.utils import update_settings_from_args
|
||||||
from pr_agent.config_loader import get_settings
|
from pr_agent.config_loader import get_settings
|
||||||
from pr_agent.git_providers import get_git_provider
|
from pr_agent.git_providers import get_git_provider
|
||||||
|
from pr_agent.git_providers.utils import apply_repo_settings
|
||||||
from pr_agent.tools.pr_add_docs import PRAddDocs
|
from pr_agent.tools.pr_add_docs import PRAddDocs
|
||||||
from pr_agent.tools.pr_code_suggestions import PRCodeSuggestions
|
from pr_agent.tools.pr_code_suggestions import PRCodeSuggestions
|
||||||
from pr_agent.tools.pr_description import PRDescription
|
from pr_agent.tools.pr_description import PRDescription
|
||||||
@ -44,22 +45,7 @@ class PRAgent:
|
|||||||
|
|
||||||
async def handle_request(self, pr_url, request, notify=None) -> bool:
|
async def handle_request(self, pr_url, request, notify=None) -> bool:
|
||||||
# First, apply repo specific settings if exists
|
# First, apply repo specific settings if exists
|
||||||
if get_settings().config.use_repo_settings_file:
|
apply_repo_settings(pr_url)
|
||||||
repo_settings_file = None
|
|
||||||
try:
|
|
||||||
git_provider = get_git_provider()(pr_url)
|
|
||||||
repo_settings = git_provider.get_repo_settings()
|
|
||||||
if repo_settings:
|
|
||||||
repo_settings_file = None
|
|
||||||
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:
|
|
||||||
try:
|
|
||||||
os.remove(repo_settings_file)
|
|
||||||
except Exception as e:
|
|
||||||
logging.error(f"Failed to remove temporary settings file {repo_settings_file}", e)
|
|
||||||
|
|
||||||
# Then, apply user specific settings if exists
|
# Then, apply user specific settings if exists
|
||||||
request = request.replace("'", "\\'")
|
request = request.replace("'", "\\'")
|
||||||
@ -84,3 +70,4 @@ class PRAgent:
|
|||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
35
pr_agent/git_providers/utils.py
Normal file
35
pr_agent/git_providers/utils.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import copy
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
import tempfile
|
||||||
|
|
||||||
|
from dynaconf import Dynaconf
|
||||||
|
|
||||||
|
from pr_agent.config_loader import get_settings
|
||||||
|
from pr_agent.git_providers import get_git_provider
|
||||||
|
|
||||||
|
|
||||||
|
def apply_repo_settings(pr_url):
|
||||||
|
if get_settings().config.use_repo_settings_file:
|
||||||
|
repo_settings_file = None
|
||||||
|
try:
|
||||||
|
git_provider = get_git_provider()(pr_url)
|
||||||
|
repo_settings = git_provider.get_repo_settings()
|
||||||
|
if repo_settings:
|
||||||
|
repo_settings_file = None
|
||||||
|
fd, repo_settings_file = tempfile.mkstemp(suffix='.toml')
|
||||||
|
os.write(fd, repo_settings)
|
||||||
|
new_settings = Dynaconf(settings_files=[repo_settings_file])
|
||||||
|
for section, contents in new_settings.as_dict().items():
|
||||||
|
section_dict = copy.deepcopy(get_settings().as_dict().get(section, {}))
|
||||||
|
for key, value in contents.items():
|
||||||
|
section_dict[key] = value
|
||||||
|
get_settings().unset(section)
|
||||||
|
get_settings().set(section, section_dict, merge=False)
|
||||||
|
|
||||||
|
finally:
|
||||||
|
if repo_settings_file:
|
||||||
|
try:
|
||||||
|
os.remove(repo_settings_file)
|
||||||
|
except Exception as e:
|
||||||
|
logging.error(f"Failed to remove temporary settings file {repo_settings_file}", e)
|
@ -15,6 +15,7 @@ from pr_agent.agent.pr_agent import PRAgent
|
|||||||
from pr_agent.algo.utils import update_settings_from_args
|
from pr_agent.algo.utils import update_settings_from_args
|
||||||
from pr_agent.config_loader import get_settings, global_settings
|
from pr_agent.config_loader import get_settings, global_settings
|
||||||
from pr_agent.git_providers import get_git_provider
|
from pr_agent.git_providers import get_git_provider
|
||||||
|
from pr_agent.git_providers.utils import apply_repo_settings
|
||||||
from pr_agent.servers.utils import verify_signature
|
from pr_agent.servers.utils import verify_signature
|
||||||
|
|
||||||
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
|
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
|
||||||
@ -124,6 +125,7 @@ async def handle_request(body: Dict[str, Any], event: str):
|
|||||||
# avoid double reviews when opening a PR for the first time
|
# avoid double reviews when opening a PR for the first time
|
||||||
return {}
|
return {}
|
||||||
logging.info(f"Performing review because of event={event} and action={action}")
|
logging.info(f"Performing review because of event={event} and action={action}")
|
||||||
|
apply_repo_settings(api_url)
|
||||||
for command in get_settings().github_app.pr_commands:
|
for command in get_settings().github_app.pr_commands:
|
||||||
split_command = command.split(" ")
|
split_command = command.split(" ")
|
||||||
command = split_command[0]
|
command = split_command[0]
|
||||||
|
Reference in New Issue
Block a user