From 84d137a19feb1f79f5bd711faff63a6bbe651cbf Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 22 Feb 2026 18:25:16 +0900 Subject: feat(resolver): replace pubgrub with Composer-ported SAT solver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add mozart-sat-resolver crate implementing a CDCL SAT-based dependency resolver ported from Composer's DependencyResolver. This replaces the pubgrub library to ensure identical resolution behavior with Composer. The new crate includes: pool (package storage with integer IDs), rule/rule_set/rule_set_generator (constraint encoding), decisions (assignment tracking), rule_watch_graph (2-watched literal BCP), solver (CDCL loop with conflict analysis and clause learning), policy (version preference), problem (Composer-style error messages), and transaction (install/update/uninstall operation computation). The registry resolver is rewritten to use PoolBuilder → RuleSetGenerator → Solver pipeline instead of pubgrub's DependencyProvider trait. Co-Authored-By: Claude Opus 4.6 --- crates/mozart-semver/src/lib.rs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'crates/mozart-semver/src') diff --git a/crates/mozart-semver/src/lib.rs b/crates/mozart-semver/src/lib.rs index 474b6ce..5a09cfe 100644 --- a/crates/mozart-semver/src/lib.rs +++ b/crates/mozart-semver/src/lib.rs @@ -115,9 +115,17 @@ impl fmt::Display for Version { return write!(f, "dev-{}", name); } // Numeric dev branch (e.g. "2.x-dev") - return write!(f, "{}.{}.{}.{}-dev", self.major, self.minor, self.patch, self.build); + return write!( + f, + "{}.{}.{}.{}-dev", + self.major, self.minor, self.patch, self.build + ); } - write!(f, "{}.{}.{}.{}", self.major, self.minor, self.patch, self.build)?; + write!( + f, + "{}.{}.{}.{}", + self.major, self.minor, self.patch, self.build + )?; if let Some(ref pre) = self.pre_release { write!(f, "-{}", pre)?; } @@ -1792,10 +1800,7 @@ mod tests { // patch1 > stable for the same numeric version. let patch_ver = Version::parse("1.0.0-patch1").unwrap(); let stable = Version::parse("1.0.0").unwrap(); - assert!( - patch_ver > stable, - "patch pre-release ranks above stable" - ); + assert!(patch_ver > stable, "patch pre-release ranks above stable"); } // normalize_pre_release() — tested via Version::parse pre_release field -- cgit v1.3.1