Skip to content

rebuild only files that need re-building #57

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
4 changes: 4 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@ serve-docs: $(VENV)
manpage: $(VENV)
help2man $(BIN)/blag --no-info -n "blog-aware, static site generator" -o debian/blag.1

.PHONY: benchmark
benchmark: $(VENV)
$(BIN)/pytest --no-cov -capture=no -rA tests/benchmark.py

.PHONY: clean
clean:
rm -rf build dist *.egg-info
Expand Down
12 changes: 12 additions & 0 deletions blag/blag.py
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,18 @@ def process_markdown(
for src, dst in convertibles:
logger.debug(f"Processing {src}")

# see first if the dst actually needs re-building. for that we compare
# the mtimes and assume mtime_dst > mtime_src means that it needs not
# to be rebuilt
if os.path.exists(f"{output_dir}/{dst}"):
mtime_src = os.stat(f"{input_dir}/{src}").st_mtime
mtime_dst = os.stat(f"{output_dir}/{dst}").st_mtime
if mtime_dst >= mtime_src:
logger.debug(
"Skipping, as target exists and is newer than source."
)
continue

with open(f"{input_dir}/{src}") as fh:
body = fh.read()

Expand Down
37 changes: 37 additions & 0 deletions tests/benchmark.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
"""Benchmark the performance of the blag build command."""

import logging
import os
from argparse import Namespace

from pytest import LogCaptureFixture

import blag
from blag.blag import build


def test_performance(args: Namespace, caplog: LogCaptureFixture) -> None:
"""Test performance of the build command."""
caplog.set_level(logging.ERROR)

FILES = 10000
print(f"Generating {FILES} markdown files")
# create random markdown files in the content directory
with open(os.path.join(blag.__path__[0], "content", "testpage.md")) as fh:
markdown = fh.read()
for i in range(FILES):
with open(f"content/{i}.md", "w") as f:
f.write(markdown)
f.write(str(i))

from time import time

t = time()
build(args)
t_first = time() - t

t = time()
build(args)
t_second = time() - t
print(f"First run: {t_first:.2f}s, second run: {t_second:.2f}s")
print(f"Speedup: {t_first/t_second:.2f}")
Loading