今天來 trace code 看看,順便感受人家開發人員的 code 之美
入口點我們來看
python3 -m pr_agent.cli --pr_url $URL review
我們找到了在 pr_agent folder 下的 cli.py,然後在裡面找到了
command
被設置為 "review"if __name__ == '__main__':
run()
def run(inargs=None, args=None):
parser = set_parser()
if not args:
args = parser.parse_args(inargs)
if not args.pr_url and not args.issue_url:
parser.print_help()
return
command = args.command.lower()
get_settings().set("CONFIG.CLI_MODE", True)
if args.issue_url:
result = asyncio.run(PRAgent().handle_request(args.issue_url, [command] + args.rest))
else:
result = asyncio.run(PRAgent().handle_request(args.pr_url, [command] + args.rest))
if not result:
parser.print_help()
run 裡面 async 調用 PRAgent().handle_request()。以下查看 PRAgent().handle_request(),
request 帶入 review
得到 apply_repo_settings(pr_url)
get_git_provider_with_context -> 確認為 gitlab provide
從 provider 帶出 context,並拿到相關設置
git_provider = get_git_provider_with_context(pr_url) -> 確認為 gitlab provider
git_provider = _GIT_PROVIDERS[provider_id](pr_url)
if is_context_env:
context["git_provider"] = {pr_url: git_provider}
檢查 request(review) 是否在command2class
字典內,並發現 "review" 命令對應的是 PRReviewer
command2class = {
"auto_review": PRReviewer,
"answer": PRReviewer,
"review": PRReviewer,
}
接著執行 command2class,創建 PRReviewer
的實例並調用其 run()
方法
await command2class[action](pr_url, ai_handler=self.ai_handler, args=args).run()