aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart-semver/src
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-22 18:25:16 +0900
committernsfisis <nsfisis@gmail.com>2026-02-22 18:28:04 +0900
commit84d137a19feb1f79f5bd711faff63a6bbe651cbf (patch)
tree858dee19c5933ecda3f368cb586cf140b4e4c4d2 /crates/mozart-semver/src
parent07733b3b328f6e4ec23754fcb3504ddb196d65a3 (diff)
downloadphp-mozart-84d137a19feb1f79f5bd711faff63a6bbe651cbf.tar.gz
php-mozart-84d137a19feb1f79f5bd711faff63a6bbe651cbf.tar.zst
php-mozart-84d137a19feb1f79f5bd711faff63a6bbe651cbf.zip
feat(resolver): replace pubgrub with Composer-ported SAT solver
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 <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart-semver/src')
-rw-r--r--crates/mozart-semver/src/lib.rs17
1 files changed, 11 insertions, 6 deletions
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