summaryrefslogtreecommitdiff
path: root/cli/args/lockfile.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2023-04-12 18:04:45 -0400
committerGitHub <noreply@github.com>2023-04-12 18:04:45 -0400
commit17e4782140a602043c4f92e643c1908c521ae017 (patch)
treec9e3cc979bbde41aec9c2615ee5d13a7d6784aab /cli/args/lockfile.rs
parenta3c5193a2e7d15bbfac390b220982561376e7322 (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.rs51
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,