Create close_old_issues.py

This commit is contained in:
xixu-me committed 2025-04-02 12:58:59 +08:00
1 parent 45c9b16045
commit f09db4e8d6
1 file changed
+70
+70
View File
@@ -0,0 +1,70 @@
"""
Close Old Issues
This script automatically closes issues that have been open for longer than
a specified number of days. It ignores pull requests even if they appear in
the issues list.
Usage:
1. Set your Personal Access Token (PAT) with 'repo' scope permission
2. Configure the repository owner, repository name, and age threshold
3. Run the script: python close_old_issues.py
Requirements:
- requests library: pip install requests
"""
from datetime import datetime, timedelta
import requests
# Configuration - Replace these values with your own
TOKEN = "YOUR_PAT" # Personal Access Token with 'repo' scope
OWNER = "your-username" # GitHub username or organization name
REPO = "your-repo" # Repository name
DAYS_OLD = 90 # Close issues older than this many days
# Set up request headers with authentication
headers = {"Authorization": f"Bearer {TOKEN}", "Accept": "application/vnd.github+json"}
# Get all open issues
url = f"https://api.github.com/repos/{OWNER}/{REPO}/issues?state=open"
response = requests.get(url, headers=headers)
# Check for successful API response
if response.status_code != 200:
print(f"Error fetching issues: {response.status_code}")
print(response.json().get("message", "No error message provided"))
exit(1)
issues = response.json()
# Calculate the cutoff date for closing issues
cutoff_date = datetime.now() - timedelta(days=DAYS_OLD)
# Process each issue
for issue in issues:
# Skip pull requests which appear in the issues list but should not be auto-closed
if "pull_request" not in issue:
issue_date = datetime.strptime(issue["created_at"], "%Y-%m-%dT%H:%M:%SZ")
# Check if the issue is older than the cutoff date
if issue_date < cutoff_date:
issue_number = issue["number"]
close_url = (
f"https://api.github.com/repos/{OWNER}/{REPO}/issues/{issue_number}"
)
payload = {"state": "closed"}
# Send the request to close the issue
close_response = requests.patch(close_url, headers=headers, json=payload)
if close_response.status_code == 200:
print(
f"Closed issue #{issue_number} (Created: {issue_date.strftime('%Y-%m-%d')})"
)
else:
print(
f"Failed to close issue #{issue_number}: {close_response.status_code}"
)
print(close_response.json().get("message", "No error message provided"))