2023-02-25 23:32:02 -08:00

155 lines
3.0 KiB
Python

# Build script for CI.
# This file is run from the root of the repository
import os
import tomli
from pathlib import Path
import shutil
from webdav3.client import Client
import helpers.tex as tex
conf_path = "resources/scripts/build.toml"
# Prepare envvars
e = os.environ.copy()
e["TEXINPUTS"] = f"::/usr/share/texmf-dist/tex//"
print(Path.cwd())
# If true, rebuild everything
# without checking for changes.
# Currently unused.
if "FORCE_ALL" in e:
force_all = e["FORCE_ALL"] == "true"
else:
force_all = False
if "NO_TEST" in e:
test = e["NO_TEST"] == "false"
else:
test = True
# Used only for debug
class FakeClient:
def __init__(self):
pass
def mkdir(self, path):
print(f"[Dry run] Making dir {path}")
def upload_sync(self, local_path, remote_path):
print(f"[Dry run] Synced {local_path} to {remote_path}")
def clean(self, path):
print(f"[Dry run] Cleaning {path}")
# Load configuration
with open(conf_path, mode="rb") as fp:
config = tomli.load(fp)
# Prepare directories
builddir = Path().absolute() / config["core"]["build_dir"]
output = Path().absolute() / config["core"]["output_dir"]
output.mkdir(parents = True, exist_ok = True)
builddir.mkdir(parents = True, exist_ok = True)
if not test:
# Connect to webdav
client = Client({
"webdav_login": e["NC_CRED_USR"],
"webdav_password": e["NC_CRED_PSW"],
"webdav_hostname": e["DAV_HOSTNAME"], # https://host:port
"webdav_root": e["DAV_ROOT"] # the rest of the url
# client.list() will break if we do not seperate the hostname
# and the root path.
})
else:
client = FakeClient()
def upload_dir(local_path: Path):
for p in local_path.rglob("*"):
r = p.relative_to(output)
if p.is_dir():
client.mkdir(str(r))
elif p.is_file():
client.upload_sync( # type: ignore
remote_path = str(r),
local_path = p
)
# Print envvars for debug
#print(e)
for i, item in enumerate(config["dir-of-dirs"]):
p = Path(item["path"])
for s in p.iterdir():
# s: path to directory,
# # relative to repo root
if not s.is_dir():
continue
print(f"Building {s}/main.tex")
# Make pdf
pdf_nosolutions = tex.build(
s,
mainfile = "main.tex",
jobname = f"{i}-nosols",
build_dir = builddir,
solutions = False,
env = e,
test = test
)
pdf_solutions = tex.build(
s,
mainfile = "main.tex",
jobname = f"{i}-sols",
build_dir = builddir,
solutions = True,
env = e,
test = test
)
target_dir = output / s.parent
target_dir.mkdir(parents = True, exist_ok = True)
shutil.copy(
pdf_nosolutions,
target_dir / (s.stem + ".pdf")
)
shutil.copy(
pdf_solutions,
target_dir / (s.stem + ".sols.pdf")
)
# TODO: this breaks when the output directory is empty.
# Fix it eventually.
if not test:
# Delete old files
for i in client.list():
if i.endswith("/"):
i = i[:-1]
client.clean(i)
upload_dir(output)
# Remove output files so they don't persist
# shutil.rmtree(output)
# Shouldn't be necessary if you tell
# jenkins to "clean before checkout."