diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-07-26 17:23:07 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-26 17:23:07 -0400 |
commit | cf16df00d9ba87de643abc6d80c860a2733917cc (patch) | |
tree | d8e17df213941675c8eecba89931b8417cd0367f /cli/npm/resolution.rs | |
parent | 53e077133f9c95e4ed23d838129158b6e4b88d6f (diff) |
fix(check): should bust check cache when json module or npm resolution changes (#19941)
A small part of #19928.
Diffstat (limited to 'cli/npm/resolution.rs')
-rw-r--r-- | cli/npm/resolution.rs | 58 |
1 files changed, 31 insertions, 27 deletions
diff --git a/cli/npm/resolution.rs b/cli/npm/resolution.rs index bfba1d67d..6992d875e 100644 --- a/cli/npm/resolution.rs +++ b/cli/npm/resolution.rs @@ -1,5 +1,6 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +use std::collections::HashMap; use std::collections::HashSet; use std::sync::Arc; @@ -249,6 +250,10 @@ impl NpmResolution { Ok(nv) } + pub fn package_reqs(&self) -> HashMap<NpmPackageReq, NpmPackageNv> { + self.snapshot.read().package_reqs().clone() + } + pub fn all_system_packages( &self, system_info: &NpmSystemInfo, @@ -303,45 +308,44 @@ async fn add_package_reqs_to_snapshot( get_new_snapshot: impl Fn() -> NpmResolutionSnapshot, ) -> Result<NpmResolutionSnapshot, AnyError> { let snapshot = get_new_snapshot(); - if !snapshot.has_pending() + let snapshot = if !snapshot.has_pending() && package_reqs .iter() .all(|req| snapshot.package_reqs().contains_key(req)) { log::debug!("Snapshot already up to date. Skipping pending resolution."); - return Ok(snapshot); - } - - let pending_resolver = get_npm_pending_resolver(api); - let result = pending_resolver - .resolve_pending(snapshot, package_reqs) - .await; - api.clear_memory_cache(); - let snapshot = match result { - Ok(snapshot) => snapshot, - Err(NpmResolutionError::Resolution(err)) if api.mark_force_reload() => { - log::debug!("{err:#}"); - log::debug!("npm resolution failed. Trying again..."); - - // try again - let snapshot = get_new_snapshot(); - let result = pending_resolver - .resolve_pending(snapshot, package_reqs) - .await; - api.clear_memory_cache(); - // now surface the result after clearing the cache - result? + snapshot + } else { + let pending_resolver = get_npm_pending_resolver(api); + let result = pending_resolver + .resolve_pending(snapshot, package_reqs) + .await; + api.clear_memory_cache(); + match result { + Ok(snapshot) => snapshot, + Err(NpmResolutionError::Resolution(err)) if api.mark_force_reload() => { + log::debug!("{err:#}"); + log::debug!("npm resolution failed. Trying again..."); + + // try again + let snapshot = get_new_snapshot(); + let result = pending_resolver + .resolve_pending(snapshot, package_reqs) + .await; + api.clear_memory_cache(); + // now surface the result after clearing the cache + result? + } + Err(err) => return Err(err.into()), } - Err(err) => return Err(err.into()), }; if let Some(lockfile_mutex) = maybe_lockfile { let mut lockfile = lockfile_mutex.lock(); populate_lockfile_from_snapshot(&mut lockfile, &snapshot)?; - Ok(snapshot) - } else { - Ok(snapshot) } + + Ok(snapshot) } fn get_npm_pending_resolver( |