build: one list of checks, run by the release build and by CI alike

tools/check.sh is what build-release.sh ran before building — every
script's syntax, the manual, every tests/test-*.sh — moved, not copied,
so a new test is run by both with nothing else to edit. It now runs every
test even after one fails, keeps each one's output and a summary table
for a CI run, and with --base checks the change's hygiene too.

The manual's revision date honours SOURCE_DATE_EPOCH, so a release built
from a commit a day later ships the manual that commit holds.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
ekklesia
2026-09-29 18:47:42 -05:00
co-authored by Claude Opus 5.5
parent 4413114d2a
commit 5416112db5
3 changed files with 156 additions and 53 deletions
+9 -2
View File
@@ -37,9 +37,10 @@ import argparse
import base64
import html
import mimetypes
import os
import re
import sys
from datetime import date
from datetime import date, datetime
from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent
@@ -704,7 +705,13 @@ def main():
if problems:
return 1
revision = f"Revision {date.today():%d %B %Y}"
# The day the source was committed, when the build says so, rather than
# the day it was built: a release built from a commit a day later must
# still ship the manual that commit holds, or the build changes the
# tree it was built from. SOURCE_DATE_EPOCH is the usual name for it.
epoch = os.environ.get("SOURCE_DATE_EPOCH")
day = datetime.fromtimestamp(int(epoch)).date() if epoch else date.today()
revision = f"Revision {day:%d %B %Y}"
if arguments.check:
for name in ("classroom-manual.html", "classroom-manual.pdf"):