#!/usr/bin/env python3 """Henter det sitet viser fra Gitea ved build og skriver data/gitea.json: repos til /projekter og aktivitets-heatmap til /now. Er Gitea nede, bygges sitet alligevel, med en fejlbesked på /projekter og en tom graf på /now.""" import datetime as dt import json import urllib.request BASE, USER = "https://gitea.weircon.dk", "agw" HIDE = set() # repo-navne der skjules helt PINNED = ["gtk-ahfail", "pi3-smart-workspace"] # vises først, i den rækkefølge WEEKS = 26 MAANEDER = ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"] def get(path): req = urllib.request.Request(f"{BASE}/api/v1{path}", headers={"Accept": "application/json"}) with urllib.request.urlopen(req, timeout=30) as r: return json.load(r) def repos(): data = get(f"/users/{USER}/repos?limit=50&sort=updated") rs = [r for r in data if not (r["fork"] or r["archived"] or r["private"] or r["name"].lower() in HIDE)] pinned = [p.lower() for p in PINNED] rs.sort(key=lambda r: r["updated_at"], reverse=True) rs.sort(key=lambda r: pinned.index(r["name"].lower()) if r["name"].lower() in pinned else len(pinned)) keep = ("name", "description", "html_url", "language", "stars_count") return [{k: r[k] for k in keep} for r in rs] def level(n): return 0 if n == 0 else 1 if n < 3 else 2 if n < 6 else 3 if n < 12 else 4 def heatmap(): per_day = {} try: for b in get(f"/users/{USER}/heatmap"): d = dt.datetime.fromtimestamp(b["timestamp"], dt.timezone.utc).date().isoformat() per_day[d] = per_day.get(d, 0) + b["contributions"] except Exception as e: print(f"heatmap: {e}") # 26 uger bagud, uger som kolonner (man-søn) today = dt.date.today() cur = today - dt.timedelta(days=WEEKS * 7 - 1 + today.weekday()) weeks = [] while cur <= today: week = [] for _ in range(7): if cur > today: break n = per_day.get(cur.isoformat(), 0) week.append({"date": cur.isoformat(), "n": n, "level": level(n)}) cur += dt.timedelta(days=1) weeks.append(week) return weeks, sum(per_day.values()), f"{today.day}. {MAANEDER[today.month - 1]} {today.year}" def main(): try: rs, error = repos(), False except Exception as e: print(f"repos: {e}") rs, error = [], True weeks, total, updated = heatmap() with open("data/gitea.json", "w") as f: json.dump({"repos": rs, "error": error, "weeks": weeks, "weeks_shown": WEEKS, "total": total, "updated": updated}, f, ensure_ascii=False) print(f"gitea: {len(rs)} repos, {total} bidrag") if __name__ == "__main__": main()