diff options
Diffstat (limited to 'crates/mozart/src/commands/prohibits.rs')
| -rw-r--r-- | crates/mozart/src/commands/prohibits.rs | 109 |
1 files changed, 12 insertions, 97 deletions
diff --git a/crates/mozart/src/commands/prohibits.rs b/crates/mozart/src/commands/prohibits.rs index 8eb4166..4bb00e4 100644 --- a/crates/mozart/src/commands/prohibits.rs +++ b/crates/mozart/src/commands/prohibits.rs @@ -1,6 +1,4 @@ use clap::Args; -use mozart_core::console_format; -use std::path::PathBuf; #[derive(Args)] pub struct ProhibitsArgs { @@ -28,99 +26,16 @@ pub async fn execute( cli: &super::Cli, console: &mozart_core::console::Console, ) -> anyhow::Result<()> { - let working_dir = match &cli.working_dir { - Some(dir) => PathBuf::from(dir), - None => std::env::current_dir()?, - }; - - let packages = super::dependency::load_packages(&working_dir, args.locked)?; - - if packages.is_empty() { - console.write_error( - "No dependencies installed. Try running mozart install or update, or use --locked.", - ); - return Err(mozart_core::exit_code::bail_silent( - mozart_core::exit_code::GENERAL_ERROR, - )); - } - - let target = args.package.to_lowercase(); - - // Fix #2: Verify the target package is known - let target_known = packages.iter().any(|p| p.name.to_lowercase() == target); - if !target_known { - anyhow::bail!( - "Could not find package \"{}\" in your project", - args.package - ); - } - - // Parse the version constraint the user is asking about - let version_constraint = mozart_semver::VersionConstraint::parse(&args.version) - .map_err(|e| anyhow::anyhow!("Invalid version constraint '{}': {}", args.version, e))?; - - let recursive = args.tree || args.recursive; - let needles = vec![target]; - - let results = super::dependency::get_dependents( - &packages, - &needles, - Some(&version_constraint), - true, // inverted = prohibits mode - recursive, - )?; - - if results.is_empty() { - console.write_stdout( - &console_format!( - "<info>{} {} can be installed.</info>", - args.package, - args.version - ), - mozart_core::console::Verbosity::Normal, - ); - return Ok(()); - } - - if args.tree { - super::dependency::print_tree(&results, 0, console); - } else { - super::dependency::print_table(&results, console); - } - - // Fix #5: Print resolution hint message - // Determine the appropriate composer command based on whether the needle - // is in root's require or require-dev. - let needle_lower = args.package.to_lowercase(); - let composer_command = packages - .iter() - .find(|p| p.is_root) - .map(|root| { - if root - .require - .keys() - .any(|k| k.to_lowercase() == needle_lower) - { - "require" - } else if root - .require_dev - .keys() - .any(|k| k.to_lowercase() == needle_lower) - { - "require --dev" - } else { - "update" - } - }) - .unwrap_or("update"); - - console.info(&format!( - "Not finding what you were looking for? Try calling `composer {} \"{}:{}\" --dry-run` to get another view on the problem.", - composer_command, args.package, args.version - )); - - // Fix #3: Return exit code 1 when prohibitors are found - Err(mozart_core::exit_code::bail_silent( - mozart_core::exit_code::GENERAL_ERROR, - )) + super::dependency::do_execute( + cli, + console, + super::dependency::DoExecuteArgs { + package: &args.package, + version: Some(&args.version), + recursive: args.recursive, + tree: args.tree, + locked: args.locked, + inverted: true, + }, + ) } |
