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) -> Result<crate::build::BuildResult> {
29 write_normalized_build_dir(state, &state.build_dir)?;
30 crate::build::squashfs::build_artifact(&state.build_dir, artifact)?;
31 Ok(crate::build::BuildResult {
32 artifact_path: artifact.display().to_string(),
33 build_dir: state.build_dir.display().to_string(),
34 manifest_path: state
35 .build_dir
36 .join("bundle-manifest.json")
37 .display()
38 .to_string(),
39 })
40}
41
42pub fn write_normalized_build_dir(
43 state: &crate::build::plan::BuildState,
44 build_dir: &Path,
45) -> Result<()> {
46 if build_dir.exists() {
47 fs::remove_dir_all(build_dir)?;
48 }
49 fs::create_dir_all(build_dir)?;
50 fs::write(
51 build_dir.join("bundle-manifest.json"),
52 format!("{}\n", serde_json::to_string_pretty(&state.manifest)?),
53 )?;
54 fs::write(
55 build_dir.join("bundle-lock.json"),
56 format!("{}\n", serde_json::to_string_pretty(&state.lock)?),
57 )?;
58 fs::write(build_dir.join("bundle.yaml"), &state.bundle_yaml)?;
59 for (name, contents) in &state.resolved_files {
60 let path = build_dir.join(name);
61 if let Some(parent) = path.parent() {
62 fs::create_dir_all(parent)?;
63 }
64 fs::write(path, contents)?;
65 }
66 for (name, contents) in &state.setup_files {
67 let path = build_dir.join(name);
68 if let Some(parent) = path.parent() {
69 fs::create_dir_all(parent)?;
70 }
71 fs::write(path, contents)?;
72 }
73 for (name, contents) in &state.asset_files {
74 let path = build_dir.join(name);
75 if let Some(parent) = path.parent() {
76 fs::create_dir_all(parent)?;
77 }
78 fs::write(path, contents)?;
79 }
80 Ok(())
81}