A static page generator for git repositories
git clone git://git.janzachar.dev/spgit.git
0from bs4 import BeautifulSoup as bs1from pathlib import Path2import git3import yaml4import shutil56from templ import index, repo_file, repo_index7from classes import Meta, Repo8import settings91011def gen_page(dest, func, *args):12 Path.mkdir(dest.parent, parents=True, exist_ok=True)13 with open(dest, "w") as f:14 html = func(*args)15 f.write(bs(html, "html.parser").prettify())1617def gen_pages(tree, repo):18 for entry in tree:19 dest = settings.BUILD / repo.path.name / "files" / Path(entry.path + ".html")2021 if entry.type in ("blob", "tree"):22 gen_page(dest, repo_file.gen, repo, entry)2324 if entry.type == "tree":25 gen_pages(entry, repo)2627def copy_assets():28 for p in settings.ASSETS.rglob("*"):29 if p.is_dir():30 continue31 base = p.relative_to(settings.ASSETS)32 target = settings.BUILD / "assets" / base3334 if target.exists():35 src_modified = p.lstat().st_mtime36 target_modified = target.lstat().st_mtime3738 if src_modified <= target_modified:39 continue4041 Path.mkdir(target.parent, parents=True, exist_ok=True)42 p.copy(target)43 print(f"Copying {base} => {target}")4445def filter_new(repos):46 out = []47 for r in repos:48 target = Path(settings.BUILD) / r.path.name49 if target.exists():50 # get latest modification date inside repo dir51 src_modified = max(f.lstat().st_mtime for f in r.path.iterdir())5253 # index.html is guaranteed to be modified with each repo update54 target_modified = (target / "index.html").lstat().st_mtime5556 if src_modified > target_modified:57 out.append(r)58 else:59 print(target, "is up to date")60 else:61 print("No target!")62 out.append(r)63 return out646566def main():67 # 0. Copy assets68 copy_assets()6970 # 1. Retrieve valid repos at settings.SRC/*71 repos = [Repo(p) for p in settings.SRC.iterdir()]72 repos = [*filter((lambda x: x.valid), repos)]7374 # 2. Get rid of the old ones75 cand = filter_new(repos)76 print(len(repos), "=>", len(cand))7778 # 3. Generate main page79 print("Generating main page...")80 gen_page(settings.BUILD / "index.html", index.gen, repos)8182 # 4. Generate repo pages83 if not cand:84 print("Nothing to do...")85 return 08687 for c in cand:88 print(f"Generating {c.path.name} ...")89 dest = settings.BUILD / c.path.name / "index.html"90 gen_page(dest, repo_index.gen, c)9192 tree = c.repo.head.commit.tree93 gen_pages(tree, c)9495if __name__ == "__main__":96 exit(main())9798