diff options
| author | Christoph Schlosser <christoph@linux.com> | 2025-08-25 00:12:59 +0200 |
|---|---|---|
| committer | Christoph Schlosser <christoph@linux.com> | 2025-08-30 18:41:33 +0200 |
| commit | bdd4756094e961f8951e4a1ddb6cd875c5b0026c (patch) | |
| tree | ef93acf2f0939bede31ffab482536f962a8ad4a1 /g2h | |
| parent | 7d1797a6428447ff4dfd473111f6b40dc505ac43 (diff) | |
| download | git2hugo-bdd4756094e961f8951e4a1ddb6cd875c5b0026c.tar.gz | |
g2h: Add tree page
Diffstat (limited to 'g2h')
| -rw-r--r-- | g2h/cli.py | 3 | ||||
| -rw-r--r-- | g2h/git.py | 3 | ||||
| -rw-r--r-- | g2h/page_factory.py | 4 | ||||
| -rw-r--r-- | g2h/tree_page.py | 51 |
4 files changed, 61 insertions, 0 deletions
@@ -31,6 +31,9 @@ def main(): factory.new_log(commits, branches, tags).render() for commit in commits: factory.new_commit(commit).render() + tree = factory.new_tree(commit, '', git.get_repo()) + for tree_page in tree.build_pages(factory): + tree_page.render() if __name__ == '__main__': main() @@ -13,5 +13,8 @@ class Git: def get_commits(self): return list(self.repo.iter_commits()) + def get_repo(self): + return self.repo + def get_tags(self): return self.repo.tags diff --git a/g2h/page_factory.py b/g2h/page_factory.py index 43a48ae..c4b89ed 100644 --- a/g2h/page_factory.py +++ b/g2h/page_factory.py @@ -1,6 +1,7 @@ from .commit_page import CommitPage from .overview_page import OverviewPage from .log_page import LogPage +from .tree_page import TreePage class PageFactory: def __init__(self, out_dir, name, content_subdir): @@ -16,3 +17,6 @@ class PageFactory: def new_log(self, commits, branches, tags): return LogPage(self.out_dir, self.name, commits, branches, tags, self.content_subdir) + + def new_tree(self, commit, tree_segment, repo): + return TreePage(self.out_dir, self.name, commit, tree_segment, repo, self.content_subdir) diff --git a/g2h/tree_page.py b/g2h/tree_page.py new file mode 100644 index 0000000..22e563a --- /dev/null +++ b/g2h/tree_page.py @@ -0,0 +1,51 @@ +import os + +from .page import Page + +class TreePage(Page): + def __init__(self, out_dir, name, commit, sub_tree, repo, content_subdir): + super(TreePage, self).__init__('tree.md', out_dir, os.path.join(commit.hexsha, 't', sub_tree, 'index.md'), name, content_subdir) + self.tree = commit.tree.join(sub_tree) if sub_tree else commit.tree + self.repo = repo + self.commit = commit + self.sub_tree = sub_tree + + def _generate_entries(self, nodes): + entries = [] + for node in nodes: + latest_commit = next(self.repo.iter_commits(self.commit, max_count=1, paths=node.path)) + entry = { + 'name': node.name + str('/' if node.type == 'tree' else ''), + 'modified': latest_commit.committed_datetime + } + entries.append(entry) + return entries + + def _get_entries(self): + files = self._generate_entries(self.tree.blobs) + dirs = self._generate_entries(self.tree.trees) + files.sort(key=lambda x: x['name']) + dirs.sort(key=lambda x: x['name']) + return dirs + files + + def context(self): + return { + 'entries': self._get_entries(), + 'title': self.name + ': Tree' + } + + def build_pages(self, factory): + visited = set() + remaining = [self.sub_tree] + tree_pages = [] + while remaining: + current = remaining.pop() + if not current in visited: + visited.add(current) + tree = self.commit.tree.join(current) if current else self.commit.tree + tree_pages.append(factory.new_tree(self.commit, tree.path, self.repo)) + for sub_tree in tree.trees: + remaining.append(sub_tree.path) + + return tree_pages + |