summaryrefslogtreecommitdiffstats
path: root/g2h
diff options
context:
space:
mode:
authorChristoph Schlosser <christoph@linux.com>2025-08-25 00:12:59 +0200
committerChristoph Schlosser <christoph@linux.com>2025-08-30 18:41:33 +0200
commitbdd4756094e961f8951e4a1ddb6cd875c5b0026c (patch)
treeef93acf2f0939bede31ffab482536f962a8ad4a1 /g2h
parent7d1797a6428447ff4dfd473111f6b40dc505ac43 (diff)
downloadgit2hugo-bdd4756094e961f8951e4a1ddb6cd875c5b0026c.tar.gz
g2h: Add tree page
Diffstat (limited to 'g2h')
-rw-r--r--g2h/cli.py3
-rw-r--r--g2h/git.py3
-rw-r--r--g2h/page_factory.py4
-rw-r--r--g2h/tree_page.py51
4 files changed, 61 insertions, 0 deletions
diff --git a/g2h/cli.py b/g2h/cli.py
index b4c1c2b..52a2be7 100644
--- a/g2h/cli.py
+++ b/g2h/cli.py
@@ -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()
diff --git a/g2h/git.py b/g2h/git.py
index 079c50b..1e835e7 100644
--- a/g2h/git.py
+++ b/g2h/git.py
@@ -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
+