diff --git a/aider_gitea/gitea_client.py b/aider_gitea/gitea_client.py index bf90768..da35b6b 100644 --- a/aider_gitea/gitea_client.py +++ b/aider_gitea/gitea_client.py @@ -219,3 +219,106 @@ 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]: + """Fetch all reviews for a specific pull request. + + Args: + owner (str): Owner of the repository. + repo (str): Name of the repository. + pull_number (int): Pull request number. + + Returns: + list[dict]: 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]: + """Fetch 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[dict]: 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() + + def get_pull_request_comments( + self, + owner: str, + repo: str, + pull_number: int, + ) -> list[dict]: + """Fetch all comments for a pull request by downloading all reviews and their comments. + + This method implements the flow: + 1. Download all reviews of the pull request + 2. Download all comments for each review + 3. Return all comments from all reviews + + Args: + owner (str): Owner of the repository. + repo (str): Name of the repository. + pull_number (int): Pull request number. + + Returns: + list[dict]: List of all comment dictionaries from all reviews. + + Raises: + requests.HTTPError: If the API request fails. + """ + all_comments = [] + + # Download all reviews of the pull request + reviews = self.get_pull_request_reviews(owner, repo, pull_number) + + # Download all comments for each review + for review in reviews: + review_id = review.get('id') + if review_id: + try: + comments = self.get_review_comments( + owner, repo, pull_number, review_id, + ) + # Add review context to each comment for better debugging + for comment in comments: + comment['review_id'] = review_id + comment['review_state'] = review.get('state') + all_comments.extend(comments) + except requests.RequestException as e: + # Log the error but continue processing other reviews + logger.warning( + 'Failed to get comments for review %s in PR %s: %s', + review_id, + pull_number, + e, + ) + + return all_comments diff --git a/test/test_claude_code_integration.py b/test/test_claude_code_integration.py index 9229225..ad83669 100644 --- a/test/test_claude_code_integration.py +++ b/test/test_claude_code_integration.py @@ -69,9 +69,10 @@ class TestClaudeCodeIntegration: 'claude', '-p', '--output-format', - 'json', - '--max-turns', - '10', + 'stream-json', + '--debug', + '--verbose', + '--dangerously-skip-permissions', issue, ] assert cmd == expected @@ -84,9 +85,10 @@ class TestClaudeCodeIntegration: 'claude', '-p', '--output-format', - 'json', - '--max-turns', - '10', + 'stream-json', + '--debug', + '--verbose', + '--dangerously-skip-permissions', '--model', 'claude-3-sonnet', issue,