refactor: update deno_core for error refactor (#26867)

Closes #26171

---------

Co-authored-by: David Sherret <dsherret@gmail.com>
This commit is contained in:
Leo Kettmeir 2025-01-08 14:52:32 -08:00 committed by GitHub
parent 814da49dff
commit ea30e188a8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
214 changed files with 3787 additions and 4210 deletions

View file

@ -6,11 +6,10 @@ use std::path::Path;
use std::path::PathBuf;
use std::sync::Arc;
use anyhow::bail;
use anyhow::Context;
use anyhow::Error as AnyError;
use deno_cache_dir::file_fetcher::CacheSetting;
use deno_cache_dir::npm::NpmCacheDir;
use deno_error::JsErrorBox;
use deno_npm::npm_rc::ResolvedNpmRc;
use deno_npm::registry::NpmPackageInfo;
use deno_npm::NpmPackageCacheFolderId;
@ -45,9 +44,11 @@ pub use fs_util::hard_link_dir_recursive;
pub use registry_info::get_package_url;
pub use registry_info::RegistryInfoProvider;
pub use remote::maybe_auth_header_for_npm_registry;
pub use tarball::EnsurePackageError;
pub use tarball::TarballCache;
#[derive(Debug)]
#[derive(Debug, deno_error::JsError)]
#[class(generic)]
pub struct DownloadError {
pub status_code: Option<StatusCode>,
pub error: AnyError,
@ -203,7 +204,7 @@ impl<
pub fn ensure_copy_package(
&self,
folder_id: &NpmPackageCacheFolderId,
) -> Result<(), AnyError> {
) -> Result<(), WithFolderSyncLockError> {
let registry_url = self.npmrc.get_registry_url(&folder_id.nv.name);
assert_ne!(folder_id.copy_index, 0);
let package_folder = self.cache_dir.package_folder_for_id(
@ -237,6 +238,7 @@ impl<
&original_package_folder,
&package_folder,
)
.map_err(JsErrorBox::from_err)
})?;
Ok(())
}
@ -295,15 +297,15 @@ impl<
pub fn load_package_info(
&self,
name: &str,
) -> Result<Option<NpmPackageInfo>, AnyError> {
) -> Result<Option<NpmPackageInfo>, serde_json::Error> {
let file_cache_path = self.get_registry_package_info_file_cache_path(name);
let file_text = match std::fs::read_to_string(file_cache_path) {
Ok(file_text) => file_text,
Err(err) if err.kind() == ErrorKind::NotFound => return Ok(None),
Err(err) => return Err(err.into()),
Err(err) => return Err(serde_json::Error::io(err)),
};
Ok(serde_json::from_str(&file_text)?)
serde_json::from_str(&file_text)
}
pub fn save_package_info(
@ -330,18 +332,52 @@ impl<
const NPM_PACKAGE_SYNC_LOCK_FILENAME: &str = ".deno_sync_lock";
#[derive(Debug, thiserror::Error, deno_error::JsError)]
pub enum WithFolderSyncLockError {
#[class(inherit)]
#[error("Error creating '{path}'")]
CreateDir {
path: PathBuf,
#[source]
#[inherit]
source: std::io::Error,
},
#[class(inherit)]
#[error("Error creating package sync lock file at '{path}'. Maybe try manually deleting this folder.")]
CreateLockFile {
path: PathBuf,
#[source]
#[inherit]
source: std::io::Error,
},
#[class(inherit)]
#[error(transparent)]
Action(#[from] JsErrorBox),
#[class(generic)]
#[error("Failed setting up package cache directory for {package}, then failed cleaning it up.\n\nOriginal error:\n\n{error}\n\nRemove error:\n\n{remove_error}\n\nPlease manually delete this folder or you will run into issues using this package in the future:\n\n{output_folder}")]
SetUpPackageCacheDir {
package: Box<PackageNv>,
error: Box<WithFolderSyncLockError>,
remove_error: std::io::Error,
output_folder: PathBuf,
},
}
// todo(dsherret): use `sys` here instead of `std::fs`.
fn with_folder_sync_lock(
package: &PackageNv,
output_folder: &Path,
action: impl FnOnce() -> Result<(), AnyError>,
) -> Result<(), AnyError> {
action: impl FnOnce() -> Result<(), JsErrorBox>,
) -> Result<(), WithFolderSyncLockError> {
fn inner(
output_folder: &Path,
action: impl FnOnce() -> Result<(), AnyError>,
) -> Result<(), AnyError> {
std::fs::create_dir_all(output_folder).with_context(|| {
format!("Error creating '{}'.", output_folder.display())
action: impl FnOnce() -> Result<(), JsErrorBox>,
) -> Result<(), WithFolderSyncLockError> {
std::fs::create_dir_all(output_folder).map_err(|source| {
WithFolderSyncLockError::CreateDir {
path: output_folder.to_path_buf(),
source,
}
})?;
// This sync lock file is a way to ensure that partially created
@ -365,16 +401,10 @@ fn with_folder_sync_lock(
let _ignore = std::fs::remove_file(&sync_lock_path);
Ok(())
}
Err(err) => {
bail!(
concat!(
"Error creating package sync lock file at '{}'. ",
"Maybe try manually deleting this folder.\n\n{:#}",
),
output_folder.display(),
err
);
}
Err(err) => Err(WithFolderSyncLockError::CreateLockFile {
path: output_folder.to_path_buf(),
source: err,
}),
}
}
@ -383,19 +413,12 @@ fn with_folder_sync_lock(
Err(err) => {
if let Err(remove_err) = std::fs::remove_dir_all(output_folder) {
if remove_err.kind() != std::io::ErrorKind::NotFound {
bail!(
concat!(
"Failed setting up package cache directory for {}, then ",
"failed cleaning it up.\n\nOriginal error:\n\n{}\n\n",
"Remove error:\n\n{}\n\nPlease manually ",
"delete this folder or you will run into issues using this ",
"package in the future:\n\n{}"
),
package,
err,
remove_err,
output_folder.display(),
);
return Err(WithFolderSyncLockError::SetUpPackageCacheDir {
package: Box::new(package.clone()),
error: Box::new(err),
remove_error: remove_err,
output_folder: output_folder.to_path_buf(),
});
}
}
Err(err)