aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/mozart-registry/src/lockfile.rs1
-rw-r--r--crates/mozart-registry/src/resolver.rs18
-rw-r--r--crates/mozart/src/commands/create_project.rs5
-rw-r--r--crates/mozart/src/commands/remove.rs12
-rw-r--r--crates/mozart/src/commands/require.rs7
-rw-r--r--crates/mozart/src/commands/update.rs6
-rw-r--r--crates/mozart/tests/installer.rs7
7 files changed, 50 insertions, 6 deletions
diff --git a/crates/mozart-registry/src/lockfile.rs b/crates/mozart-registry/src/lockfile.rs
index 447e2cf..77a6b4c 100644
--- a/crates/mozart-registry/src/lockfile.rs
+++ b/crates/mozart-registry/src/lockfile.rs
@@ -1405,6 +1405,7 @@ mod tests {
raw_repositories: vec![],
root_provide: IndexMap::new(),
root_replace: IndexMap::new(),
+ root_conflict: IndexMap::new(),
};
let resolved = resolve(&resolve_request)
diff --git a/crates/mozart-registry/src/resolver.rs b/crates/mozart-registry/src/resolver.rs
index adc8780..48db7c3 100644
--- a/crates/mozart-registry/src/resolver.rs
+++ b/crates/mozart-registry/src/resolver.rs
@@ -611,6 +611,13 @@ pub struct ResolveRequest {
/// Root composer.json's `replace` map. Same role as `root_provide` for the
/// `replace` link: a replaced target counts as fulfilled by the root.
pub root_replace: IndexMap<String, String>,
+ /// Root composer.json's `conflict` map (target → constraint). Composer's
+ /// `RootPackageRepository` carries these onto the in-pool root package
+ /// entry; the SAT generator then forbids any candidate matching the
+ /// constraint, so a root `conflict` blocks both direct selection of the
+ /// targeted version and any alias / replace / provide that would resolve
+ /// to it.
+ pub root_conflict: IndexMap<String, String>,
}
/// A single package in the resolution output.
@@ -776,7 +783,15 @@ pub async fn resolve(request: &ResolveRequest) -> Result<Vec<ResolvedPackage>, R
source: root_name_lower.clone(),
})
.collect(),
- conflicts: vec![],
+ conflicts: request
+ .root_conflict
+ .iter()
+ .map(|(target, constraint)| PoolLink {
+ target: target.to_lowercase(),
+ constraint: constraint.clone(),
+ source: root_name_lower.clone(),
+ })
+ .collect(),
is_fixed: true,
is_alias_of: None,
};
@@ -1410,6 +1425,7 @@ mod tests {
raw_repositories: vec![],
root_provide: IndexMap::new(),
root_replace: IndexMap::new(),
+ root_conflict: IndexMap::new(),
};
let result = resolve(&request).await;
diff --git a/crates/mozart/src/commands/create_project.rs b/crates/mozart/src/commands/create_project.rs
index eceafd0..c0faa76 100644
--- a/crates/mozart/src/commands/create_project.rs
+++ b/crates/mozart/src/commands/create_project.rs
@@ -435,6 +435,11 @@ pub async fn execute(
.iter()
.map(|(k, v)| (k.clone(), v.clone()))
.collect(),
+ root_conflict: raw
+ .conflict
+ .iter()
+ .map(|(k, v)| (k.clone(), v.clone()))
+ .collect(),
};
console.info("Resolving dependencies...");
diff --git a/crates/mozart/src/commands/remove.rs b/crates/mozart/src/commands/remove.rs
index f11e9c3..08f7cc6 100644
--- a/crates/mozart/src/commands/remove.rs
+++ b/crates/mozart/src/commands/remove.rs
@@ -269,6 +269,11 @@ pub async fn execute(
.iter()
.map(|(k, v)| (k.clone(), v.clone()))
.collect(),
+ root_conflict: raw
+ .conflict
+ .iter()
+ .map(|(k, v)| (k.clone(), v.clone()))
+ .collect(),
};
// Print header messages
@@ -540,6 +545,11 @@ async fn remove_unused(
.iter()
.map(|(k, v)| (k.clone(), v.clone()))
.collect(),
+ root_conflict: raw
+ .conflict
+ .iter()
+ .map(|(k, v)| (k.clone(), v.clone()))
+ .collect(),
};
console.info("Resolving dependencies to detect unused packages...");
@@ -891,6 +901,7 @@ mod tests {
raw_repositories: vec![],
root_provide: IndexMap::new(),
root_replace: IndexMap::new(),
+ root_conflict: IndexMap::new(),
};
let resolved = resolve(&request)
.await
@@ -945,6 +956,7 @@ mod tests {
raw_repositories: vec![],
root_provide: IndexMap::new(),
root_replace: IndexMap::new(),
+ root_conflict: IndexMap::new(),
};
let resolved2 = resolve(&request2)
.await
diff --git a/crates/mozart/src/commands/require.rs b/crates/mozart/src/commands/require.rs
index cac0dad..97d6b02 100644
--- a/crates/mozart/src/commands/require.rs
+++ b/crates/mozart/src/commands/require.rs
@@ -657,6 +657,11 @@ pub async fn execute(
.iter()
.map(|(k, v)| (k.clone(), v.clone()))
.collect(),
+ root_conflict: raw
+ .conflict
+ .iter()
+ .map(|(k, v)| (k.clone(), v.clone()))
+ .collect(),
};
// Print header messages
@@ -1055,6 +1060,7 @@ mod tests {
raw_repositories: vec![],
root_provide: IndexMap::new(),
root_replace: IndexMap::new(),
+ root_conflict: IndexMap::new(),
};
let resolved = resolver::resolve(&request)
@@ -1126,6 +1132,7 @@ mod tests {
raw_repositories: vec![],
root_provide: IndexMap::new(),
root_replace: IndexMap::new(),
+ root_conflict: IndexMap::new(),
};
let resolved = resolver::resolve(&request)
diff --git a/crates/mozart/src/commands/update.rs b/crates/mozart/src/commands/update.rs
index db9d616..130d7e3 100644
--- a/crates/mozart/src/commands/update.rs
+++ b/crates/mozart/src/commands/update.rs
@@ -907,6 +907,11 @@ pub async fn run(
.iter()
.map(|(k, v)| (k.clone(), v.clone()))
.collect(),
+ root_conflict: composer_json
+ .conflict
+ .iter()
+ .map(|(k, v)| (k.clone(), v.clone()))
+ .collect(),
};
// Step 6: Print header and run resolver
@@ -2017,6 +2022,7 @@ mod tests {
raw_repositories: vec![],
root_provide: IndexMap::new(),
root_replace: IndexMap::new(),
+ root_conflict: IndexMap::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 0cf7e84..6ab083d 100644
--- a/crates/mozart/tests/installer.rs
+++ b/crates/mozart/tests/installer.rs
@@ -238,12 +238,9 @@ installer_fixture!(conflict_between_dependents);
installer_fixture!(conflict_between_root_and_dependent);
installer_fixture!(conflict_downgrade);
installer_fixture!(conflict_downgrade_nested);
-installer_fixture!(
- conflict_on_root_with_alias_prevents_update_if_not_required,
- ignore
-);
+installer_fixture!(conflict_on_root_with_alias_prevents_update_if_not_required);
installer_fixture!(conflict_with_alias_in_lock_does_prevents_install, ignore);
-installer_fixture!(conflict_with_alias_prevents_update, ignore);
+installer_fixture!(conflict_with_alias_prevents_update);
installer_fixture!(conflict_with_alias_prevents_update_if_not_required);
installer_fixture!(conflict_with_all_dependencies_option_dont_recommend_to_use_it);
installer_fixture!(deduplicate_solver_problems);