summaryrefslogtreecommitdiff
path: root/cli/npm/cache.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/npm/cache.rs')
-rw-r--r--cli/npm/cache.rs51
1 files changed, 30 insertions, 21 deletions
diff --git a/cli/npm/cache.rs b/cli/npm/cache.rs
index aba6c0cca..142cbee18 100644
--- a/cli/npm/cache.rs
+++ b/cli/npm/cache.rs
@@ -15,6 +15,7 @@ use deno_core::parking_lot::Mutex;
use deno_core::url::Url;
use deno_npm::registry::NpmPackageVersionDistInfo;
use deno_npm::NpmPackageCacheFolderId;
+use deno_runtime::deno_fs;
use deno_semver::npm::NpmPackageNv;
use deno_semver::Version;
use once_cell::sync::Lazy;
@@ -113,13 +114,13 @@ pub fn with_folder_sync_lock(
}
#[derive(Clone, Debug)]
-pub struct ReadonlyNpmCache {
+pub struct NpmCacheDir {
root_dir: PathBuf,
// cached url representation of the root directory
root_dir_url: Url,
}
-impl ReadonlyNpmCache {
+impl NpmCacheDir {
pub fn new(root_dir: PathBuf) -> Self {
fn try_get_canonicalized_root_dir(
root_dir: &Path,
@@ -279,8 +280,9 @@ impl ReadonlyNpmCache {
/// Stores a single copy of npm packages in a cache.
#[derive(Debug)]
pub struct NpmCache {
- readonly: ReadonlyNpmCache,
+ cache_dir: NpmCacheDir,
cache_setting: CacheSetting,
+ fs: Arc<dyn deno_fs::FileSystem>,
http_client: Arc<HttpClient>,
progress_bar: ProgressBar,
/// ensures a package is only downloaded once per run
@@ -289,22 +291,24 @@ pub struct NpmCache {
impl NpmCache {
pub fn new(
- cache_dir_path: PathBuf,
+ cache_dir: NpmCacheDir,
cache_setting: CacheSetting,
+ fs: Arc<dyn deno_fs::FileSystem>,
http_client: Arc<HttpClient>,
progress_bar: ProgressBar,
) -> Self {
Self {
- readonly: ReadonlyNpmCache::new(cache_dir_path),
+ cache_dir,
cache_setting,
+ fs,
http_client,
progress_bar,
previously_reloaded_packages: Default::default(),
}
}
- pub fn as_readonly(&self) -> ReadonlyNpmCache {
- self.readonly.clone()
+ pub fn as_readonly(&self) -> NpmCacheDir {
+ self.cache_dir.clone()
}
pub fn cache_setting(&self) -> &CacheSetting {
@@ -312,7 +316,7 @@ impl NpmCache {
}
pub fn root_dir_url(&self) -> &Url {
- self.readonly.root_dir_url()
+ self.cache_dir.root_dir_url()
}
/// Checks if the cache should be used for the provided name and version.
@@ -350,13 +354,13 @@ impl NpmCache {
registry_url: &Url,
) -> Result<(), AnyError> {
let package_folder = self
- .readonly
+ .cache_dir
.package_folder_for_name_and_version(package, registry_url);
if self.should_use_global_cache_for_package(package)
- && package_folder.exists()
+ && self.fs.exists(&package_folder)
// if this file exists, then the package didn't successfully extract
// the first time, or another process is currently extracting the zip file
- && !package_folder.join(NPM_PACKAGE_SYNC_LOCK_FILENAME).exists()
+ && !self.fs.exists(&package_folder.join(NPM_PACKAGE_SYNC_LOCK_FILENAME))
{
return Ok(());
} else if self.cache_setting == CacheSetting::Only {
@@ -370,6 +374,10 @@ impl NpmCache {
);
}
+ if dist.tarball.is_empty() {
+ bail!("Tarball URL was empty.");
+ }
+
let guard = self.progress_bar.update(&dist.tarball);
let maybe_bytes = self
.http_client
@@ -395,8 +403,9 @@ impl NpmCache {
registry_url: &Url,
) -> Result<(), AnyError> {
assert_ne!(folder_id.copy_index, 0);
- let package_folder =
- self.readonly.package_folder_for_id(folder_id, registry_url);
+ let package_folder = self
+ .cache_dir
+ .package_folder_for_id(folder_id, registry_url);
if package_folder.exists()
// if this file exists, then the package didn't successfully extract
@@ -408,7 +417,7 @@ impl NpmCache {
}
let original_package_folder = self
- .readonly
+ .cache_dir
.package_folder_for_name_and_version(&folder_id.nv, registry_url);
with_folder_sync_lock(&folder_id.nv, &package_folder, || {
hard_link_dir_recursive(&original_package_folder, &package_folder)
@@ -421,7 +430,7 @@ impl NpmCache {
id: &NpmPackageCacheFolderId,
registry_url: &Url,
) -> PathBuf {
- self.readonly.package_folder_for_id(id, registry_url)
+ self.cache_dir.package_folder_for_id(id, registry_url)
}
pub fn package_folder_for_name_and_version(
@@ -430,16 +439,16 @@ impl NpmCache {
registry_url: &Url,
) -> PathBuf {
self
- .readonly
+ .cache_dir
.package_folder_for_name_and_version(package, registry_url)
}
pub fn package_name_folder(&self, name: &str, registry_url: &Url) -> PathBuf {
- self.readonly.package_name_folder(name, registry_url)
+ self.cache_dir.package_name_folder(name, registry_url)
}
pub fn registry_folder(&self, registry_url: &Url) -> PathBuf {
- self.readonly.registry_folder(registry_url)
+ self.cache_dir.registry_folder(registry_url)
}
pub fn resolve_package_folder_id_from_specifier(
@@ -448,7 +457,7 @@ impl NpmCache {
registry_url: &Url,
) -> Result<NpmPackageCacheFolderId, AnyError> {
self
- .readonly
+ .cache_dir
.resolve_package_folder_id_from_specifier(specifier, registry_url)
}
}
@@ -474,14 +483,14 @@ mod test {
use deno_semver::npm::NpmPackageNv;
use deno_semver::Version;
- use super::ReadonlyNpmCache;
+ use super::NpmCacheDir;
use crate::npm::cache::NpmPackageCacheFolderId;
#[test]
fn should_get_package_folder() {
let deno_dir = crate::cache::DenoDir::new(None).unwrap();
let root_dir = deno_dir.npm_folder_path();
- let cache = ReadonlyNpmCache::new(root_dir.clone());
+ let cache = NpmCacheDir::new(root_dir.clone());
let registry_url = Url::parse("https://registry.npmjs.org/").unwrap();
assert_eq!(