fix: beads-gitea sync
All checks were successful
Sync Beads to Gitea Issues / sync-beads (push) Successful in 6s
All checks were successful
Sync Beads to Gitea Issues / sync-beads (push) Successful in 6s
This commit is contained in:
parent
d6124c3959
commit
78efaa0502
@ -1,53 +1,61 @@
|
||||
import json
|
||||
import os
|
||||
import requests
|
||||
import sys
|
||||
|
||||
# Configuration
|
||||
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 get_gitea_issues():
|
||||
"""Fetch all issues from Gitea to map by their Beads ID."""
|
||||
url = f"{URL}/api/v1/repos/{REPO}/issues?state=all"
|
||||
resp = requests.get(url, headers=HEADERS)
|
||||
resp.raise_for_status()
|
||||
# We store the Beads ID in the title or a hidden comment to track them
|
||||
return {issue['title'].split(']')[0][1:]: issue for issue in resp.json() if ']' in issue['title']}
|
||||
HEADERS = {"Authorization": f"token {TOKEN}", "Content-Type": f"application/json"}
|
||||
|
||||
def sync():
|
||||
beads_file = ".beads/issues.jsonl"
|
||||
if not os.path.exists(beads_file):
|
||||
print("No beads found.")
|
||||
return
|
||||
beads_path = ".beads/issues.jsonl"
|
||||
if not os.path.exists(beads_path):
|
||||
print(f"❌ ERROR: {beads_path} not found.")
|
||||
sys.exit(1)
|
||||
|
||||
gitea_issues = get_gitea_issues()
|
||||
print(f"🔍 Reading Beads from: {beads_path}")
|
||||
|
||||
# Fetch existing Gitea issues
|
||||
try:
|
||||
# Note: state=all is important so we can find closed issues to re-open if needed
|
||||
resp = requests.get(f"{URL}/api/v1/repos/{REPO}/issues?state=all", headers=HEADERS)
|
||||
resp.raise_for_status()
|
||||
# Map by [ID] to identify existing ones
|
||||
existing = {i['title'].split(']')[0][1:]: i for i in resp.json() if ']' in i['title']}
|
||||
except Exception as e:
|
||||
print(f"❌ Gitea API Connection Failed: {e}")
|
||||
sys.exit(1)
|
||||
|
||||
with open(beads_file, "r") as f:
|
||||
with open(beads_path, "r") as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
if not line: continue
|
||||
|
||||
data = json.loads(line)
|
||||
bid = data.get("id")
|
||||
title = data.get("title")
|
||||
desc = data.get("description", "")
|
||||
# Mapping Beads status to Gitea states
|
||||
is_closed = data.get("status") in ["closed", "done", "finished"]
|
||||
target_state = "closed" if is_closed else "open"
|
||||
# The fix: Beads uses issue_type
|
||||
itype = data.get("issue_type", "unknown")
|
||||
|
||||
print(f"Found Bead: {bid} ({itype}) - {title}")
|
||||
|
||||
# Only sync actual tasks/issues
|
||||
if not bid or itype not in ["task", "bug", "feature", "issue"]:
|
||||
continue
|
||||
|
||||
unique_title = f"[{bid}] {title}"
|
||||
payload = {
|
||||
"title": f"[{bid}] {title}",
|
||||
"body": f"{desc}\n\n---\n**Beads ID:** `{bid}`\n**Priority:** {data.get('priority', 'N/A')}",
|
||||
"state": target_state
|
||||
"title": unique_title,
|
||||
"body": f"{data.get('description', 'No description provided.')}\n\n---\n**Beads ID:** `{bid}`\n**Owner:** `{data.get('owner')}`",
|
||||
"state": "closed" if data.get("status") in ["closed", "done"] else "open"
|
||||
}
|
||||
|
||||
if bid in gitea_issues:
|
||||
# Update existing issue if state or title changed
|
||||
issue_number = gitea_issues[bid]['number']
|
||||
print(f"Updating Issue #{issue_number} ({bid})")
|
||||
requests.patch(f"{URL}/api/v1/repos/{REPO}/issues/{issue_number}", headers=HEADERS, json=payload)
|
||||
if bid in existing:
|
||||
print(f"✅ Updating Gitea Issue #{existing[bid]['number']}")
|
||||
requests.patch(f"{URL}/api/v1/repos/{REPO}/issues/{existing[bid]['number']}", headers=HEADERS, json=payload)
|
||||
else:
|
||||
# Create new issue
|
||||
print(f"Creating New Issue for {bid}")
|
||||
print(f"➕ Creating New Gitea Issue")
|
||||
requests.post(f"{URL}/api/v1/repos/{REPO}/issues", headers=HEADERS, json=payload)
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
Loading…
Reference in New Issue
Block a user