aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart/src/lockfile.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-21 14:11:18 +0900
committernsfisis <nsfisis@gmail.com>2026-02-21 14:11:18 +0900
commit294bd3dd425a374eda13a52b925a2cd0c4db7f0a (patch)
treef63a008b88113ac2548affbd0a662879f14b1ed7 /crates/mozart/src/lockfile.rs
parent48e88e9e204a38d1e31483412003f1492fa8fdcf (diff)
downloadphp-mozart-294bd3dd425a374eda13a52b925a2cd0c4db7f0a.tar.gz
php-mozart-294bd3dd425a374eda13a52b925a2cd0c4db7f0a.tar.zst
php-mozart-294bd3dd425a374eda13a52b925a2cd0c4db7f0a.zip
feat(depends): implement depends and prohibits commands with shared dependency logic
Add the `depends` (why) and `prohibits` (why-not) commands that query the dependency graph to answer "which packages require X?" and "which packages prevent version Y of X from being installed?" respectively. Introduces the shared `dependency` module with package loading from lock file or installed.json, forward/inverted dependency graph walking, recursive traversal with cycle detection, and table/tree output formatters. Adds `conflict` field to LockedPackage for conflict-based prohibition detection, updating all struct literals across install, remove, require, and update test helpers. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart/src/lockfile.rs')
-rw-r--r--crates/mozart/src/lockfile.rs7
1 files changed, 7 insertions, 0 deletions
diff --git a/crates/mozart/src/lockfile.rs b/crates/mozart/src/lockfile.rs
index 9b5b996..7c945b8 100644
--- a/crates/mozart/src/lockfile.rs
+++ b/crates/mozart/src/lockfile.rs
@@ -78,6 +78,9 @@ pub struct LockedPackage {
)]
pub require_dev: BTreeMap<String, String>,
+ #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
+ pub conflict: BTreeMap<String, String>,
+
#[serde(skip_serializing_if = "Option::is_none")]
pub suggest: Option<BTreeMap<String, String>>,
@@ -281,6 +284,7 @@ fn packagist_version_to_locked_package(name: &str, pv: &PackagistVersion) -> Loc
dist: pv.dist.as_ref().map(packagist_dist_to_locked),
require: pv.require.clone(),
require_dev: pv.require_dev.clone(),
+ conflict: pv.conflict.clone(),
suggest: pv.suggest.clone(),
package_type: pv.package_type.clone(),
autoload: pv.autoload.clone(),
@@ -527,6 +531,7 @@ mod tests {
}),
require: BTreeMap::new(),
require_dev: BTreeMap::new(),
+ conflict: BTreeMap::new(),
suggest: None,
package_type: Some("library".to_string()),
autoload: None,
@@ -954,6 +959,7 @@ mod tests {
dist: None,
require: BTreeMap::new(),
require_dev: BTreeMap::new(),
+ conflict: BTreeMap::new(),
suggest: None,
package_type: None,
autoload: None,
@@ -976,6 +982,7 @@ mod tests {
dist: None,
require: BTreeMap::new(),
require_dev: BTreeMap::new(),
+ conflict: BTreeMap::new(),
suggest: None,
package_type: None,
autoload: None,