mirror of
https://github.com/denoland/deno.git
synced 2025-09-26 12:19:12 +00:00
fix(check): should bust check cache when json module or npm resolution changes (#19941)
A small part of #19928.
This commit is contained in:
parent
53e077133f
commit
cf16df00d9
17 changed files with 223 additions and 58 deletions
|
@ -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);
|
||||
}
|
||||
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...");
|
||||
|
||||
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?
|
||||
// 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(
|
||||
|
|
|
@ -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<NpmPackageReq, NpmPackageNv> {
|
||||
self.resolution.package_reqs()
|
||||
}
|
||||
|
||||
pub fn snapshot(&self) -> NpmResolutionSnapshot {
|
||||
self.resolution.snapshot()
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue