summaryrefslogtreecommitdiff
path: root/cli/npm
diff options
context:
space:
mode:
Diffstat (limited to 'cli/npm')
-rw-r--r--cli/npm/managed/resolvers/local.rs33
1 files changed, 31 insertions, 2 deletions
diff --git a/cli/npm/managed/resolvers/local.rs b/cli/npm/managed/resolvers/local.rs
index edc7c7ea0..258c9bf3d 100644
--- a/cli/npm/managed/resolvers/local.rs
+++ b/cli/npm/managed/resolvers/local.rs
@@ -343,6 +343,14 @@ async fn sync_resolution_with_fs(
},
);
let packages_with_deprecation_warnings = Arc::new(Mutex::new(Vec::new()));
+
+ let mut package_tags: HashMap<&PackageNv, Vec<&str>> = HashMap::new();
+ for (package_req, package_nv) in snapshot.package_reqs() {
+ if let Some(tag) = package_req.version_req.tag() {
+ package_tags.entry(package_nv).or_default().push(tag);
+ }
+ }
+
for package in &package_partitions.packages {
if let Some(current_pkg) =
newest_packages_by_name.get_mut(&package.id.nv.name)
@@ -357,11 +365,29 @@ async fn sync_resolution_with_fs(
let package_folder_name =
get_package_folder_id_folder_name(&package.get_package_cache_folder_id());
let folder_path = deno_local_registry_dir.join(&package_folder_name);
+ let tags = package_tags
+ .get(&package.id.nv)
+ .map(|tags| tags.join(","))
+ .unwrap_or_default();
+ enum PackageFolderState {
+ UpToDate,
+ Uninitialized,
+ TagsOutdated,
+ }
let initialized_file = folder_path.join(".initialized");
+ let package_state = std::fs::read_to_string(&initialized_file)
+ .map(|s| {
+ if s != tags {
+ PackageFolderState::TagsOutdated
+ } else {
+ PackageFolderState::UpToDate
+ }
+ })
+ .unwrap_or(PackageFolderState::Uninitialized);
if !cache
.cache_setting()
.should_use_for_npm_package(&package.id.nv.name)
- || !initialized_file.exists()
+ || matches!(package_state, PackageFolderState::Uninitialized)
{
// cache bust the dep from the dep setup cache so the symlinks
// are forced to be recreated
@@ -371,6 +397,7 @@ async fn sync_resolution_with_fs(
let bin_entries_to_setup = bin_entries.clone();
let packages_with_deprecation_warnings =
packages_with_deprecation_warnings.clone();
+
cache_futures.push(async move {
tarball_cache
.ensure_package(&package.id.nv, &package.dist)
@@ -389,7 +416,7 @@ async fn sync_resolution_with_fs(
move || {
clone_dir_recursive(&cache_folder, &package_path)?;
// write out a file that indicates this folder has been initialized
- fs::write(initialized_file, "")?;
+ fs::write(initialized_file, tags)?;
Ok::<_, AnyError>(())
}
@@ -410,6 +437,8 @@ async fn sync_resolution_with_fs(
drop(pb_guard); // explicit for clarity
Ok::<_, AnyError>(())
});
+ } else if matches!(package_state, PackageFolderState::TagsOutdated) {
+ fs::write(initialized_file, tags)?;
}
let sub_node_modules = folder_path.join("node_modules");