diff options
| author | Hermes Agent <hermes@localhost> | 2026-08-12 08:26:30 +0000 |
|---|---|---|
| committer | Hermes Agent <hermes@localhost> | 2026-08-12 08:26:30 +0000 |
| commit | 21ac6ba754296000823869e3f025fbe6225e256f (patch) | |
| tree | 17e0ba6164f191cffc13ccf4720fd43f3d3f67b4 /src/build.rs | |
| parent | 9e3259b6fd163903c406b250e18782370e63c517 (diff) | |
Clean partial outputs after manifest write failure
Diffstat (limited to 'src/build.rs')
| -rw-r--r-- | src/build.rs | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/build.rs b/src/build.rs index cb6a436..457e938 100644 --- a/src/build.rs +++ b/src/build.rs @@ -133,10 +133,34 @@ impl<I: PackageInstaller, B: InitramfsBuilder> BuildExecutor<I, B> { })(); match result { Ok(result) => Ok(result), - Err(error) => Self::fail_and_remove_workspace(workspace, error), + Err(error) => { + Self::remove_partial_outputs(artifact)?; + Self::fail_and_remove_workspace(workspace, error) + } } } + fn remove_partial_outputs(artifact: &Path) -> Result<()> { + if artifact.exists() { + std::fs::remove_file(artifact) + .with_context(|| format!("remove partial artifact {}", artifact.display()))?; + } + let manifest = ArtifactManifest::path_beside(artifact)?; + if manifest.exists() { + let metadata = std::fs::symlink_metadata(&manifest) + .with_context(|| format!("inspect partial manifest {}", manifest.display()))?; + if metadata.is_dir() { + std::fs::remove_dir_all(&manifest).with_context(|| { + format!("remove partial manifest directory {}", manifest.display()) + })?; + } else { + std::fs::remove_file(&manifest) + .with_context(|| format!("remove partial manifest {}", manifest.display()))?; + } + } + Ok(()) + } + fn fail_and_remove_workspace<T>(workspace: &Path, error: anyhow::Error) -> Result<T> { std::fs::remove_dir_all(workspace) .with_context(|| format!("remove failed workspace {}", workspace.display()))?; |