From a2d636f64ee6a464773ee961f0609cb7ea76fab5 Mon Sep 17 00:00:00 2001 From: arthurcai Date: Fri, 19 Sep 2025 19:41:40 +0800 Subject: [PATCH] feat: close issues --- joint_teapot/workers/gitea.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/joint_teapot/workers/gitea.py b/joint_teapot/workers/gitea.py index 35f3c89..80cd550 100644 --- a/joint_teapot/workers/gitea.py +++ b/joint_teapot/workers/gitea.py @@ -479,6 +479,35 @@ class Gitea: self.org_name, repo_name, issue.number, body={"state": "closed"} ) + def close_issues(self, repo_name: str, issue_numbers: List[int], dry_run: bool = True) -> None: + if not issue_numbers: + logger.warning("No issue numbers provided to close") + return + if dry_run: + logger.info("Dry run enabled. No changes will be made to issues.") + try: + issues = {issue.number: issue for issue in list_all(self.issue_api.issue_list_issues, self.org_name, repo_name)} + except ApiException as e: + logger.error(f"Failed to list issues for {repo_name}: {e}") + return + + for num in issue_numbers: + issue = issues.get(num) + if issue is None: + logger.warning(f"Issue #{num} not found in {repo_name}") + continue + if getattr(issue, "state", "") == "closed": + logger.info(f"Issue #{num} in {repo_name} already closed") + continue + try: + if dry_run: + logger.info(f"Would close issue #{num} in {repo_name} (dry run)") + continue + self.issue_api.issue_edit_issue(self.org_name, repo_name, num, body={"state": "closed"}) + logger.info(f"Closed issue #{num} in {repo_name}") + except ApiException as e: + logger.error(f"Failed to close issue #{num} in {repo_name}: {e}") + def archive_repos(self, regex: str = ".+", dry_run: bool = True) -> None: if dry_run: logger.info("Dry run enabled. No changes will be made to the repositories.")