From 21ac6ba754296000823869e3f025fbe6225e256f Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Wed, 12 Aug 2026 08:26:30 +0000 Subject: Clean partial outputs after manifest write failure --- src/build.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'src/build.rs') 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 BuildExecutor { })(); 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(workspace: &Path, error: anyhow::Error) -> Result { std::fs::remove_dir_all(workspace) .with_context(|| format!("remove failed workspace {}", workspace.display()))?; -- cgit v1.2.3