2023-08-01 15:36:20 +00:00
|
|
|
import logging
|
2023-08-01 14:44:08 +00:00
|
|
|
import os
|
2023-08-01 11:43:26 +00:00
|
|
|
import shlex
|
2023-08-01 14:44:08 +00:00
|
|
|
import tempfile
|
2023-07-05 21:21:08 +00:00
|
|
|
|
2023-08-01 11:43:26 +00:00
|
|
|
from pr_agent.algo.utils import update_settings_from_args
|
|
|
|
|
from pr_agent.config_loader import get_settings
|
2023-08-01 14:44:08 +00:00
|
|
|
from pr_agent.git_providers import get_git_provider
|
2023-07-16 12:42:50 +00:00
|
|
|
from pr_agent.tools.pr_code_suggestions import PRCodeSuggestions
|
|
|
|
|
from pr_agent.tools.pr_description import PRDescription
|
2023-07-17 12:49:29 +00:00
|
|
|
from pr_agent.tools.pr_information_from_user import PRInformationFromUser
|
2023-07-05 21:21:08 +00:00
|
|
|
from pr_agent.tools.pr_questions import PRQuestions
|
|
|
|
|
from pr_agent.tools.pr_reviewer import PRReviewer
|
2023-08-21 06:07:21 +00:00
|
|
|
from pr_agent.tools.pr_extended_code_suggestions import PRExtendedCodeSuggestions
|
2023-07-26 17:05:18 +00:00
|
|
|
from pr_agent.tools.pr_update_changelog import PRUpdateChangelog
|
2023-08-02 13:42:54 +00:00
|
|
|
from pr_agent.tools.pr_config import PRConfig
|
2023-07-05 21:21:08 +00:00
|
|
|
|
2023-08-01 11:43:26 +00:00
|
|
|
command2class = {
|
2023-08-16 20:17:00 +00:00
|
|
|
"auto_review": PRReviewer,
|
2023-08-01 11:43:26 +00:00
|
|
|
"answer": PRReviewer,
|
|
|
|
|
"review": PRReviewer,
|
|
|
|
|
"review_pr": PRReviewer,
|
|
|
|
|
"reflect": PRInformationFromUser,
|
|
|
|
|
"reflect_and_review": PRInformationFromUser,
|
|
|
|
|
"describe": PRDescription,
|
|
|
|
|
"describe_pr": PRDescription,
|
|
|
|
|
"improve": PRCodeSuggestions,
|
|
|
|
|
"improve_code": PRCodeSuggestions,
|
2023-08-21 06:07:21 +00:00
|
|
|
"extended_improve": PRExtendedCodeSuggestions,
|
2023-08-01 11:43:26 +00:00
|
|
|
"ask": PRQuestions,
|
|
|
|
|
"ask_question": PRQuestions,
|
|
|
|
|
"update_changelog": PRUpdateChangelog,
|
2023-08-02 13:42:54 +00:00
|
|
|
"config": PRConfig,
|
|
|
|
|
"settings": PRConfig,
|
2023-08-01 11:43:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
commands = list(command2class.keys())
|
2023-07-05 21:21:08 +00:00
|
|
|
|
|
|
|
|
class PRAgent:
|
2023-07-08 05:52:11 +00:00
|
|
|
def __init__(self):
|
|
|
|
|
pass
|
2023-07-05 21:21:08 +00:00
|
|
|
|
2023-08-07 15:09:39 +00:00
|
|
|
async def handle_request(self, pr_url, request, notify=None) -> bool:
|
2023-08-01 14:44:08 +00:00
|
|
|
# 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:
|
2023-08-01 15:36:20 +00:00
|
|
|
try:
|
|
|
|
|
os.remove(repo_settings_file)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
logging.error(f"Failed to remove temporary settings file {repo_settings_file}", e)
|
2023-08-01 14:44:08 +00:00
|
|
|
|
|
|
|
|
# Then, apply user specific settings if exists
|
2023-08-01 12:58:23 +00:00
|
|
|
request = request.replace("'", "\\'")
|
2023-08-01 11:43:26 +00:00
|
|
|
lexer = shlex.shlex(request, posix=True)
|
|
|
|
|
lexer.whitespace_split = True
|
|
|
|
|
action, *args = list(lexer)
|
|
|
|
|
args = update_settings_from_args(args)
|
2023-08-01 14:44:08 +00:00
|
|
|
|
2023-08-01 11:43:26 +00:00
|
|
|
action = action.lstrip("/").lower()
|
|
|
|
|
if action == "reflect_and_review" and not get_settings().pr_reviewer.ask_and_reflect:
|
|
|
|
|
action = "review"
|
|
|
|
|
if action == "answer":
|
2023-08-07 15:09:39 +00:00
|
|
|
if notify:
|
|
|
|
|
notify()
|
2023-08-01 11:43:26 +00:00
|
|
|
await PRReviewer(pr_url, is_answer=True, args=args).run()
|
2023-08-16 20:17:00 +00:00
|
|
|
elif action == "auto_review":
|
|
|
|
|
await PRReviewer(pr_url, is_auto=True, args=args).run()
|
2023-08-01 11:43:26 +00:00
|
|
|
elif action in command2class:
|
2023-08-07 15:09:39 +00:00
|
|
|
if notify:
|
|
|
|
|
notify()
|
2023-08-01 11:43:26 +00:00
|
|
|
await command2class[action](pr_url, args=args).run()
|
2023-07-06 09:58:05 +00:00
|
|
|
else:
|
2023-07-16 12:42:50 +00:00
|
|
|
return False
|
|
|
|
|
return True
|