diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-23 01:01:22 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-23 01:01:22 +0900 |
| commit | 48dffd282efd8fa847b3636753d7c0d856672f36 (patch) | |
| tree | 57dc8e7dd6240506dcef16f385afd47a65c00f20 /crates/mozart | |
| parent | ad245ab21f79518e28c68b28e14e9f3ab09f4814 (diff) | |
| download | php-mozart-48dffd282efd8fa847b3636753d7c0d856672f36.tar.gz php-mozart-48dffd282efd8fa847b3636753d7c0d856672f36.tar.zst php-mozart-48dffd282efd8fa847b3636753d7c0d856672f36.zip | |
fix(check-platform-reqs): add informational messages and empty vendor fallback
Emit Composer-compatible stderr messages indicating which source is used
(lock file, vendor dir, or fallback). Detect empty installed.json and
fall back to the lock file with a warning instead of silently succeeding.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart')
| -rw-r--r-- | crates/mozart/src/commands/check_platform_reqs.rs | 74 |
1 files changed, 60 insertions, 14 deletions
diff --git a/crates/mozart/src/commands/check_platform_reqs.rs b/crates/mozart/src/commands/check_platform_reqs.rs index fffb7f9..f8c9d72 100644 --- a/crates/mozart/src/commands/check_platform_reqs.rs +++ b/crates/mozart/src/commands/check_platform_reqs.rs @@ -55,7 +55,7 @@ struct CheckResult { pub async fn execute( args: &CheckPlatformReqsArgs, cli: &super::Cli, - _console: &mozart_core::console::Console, + console: &mozart_core::console::Console, ) -> anyhow::Result<()> { let working_dir = match &cli.working_dir { Some(dir) => PathBuf::from(dir), @@ -78,7 +78,7 @@ pub async fn execute( } // Collect platform requirements from all packages + root - let requirements = collect_requirements(&working_dir, args)?; + let requirements = collect_requirements(&working_dir, args, console)?; if requirements.is_empty() { // No platform requirements to check @@ -118,9 +118,12 @@ pub async fn execute( fn collect_requirements( working_dir: &Path, args: &CheckPlatformReqsArgs, + console: &mozart_core::console::Console, ) -> anyhow::Result<BTreeMap<String, Vec<PlatformRequirement>>> { let mut requirements: BTreeMap<String, Vec<PlatformRequirement>> = BTreeMap::new(); + let dev_text = if args.no_dev { "non-dev " } else { "" }; + // Determine package source let lock_path = working_dir.join("composer.lock"); let vendor_dir = working_dir.join("vendor"); @@ -131,12 +134,51 @@ fn collect_requirements( if !lock_path.exists() { anyhow::bail!("No composer.lock found. Run `mozart install` or `mozart update` first."); } + console.info(&format!( + "Checking {}platform requirements using the lock file", + dev_text + )); collect_from_lock(&lock_path, args.no_dev, &mut requirements)?; } else if installed_path.exists() { // Default: read from installed.json - collect_from_installed(&vendor_dir, args.no_dev, &mut requirements)?; + let installed = mozart_registry::installed::InstalledPackages::read(&vendor_dir)?; + if installed.packages.is_empty() { + // Fall through to lock file with a warning + console.write( + &format!( + "{}", + mozart_core::console::warning(&format!( + "No vendor dir present, checking {}platform requirements from the lock file", + dev_text + )) + ), + mozart_core::console::Verbosity::Normal, + ); + if !lock_path.exists() { + anyhow::bail!( + "No installed packages found. Run `mozart install` or `mozart update` first." + ); + } + collect_from_lock(&lock_path, args.no_dev, &mut requirements)?; + } else { + console.info(&format!( + "Checking {}platform requirements for packages in the vendor dir", + dev_text + )); + collect_from_installed_data(&installed, args.no_dev, &mut requirements); + } } else if lock_path.exists() { // Fallback: read from lock file + console.write( + &format!( + "{}", + mozart_core::console::warning(&format!( + "No vendor dir present, checking {}platform requirements from the lock file", + dev_text + )) + ), + mozart_core::console::Verbosity::Normal, + ); collect_from_lock(&lock_path, args.no_dev, &mut requirements)?; } else { anyhow::bail!( @@ -176,13 +218,11 @@ fn collect_from_lock( Ok(()) } -fn collect_from_installed( - vendor_dir: &Path, +fn collect_from_installed_data( + installed: &mozart_registry::installed::InstalledPackages, no_dev: bool, requirements: &mut BTreeMap<String, Vec<PlatformRequirement>>, -) -> anyhow::Result<()> { - let installed = mozart_registry::installed::InstalledPackages::read(vendor_dir)?; - +) { let dev_names: std::collections::HashSet<String> = installed .dev_package_names .iter() @@ -213,8 +253,6 @@ fn collect_from_installed( } } } - - Ok(()) } fn add_platform_requirements_from_map( @@ -414,6 +452,10 @@ mod tests { // ── Helpers ────────────────────────────────────────────────────────────── + fn test_console() -> mozart_core::console::Console { + mozart_core::console::Console::new(0, true, false, true, true) + } + fn make_platform(entries: &[(&str, &str)]) -> Vec<PlatformPackage> { entries .iter() @@ -534,7 +576,8 @@ mod tests { format: None, }; - let reqs = collect_requirements(working_dir, &args).unwrap(); + let console = test_console(); + let reqs = collect_requirements(working_dir, &args, &console).unwrap(); assert!(reqs.contains_key("php"), "php should be in requirements"); assert!( @@ -577,13 +620,15 @@ mod tests { &[("vendor/devpkg", dev_require)], ); + let console = test_console(); + // With --no-dev let args_no_dev = CheckPlatformReqsArgs { no_dev: true, lock: true, format: None, }; - let reqs_no_dev = collect_requirements(working_dir, &args_no_dev).unwrap(); + let reqs_no_dev = collect_requirements(working_dir, &args_no_dev, &console).unwrap(); assert!(reqs_no_dev.contains_key("php")); assert!( !reqs_no_dev.contains_key("ext-xdebug"), @@ -596,7 +641,7 @@ mod tests { lock: true, format: None, }; - let reqs_with_dev = collect_requirements(working_dir, &args_with_dev).unwrap(); + let reqs_with_dev = collect_requirements(working_dir, &args_with_dev, &console).unwrap(); assert!(reqs_with_dev.contains_key("php")); assert!( reqs_with_dev.contains_key("ext-xdebug"), @@ -625,7 +670,8 @@ mod tests { format: None, }; - let reqs = collect_requirements(working_dir, &args).unwrap(); + let console = test_console(); + let reqs = collect_requirements(working_dir, &args, &console).unwrap(); assert!( reqs.contains_key("php"), |
