A static page generator for git repositories
git clone git://git.janzachar.dev/spgit.git
0from pathlib import Path1import settings2import git3import yaml45class Meta:6 """7 Holds repo metadata.8 Things retrieved from .meta.yml9 as well as in-place generated urls10 """11 def __init__(self, path, data):12 self.name: str13 self.description: str14 self.info: dict15 self.page_url: str16 self.clone_url: str1718 self.validate(data)1920 self.page_url = f"/{path.name}"21 self.clone_url = f"git://{settings.HOST}/{path.name}"2223 def validate(self, data):24 self.name = data["name"]25 self.description = data["description"]26 self.info = data["info"]2728 for x in (self.name, self.description):29 if not isinstance(x, str):30 raise TypeError(f"{x} must be str, got {type(self.name).__name__}!")3132 if not isinstance(self.info, dict):33 raise TypeError(f"{self.info} must be dict, got {type(self.name).__name__}!")343536class Repo:37 """38 Repository-related objects in one place.39 Mainly responsible for validating repos.40 """41 def __init__(self, path):42 self.path: Path43 self.repo: git.Repo44 self.meta: Meta45 self.valid: Bool4647 self.path = path48 try:49 self.repo = git.Repo(path)50 except git.exc.InvalidGitRepositoryError as e:51 print(f"Rejected {self.path}: Invalid repo!")52 self.valid = False53 return5455 if not self.repo.head.is_valid():56 print(f"Rejected {self.path}: Invalid HEAD!")57 self.valid = False58 return5960 try:61 self.load_yml()62 except FileNotFoundError, TypeError, KeyError:63 print(f"Rejected {self.path}: .meta.yml: {e.__name__}: {e}")64 self.valid = False65 else:66 self.valid = True6768 def load_yml(self):69 # Extract '.meta.yml' from HEAD70 tree = self.repo.head.commit.tree71 if ".meta.yml" not in tree:72 raise FileNotFoundError("'.meta.yml' not found in HEAD")7374 fp = tree[".meta.yml"].data_stream75 out = yaml.safe_load(fp)7677 self.meta = Meta(self.path, out)7879