Files
Skrift-Auto-Article/build/push_gitea.py

64 lines
2.4 KiB
Python

# -*- 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")