From d62d09948794650836595f7b0e3872be5c4cf9cc Mon Sep 17 00:00:00 2001 From: Lucas Orth Date: Sun, 20 Sep 2026 12:09:22 +0200 Subject: [PATCH] Workflows, Mu-Plugin, Feldnachweis und Doku --- build/push_gitea.py | 63 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 build/push_gitea.py diff --git a/build/push_gitea.py b/build/push_gitea.py new file mode 100644 index 0000000..289f129 --- /dev/null +++ b/build/push_gitea.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +"""Laedt Dateien ueber die Gitea-Contents-API hoch (create oder update).""" +import base64, json, os, sys, urllib.request, urllib.error + +def env(): + d = {} + for line in open('.env', encoding='utf-8'): + line = line.strip() + if not line or line.startswith('#') or '=' not in line: continue + k, v = line.split('=', 1) + v = v.strip() + if v.startswith('"') and v.endswith('"'): v = v[1:-1].replace('\\$', '$').replace('\\"', '"') + d[k] = v + return d + +E = env() +BASE = E['GITEA_BASE_URL'].rstrip('/') +REPO = f"{BASE}/api/v1/repos/{E['GITEA_OWNER']}/{E['GITEA_REPO']}/contents" +KOPF = {'Authorization': 'token ' + E['GITEA_TOKEN'], 'Content-Type': 'application/json'} + +def ruf(methode, url, daten=None): + r = urllib.request.Request(url, method=methode, headers=KOPF, + data=json.dumps(daten).encode() if daten else None) + try: + with urllib.request.urlopen(r, timeout=60) as a: + return a.status, json.loads(a.read().decode()) + except urllib.error.HTTPError as e: + return e.code, json.loads(e.read().decode() or '{}') + +def hoch(pfad, nachricht): + with open(pfad, 'rb') as f: + inhalt = base64.b64encode(f.read()).decode() + ziel = pfad.replace(os.sep, '/') + code, _ = ruf('GET', f"{REPO}/{ziel}?ref={E.get('branch','main')}") + sha = None + if code == 200: + code_g, body = ruf('GET', f"{REPO}/{ziel}?ref=main") + sha = body.get('sha') + daten = {'content': inhalt, 'message': nachricht, 'branch': 'main'} + if sha: + daten['sha'] = sha + c, b = ruf('PUT', f"{REPO}/{ziel}", daten) + else: + c, b = ruf('POST', f"{REPO}/{ziel}", daten) + ok = c in (200, 201) + print(f" {'ok ' if ok else 'FEHLER'} {ziel}" + ('' if ok else f" -> {c} {str(b)[:160]}")) + return ok + +AUS = {'.git', '.env', 'node_modules', '__pycache__'} +dateien = [] +for wurzel, ordner, namen in os.walk('.'): + ordner[:] = [o for o in ordner if o not in AUS] + for n in namen: + p = os.path.relpath(os.path.join(wurzel, n), '.') + if p in AUS or p.startswith('.env') and p != '.env.example': continue + if p == '.env': continue + dateien.append(p) + +nachricht = sys.argv[1] if len(sys.argv) > 1 else 'Update' +fehler = 0 +for p in sorted(dateien): + if not hoch(p, nachricht): fehler += 1 +print(f"\n{len(dateien)} Dateien, {fehler} Fehler")