welcome/.gitea/sync_beads.py
rootiest e77c98c674
All checks were successful
Sync Beads to Gitea Issues / sync-beads (push) Successful in 7s
fix: beads-gitea sync
2026-01-19 19:42:19 -05:00

57 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import json
import os
import requests
import sys
TOKEN = os.getenv("GITEA_TOKEN")
URL = os.getenv("GITEA_URL")
REPO = os.getenv("REPO_NAME")
HEADERS = {"Authorization": f"token {TOKEN}", "Content-Type": "application/json"}
def sync():
# Your ls shows 'issues.jsonl' exists
beads_path = ".beads/issues.jsonl"
if not os.path.exists(beads_path):
print(f"❌ ERROR: {beads_path} not found.")
# Print directory to debug what the Action user sees
print(f"Directory Contents: {os.listdir('.beads/') if os.path.exists('.beads') else 'None'}")
sys.exit(1)
print(f"🔍 Reading Beads from: {beads_path}")
try:
# Fetch existing Gitea issues
resp = requests.get(f"{URL}/api/v1/repos/{REPO}/issues?state=all", headers=HEADERS)
resp.raise_for_status()
existing = {i['title'].split(']')[0][1:]: i for i in resp.json() if ']' in i['title']}
with open(beads_path, "r") as f:
for line in f:
if not line.strip(): continue
data = json.loads(line)
bid, title = data.get("id"), data.get("title")
payload = {
"title": f"[{bid}] {title}",
"body": f"{data.get('description', 'No description')}\n\n---\n**Beads ID:** `{bid}`",
"state": "closed" if data.get("status") in ["closed", "done"] else "open"
}
if bid in existing:
print(f"✅ Updating: {bid}")
requests.patch(f"{URL}/api/v1/repos/{REPO}/issues/{existing[bid]['number']}", headers=HEADERS, json=payload)
else:
print(f" Creating: {bid}")
requests.post(f"{URL}/api/v1/repos/{REPO}/issues", headers=HEADERS, json=payload)
except PermissionError:
print(f"❌ PERMISSION DENIED: Action user cannot read {beads_path}. Run 'chmod 644 {beads_path}' locally.")
sys.exit(1)
except Exception as e:
print(f"❌ ERROR: {e}")
sys.exit(1)
if __name__ == "__main__":
sync()