From 5e31fa33c3b5cf726a57a063b8e7a070869250fe Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 19 May 2026 21:46:01 +0900 Subject: fix(compile): fix more random compile errors Co-Authored-By: Claude Opus 4.7 (1M context) --- crates/shirabe/src/command/bump_command.rs | 151 ++++++++++++++++------------- 1 file changed, 83 insertions(+), 68 deletions(-) (limited to 'crates/shirabe/src/command/bump_command.rs') diff --git a/crates/shirabe/src/command/bump_command.rs b/crates/shirabe/src/command/bump_command.rs index 6b8ca1a..fb32979 100644 --- a/crates/shirabe/src/command/bump_command.rs +++ b/crates/shirabe/src/command/bump_command.rs @@ -4,8 +4,8 @@ use crate::io::io_interface; use crate::package::base_package; use anyhow::Result; use shirabe_external_packages::composer::pcre::preg::Preg; -use shirabe_external_packages::symfony::console::input::input_interface::InputInterface; -use shirabe_external_packages::symfony::console::output::output_interface::OutputInterface; +use shirabe_external_packages::symfony::component::console::input::input_interface::InputInterface; +use shirabe_external_packages::symfony::component::console::output::output_interface::OutputInterface; use shirabe_php_shim::{PhpMixed, file_get_contents, file_put_contents, is_writable, strtolower}; use crate::command::base_command::{BaseCommand, BaseCommandData, HasBaseCommandData}; @@ -37,16 +37,10 @@ impl BumpCommand { self .set_name("bump") .set_description("Increases the lower limit of your composer.json requirements to the currently installed versions") - .set_definition(vec![ - InputArgument::new( - "packages", - Some(InputArgument::IS_ARRAY | InputArgument::OPTIONAL), - "Optional package name(s) to restrict which packages are bumped.", - None, - ), - InputOption::new("dev-only", Some(PhpMixed::String("D".to_string())), Some(InputOption::VALUE_NONE), "Only bump requirements in \"require-dev\".", None), - InputOption::new("no-dev-only", Some(PhpMixed::String("R".to_string())), Some(InputOption::VALUE_NONE), "Only bump requirements in \"require\".", None), - InputOption::new("dry-run", None, Some(InputOption::VALUE_NONE), "Outputs the packages to bump, but will not execute anything.", None), + .set_definition (&[ + InputArgument::new("packages",Some(InputArgument::IS_ARRAY | InputArgument::OPTIONAL),"Optional package name(s) to restrict which packages are bumped.",None,).unwrap().into(),InputOption::new("dev-only", Some(PhpMixed::String("D".to_string())), Some(InputOption::VALUE_NONE), "Only bump requirements in \"require-dev\".", None).unwrap().into(), + InputOption::new("no-dev-only", Some(PhpMixed::String("R".to_string())), Some(InputOption::VALUE_NONE), "Only bump requirements in \"require\".", None).unwrap().into(), + InputOption::new("dry-run", None, Some(InputOption::VALUE_NONE), "Outputs the packages to bump, but will not execute anything.", None).unwrap().into(), ]) .set_help( "The bump command increases the lower limit of your composer.json requirements\n\ @@ -136,23 +130,34 @@ impl BumpCommand { } let composer = self.require_composer(None, None)?; - let has_lock_file_disabled = !composer.get_config().has("lock") - || composer.get_config().get("lock").as_bool().unwrap_or(true); - let repo = if !has_lock_file_disabled { - composer.get_locker().get_locked_repository(true)? - } else if composer.get_locker().is_locked() { - if !composer.get_locker().is_fresh() { - io.write_error3( + let has_lock_file_disabled = !composer.get_config().borrow().has("lock") + || composer + .get_config() + .borrow_mut() + .get("lock") + .as_bool() + .unwrap_or(true); + let repo: Box = + if !has_lock_file_disabled { + Box::new(composer.get_locker().get_locked_repository(true)?) + } else if composer.get_locker().is_locked() { + if !composer.get_locker().is_fresh()? { + io.write_error3( "The lock file is not up to date with the latest changes in composer.json. Run the appropriate `update` to fix that before you use the `bump` command.", true, io_interface::NORMAL, ); - return Ok(Self::ERROR_LOCK_OUTDATED); - } - composer.get_locker().get_locked_repository(true)? - } else { - composer.get_repository_manager().get_local_repository() - }; + return Ok(Self::ERROR_LOCK_OUTDATED); + } + Box::new(composer.get_locker().get_locked_repository(true)?) + } else { + // TODO(phase-b): get_local_repository returns &dyn InstalledRepositoryInterface; + // cloning into an owned Box requires clone_box on that trait. + composer + .get_repository_manager() + .get_local_repository() + .clone_box() + }; if composer.get_package().get_type() != "project" && !dev_only { io.write_error3( @@ -162,7 +167,10 @@ impl BumpCommand { ); let contents_data = composer_json.read()?; - if !contents_data.contains_key("type") { + if !contents_data + .as_array() + .map_or(false, |m| m.contains_key("type")) + { io.write_error3( "If your package is not a library, you can explicitly specify the \"type\" by using \"composer config type project\".", true, @@ -192,7 +200,7 @@ impl BumpCommand { let packages_filter: Vec = packages_filter .iter() .map(|constraint| { - Preg::replace(r"{[:= ].+}", "", constraint.clone()) + Preg::replace(r"{[:= ].+}", "", constraint) .unwrap_or_else(|_| constraint.clone()) }) .collect(); @@ -218,20 +226,25 @@ impl BumpCommand { if PlatformRepository::is_platform_package(pkg_name) { continue; } - let current_constraint = link.get_pretty_constraint(); + let current_constraint = link.get_pretty_constraint()?; - let package_opt = repo.find_package(pkg_name, "*"); - let package = match package_opt { + let package_opt = repo.find_package( + pkg_name, + crate::repository::repository_interface::FindPackageConstraint::String( + "*".to_string(), + ), + ); + let mut package = match package_opt { None => continue, Some(p) => p, }; - let mut package = package; while let Some(alias) = package.as_any().downcast_ref::() { - package = alias.get_alias_of(); + // TODO(phase-b): get_alias_of returns &dyn BasePackage; cloning into Box + // requires clone_box on BasePackage applied to a borrowed ref. + package = alias.get_alias_of().clone_box(); } - let bumped = - bumper.bump_requirement(link.get_constraint().as_ref(), package.as_ref())?; + let bumped = bumper.bump_requirement(link.get_constraint(), package.as_ref())?; if bumped == current_constraint { continue; @@ -245,62 +258,64 @@ impl BumpCommand { } if !dry_run && !self.update_file_cleanly(&composer_json, &updates)? { - let mut composer_definition = composer_json.read()?; + let mut composer_definition = match composer_json.read()? { + PhpMixed::Array(m) => m, + _ => indexmap::IndexMap::new(), + }; for (key, packages) in &updates { for (package, version) in packages { - composer_definition + let section = composer_definition .entry(key.to_string()) - .or_insert_with(indexmap::IndexMap::new) - .insert(package.clone(), version.clone()); + .or_insert_with(|| Box::new(PhpMixed::Array(indexmap::IndexMap::new()))); + if let PhpMixed::Array(map) = section.as_mut() { + map.insert(package.clone(), Box::new(PhpMixed::String(version.clone()))); + } } } - composer_json.write(composer_definition)?; + composer_json.write(PhpMixed::Array(composer_definition))?; } let change_count: usize = updates.values().map(|m| m.len()).sum(); if change_count > 0 { if dry_run { - io.write3( - &format!("{} would be updated with:", composer_json_path), - true, - io_interface::NORMAL, - ); + io.write(&format!( + "{} would be updated with:", + composer_json_path + )); for (require_type, packages) in &updates { for (package, version) in packages { - io.write3( - &format!(" - {}.{}: {}", require_type, package, version), - true, - io_interface::NORMAL, - ); + io.write(&format!( + " - {}.{}: {}", + require_type, package, version + )); } } } else { - io.write3( - &format!( - "{} has been updated ({} changes).", - composer_json_path, change_count - ), - true, - io_interface::NORMAL, - ); + io.write(&format!( + "{} has been updated ({} changes).", + composer_json_path, change_count + )); } } else { - io.write3( - &format!( - "No requirements to update in {}.", - composer_json_path - ), - true, - io_interface::NORMAL, - ); + io.write(&format!( + "No requirements to update in {}.", + composer_json_path + )); } if !dry_run && composer.get_locker().is_locked() - && composer.get_config().get("lock").as_bool().unwrap_or(true) + && composer + .get_config() + .borrow_mut() + .get("lock") + .as_bool() + .unwrap_or(true) && change_count > 0 { - composer.get_locker().update_hash(&composer_json)?; + composer + .get_locker() + .update_hash(&composer_json, None:: _>)?; } if dry_run && change_count > 0 { @@ -330,7 +345,7 @@ impl BumpCommand { for (key, packages) in updates { for (package, version) in packages { - if !manipulator.add_link(key, package, version)? { + if !manipulator.add_link(key, package, version, false)? { return Ok(false); } } -- cgit v1.3.1