Optimize PR commit retrieval and caching in GitHub provider and utils

This commit is contained in:
mrT23
2024-02-21 16:33:32 +02:00
parent 34797fe809
commit f08ce53de3
2 changed files with 35 additions and 14 deletions

View File

@ -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:

View File

@ -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')