"""Browse the VWE/firestorm gitea repo (read-only) without cloning 10GB.""" import base64, json, subprocess, sys, urllib.request sys.stdout.reconfigure(encoding='utf-8', errors='replace') _out = subprocess.run(["git","credential","fill"], input="protocol=https\nhost=mysticmachines.com\n\n", capture_output=True, text=True, cwd=r"C:\git\bt411") _c = dict(l.split("=",1) for l in _out.stdout.strip().splitlines() if "=" in l) AUTH = "Basic " + base64.b64encode((_c["username"]+":"+_c["password"]).encode()).decode() B = "https://mysticmachines.com/api/v1/repos/VWE/firestorm" def api(p, t=120): r = urllib.request.Request(B+p, headers={"Authorization": AUTH}) return json.load(urllib.request.urlopen(r, timeout=t)) def ls(path=""): try: return api("/contents/" + urllib.request.quote(path)) except Exception as e: return [] def raw(path, t=120): r = urllib.request.Request(B+"/raw/"+urllib.request.quote(path), headers={"Authorization": AUTH}) return urllib.request.urlopen(r, timeout=t).read().decode("utf-8","replace") if __name__ == "__main__": cmd = sys.argv[1] if cmd == "ls": for e in sorted(ls(sys.argv[2] if len(sys.argv)>2 else ""), key=lambda x: x["type"]+x["name"]): print(f' {e["type"]:4} {e.get("size",0):>9} {e["path"]}') elif cmd == "cat": print(raw(sys.argv[2])[:int(sys.argv[3]) if len(sys.argv)>3 else 4000]) def subtree(path, recursive=True): """Full file list under a directory, via its tree sha (avoids the 1000-entry truncation of a whole-repo recursive tree).""" e = api("/contents/" + urllib.request.quote(path)) # the dir's own sha comes from its parent listing parent = "/".join(path.split("/")[:-1]) name = path.split("/")[-1] for it in ls(parent): if it["name"] == name and it["type"] == "dir": sha = it["sha"] break else: return [] t = api(f"/git/trees/{sha}?recursive={1 if recursive else 0}&per_page=99999", t=180) return [(x["path"], x.get("size", 0)) for x in t.get("tree", []) if x["type"] == "blob"], t.get("truncated")