# 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."