diff options
Diffstat (limited to 'src')
| -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()))?; |