155 lines
3.0 KiB
Python
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." |