From b286af9ffe78d50b63bf5fda7fc796ab20f2552f Mon Sep 17 00:00:00 2001 From: nsfisis Date: Fri, 8 May 2026 20:06:29 +0900 Subject: fix(reinstall): align with Composer's ReinstallCommand pipeline Switch to Composer::require() for the entrypoint, drop the Mozart-only --dry-run / --no-dev flags, mirror selection inline using a port of BasePackage::packageNameToRegexp, read autoloader options from composer.config(), and route the autoload dump through composer.autoload_generator(). Empty-result and unmatched-pattern warnings now emit on stderr with markup, matching $io->writeError. Plugin/script-event dispatch and Transaction-based operation building remain TODO until the installer_executor lands. Co-Authored-By: Claude Opus 4.7 (1M context) --- crates/mozart-core/src/factory.rs | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) (limited to 'crates/mozart-core/src/factory.rs') diff --git a/crates/mozart-core/src/factory.rs b/crates/mozart-core/src/factory.rs index c9d346b..6602056 100644 --- a/crates/mozart-core/src/factory.rs +++ b/crates/mozart-core/src/factory.rs @@ -208,8 +208,9 @@ pub fn create_composer(project_dir: PathBuf, composer_json: &Path) -> anyhow::Re project_dir.join(&config.vendor_dir) }; - let local_packages = read_local_packages(&vendor_dir)?; - let repository_manager = RepositoryManager::new(LocalRepository::new(local_packages)); + let (local_packages, dev_mode) = read_local_packages(&vendor_dir)?; + let repository_manager = + RepositoryManager::new(LocalRepository::with_dev_mode(local_packages, dev_mode)); let installation_manager = InstallationManager::new(vendor_dir); let autoload_generator = AutoloadGenerator::new(); @@ -252,21 +253,24 @@ pub fn create_composer(project_dir: PathBuf, composer_json: &Path) -> anyhow::Re /// dependency graph; the parsing that's actually load-bearing for the /// install-path computation is just the package name + optional /// `target-dir`. -fn read_local_packages(vendor_dir: &Path) -> anyhow::Result> { +fn read_local_packages(vendor_dir: &Path) -> anyhow::Result<(Vec, Option)> { let path = vendor_dir.join("composer/installed.json"); if !path.exists() { - return Ok(Vec::new()); + return Ok((Vec::new(), None)); } let content = std::fs::read_to_string(&path)?; let value: serde_json::Value = serde_json::from_str(&content)?; - let entries: &[serde_json::Value] = match &value { - serde_json::Value::Object(obj) => match obj.get("packages") { - Some(serde_json::Value::Array(arr)) => arr.as_slice(), - _ => return Ok(Vec::new()), - }, - serde_json::Value::Array(arr) => arr.as_slice(), - _ => return Ok(Vec::new()), + let (entries, dev_mode): (&[serde_json::Value], Option) = match &value { + serde_json::Value::Object(obj) => { + let entries = match obj.get("packages") { + Some(serde_json::Value::Array(arr)) => arr.as_slice(), + _ => return Ok((Vec::new(), obj.get("dev").and_then(|v| v.as_bool()))), + }; + (entries, obj.get("dev").and_then(|v| v.as_bool())) + } + serde_json::Value::Array(arr) => (arr.as_slice(), None), + _ => return Ok((Vec::new(), None)), }; let mut out = Vec::with_capacity(entries.len()); @@ -310,7 +314,7 @@ fn read_local_packages(vendor_dir: &Path) -> anyhow::Result> { extra, )); } - Ok(out) + Ok((out, dev_mode)) } fn read_package_reference( -- cgit v1.3.1