diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-04-12 18:04:45 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-12 18:04:45 -0400 |
commit | 17e4782140a602043c4f92e643c1908c521ae017 (patch) | |
tree | c9e3cc979bbde41aec9c2615ee5d13a7d6784aab /cli/args/lockfile.rs | |
parent | a3c5193a2e7d15bbfac390b220982561376e7322 (diff) |
fix(npm): eagerly reload package information when version from lockfile not found locally (#18673)
Closes #18624
Diffstat (limited to 'cli/args/lockfile.rs')
-rw-r--r-- | cli/args/lockfile.rs | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/cli/args/lockfile.rs b/cli/args/lockfile.rs index 29c01b252..48a3e89c1 100644 --- a/cli/args/lockfile.rs +++ b/cli/args/lockfile.rs @@ -19,6 +19,7 @@ use deno_semver::npm::NpmPackageReq; use crate::args::config_file::LockConfig; use crate::args::ConfigFile; +use crate::npm::CliNpmRegistryApi; use crate::Flags; use super::DenoSubcommand; @@ -75,7 +76,7 @@ pub fn discover( pub async fn snapshot_from_lockfile( lockfile: Arc<Mutex<Lockfile>>, - api: &dyn NpmRegistryApi, + api: &CliNpmRegistryApi, ) -> Result<NpmResolutionSnapshot, AnyError> { let (root_packages, mut packages) = { let lockfile = lockfile.lock(); @@ -114,25 +115,45 @@ pub async fn snapshot_from_lockfile( }; // now that the lockfile is dropped, fetch the package version information - let mut version_infos = - FuturesOrdered::from_iter(packages.iter().map(|p| p.pkg_id.nv.clone()).map( - |nv| async move { - let package_info = api.package_info(&nv.name).await?; - match package_info.version_info(&nv) { - Ok(version_info) => Ok(version_info), - Err(err) => { - bail!("Could not find '{}' specified in the lockfile. Maybe try again with --reload", err.0); - } - } - }, - )); + let pkg_nvs = packages + .iter() + .map(|p| p.pkg_id.nv.clone()) + .collect::<Vec<_>>(); + let get_version_infos = || { + FuturesOrdered::from_iter(pkg_nvs.iter().map(|nv| async move { + let package_info = api.package_info(&nv.name).await?; + match package_info.version_info(nv) { + Ok(version_info) => Ok(version_info), + Err(err) => { + bail!("Could not find '{}' specified in the lockfile.", err.0); + } + } + })) + }; + let mut version_infos = get_version_infos(); let mut i = 0; - while let Some(version_info) = version_infos.next().await { - packages[i].dist = version_info?.dist; + while let Some(result) = version_infos.next().await { + packages[i].dist = match result { + Ok(version_info) => version_info.dist, + Err(err) => { + if api.mark_force_reload() { + // reset and try again + version_infos = get_version_infos(); + i = 0; + continue; + } else { + return Err(err); + } + } + }; + i += 1; } + // clear the memory cache to reduce memory usage + api.clear_memory_cache(); + NpmResolutionSnapshot::from_packages(NpmResolutionSnapshotCreateOptions { packages, root_packages, |