summaryrefslogtreecommitdiff
path: root/src/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/build.rs')
-rw-r--r--src/build.rs26
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()))?;