From 8e6230a669886cd412f73cd58114bcf4195b332c Mon Sep 17 00:00:00 2001 From: bucolucas Date: Sun, 18 Aug 2024 12:31:00 -0500 Subject: [PATCH] Add functions to approve, close, merge PRs, and delete branches --- tools/github_tool.py | 146 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 145 insertions(+), 1 deletion(-) diff --git a/tools/github_tool.py b/tools/github_tool.py index 9dc8696..d9c256a 100644 --- a/tools/github_tool.py +++ b/tools/github_tool.py @@ -238,6 +238,78 @@ class GitHubTool(BaseTool): } } } + }, + { + "name": "approve_pull_request", + "description": "Approve a pull request", + "parameters": { + "type": "object", + "properties": { + "pull_number": { + "type": "integer", + "description": "The number of the pull request" + } + }, + "required": ["pull_number"] + } + }, + { + "name": "close_pull_request", + "description": "Close a pull request", + "parameters": { + "type": "object", + "properties": { + "pull_number": { + "type": "integer", + "description": "The number of the pull request" + } + }, + "required": ["pull_number"] + } + }, + { + "name": "merge_pull_request", + "description": "Merge a pull request", + "parameters": { + "type": "object", + "properties": { + "pull_number": { + "type": "integer", + "description": "The number of the pull request" + }, + "commit_title": { + "type": "string", + "description": "Title for the automatic commit message", + "default": "Merge pull request" + }, + "commit_message": { + "type": "string", + "description": "Extra detail to append to automatic commit message", + "default": "" + }, + "merge_method": { + "type": "string", + "description": "Merge method to use", + "enum": ["merge", "squash", "rebase"], + "default": "merge" + } + }, + "required": ["pull_number"] + } + }, + { + "name": "delete_branch", + "description": "Delete a branch", + "parameters": { + "type": "object", + "properties": { + "branch_name": { + "type": "string", + "description": "Name of the branch to delete" + } + }, + "required": ["branch_name"] + } } ] @@ -267,7 +339,16 @@ class GitHubTool(BaseTool): elif function_name == "list_branches": return self._list_branches(kwargs.get("per_page", 100), kwargs.get("all_pages", True)) elif function_name == "get_branch_sha": - return self._get_branch_sha(kwargs["branch"]) + return self._get_branch_sha(kwargs["branch"]) + elif function_name == "approve_pull_request": + return self._approve_pull_request(kwargs["pull_number"]) + elif function_name == "close_pull_request": + return self._close_pull_request(kwargs["pull_number"]) + elif function_name == "merge_pull_request": + return self._merge_pull_request(kwargs["pull_number"], kwargs.get("commit_title", "Merge pull request"), + kwargs.get("commit_message", ""), kwargs.get("merge_method", "merge")) + elif function_name == "delete_branch": + return self._delete_branch(kwargs["branch_name"]) else: error_message = f"Unknown function: {function_name}" self.logger.error(error_message) @@ -474,3 +555,66 @@ class GitHubTool(BaseTool): self.logger.info(f"Successfully listed all branches. Total: {len(all_branches)}") return all_branches + + def _approve_pull_request(self, pull_number): + self.logger.info(f"Approving pull request: {pull_number}") + url = f"{self.base_url}/repos/{self.repo}/pulls/{pull_number}/reviews" + data = { + "event": "APPROVE" + } + response = requests.post(url, headers=self.headers, json=data) + if response.status_code == 200: + success_message = f"Pull request {pull_number} approved successfully" + self.logger.info(success_message) + return success_message + else: + error_message = f"Error approving pull request: {response.status_code}\nResponse: {response.text}" + self.logger.error(error_message) + return error_message + + def _close_pull_request(self, pull_number): + self.logger.info(f"Closing pull request: {pull_number}") + url = f"{self.base_url}/repos/{self.repo}/pulls/{pull_number}" + data = { + "state": "closed" + } + response = requests.patch(url, headers=self.headers, json=data) + if response.status_code == 200: + success_message = f"Pull request {pull_number} closed successfully" + self.logger.info(success_message) + return success_message + else: + error_message = f"Error closing pull request: {response.status_code}\nResponse: {response.text}" + self.logger.error(error_message) + return error_message + + def _merge_pull_request(self, pull_number, commit_title, commit_message, merge_method): + self.logger.info(f"Merging pull request: {pull_number}") + url = f"{self.base_url}/repos/{self.repo}/pulls/{pull_number}/merge" + data = { + "commit_title": commit_title, + "commit_message": commit_message, + "merge_method": merge_method + } + response = requests.put(url, headers=self.headers, json=data) + if response.status_code == 200: + success_message = f"Pull request {pull_number} merged successfully" + self.logger.info(success_message) + return success_message + else: + error_message = f"Error merging pull request: {response.status_code}\nResponse: {response.text}" + self.logger.error(error_message) + return error_message + + def _delete_branch(self, branch_name): + self.logger.info(f"Deleting branch: {branch_name}") + url = f"{self.base_url}/repos/{self.repo}/git/refs/heads/{branch_name}" + response = requests.delete(url, headers=self.headers) + if response.status_code == 204: + success_message = f"Branch {branch_name} deleted successfully" + self.logger.info(success_message) + return success_message + else: + error_message = f"Error deleting branch: {response.status_code}\nResponse: {response.text}" + self.logger.error(error_message) + return error_message \ No newline at end of file