From cf16df00d9ba87de643abc6d80c860a2733917cc Mon Sep 17 00:00:00 2001 From: David Sherret Date: Wed, 26 Jul 2023 17:23:07 -0400 Subject: fix(check): should bust check cache when json module or npm resolution changes (#19941) A small part of #19928. --- cli/npm/resolution.rs | 58 ++++++++++++++++++++++++++---------------------- cli/npm/resolvers/mod.rs | 7 +++++- 2 files changed, 37 insertions(+), 28 deletions(-) (limited to 'cli/npm') 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 { + 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 { 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( diff --git a/cli/npm/resolvers/mod.rs b/cli/npm/resolvers/mod.rs index d46b6da6e..9ae84d7f9 100644 --- a/cli/npm/resolvers/mod.rs +++ b/cli/npm/resolvers/mod.rs @@ -4,6 +4,7 @@ mod common; mod global; mod local; +use std::collections::HashMap; use std::path::Path; use std::path::PathBuf; use std::sync::Arc; @@ -153,7 +154,7 @@ impl CliNpmResolver { let Some(cache_folder_id) = self .fs_resolver .resolve_package_cache_folder_id_from_specifier(specifier)? else { -return Ok(None); + return Ok(None); }; Ok(Some( self @@ -229,6 +230,10 @@ return Ok(None); .unwrap() } + pub fn package_reqs(&self) -> HashMap { + self.resolution.package_reqs() + } + pub fn snapshot(&self) -> NpmResolutionSnapshot { self.resolution.snapshot() } -- cgit v1.2.3