diff --git a/pr_agent/git_providers/github_provider.py b/pr_agent/git_providers/github_provider.py index 19fee379..b0343ddf 100644 --- a/pr_agent/git_providers/github_provider.py +++ b/pr_agent/git_providers/github_provider.py @@ -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: diff --git a/pr_agent/git_providers/utils.py b/pr_agent/git_providers/utils.py index 5c9af8b0..5e86c504 100644 --- a/pr_agent/git_providers/utils.py +++ b/pr_agent/git_providers/utils.py @@ -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')