diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-05-08 20:06:29 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-05-08 20:06:29 +0900 |
| commit | b286af9ffe78d50b63bf5fda7fc796ab20f2552f (patch) | |
| tree | 3b3cb80e790aaa6b457cfeca1e7efab7126e016a /crates/mozart-core/src/factory.rs | |
| parent | 5cb8fc4e306970764e84bb850da2c56f844c3b12 (diff) | |
| download | php-mozart-b286af9ffe78d50b63bf5fda7fc796ab20f2552f.tar.gz php-mozart-b286af9ffe78d50b63bf5fda7fc796ab20f2552f.tar.zst php-mozart-b286af9ffe78d50b63bf5fda7fc796ab20f2552f.zip | |
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 <warning> 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) <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart-core/src/factory.rs')
| -rw-r--r-- | crates/mozart-core/src/factory.rs | 28 |
1 files changed, 16 insertions, 12 deletions
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<Vec<LocalPackage>> { +fn read_local_packages(vendor_dir: &Path) -> anyhow::Result<(Vec<LocalPackage>, Option<bool>)> { 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<bool>) = 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<Vec<LocalPackage>> { extra, )); } - Ok(out) + Ok((out, dev_mode)) } fn read_package_reference( |
