From 5dd70d8d2d7849f25d38e5f86bd6b1398d0c6fb1 Mon Sep 17 00:00:00 2001 From: Andrew Voynov Date: Wed, 5 Mar 2025 16:59:40 +0300 Subject: [PATCH] Fix incorrect directory being removed --- crates/typst-kit/src/package.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/crates/typst-kit/src/package.rs b/crates/typst-kit/src/package.rs index 9d21863c2..ce6d374ac 100644 --- a/crates/typst-kit/src/package.rs +++ b/crates/typst-kit/src/package.rs @@ -218,14 +218,6 @@ impl PackageStorage { create_dir(package_download_dir.as_path(), "download")?; create_dir(package_dir, "package")?; - let decompressed = flate2::read::GzDecoder::new(data.as_slice()); - tar::Archive::new(decompressed) - .unpack(&package_download_dir) - .map_err(|err| { - fs::remove_dir_all(package_dir).ok(); - PackageError::MalformedArchive(Some(eco_format!("{err}"))) - })?; - let removed_download_dir = || { fs::remove_dir_all(&package_download_dir).map_err(|err| { PackageError::Other(Some(eco_format!( @@ -234,6 +226,17 @@ impl PackageStorage { }) }; + let decompressed = flate2::read::GzDecoder::new(data.as_slice()); + tar::Archive::new(decompressed) + .unpack(&package_download_dir) + .map_err(|err| { + let message = match removed_download_dir() { + Err(PackageError::Other(Some(str))) => eco_format!("{err}\n{str}"), + _ => eco_format!("{err}"), + }; + PackageError::MalformedArchive(Some(message)) + })?; + // As to not overcomplicate the code base to combat an already rare case // where multiple instances try to download the same package version // concurrently, we are abusing the behavior of the `rename` FS