complete refactor to use Gitea class api wrapper
This commit is contained in:
0
scripts/__init__.py
Normal file
0
scripts/__init__.py
Normal file
@@ -1,128 +0,0 @@
|
||||
import os
|
||||
import sys
|
||||
import requests
|
||||
from datetime import datetime, timedelta, timezone
|
||||
|
||||
def main():
|
||||
"""
|
||||
Main function to fetch issues from a Gitea repository and applies a tag to them.
|
||||
"""
|
||||
# --- Get configuration from environment variables ---
|
||||
try:
|
||||
instance_url = os.environ['INSTANCE_URL'].rstrip('/')
|
||||
repository = os.environ['REPOSITORY']
|
||||
token = os.environ['TOKEN']
|
||||
stale_days = os.environ.get('STALE_DAYS')
|
||||
stale_tag = os.environ.get('STALE_TAG')
|
||||
exclude_tag = os.environ.get('EXCLUDE_TAG')
|
||||
required_tag = os.environ.get('REQUIRED_TAG')
|
||||
except KeyError as e:
|
||||
print(f"Error: Missing required environment variable: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
# --- Switch off checks if env is empty ---
|
||||
if required_tag == None:
|
||||
enable_required_tag = False
|
||||
print(f">> No optional required tag set.")
|
||||
else:
|
||||
required_tag = int(required_tag)
|
||||
enable_required_tag = True
|
||||
|
||||
if exclude_tag == None:
|
||||
enable_exclude_tag= False
|
||||
print(f">> No optional exclusive tag set.")
|
||||
else:
|
||||
exclude_tag = int(exclude_tag)
|
||||
enable_exclude_tag = True
|
||||
|
||||
if stale_days == None:
|
||||
enable_stale_tag= False
|
||||
print(f">> No value for stale days.")
|
||||
else:
|
||||
stale_days = int(stale_days)
|
||||
older_than_date = datetime.now(timezone.utc) - timedelta(days=stale_days)
|
||||
enable_stale_tag = True
|
||||
|
||||
stale_tag = int(stale_tag)
|
||||
|
||||
|
||||
# --- Check if any actions are enabled ---
|
||||
if not any([enable_stale_tag]) == True:
|
||||
print(f">> No actions enabled, exiting.")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
# --- Set up API headers and base URL ---
|
||||
headers = {
|
||||
'Authorization': f'token {token}',
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
base_api_url = f"{instance_url}/api/v1/repos/{repository}/issues"
|
||||
params = {'state': 'open'}
|
||||
|
||||
|
||||
# --- 3. Fetch open issues ---
|
||||
print(">> Fetching issues ...")
|
||||
try:
|
||||
response = requests.get(base_api_url, headers=headers, params=params, timeout=30)
|
||||
response.raise_for_status()
|
||||
issues = response.json()
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error fetching issues: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
if not issues:
|
||||
print(">> No open issues found, exiting.")
|
||||
sys.exit(0)
|
||||
|
||||
print(f">> Processing {len(issues)} open issues ...")
|
||||
|
||||
|
||||
# --- Process Pull Requests ---
|
||||
for issue in issues:
|
||||
issue_number = issue['number']
|
||||
issue_created_at = datetime.fromisoformat(issue['created_at'].replace('Z', '+00:00'))
|
||||
|
||||
|
||||
# -- Process labels ---
|
||||
issue_current_labels = {label['name'] for label in issue.get('labels', [])}
|
||||
update_labels = issue_current_labels
|
||||
|
||||
if enable_required_tag:
|
||||
if not required_tag in issue_current_labels:
|
||||
print(f">> Skipping issue #{issue_number} because it does not have the '{required_tag}' tag.")
|
||||
continue
|
||||
|
||||
if enable_exclude_tag:
|
||||
if exclude_tag in issue_current_labels:
|
||||
print(f">> Skipping issue #{issue_number} because it has the '{exclude_tag}' tag.")
|
||||
continue
|
||||
|
||||
if enable_stale_tag:
|
||||
if issue_created_at < older_than_date:
|
||||
if stale_tag in issue_current_labels:
|
||||
print(f">> Skipping issue #{issue_number} because it already has the '{stale_tag}' tag.")
|
||||
continue
|
||||
|
||||
print(f">> Will tag issue #{issue_number} with '{stale_tag}'")
|
||||
update_labels.add(stale_tag)
|
||||
|
||||
|
||||
# --- Make update with new labels ---
|
||||
update_payload = {'labels': list(update_labels)}
|
||||
update_url = f"{base_api_url}/{issue_number}/labels"
|
||||
|
||||
print(f">> Updating Issue #{issue_number} ...")
|
||||
try:
|
||||
update_response = requests.put(update_url, headers=headers, json=update_payload, timeout=30)
|
||||
update_response.raise_for_status()
|
||||
print(f">> Successfully updated labels for issue #{issue_number}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error updating labels for issue #{issue_number}: {e}", file=sys.stderr)
|
||||
|
||||
print(">> Finished processing issues.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
@@ -1,130 +0,0 @@
|
||||
import os
|
||||
import sys
|
||||
import requests
|
||||
from datetime import datetime, timedelta, timezone
|
||||
|
||||
def main():
|
||||
"""
|
||||
Main function to fetch pull requests from a Gitea repository and process them.
|
||||
"""
|
||||
# --- Get configuration from environment variables ---
|
||||
try:
|
||||
instance_url = os.environ['INSTANCE_URL'].rstrip('/')
|
||||
repository = os.environ['REPOSITORY']
|
||||
token = os.environ['TOKEN']
|
||||
stale_days = os.environ.get('STALE_DAYS')
|
||||
stale_tag = os.environ.get('STALE_TAG')
|
||||
exclude_tag = os.environ.get('EXCLUDE_TAG')
|
||||
required_tag = os.environ.get('REQUIRED_TAG')
|
||||
except KeyError as e:
|
||||
print(f"Error: Missing required environment variable: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
print(f">> Processing pull requests ...")
|
||||
|
||||
|
||||
# --- Switch off checks if env is empty ---
|
||||
if required_tag == None:
|
||||
enable_required_tag = False
|
||||
print(f">> No optional required tag set.")
|
||||
else:
|
||||
required_tag = int(required_tag)
|
||||
enable_required_tag = True
|
||||
|
||||
if exclude_tag == None:
|
||||
enable_exclude_tag= False
|
||||
print(f">> No optional exclusive tag set.")
|
||||
else:
|
||||
exclude_tag = int(exclude_tag)
|
||||
enable_exclude_tag = True
|
||||
|
||||
if stale_days == None:
|
||||
enable_stale_tag= False
|
||||
print(f">> No value for stale days.")
|
||||
else:
|
||||
stale_days = int(stale_days)
|
||||
older_than_date = datetime.now(timezone.utc) - timedelta(days=stale_days)
|
||||
enable_stale_tag = True
|
||||
|
||||
stale_tag = int(stale_tag)
|
||||
|
||||
|
||||
# --- Check if any actions are enabled ---
|
||||
if not any([enable_stale_tag]) == True:
|
||||
print(f">> No actions enabled, exiting.")
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
# --- Set up API headers and base URL ---
|
||||
headers = {
|
||||
'Authorization': f'token {token}',
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
base_api_url = f"{instance_url}/api/v1/repos/{repository}/pulls"
|
||||
params = {'state': 'open'}
|
||||
|
||||
|
||||
# --- Fetch pull requests ---
|
||||
print(">> Fetching pull requests ...")
|
||||
try:
|
||||
response = requests.get(base_api_url, headers=headers, params=params, timeout=30)
|
||||
response.raise_for_status()
|
||||
pull_requests = response.json()
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error fetching pull requests: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
if not pull_requests:
|
||||
print(">> No open pull requests found, exiting.")
|
||||
sys.exit(0)
|
||||
|
||||
print(f">> Processing {len(pull_requests)} open pull requests ...")
|
||||
|
||||
|
||||
# --- Process Pull Requests ---
|
||||
for pr in pull_requests:
|
||||
pr_number = pr['number']
|
||||
pr_created_at = datetime.fromisoformat(pr['created_at'].replace('Z', '+00:00'))
|
||||
|
||||
|
||||
# -- Process labels ---
|
||||
pr_current_labels = {label['name'] for label in pr.get('labels', [])}
|
||||
update_labels = pr_current_labels
|
||||
|
||||
if enable_required_tag:
|
||||
if not required_tag in pr_current_labels:
|
||||
print(f">> Skipping PR #{pr_number} because it does not have the '{required_tag}' tag.")
|
||||
continue
|
||||
|
||||
if enable_exclude_tag:
|
||||
if exclude_tag in pr_current_labels:
|
||||
print(f">> Skipping PR #{pr_number} because it has the '{exclude_tag}' tag.")
|
||||
continue
|
||||
|
||||
if enable_stale_tag:
|
||||
if pr_created_at < older_than_date:
|
||||
if stale_tag in pr_current_labels:
|
||||
print(f">> Skipping issue #{pr_number} because it already has the '{stale_tag}' tag.")
|
||||
continue
|
||||
|
||||
print(f">> Will tag PR #{pr_number} with '{stale_tag}'")
|
||||
update_labels.add(stale_tag)
|
||||
|
||||
|
||||
# --- Make update with new labels ---
|
||||
update_payload = {'labels': list(update_labels)}
|
||||
update_url = f"{base_api_url}/{pr_number}/labels"
|
||||
|
||||
print(f">> Updating PR #{pr_number} ...")
|
||||
try:
|
||||
update_response = requests.put(update_url, headers=headers, json=update_payload, timeout=30)
|
||||
update_response.raise_for_status()
|
||||
print(f">> Successfully updated labels for PR #{pr_number}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Error updating labels for PR #{pr_number}: {e}", file=sys.stderr)
|
||||
|
||||
print(">> Finished processing pull requests.")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
154
scripts/process-repository.py
Normal file
154
scripts/process-repository.py
Normal file
@@ -0,0 +1,154 @@
|
||||
import os
|
||||
import sys
|
||||
import logging
|
||||
|
||||
from datetime import datetime, timedelta, timezone
|
||||
|
||||
from ..lib.gitea import Gitea
|
||||
|
||||
def main():
|
||||
"""
|
||||
Main function to fetch issues from a Gitea repository and process them.
|
||||
"""
|
||||
# --- Get configuration from environment variables ---
|
||||
try:
|
||||
instance_url = os.environ["INSTANCE_URL"].rstrip("/")
|
||||
owner = os.environ["OWNER"]
|
||||
repository = os.environ["REPOSITORY"]
|
||||
token = os.environ["TOKEN"]
|
||||
log_level = os.environ.get("LOG_LEVEL", "INFO").upper()
|
||||
issue_stale_days = os.environ.get("ISSUE_STALE_DAYS")
|
||||
issue_stale_tag = os.environ.get("ISSUE_STALE_TAG")
|
||||
issue_exclude_tag = os.environ.get("ISSUE_EXCLUDE_TAG")
|
||||
issue_required_tag = os.environ.get("ISSUE_REQUIRED_TAG")
|
||||
pull_request_stale_days = os.environ.get("PULL_REQUEST_STALE_DAYS")
|
||||
pull_request_stale_tag = os.environ.get("PULL_REQUEST_STALE_TAG")
|
||||
pull_request_exclude_tag = os.environ.get("PULL_REQUEST_EXCLUDE_TAG")
|
||||
pull_request_required_tag = os.environ.get("PULL_REQUEST_REQUIRED_TAG")
|
||||
except KeyError as e:
|
||||
print(f">> Error: Missing required environment variable: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
# Enable logging
|
||||
LOG_LEVELS = {
|
||||
"DEBUG": logging.DEBUG,
|
||||
"INFO": logging.INFO,
|
||||
"WARNING": logging.WARNING,
|
||||
"ERROR": logging.ERROR,
|
||||
}
|
||||
logging.basicConfig(
|
||||
level=LOG_LEVELS.get(log_level, logging.INFO),
|
||||
format="%(asctime)s - %(levelname)s - %(message)s",
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# --- Setup Gitea API ---
|
||||
gitea = Gitea(instance_url, token, log_level)
|
||||
|
||||
# --- Fetch issues ---
|
||||
issues = gitea.get_issues(owner=owner, repository=repository)
|
||||
|
||||
# --- Process issues ---
|
||||
if len(issues) < 1:
|
||||
logger.info(">> No open issues found")
|
||||
else:
|
||||
logger.info(f">> Processing {len(issues)} open issues ...")
|
||||
for issue in issues:
|
||||
|
||||
# -- Process labels ---
|
||||
issue_created_at = datetime.fromisoformat(issue["created_at"].replace("Z", "+00:00"))
|
||||
issue_older_than_date = datetime.now(timezone.utc) - timedelta(days=issue_stale_days)
|
||||
issue_current_labels = {label["name"] for label in issue.get("labels", [])}
|
||||
issue_update_labels = list(issue_current_labels)
|
||||
logger.debug(f">> Issue has the following labels: {issue_current_labels}")
|
||||
|
||||
# -- Check required --
|
||||
if (not issue_required_tag == None) and (not int(issue_required_tag) in issue_current_labels):
|
||||
logger.debug(
|
||||
f">> Skipping issue #{issue["number"]} because it does not have the required ('{issue_required_tag}') tag"
|
||||
)
|
||||
continue
|
||||
|
||||
# -- Check exclude --
|
||||
if (not issue_exclude_tag == None) and (int(issue_exclude_tag) in issue_current_labels):
|
||||
logger.debug(
|
||||
f">> Skipping issue #{issue["number"]} because it has the exclude ('{issue_exclude_tag}') tag"
|
||||
)
|
||||
continue
|
||||
|
||||
# -- Apply stale tag --
|
||||
if (not issue_stale_tag == None) and (issue_created_at < issue_older_than_date):
|
||||
logger.debug(
|
||||
f">> Issue was created at {issue_created_at}, which is older then {issue_older_than_date}"
|
||||
)
|
||||
|
||||
if issue_stale_tag in issue_current_labels:
|
||||
logger.debug(
|
||||
f">> Skipping issue #{issue["number"]} because it already has the stale ('{issue_stale_tag}') tag"
|
||||
)
|
||||
continue
|
||||
|
||||
logger.info(f">> Will tag issue #{issue["number"]} with '{issue_stale_tag}'")
|
||||
issue_update_labels.add(issue_stale_tag)
|
||||
|
||||
gitea.update_issue_labels(issue_number=issue["number"], labels=issue_update_labels, owner=owner, repository=repository)
|
||||
|
||||
logger.info(f">> Finished issue #{issue["number"]}")
|
||||
|
||||
logger.info(">> Finished processing issues")
|
||||
|
||||
# --- Fetch pull requests ---
|
||||
pull_requests = gitea.get_pull_requests(owner=owner, repository=repository)
|
||||
|
||||
# --- Process pull requests ---
|
||||
if len(pull_requests) < 1:
|
||||
logger.info(">> No open pull requests found")
|
||||
else:
|
||||
logger.info(f">> Processing {len(pull_requests)} open pull requests ...")
|
||||
for pull_request in pull_requests:
|
||||
|
||||
# -- Process labels ---
|
||||
pull_request_created_at = datetime.fromisoformat(pull_request["created_at"].replace("Z", "+00:00"))
|
||||
pull_request_older_than_date = datetime.now(timezone.utc) - timedelta(days=pull_request_stale_days)
|
||||
pull_request_current_labels = {label["name"] for label in pull_request.get("labels", [])}
|
||||
pull_request_update_labels = list(pull_request_current_labels)
|
||||
logger.debug(f">> Pull request has the following labels: {issue_current_labels}")
|
||||
|
||||
# -- Check required --
|
||||
if (not pull_request_required_tag == None) and (not int(pull_request_required_tag) in pull_request_current_labels):
|
||||
logger.debug(
|
||||
f">> Skipping pull request #{pull_request["number"]} because it does not have the required ('{pull_request_required_tag}') tag"
|
||||
)
|
||||
continue
|
||||
|
||||
# -- Check exclude --
|
||||
if (not pull_request_exclude_tag == None) and (int(pull_request_exclude_tag) in pull_request_current_labels):
|
||||
logger.debug(
|
||||
f">> Skipping pull request #{pull_request["number"]} because it has the exclude ('{pull_request_exclude_tag}') tag"
|
||||
)
|
||||
continue
|
||||
|
||||
# -- Apply stale tag --
|
||||
if (not pull_request_stale_tag == None) and (pull_request_created_at < pull_request_older_than_date):
|
||||
logger.debug(
|
||||
f">> Pull request was created at {pull_request_created_at}, which is older then {pull_request_older_than_date}"
|
||||
)
|
||||
|
||||
if pull_request_stale_tag in pull_request_current_labels:
|
||||
logger.debug(
|
||||
f">> Skipping pull request #{pull_request["number"]} because it already has the stale ('{pull_request_stale_tag}') tag"
|
||||
)
|
||||
continue
|
||||
|
||||
logger.info(f">> Will tag pull request #{pull_request["number"]} with '{pull_request_stale_tag}'")
|
||||
pull_request_update_labels.add(pull_request_stale_tag)
|
||||
|
||||
gitea.update_pull_requests(pull_request_number=pull_request["number"], labels=pull_request_update_labels, owner=owner, repository=repository)
|
||||
|
||||
logger.info(f">> Finished pull request #{issue["number"]}")
|
||||
|
||||
logger.info(">> Finished processing pull requests")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Reference in New Issue
Block a user