summaryrefslogtreecommitdiff
path: root/repo/www
diff options
context:
space:
mode:
authorKévin Le Gouguec <kevin.legouguec@gmail.com>2020-04-12 23:06:07 +0200
committerKévin Le Gouguec <kevin.legouguec@gmail.com>2020-04-12 23:06:07 +0200
commit12e18454ba07c3b7747f8b868f6830f05de149c4 (patch)
tree317c3f700b9d088cf30466a197ffc512d12fc183 /repo/www
parent629664bd50ed4e72cffc33bf2e7082119d483469 (diff)
downloadmemory-leaks-12e18454ba07c3b7747f8b868f6830f05de149c4.tar.xz
Add intermediate step to cache site tree
Seems kind of wasteful to recompute it every time. Also, now subsequent scripts don't have to care about file extensions anymore.
Diffstat (limited to 'repo/www')
-rw-r--r--repo/www/.gitignore3
-rw-r--r--repo/www/Makefile16
-rwxr-xr-xrepo/www/generate-deps.py16
-rwxr-xr-xrepo/www/generate-index.py18
-rwxr-xr-xrepo/www/generate-tree.py32
-rw-r--r--repo/www/helpers.py22
6 files changed, 81 insertions, 26 deletions
diff --git a/repo/www/.gitignore b/repo/www/.gitignore
index b921cf0..edad99c 100644
--- a/repo/www/.gitignore
+++ b/repo/www/.gitignore
@@ -1 +1,2 @@
-deps.mk \ No newline at end of file
+deps.mk
+site-tree.json
diff --git a/repo/www/Makefile b/repo/www/Makefile
index 9050626..fdc0112 100644
--- a/repo/www/Makefile
+++ b/repo/www/Makefile
@@ -1,5 +1,3 @@
-# TODO: add a target for the file tree; use it in generate-* scripts.
-
TOP_DIR = ../..
OUT_DIR = $(TOP_DIR)/public
TEXT_FILES = md org
@@ -12,12 +10,18 @@ text_folders = $(call dirnames,$(shell git ls-files $(text_patterns)))
all: site
+# Maps folders to their contents (files and subfolders).
+site_tree = site-tree.json
# Defines $(pages) and $(indices).
dependencies = deps.mk
-include $(dependencies)
-$(dependencies): $(text_folders)
- ./generate-deps.py "$(TEXT_FILES)" $(OUT_DIR)
+$(site_tree): $(text_folders)
+ ./generate-tree.py -o $@ $(TEXT_FILES)
+
+$(dependencies): $(site_tree)
+ ./generate-deps.py $< $@ $(OUT_DIR)
+
+include $(dependencies)
site: $(pages) $(indices)
@@ -33,7 +37,7 @@ $(pages):
# ⚠ When tweaking this rule, check whether it still works for the
# top-level index.html.
$(indices): $(OUT_DIR)/%index.html:
- ./generate-index.py "$(TEXT_FILES)" "$(patsubst %/,%,$*)" $@
+ ./generate-index.py $(site_tree) "$(patsubst %/,%,$*)" $@
clean:
-rm $(dependencies)
diff --git a/repo/www/generate-deps.py b/repo/www/generate-deps.py
index 8388c40..e82b691 100755
--- a/repo/www/generate-deps.py
+++ b/repo/www/generate-deps.py
@@ -18,19 +18,20 @@ We want to compute:
OUTPUT/foo/index.html: foo | OUTPUT/foo
"""
+import json
from os import path
from sys import argv, exit
from git import Repo
-from helpers import compute_directories
+from helpers import deserialize_directories
def parse_arguments(args):
- if len(args) != 3:
- exit(f'Usage: {argv[0]} EXTENSIONS OUTPUT-DIR')
+ if len(args) != 4:
+ exit(f'Usage: {argv[0]} SITE-TREE OUTPUT-FILE OUTPUT-DIR')
- return argv[1].split(), argv[2]
+ return argv[1], argv[2], argv[3]
def pjoin(directory, item):
@@ -84,14 +85,15 @@ def write_dependencies(deps_file, directories, top_dir, out_dir):
def main(arguments):
- extensions, out_dir = parse_arguments(arguments)
+ tree_file, deps_file, out_dir = parse_arguments(arguments)
repository = Repo(search_parent_directories=True)
top_dir = path.relpath(repository.working_dir, path.curdir)
- directories = compute_directories(extensions, repository)
+ with open(tree_file) as tree:
+ directories = deserialize_directories(json.load(tree))
- with open('deps.mk', 'w') as deps:
+ with open(deps_file, 'w') as deps:
write_dependencies(deps, directories, top_dir, out_dir)
diff --git a/repo/www/generate-index.py b/repo/www/generate-index.py
index 96c5dc6..d28c6a6 100755
--- a/repo/www/generate-index.py
+++ b/repo/www/generate-index.py
@@ -1,19 +1,19 @@
#!/usr/bin/env python3
from argparse import ArgumentParser
+import json
from os import path
from subprocess import run
from git import Repo
-from helpers import compute_directories
+from helpers import deserialize_directories
def parse_arguments():
parser = ArgumentParser()
parser.add_argument(
- 'extensions', type=str.split,
- help='File extensions to consider when recording pages.'
+ 'site_tree', help='JSON file describing the page tree.'
)
parser.add_argument(
'target', help='Pathspec to generate an index for.'
@@ -24,8 +24,9 @@ def parse_arguments():
return parser.parse_args()
-def list_files(extensions, folder, repo):
- directories = compute_directories(extensions, repo)
+def list_files(tree_file, folder):
+ with open(tree_file) as tree:
+ directories = deserialize_directories(json.load(tree))
return directories[folder].subfolders, directories[folder].files
@@ -59,16 +60,15 @@ def convert_page(content, output):
def main(arguments):
- repo = Repo(search_parent_directories=True)
-
target = arguments.target
- extensions = arguments.extensions
- folders, files = list_files(extensions, target, repo)
+ folders, files = list_files(arguments.site_tree, target)
names = []
intro = None
+ repo = Repo(search_parent_directories=True)
+
for f in files:
name, _ = path.splitext(f)
if name == 'README':
diff --git a/repo/www/generate-tree.py b/repo/www/generate-tree.py
new file mode 100755
index 0000000..d858fe8
--- /dev/null
+++ b/repo/www/generate-tree.py
@@ -0,0 +1,32 @@
+#!/usr/bin/env python3
+
+from argparse import ArgumentParser
+import json
+
+from git import Repo
+
+from helpers import compute_directories
+
+
+def parse_arguments():
+ parser = ArgumentParser()
+ parser.add_argument('-o', '--output', help='Path to the output file.')
+ parser.add_argument(
+ 'extensions', nargs='+',
+ help='File extensions to consider when recording pages.'
+ )
+ return parser.parse_args()
+
+
+def main(arguments):
+ repo = Repo(search_parent_directories=True)
+
+ directories = compute_directories(arguments.extensions, repo)
+ serialized = ((d, directories[d].serialize()) for d in sorted(directories))
+
+ with open(arguments.output, 'w') as out:
+ json.dump(dict(serialized), out, sort_keys=True)
+
+
+if __name__ == '__main__':
+ main(parse_arguments())
diff --git a/repo/www/helpers.py b/repo/www/helpers.py
index 80115b7..6dc5bad 100644
--- a/repo/www/helpers.py
+++ b/repo/www/helpers.py
@@ -1,13 +1,23 @@
from collections import defaultdict
from dataclasses import dataclass, field
from os import path
-from typing import List, Set
+from typing import Iterator
@dataclass
class Directory:
- files: List[str] = field(default_factory=list)
- subfolders: Set[str] = field(default_factory=set)
+ files: Iterator[str] = field(default_factory=list)
+ subfolders: Iterator[str] = field(default_factory=set)
+
+ def serialize(self):
+ return {
+ 'files': sorted(self.files),
+ 'subfolders': sorted(self.subfolders)
+ }
+
+ @classmethod
+ def deserialize(cls, d):
+ return cls(**d)
def _find_files(extensions, repository):
@@ -36,3 +46,9 @@ def compute_directories(extensions, repository):
files = _find_files(extensions, repository)
top_dir = path.relpath(repository.working_dir, path.curdir)
return _fill_directories(files, top_dir)
+
+
+def deserialize_directories(directories):
+ return {
+ k: Directory.deserialize(v) for k, v in directories.items()
+ }