diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-23 01:34:55 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-23 01:58:28 +0900 |
| commit | ec3d69446cf07409b9c91de3d2e63856f33b26fd (patch) | |
| tree | 06f6c7eb0633809c8f58ab098adb9899cc57af90 /crates/mozart/src/commands/show.rs | |
| parent | 1ab3d928a2d350ce407205d9ee6ea9569cd38424 (diff) | |
| download | php-mozart-ec3d69446cf07409b9c91de3d2e63856f33b26fd.tar.gz php-mozart-ec3d69446cf07409b9c91de3d2e63856f33b26fd.tar.zst php-mozart-ec3d69446cf07409b9c91de3d2e63856f33b26fd.zip | |
fix(show,outdated): align outdated classification and wildcard handling with Composer
- Extract matches_wildcard to mozart-core for reuse across commands
- Support wildcard patterns in --package and --ignore arguments
- Use ^<installed_version> for semver-safe classification instead of root constraint
- Replace std::process::exit(1) with bail_silent for proper cleanup
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'crates/mozart/src/commands/show.rs')
| -rw-r--r-- | crates/mozart/src/commands/show.rs | 52 |
1 files changed, 13 insertions, 39 deletions
diff --git a/crates/mozart/src/commands/show.rs b/crates/mozart/src/commands/show.rs index 4712757..346c7b7 100644 --- a/crates/mozart/src/commands/show.rs +++ b/crates/mozart/src/commands/show.rs @@ -1,5 +1,6 @@ use clap::Args; use mozart_core::console_format; +use mozart_core::matches_wildcard; use std::collections::{HashMap, HashSet}; use std::path::{Path, PathBuf}; @@ -334,7 +335,9 @@ async fn show_installed_package_list( if format == "json" { render_installed_json(&entries)?; if args.strict && has_outdated { - std::process::exit(1); + return Err(mozart_core::exit_code::bail_silent( + mozart_core::exit_code::GENERAL_ERROR, + )); } return Ok(()); } @@ -430,7 +433,9 @@ async fn show_installed_package_list( } if args.strict && has_outdated { - std::process::exit(1); + return Err(mozart_core::exit_code::bail_silent( + mozart_core::exit_code::GENERAL_ERROR, + )); } Ok(()) @@ -784,7 +789,9 @@ async fn show_locked_package_list( if format == "json" { render_locked_json(&entries)?; if args.strict && has_outdated { - std::process::exit(1); + return Err(mozart_core::exit_code::bail_silent( + mozart_core::exit_code::GENERAL_ERROR, + )); } return Ok(()); } @@ -880,7 +887,9 @@ async fn show_locked_package_list( } if args.strict && has_outdated { - std::process::exit(1); + return Err(mozart_core::exit_code::bail_silent( + mozart_core::exit_code::GENERAL_ERROR, + )); } Ok(()) @@ -1648,41 +1657,6 @@ fn resolve_path(path: &Path) -> String { } } -/// Match a package name against a wildcard pattern (case-insensitive). -/// `*` matches any sequence of characters. -fn matches_wildcard(name: &str, pattern: &str) -> bool { - let name_lower = name.to_lowercase(); - let pattern_lower = pattern.to_lowercase(); - let parts: Vec<&str> = pattern_lower.split('*').collect(); - - if parts.len() == 1 { - return name_lower == pattern_lower; - } - - let mut pos = 0usize; - for (i, part) in parts.iter().enumerate() { - if part.is_empty() { - continue; - } - match name_lower[pos..].find(*part) { - Some(found) => { - if i == 0 && found != 0 { - return false; // First segment must match at start - } - pos += found + part.len(); - } - None => return false, - } - } - - // If pattern doesn't end with *, name must be fully consumed - if !pattern_lower.ends_with('*') { - return pos == name_lower.len(); - } - - true -} - /// Simple version normalizer fallback when `version_normalized` is absent. fn normalize_version_simple(version: &str) -> String { let v = version.strip_prefix('v').unwrap_or(version); |
