From e7258e732be56fb7ce803c02d9a9ecb0d4cf887b Mon Sep 17 00:00:00 2001 From: Ori Kotek Date: Sat, 14 Oct 2023 01:39:05 +0300 Subject: [PATCH] Refactor repo-specific settings application into a utility function, fix merge bug --- pr_agent/agent/pr_agent.py | 19 +++--------------- pr_agent/git_providers/utils.py | 35 +++++++++++++++++++++++++++++++++ pr_agent/servers/github_app.py | 2 ++ 3 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 pr_agent/git_providers/utils.py diff --git a/pr_agent/agent/pr_agent.py b/pr_agent/agent/pr_agent.py index 3d819af5..476957d5 100644 --- a/pr_agent/agent/pr_agent.py +++ b/pr_agent/agent/pr_agent.py @@ -6,6 +6,7 @@ import tempfile from pr_agent.algo.utils import update_settings_from_args from pr_agent.config_loader import get_settings 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_code_suggestions import PRCodeSuggestions 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: # First, apply repo specific settings if exists - 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) - 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) + apply_repo_settings(pr_url) # Then, apply user specific settings if exists request = request.replace("'", "\\'") @@ -84,3 +70,4 @@ class PRAgent: else: return False return True + diff --git a/pr_agent/git_providers/utils.py b/pr_agent/git_providers/utils.py new file mode 100644 index 00000000..d2dc79af --- /dev/null +++ b/pr_agent/git_providers/utils.py @@ -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) diff --git a/pr_agent/servers/github_app.py b/pr_agent/servers/github_app.py index c9f25124..272d9d0f 100644 --- a/pr_agent/servers/github_app.py +++ b/pr_agent/servers/github_app.py @@ -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.config_loader import get_settings, global_settings 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 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 return {} 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: split_command = command.split(" ") command = split_command[0]