Skip to content

Commit

Permalink
chore: pr-review-tooling (#434)
Browse files Browse the repository at this point in the history
# Motivation

<!-- Why is this change necessary? -->

# Content

<!-- Please include a summary of the change -->

# Testing

<!-- How was the change tested? -->

# Please check the following before marking your PR as ready for review

- [ ] I have added tests for my changes
- [ ] I have updated the documentation or added new documentation as
needed

---------

Co-authored-by: kopekC <[email protected]>
  • Loading branch information
kopekC and kopekC authored Feb 12, 2025
1 parent e451605 commit 572d9ab
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 10 deletions.
10 changes: 3 additions & 7 deletions codegen-examples/examples/pr_review_bot/run.py
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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": [
Expand Down
2 changes: 1 addition & 1 deletion src/codegen/git/repo_operator/local_repo_operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
8 changes: 8 additions & 0 deletions src/codegen/git/repo_operator/repo_operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
17 changes: 17 additions & 0 deletions src/codegen/git/utils/pr_review.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
5 changes: 3 additions & 2 deletions src/codegen/sdk/core/codebase.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 572d9ab

Please sign in to comment.