From 924504b6184158374f344962b4577014fbbdd672 Mon Sep 17 00:00:00 2001 From: Jon Michael Aanes Date: Mon, 9 Jun 2025 18:06:29 +0200 Subject: [PATCH] Ruff after Claude Code --- aider_gitea/__init__.py | 86 +++++++++++++++++++++++++------------ aider_gitea/gitea_client.py | 50 +++++++++++++++++++++ 2 files changed, 109 insertions(+), 27 deletions(-) diff --git a/aider_gitea/__init__.py b/aider_gitea/__init__.py index 9fe3f23..83a03fe 100644 --- a/aider_gitea/__init__.py +++ b/aider_gitea/__init__.py @@ -792,38 +792,70 @@ def handle_pr_comments( issue_url, code_solver: CodeSolverStrategy, ): - """Fetch unresolved PR comments and resolve them via code solver.""" - comments = client.get_pull_request_comments( + """Fetch unresolved PR comments and resolve them via code solver. + + This function implements the correct flow: + 1. Download all reviews of the pull request + 2. Download all comments for each review + 3. Fix each comment for each review + """ + # Download all reviews for the pull request + reviews = client.get_pull_request_reviews( repository_config.owner, repository_config.repo, pr_number, ) - for comment in comments: - path = comment.get('path') - line = comment.get('line') or comment.get('position') or 0 - file_path = repository_path / path - try: - lines = file_path.read_text().splitlines() - start = max(0, line - 3) - end = min(len(lines), line + 2) - context = '\n'.join(lines[start:end]) - except Exception: - context = '' - body = comment.get('body', '') - issue = ( - f'Resolve the following reviewer comment:\n{body}\n\n' - f'File: {path}\n\nContext:\n{context}' + + for review in reviews: + review_id = review.get('id') + if not review_id: + continue + + # Download all comments for this review + comments = client.get_review_comments( + repository_config.owner, + repository_config.repo, + pr_number, + review_id, ) - # invoke code solver on the comment context - code_solver.solve_issue_round(repository_path, issue) - # commit and push changes for this comment - run_cmd(['git', 'add', path], repository_path, check=False) - run_cmd( - ['git', 'commit', '-m', f'Resolve comment {comment.get("id")}'], - repository_path, - check=False, - ) - run_cmd(['git', 'push', 'origin', branch_name], repository_path, check=False) + + # Process each comment in the review + for comment in comments: + path = comment.get('path') + line = comment.get('line') or comment.get('position') or 0 + if not path: + continue + + file_path = repository_path / path + try: + lines = file_path.read_text().splitlines() + start = max(0, line - 3) + end = min(len(lines), line + 2) + context = '\n'.join(lines[start:end]) + except Exception: + context = '' + + body = comment.get('body', '') + issue = ( + f'Resolve the following reviewer comment:\n{body}\n\n' + f'File: {path}\n\nContext:\n{context}' + ) + + # Invoke code solver on the comment context + code_solver.solve_issue_round(repository_path, issue) + + # Commit and push changes for this comment + run_cmd(['git', 'add', path], repository_path, check=False) + run_cmd( + ['git', 'commit', '-m', f'Resolve review comment {comment.get("id")}'], + repository_path, + check=False, + ) + run_cmd( + ['git', 'push', 'origin', branch_name], + repository_path, + check=False, + ) def handle_failing_pipelines( diff --git a/aider_gitea/gitea_client.py b/aider_gitea/gitea_client.py index bf90768..4e44c37 100644 --- a/aider_gitea/gitea_client.py +++ b/aider_gitea/gitea_client.py @@ -219,3 +219,53 @@ class GiteaClient: response = self.session.get(url) response.raise_for_status() return response.json() + + def get_pull_request_reviews( + self, + owner: str, + repo: str, + pull_number: int, + ) -> list[dict]: + """Download all reviews for a pull request. + + Args: + owner (str): Owner of the repository. + repo (str): Name of the repository. + pull_number (int): Pull request number. + + Returns: + list: A list of review dictionaries. + + Raises: + requests.HTTPError: If the API request fails. + """ + url = f'{self.gitea_url}/repos/{owner}/{repo}/pulls/{pull_number}/reviews' + response = self.session.get(url) + response.raise_for_status() + return response.json() + + def get_review_comments( + self, + owner: str, + repo: str, + pull_number: int, + review_id: int, + ) -> list[dict]: + """Download all comments for a specific review. + + Args: + owner (str): Owner of the repository. + repo (str): Name of the repository. + pull_number (int): Pull request number. + review_id (int): Review ID. + + Returns: + list: A list of comment dictionaries. + + Raises: + requests.HTTPError: If the API request fails. + """ + url = f'{self.gitea_url}/repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments' + response = self.session.get(url) + response.raise_for_status() + return response.json()