aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/mozart/src/commands/show.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-23 01:34:55 +0900
committernsfisis <nsfisis@gmail.com>2026-02-23 01:58:28 +0900
commitec3d69446cf07409b9c91de3d2e63856f33b26fd (patch)
tree06f6c7eb0633809c8f58ab098adb9899cc57af90 /crates/mozart/src/commands/show.rs
parent1ab3d928a2d350ce407205d9ee6ea9569cd38424 (diff)
downloadphp-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.rs52
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);