diff options
| author | Christoph Schlosser <christoph@linux.com> | 2025-09-19 19:21:11 +0200 |
|---|---|---|
| committer | Christoph Schlosser <christoph@linux.com> | 2025-09-19 19:21:11 +0200 |
| commit | a3324b7e71ec48daab81981e7d85967a590d4f79 (patch) | |
| tree | def4a8d901d9a56047a0e63f5f3d93803c93ee87 /src/g2h/tree_page.py | |
| parent | bd403e6ab18d5cc7818e86d43c3ca0b15c5e53a1 (diff) | |
| download | git2hugo-a3324b7e71ec48daab81981e7d85967a590d4f79.tar.gz | |
g2h: Add utility script
Also move the sources into the more conventional src/g2h dir
Diffstat (limited to 'src/g2h/tree_page.py')
| -rw-r--r-- | src/g2h/tree_page.py | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/g2h/tree_page.py b/src/g2h/tree_page.py new file mode 100644 index 0000000..df65a33 --- /dev/null +++ b/src/g2h/tree_page.py @@ -0,0 +1,73 @@ +import os + +from .file import generate_breadcrumbs, sanitize_file_name, tree_join +from .page import Page +from .tree import safe_join + +class TreePage(Page): + def __init__(self, out_dir, name, commit, sub_tree, repo, content_subdir): + tree = safe_join(commit.tree, sub_tree) + super(TreePage, self).__init__('tree.md', out_dir, os.path.join(tree_join(commit, tree.path), '_index.md'), name, content_subdir) + self.tree = 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)) + name = node.name + file_name = name + if node.type == 'tree': + name += '/' + file_name = name + else: + file_name = sanitize_file_name(name, self.tree.blobs) + entry = { + 'file_name': file_name, + 'name': name, + '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 { + 'breadcrumbs': generate_breadcrumbs(self.content_subdir, self.commit, self.sub_tree, self.tree.blobs), + 'content_subdir': self.content_subdir, + 'entries': self._get_entries(), + # TODO: Make this fit the rest of the system. + 'subdir': '/'.join([self.content_subdir, tree_join(self.commit, self.tree.path)]), + 'this_commit': self.commit, + '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 = safe_join(self.commit.tree, current) + 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 + + def get_files(self): + file_paths = [] + for blob in self.tree.blobs: + file_paths.append(blob.path) + + return file_paths |