mirror of
https://github.com/qodo-ai/pr-agent.git
synced 2025-07-03 04:10:49 +08:00
Optimize PR commit retrieval and caching in GitHub provider and utils
This commit is contained in:
@ -34,8 +34,11 @@ class GithubProvider(GitProvider):
|
||||
self.incremental = incremental
|
||||
if pr_url and 'pull' in pr_url:
|
||||
self.set_pr(pr_url)
|
||||
self.last_commit_id = list(self.pr.get_commits())[-1]
|
||||
self.pr_commits = self.pr.get_commits()
|
||||
self.last_commit_id = list(self.pr_commits)[-1]
|
||||
self.pr_url = self.get_pr_url() # pr_url for github actions can be as api.github.com, so we need to get the url from the pr object
|
||||
else:
|
||||
self.pr_commits = None
|
||||
|
||||
def is_supported(self, capability: str) -> bool:
|
||||
return True
|
||||
@ -50,7 +53,8 @@ class GithubProvider(GitProvider):
|
||||
self.get_incremental_commits()
|
||||
|
||||
def get_incremental_commits(self):
|
||||
self.commits = list(self.pr.get_commits())
|
||||
if not self.pr_commits:
|
||||
self.pr_commits = list(self.pr.get_commits())
|
||||
|
||||
self.previous_review = self.get_previous_review(full=True, incremental=True)
|
||||
if self.previous_review:
|
||||
@ -68,14 +72,14 @@ class GithubProvider(GitProvider):
|
||||
def get_commit_range(self):
|
||||
last_review_time = self.previous_review.created_at
|
||||
first_new_commit_index = None
|
||||
for index in range(len(self.commits) - 1, -1, -1):
|
||||
if self.commits[index].commit.author.date > last_review_time:
|
||||
self.incremental.first_new_commit = self.commits[index]
|
||||
for index in range(len(self.pr_commits) - 1, -1, -1):
|
||||
if self.pr_commits[index].commit.author.date > last_review_time:
|
||||
self.incremental.first_new_commit = self.pr_commits[index]
|
||||
first_new_commit_index = index
|
||||
else:
|
||||
self.incremental.last_seen_commit = self.commits[index]
|
||||
self.incremental.last_seen_commit = self.pr_commits[index]
|
||||
break
|
||||
return self.commits[first_new_commit_index:] if first_new_commit_index is not None else []
|
||||
return self.pr_commits[first_new_commit_index:] if first_new_commit_index is not None else []
|
||||
|
||||
def get_previous_review(self, *, full: bool, incremental: bool):
|
||||
if not (full or incremental):
|
||||
@ -94,9 +98,13 @@ class GithubProvider(GitProvider):
|
||||
def get_files(self):
|
||||
if self.incremental.is_incremental and self.file_set:
|
||||
return self.file_set.values()
|
||||
if not self.git_files:
|
||||
# bring files from GitHub only once
|
||||
self.git_files = self.pr.get_files()
|
||||
try:
|
||||
git_files = context.get("git_files", None)
|
||||
if git_files:
|
||||
return git_files
|
||||
except Exception:
|
||||
pass
|
||||
self.git_files = context["git_files"] = self.pr.get_files()
|
||||
return self.git_files
|
||||
|
||||
@retry(exceptions=RateLimitExceeded,
|
||||
@ -111,8 +119,12 @@ class GithubProvider(GitProvider):
|
||||
or renamed files in the merge request.
|
||||
"""
|
||||
try:
|
||||
if self.diff_files:
|
||||
return self.diff_files
|
||||
try:
|
||||
diff_files = context.get("diff_files", None)
|
||||
if diff_files:
|
||||
return diff_files
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
files = self.get_files()
|
||||
diff_files = []
|
||||
@ -156,6 +168,7 @@ class GithubProvider(GitProvider):
|
||||
diff_files.append(file_patch_canonical_structure)
|
||||
|
||||
self.diff_files = diff_files
|
||||
context["diff_files"] = diff_files
|
||||
return diff_files
|
||||
|
||||
except GithubException.RateLimitExceededException as e:
|
||||
|
@ -7,14 +7,22 @@ from dynaconf import Dynaconf
|
||||
from pr_agent.config_loader import get_settings
|
||||
from pr_agent.git_providers import get_git_provider
|
||||
from pr_agent.log import get_logger
|
||||
from starlette_context import context
|
||||
|
||||
|
||||
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()
|
||||
try:
|
||||
repo_settings = context.get("git_files", None)
|
||||
except Exception:
|
||||
repo_settings = None
|
||||
pass
|
||||
if not repo_settings:
|
||||
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')
|
||||
|
Reference in New Issue
Block a user