Files
Gitea-Tools/list_issues.py
T

60 lines
2.0 KiB
Python

#!/usr/bin/env python3
"""List Gitea issues.
Usage:
list_issues.py --remote dadeschools
"""
import os
import sys
import argparse
# Auto-execute using the project's local virtual environment Python
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
venv_python = os.path.join(PROJECT_ROOT, "venv", "bin", "python3")
if os.path.exists(venv_python) and sys.executable != venv_python:
os.execv(venv_python, [venv_python] + sys.argv)
from gitea_auth import get_auth_header, resolve_remote, add_remote_args, api_request, repo_api_url
def main(argv=None):
parser = argparse.ArgumentParser(description="List Gitea issues.")
add_remote_args(parser)
parser.add_argument("--state", choices=["open", "closed", "all"], default="open",
help="Filter by issue state (default: open).")
parser.add_argument("--label", help="Filter by label name.")
args = parser.parse_args(argv)
host, org, repo = resolve_remote(args)
auth = get_auth_header(host)
if not auth:
print(f"Could not get credentials or token for {host}.", file=sys.stderr)
return 1
params = f"state={args.state}&type=issues"
if args.label:
params += f"&labels={args.label}"
url = f"{repo_api_url(host, org, repo)}/issues?{params}"
try:
issues = api_request("GET", url, auth)
if not issues:
print("No issues found.")
return 0
for i in issues:
labels_str = ", ".join(lb["name"] for lb in i.get("labels", []))
labels_part = f" [{labels_str}]" if labels_str else ""
assignee = (i.get("assignee") or {}).get("login", "unassigned")
print(f"Issue #{i['number']}: {i['title']}{labels_part}")
print(f" State: {i['state']} | Assignee: {assignee}")
print(f" URL: {i['html_url']}")
return 0
except Exception as e:
print(f"Error listing issues: {e}", file=sys.stderr)
return 1
if __name__ == "__main__":
sys.exit(main())