greentic_bundle/build/
export.rs1use std::fs;
2use std::path::Path;
3
4use anyhow::Result;
5
6#[derive(Debug, Clone)]
7pub struct ExportPlan {
8 pub artifact_path: String,
9 pub build_dir: String,
10 pub manifest_path: String,
11}
12
13pub fn export_plan(state: &crate::build::plan::BuildState, artifact: &Path) -> ExportPlan {
14 ExportPlan {
15 artifact_path: artifact.display().to_string(),
16 build_dir: state.build_dir.display().to_string(),
17 manifest_path: state
18 .build_dir
19 .join("bundle-manifest.json")
20 .display()
21 .to_string(),
22 }
23}
24
25pub fn write_build_outputs(
26 state: &crate::build::plan::BuildState,
27 artifact: &Path,
28 warmup: bool,
29) -> Result<crate::build::BuildResult> {
30 write_normalized_build_dir(state, &state.build_dir)?;
31 if warmup {
32 crate::build::warmup::warmup_build_dir(&state.build_dir)?;
33 }
34 crate::build::squashfs::build_artifact(&state.build_dir, artifact)?;
35 Ok(crate::build::BuildResult {
36 artifact_path: artifact.display().to_string(),
37 build_dir: state.build_dir.display().to_string(),
38 manifest_path: state
39 .build_dir
40 .join("bundle-manifest.json")
41 .display()
42 .to_string(),
43 })
44}
45
46pub fn write_normalized_build_dir(
47 state: &crate::build::plan::BuildState,
48 build_dir: &Path,
49) -> Result<()> {
50 if build_dir.exists() {
51 fs::remove_dir_all(build_dir)?;
52 }
53 fs::create_dir_all(build_dir)?;
54 fs::write(
55 build_dir.join("bundle-manifest.json"),
56 format!("{}\n", serde_json::to_string_pretty(&state.manifest)?),
57 )?;
58 fs::write(
59 build_dir.join("bundle-lock.json"),
60 format!("{}\n", serde_json::to_string_pretty(&state.lock)?),
61 )?;
62 fs::write(build_dir.join("bundle.yaml"), &state.bundle_yaml)?;
63 for (name, contents) in &state.resolved_files {
64 let path = build_dir.join(name);
65 if let Some(parent) = path.parent() {
66 fs::create_dir_all(parent)?;
67 }
68 fs::write(path, contents)?;
69 }
70 for (name, contents) in &state.setup_files {
71 let path = build_dir.join(name);
72 if let Some(parent) = path.parent() {
73 fs::create_dir_all(parent)?;
74 }
75 fs::write(path, contents)?;
76 }
77 for (name, contents) in &state.asset_files {
78 let path = build_dir.join(name);
79 if let Some(parent) = path.parent() {
80 fs::create_dir_all(parent)?;
81 }
82 fs::write(path, contents)?;
83 }
84 Ok(())
85}