diff --git a/codegen-examples/examples/pr_review_bot/run.py b/codegen-examples/examples/pr_review_bot/run.py index 81982b72f..af88f6a52 100644 --- a/codegen-examples/examples/pr_review_bot/run.py +++ b/codegen-examples/examples/pr_review_bot/run.py @@ -1,7 +1,7 @@ import codegen from codegen import Codebase -from codegen.sdk.enums import ProgrammingLanguage -from codegen.sdk.codebase.config import CodebaseConfig +from codegen.shared.enums.programming_language import ProgrammingLanguage +from codegen.sdk.codebase.config import CodebaseConfig, Secrets import json from codegen.sdk.secrets import Secrets @@ -20,13 +20,9 @@ def run(codebase: Codebase): modified_symbols = codebase.get_modified_symbols_in_pr(pr_number) for symbol in modified_symbols: # Get direct dependencies - deps = codebase.get_symbol_dependencies(symbol, max_depth=2) + deps = symbol.dependencies(max_depth=2) context_symbols.update(deps) - # Get reverse dependencies (symbols that depend on this one) - rev_deps = codebase.get_symbol_dependents(symbol, max_depth=2) - context_symbols.update(rev_deps) - # Prepare context for LLM context = { "modified_symbols": [ diff --git a/src/codegen/git/repo_operator/local_repo_operator.py b/src/codegen/git/repo_operator/local_repo_operator.py index 8b0a528b3..9d84847d3 100644 --- a/src/codegen/git/repo_operator/local_repo_operator.py +++ b/src/codegen/git/repo_operator/local_repo_operator.py @@ -183,7 +183,7 @@ def get_pull_request(self, pr_number: int) -> PullRequest | None: if repo is None: logger.warning("GitHub API key is required to fetch pull requests") return None - return repo.get_pull(pr_number) + return repo.get_pull_safe(pr_number) except Exception as e: logger.warning(f"Failed to get PR {pr_number}: {e!s}") return None diff --git a/src/codegen/git/repo_operator/repo_operator.py b/src/codegen/git/repo_operator/repo_operator.py index 859f53517..79bf9a4de 100644 --- a/src/codegen/git/repo_operator/repo_operator.py +++ b/src/codegen/git/repo_operator/repo_operator.py @@ -600,3 +600,11 @@ def stash_push(self) -> None: def stash_pop(self) -> None: self.git_cli.git.stash("pop") + + #################################################################################################################### + # PR UTILITIES + #################################################################################################################### + + def get_pr_data(self, pr_number: int) -> dict: + """Returns the data associated with a PR""" + return self.remote_git_repo.get_pr_data(pr_number) diff --git a/src/codegen/git/utils/pr_review.py b/src/codegen/git/utils/pr_review.py index 271a594f5..4e1bec3b6 100644 --- a/src/codegen/git/utils/pr_review.py +++ b/src/codegen/git/utils/pr_review.py @@ -127,3 +127,20 @@ def modified_symbols(self) -> list["Symbol"]: if self.is_modified(symbol): all_modified.append(symbol) return all_modified + + def get_pr_diff(self) -> str: + """Get the full diff of the PR""" + if not self._op.remote_git_repo: + msg = "GitHub API client is required to get PR diffs" + raise ValueError(msg) + + # Get the diff directly from the PR + diff_url = self._gh_pr.raw_data.get("diff_url") + if diff_url: + # Fetch the diff content from the URL + response = requests.get(diff_url) + response.raise_for_status() + return response.text + else: + # If diff_url not available, get the patch directly + return self._gh_pr.get_patch() diff --git a/src/codegen/sdk/core/codebase.py b/src/codegen/sdk/core/codebase.py index 455b36e07..44242732f 100644 --- a/src/codegen/sdk/core/codebase.py +++ b/src/codegen/sdk/core/codebase.py @@ -1259,11 +1259,12 @@ def from_repo( logger.exception(f"Failed to initialize codebase: {e}") raise - def get_modified_symbols_in_pr(self, pr_id: int) -> list[Symbol]: + def get_modified_symbols_in_pr(self, pr_id: int) -> tuple[list[Symbol], str]: """Get all modified symbols in a pull request""" pr = self._op.get_pull_request(pr_id) cg_pr = CodegenPR(self._op, self, pr) - return cg_pr.modified_symbols + patch = cg_pr.get_pr_diff() + return cg_pr.modified_symbols, patch # The last 2 lines of code are added to the runner. See codegen-backend/cli/generate/utils.py