vars: eval finalScript lazy

This commit is contained in:
lassulus
2024-12-13 18:30:54 +01:00
parent 83a38909c0
commit 9cc3bdbc9f
6 changed files with 67 additions and 31 deletions

View File

@@ -166,7 +166,11 @@ class Machine:
generators: dict[str, Any] = clan_vars.get("generators")
if generators is None:
return []
return [Generator.from_json(gen) for gen in generators.values()]
_generators = [Generator.from_json(gen) for gen in generators.values()]
for gen in _generators:
gen.machine(self)
return _generators
@property
def secrets_upload_directory(self) -> str:

View File

@@ -40,7 +40,6 @@ class Generator:
files: list[Var] = field(default_factory=list)
share: bool = False
validation: str | None = None
final_script: str = ""
prompts: list[Prompt] = field(default_factory=list)
dependencies: list[str] = field(default_factory=list)
@@ -62,7 +61,6 @@ class Generator:
return cls(
name=data["name"],
share=data["share"],
final_script=data["finalScript"],
files=[Var.from_json(data["name"], f) for f in data["files"].values()],
validation=data["validationHash"],
dependencies=data["dependencies"],
@@ -70,6 +68,14 @@ class Generator:
prompts=[Prompt.from_json(p) for p in data["prompts"].values()],
)
@property
def final_script(self) -> Path:
assert self._machine is not None
final_script = self._machine.build_nix(
f"config.clan.core.vars.generators.{self.name}.finalScript"
)
return final_script
def bubblewrap_cmd(generator: str, tmpdir: Path) -> list[str]:
# fmt: off
@@ -188,7 +194,7 @@ def execute_generator(
prompt_file.write_text(value)
if sys.platform == "linux":
cmd = bubblewrap_cmd(generator.final_script, tmpdir)
cmd = bubblewrap_cmd(str(generator.final_script), tmpdir)
else:
cmd = ["bash", "-c", generator.final_script]
run(cmd, RunOpts(env=env))
@@ -201,7 +207,7 @@ def execute_generator(
secret_file = tmpdir_out / file.name
if not secret_file.is_file():
msg = f"did not generate a file for '{file.name}' when running the following command:\n"
msg += generator.final_script
msg += str(generator.final_script)
raise ClanError(msg)
if file.secret:
file_path = secret_vars_store.set(