aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart
diff options
context:
space:
mode:
Diffstat (limited to 'crates/mozart')
-rw-r--r--crates/mozart/src/commands/create_project.rs1
-rw-r--r--crates/mozart/src/commands/remove.rs6
-rw-r--r--crates/mozart/src/commands/require.rs5
-rw-r--r--crates/mozart/src/commands/update.rs37
-rw-r--r--crates/mozart/tests/installer.rs8
5 files changed, 52 insertions, 5 deletions
diff --git a/crates/mozart/src/commands/create_project.rs b/crates/mozart/src/commands/create_project.rs
index c0faa76..215eb20 100644
--- a/crates/mozart/src/commands/create_project.rs
+++ b/crates/mozart/src/commands/create_project.rs
@@ -440,6 +440,7 @@ pub async fn execute(
.iter()
.map(|(k, v)| (k.clone(), v.clone()))
.collect(),
+ locked_package_names: indexmap::IndexSet::new(),
};
console.info("Resolving dependencies...");
diff --git a/crates/mozart/src/commands/remove.rs b/crates/mozart/src/commands/remove.rs
index 08f7cc6..15b3586 100644
--- a/crates/mozart/src/commands/remove.rs
+++ b/crates/mozart/src/commands/remove.rs
@@ -274,6 +274,7 @@ pub async fn execute(
.iter()
.map(|(k, v)| (k.clone(), v.clone()))
.collect(),
+ locked_package_names: indexmap::IndexSet::new(),
};
// Print header messages
@@ -550,6 +551,7 @@ async fn remove_unused(
.iter()
.map(|(k, v)| (k.clone(), v.clone()))
.collect(),
+ locked_package_names: indexmap::IndexSet::new(),
};
console.info("Resolving dependencies to detect unused packages...");
@@ -859,7 +861,7 @@ mod tests {
#[tokio::test]
#[ignore]
async fn test_remove_full_e2e() {
- use indexmap::IndexMap;
+ use indexmap::{IndexMap, IndexSet};
use mozart_registry::lockfile::{LockFileGenerationRequest, generate_lock_file};
use mozart_registry::resolver::{ResolveRequest, resolve};
use tempfile::tempdir;
@@ -902,6 +904,7 @@ mod tests {
root_provide: IndexMap::new(),
root_replace: IndexMap::new(),
root_conflict: IndexMap::new(),
+ locked_package_names: IndexSet::new(),
};
let resolved = resolve(&request)
.await
@@ -957,6 +960,7 @@ mod tests {
root_provide: IndexMap::new(),
root_replace: IndexMap::new(),
root_conflict: IndexMap::new(),
+ locked_package_names: IndexSet::new(),
};
let resolved2 = resolve(&request2)
.await
diff --git a/crates/mozart/src/commands/require.rs b/crates/mozart/src/commands/require.rs
index 97d6b02..6a2917b 100644
--- a/crates/mozart/src/commands/require.rs
+++ b/crates/mozart/src/commands/require.rs
@@ -662,6 +662,7 @@ pub async fn execute(
.iter()
.map(|(k, v)| (k.clone(), v.clone()))
.collect(),
+ locked_package_names: indexmap::IndexSet::new(),
};
// Print header messages
@@ -1029,6 +1030,7 @@ mod tests {
#[tokio::test]
#[ignore]
async fn test_require_full_e2e() {
+ use indexmap::IndexSet;
use mozart_core::package::RawPackageData;
use mozart_registry::lockfile::{LockFileGenerationRequest, generate_lock_file};
@@ -1061,6 +1063,7 @@ mod tests {
root_provide: IndexMap::new(),
root_replace: IndexMap::new(),
root_conflict: IndexMap::new(),
+ locked_package_names: IndexSet::new(),
};
let resolved = resolver::resolve(&request)
@@ -1094,6 +1097,7 @@ mod tests {
#[tokio::test]
#[ignore]
async fn test_require_no_install_writes_lock_only() {
+ use indexmap::IndexSet;
use mozart_core::package::RawPackageData;
use tempfile::tempdir;
@@ -1133,6 +1137,7 @@ mod tests {
root_provide: IndexMap::new(),
root_replace: IndexMap::new(),
root_conflict: IndexMap::new(),
+ locked_package_names: IndexSet::new(),
};
let resolved = resolver::resolve(&request)
diff --git a/crates/mozart/src/commands/update.rs b/crates/mozart/src/commands/update.rs
index 130d7e3..6d314dc 100644
--- a/crates/mozart/src/commands/update.rs
+++ b/crates/mozart/src/commands/update.rs
@@ -843,6 +843,41 @@ pub async fn run(
.filter(|p| !matches!(p.to_lowercase().as_str(), "lock" | "nothing" | "mirrors"))
.collect();
+ // For partial updates (specific package names given), eagerly read the
+ // lock file to collect names that stay pinned across this resolve.
+ // The resolver uses this set to skip materializing root `as` aliases
+ // for those packages — Composer's `PoolBuilder::loadPackage` only
+ // applies a root alias when the package's update is being propagated,
+ // so a locked-only package keeps its locked version unaliased.
+ //
+ // Only the *names* are needed — the full lock is re-read below for
+ // change reporting and `apply_partial_update` post-processing. Reading
+ // it twice is fine: it's a small JSON file. Errors here fall back to
+ // an empty set (treat as full update); the later read surfaces the
+ // failure to the user.
+ let locked_package_names: IndexSet<String> = if !raw_packages.is_empty() && lock_path.exists() {
+ match lockfile::LockFile::read_from_file(&lock_path) {
+ Ok(l) => {
+ let updated: IndexSet<String> =
+ raw_packages.iter().map(|s| s.to_lowercase()).collect();
+ l.packages
+ .iter()
+ .map(|p| p.name.to_lowercase())
+ .chain(
+ l.packages_dev
+ .iter()
+ .flatten()
+ .map(|p| p.name.to_lowercase()),
+ )
+ .filter(|n| !updated.contains(n))
+ .collect()
+ }
+ Err(_) => IndexSet::new(),
+ }
+ } else {
+ IndexSet::new()
+ };
+
// Step 5: Build the resolve request from composer.json
// Filter out platform packages from require list for the resolver (they're handled separately)
let require: Vec<(String, String)> = composer_json
@@ -912,6 +947,7 @@ pub async fn run(
.iter()
.map(|(k, v)| (k.clone(), v.clone()))
.collect(),
+ locked_package_names,
};
// Step 6: Print header and run resolver
@@ -2023,6 +2059,7 @@ mod tests {
root_provide: IndexMap::new(),
root_replace: IndexMap::new(),
root_conflict: IndexMap::new(),
+ locked_package_names: IndexSet::new(),
};
let resolved = resolve(&request).await.expect("Resolution should succeed");
diff --git a/crates/mozart/tests/installer.rs b/crates/mozart/tests/installer.rs
index 6ab083d..b4eb512 100644
--- a/crates/mozart/tests/installer.rs
+++ b/crates/mozart/tests/installer.rs
@@ -223,8 +223,8 @@ installer_fixture!(alias_on_unloadable_package);
installer_fixture!(alias_solver_problems);
installer_fixture!(alias_solver_problems2);
installer_fixture!(alias_with_reference, ignore);
-installer_fixture!(aliased_priority, ignore);
-installer_fixture!(aliased_priority_conflicting, ignore);
+installer_fixture!(aliased_priority);
+installer_fixture!(aliased_priority_conflicting);
installer_fixture!(aliases_with_require_dev, ignore);
installer_fixture!(broken_deps_do_not_replace, ignore);
installer_fixture!(circular_dependency, ignore);
@@ -255,10 +255,10 @@ installer_fixture!(github_issues_8903, ignore);
installer_fixture!(github_issues_9012, ignore);
installer_fixture!(github_issues_9290, ignore);
installer_fixture!(hint_main_rename);
-installer_fixture!(install_aliased_alias, ignore);
+installer_fixture!(install_aliased_alias);
installer_fixture!(install_branch_alias_composer_repo);
installer_fixture!(install_dev);
-installer_fixture!(install_dev_using_dist, ignore);
+installer_fixture!(install_dev_using_dist);
installer_fixture!(install_forces_reinstall_if_abandon_changes, ignore);
installer_fixture!(install_from_incomplete_lock);
installer_fixture!(install_from_incomplete_lock_with_ignore, ignore);