diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-07-19 18:47:48 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-07-19 18:47:48 +0900 |
| commit | fe0352e2db35ed559506c2b477708180768000e8 (patch) | |
| tree | efd3a985b33024914541eaab0bc44de41798a6e7 /crates/shirabe/src/command | |
| parent | d0cd98cd212bc13cbcfd0fd97fc245329b57f50f (diff) | |
| download | php-shirabe-fe0352e2db35ed559506c2b477708180768000e8.tar.gz php-shirabe-fe0352e2db35ed559506c2b477708180768000e8.tar.zst php-shirabe-fe0352e2db35ed559506c2b477708180768000e8.zip | |
fix(show-command): un-ignore 10 tests by fixing show-warnings typing and repo bugs
Replace the PhpMixed-based `$showWarnings` hack in VersionSelector::
findBestCandidate with a typed ShowWarnings enum (Always / Predicate),
letting ShowCommand::findLatestPackage pass its real closure instead of
hardcoding `true`. Fix the --no-dev branch in ShowCommand::execute,
which built `repos` from an empty package list instead of sharing the
same InstalledRepository as `installed_repo`. Pass repository handles
instead of pre-borrowed `&dyn RepositoryInterface` refs into get_package/
generate_package_tree/add_tree to stop a RefCell double-borrow panic on
--all/--locked. Add the missing CompletePackage/RootPackage
set_release_date setter so the outdated sorting-by-age test can set
fixture dates. Resolve OutputFormatterStyleStack::pop's empty-style
todo!() via clone_box(), and fix FileDownloader's cache-GC log call to
pass the VERY_VERBOSE verbosity PHP uses.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/command')
| -rw-r--r-- | crates/shirabe/src/command/archive_command.rs | 3 | ||||
| -rw-r--r-- | crates/shirabe/src/command/create_project_command.rs | 5 | ||||
| -rw-r--r-- | crates/shirabe/src/command/package_discovery_trait.rs | 13 | ||||
| -rw-r--r-- | crates/shirabe/src/command/show_command.rs | 52 | ||||
| -rw-r--r-- | crates/shirabe/src/command/update_command.rs | 3 |
5 files changed, 36 insertions, 40 deletions
diff --git a/crates/shirabe/src/command/archive_command.rs b/crates/shirabe/src/command/archive_command.rs index cd2d1648..25d32b2b 100644 --- a/crates/shirabe/src/command/archive_command.rs +++ b/crates/shirabe/src/command/archive_command.rs @@ -12,6 +12,7 @@ use crate::io::IOInterfaceImmutable; use crate::package::archiver::ArchiveManagerInterface; use crate::package::version::VersionParser; use crate::package::version::VersionSelector; +use crate::package::version::version_selector::ShowWarnings; use crate::plugin::CommandEvent; use crate::plugin::PluginEvents; use crate::repository::CompositeRepository; @@ -424,7 +425,7 @@ impl ArchiveCommand { None, 0, None, - shirabe_php_shim::PhpMixed::Bool(true), + ShowWarnings::Always, )?; let p = best.unwrap_or_else(|| packages.into_iter().next().unwrap()); diff --git a/crates/shirabe/src/command/create_project_command.rs b/crates/shirabe/src/command/create_project_command.rs index 9a2c4755..8ea4f07f 100644 --- a/crates/shirabe/src/command/create_project_command.rs +++ b/crates/shirabe/src/command/create_project_command.rs @@ -21,6 +21,7 @@ use crate::io::IOInterfaceImmutable; use crate::json::JsonFile; use crate::package::version::VersionParser; use crate::package::version::VersionSelector; +use crate::package::version::version_selector::ShowWarnings; use crate::package::{STABILITIES, SUPPORTED_LINK_TYPES}; use crate::plugin::PluginBlockedException; use crate::repository::CompositeRepository; @@ -895,7 +896,7 @@ impl CreateProjectCommand { Some(platform_requirement_filter.clone()), 0, Some(io.clone()), - PhpMixed::Bool(true), + ShowWarnings::Always, )?; if package.is_none() { @@ -921,7 +922,7 @@ impl CreateProjectCommand { Some(PlatformRequirementFilterFactory::ignore_all()), 0, None, - PhpMixed::Bool(true), + ShowWarnings::Always, )? .is_some() { diff --git a/crates/shirabe/src/command/package_discovery_trait.rs b/crates/shirabe/src/command/package_discovery_trait.rs index f8f7cede..830f1996 100644 --- a/crates/shirabe/src/command/package_discovery_trait.rs +++ b/crates/shirabe/src/command/package_discovery_trait.rs @@ -10,6 +10,7 @@ use crate::io::io_interface; use crate::package::PackageInterfaceHandle; use crate::package::version::VersionParser; use crate::package::version::VersionSelector; +use crate::package::version::version_selector::ShowWarnings; use crate::repository::CompositeRepository; use crate::repository::PlatformRepository; use crate::repository::PlatformRepositoryHandle; @@ -486,7 +487,7 @@ pub trait PackageDiscoveryTrait: BaseCommand { Some(platform_requirement_filter.clone()), 0, None, - shirabe_php_shim::PhpMixed::Null, + ShowWarnings::Always, )?; if package.is_none() { @@ -544,7 +545,7 @@ pub trait PackageDiscoveryTrait: BaseCommand { Some(PlatformRequirementFilterFactory::ignore_all()), 0, None, - shirabe_php_shim::PhpMixed::Null, + ShowWarnings::Always, )?; if let Some(candidate) = candidate { return Err(InvalidArgumentException { @@ -569,7 +570,7 @@ pub trait PackageDiscoveryTrait: BaseCommand { Some(platform_requirement_filter.clone()), RepositorySet::ALLOW_UNACCEPTABLE_STABILITIES, None, - shirabe_php_shim::PhpMixed::Null, + ShowWarnings::Always, )?; if let Some(package) = package_at_unacceptable { // we must first verify if a valid package would be found in a lower priority repository @@ -580,7 +581,7 @@ pub trait PackageDiscoveryTrait: BaseCommand { Some(PlatformRequirementFilterFactory::ignore_nothing()), RepositorySet::ALLOW_SHADOWED_REPOSITORIES, None, - shirabe_php_shim::PhpMixed::Null, + ShowWarnings::Always, )?; if let Some(all_repos_package) = all_repos_package { return Err(InvalidArgumentException { @@ -620,7 +621,7 @@ pub trait PackageDiscoveryTrait: BaseCommand { Some(PlatformRequirementFilterFactory::ignore_all()), RepositorySet::ALLOW_UNACCEPTABLE_STABILITIES, None, - shirabe_php_shim::PhpMixed::Null, + ShowWarnings::Always, )?; if let Some(candidate) = candidate { let mut additional = String::new(); @@ -631,7 +632,7 @@ pub trait PackageDiscoveryTrait: BaseCommand { Some(PlatformRequirementFilterFactory::ignore_all()), 0, None, - shirabe_php_shim::PhpMixed::Null, + ShowWarnings::Always, )?; if no_match.is_none() { additional = format!( diff --git a/crates/shirabe/src/command/show_command.rs b/crates/shirabe/src/command/show_command.rs index 8d1f67ff..4ba20575 100644 --- a/crates/shirabe/src/command/show_command.rs +++ b/crates/shirabe/src/command/show_command.rs @@ -16,6 +16,7 @@ use crate::package::PackageInterfaceHandle; use crate::package::base_package; use crate::package::version::VersionParser; use crate::package::version::VersionSelector; +use crate::package::version::version_selector::ShowWarnings; use crate::plugin::CommandEvent; use crate::plugin::PluginEvents; use crate::repository::ComposerRepository; @@ -540,18 +541,14 @@ impl Command for ShowCommand { .iter() .map(crate::package::PackageInterfaceHandle::dup) .collect(); - installed_repo = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ - root_repo.clone(), - RepositoryInterfaceHandle::new(InstalledArrayRepository::new_with_packages( - cloned, - )?), - ])); - repos = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ + let new_repo = RepositoryInterfaceHandle::new(InstalledRepository::new(vec![ root_repo, RepositoryInterfaceHandle::new(InstalledArrayRepository::new_with_packages( - Vec::new(), + cloned, )?), ])); + installed_repo = new_repo.clone(); + repos = new_repo; } else { let repository_manager = composer_local.get_repository_manager().clone(); let repository_manager = repository_manager.borrow(); @@ -619,7 +616,7 @@ impl Command for ShowCommand { && !pf.contains('*') { let (matched_package, vers) = self.get_package( - &*installed_repo.borrow(), + &installed_repo, &repos, pf, input.borrow().get_argument("version")?, @@ -686,11 +683,8 @@ impl Command for ShowCommand { let mut exit_code: i64 = 0; if input.borrow().get_option("tree")?.as_bool() == Some(true) { - let array_tree = self.generate_package_tree( - package.clone().into(), - &*installed_repo.borrow(), - &repos, - ); + let array_tree = + self.generate_package_tree(package.clone().into(), &installed_repo, &repos); if format == "json" { let mut wrapper: IndexMap<String, PhpMixed> = IndexMap::new(); @@ -812,7 +806,7 @@ impl Command for ShowCommand { ) { array_tree.push(self.generate_package_tree( package.clone(), - &*installed_repo.borrow(), + &installed_repo, &repos, )); } @@ -1656,7 +1650,7 @@ impl ShowCommand { /// finds a package by name and version if provided pub(crate) fn get_package( &self, - installed_repo: &dyn RepositoryInterface, + installed_repo: &RepositoryInterfaceHandle, repos: &RepositoryInterfaceHandle, name: &str, version: PhpMixed, @@ -2462,7 +2456,7 @@ impl ShowCommand { pub(crate) fn generate_package_tree( &self, package: PackageInterfaceHandle, - installed_repo: &dyn RepositoryInterface, + installed_repo: &RepositoryInterfaceHandle, remote_repos: &RepositoryInterfaceHandle, ) -> IndexMap<String, PhpMixed> { let requires = { @@ -2613,7 +2607,7 @@ impl ShowCommand { &self, name: &str, link: &Link, - installed_repo: &dyn RepositoryInterface, + installed_repo: &RepositoryInterfaceHandle, remote_repos: &RepositoryInterfaceHandle, packages_in_tree: &[PhpMixed], ) -> anyhow::Result<Vec<IndexMap<String, PhpMixed>>> { @@ -2817,12 +2811,12 @@ impl ShowCommand { } } - let show_warnings_box: Box<dyn Fn(PackageInterfaceHandle) -> bool> = - if self.get_io().is_verbose() { - Box::new(|_p: PackageInterfaceHandle| -> bool { true }) - } else { - let package_version = package.get_version(); - Box::new(move |candidate: PackageInterfaceHandle| -> bool { + let show_warnings = if self.get_io().is_verbose() { + ShowWarnings::Always + } else { + let package_version = package.get_version(); + ShowWarnings::Predicate(Box::new( + move |candidate: &PackageInterfaceHandle| -> bool { if candidate.get_version().starts_with("dev-") || package_version.starts_with("dev-") { @@ -2830,11 +2824,9 @@ impl ShowCommand { } version_compare(&candidate.get_version(), &package_version, "<=") - }) - }; - // TODO(phase-c): PHP passes $showWarnings (true or a closure) as the last argument, but the - // closure form requires modeling a callable inside PhpMixed; hardcoding true until then. - let _ = show_warnings_box; + }, + )) + }; let mut candidate = version_selector.find_best_candidate( &name, target_version.as_deref(), @@ -2842,7 +2834,7 @@ impl ShowCommand { Some(platform_req_filter), 0, Some(self.get_io().clone()), - PhpMixed::Bool(true), + show_warnings, )?; while let Some(ref c) = candidate { if let Some(alias) = c.as_alias() { diff --git a/crates/shirabe/src/command/update_command.rs b/crates/shirabe/src/command/update_command.rs index 0d212350..b47c51d0 100644 --- a/crates/shirabe/src/command/update_command.rs +++ b/crates/shirabe/src/command/update_command.rs @@ -16,6 +16,7 @@ use crate::package::base_package; use crate::package::loader::RootPackageLoader; use crate::package::version::VersionParser; use crate::package::version::VersionSelector; +use crate::package::version::version_selector::ShowWarnings; use crate::plugin::CommandEvent; use crate::plugin::PluginEvents; use crate::repository::CanonicalPackagesTrait; @@ -669,7 +670,7 @@ impl UpdateCommand { None, 0, None, - PhpMixed::Bool(true), + ShowWarnings::Always, )?; let _ = &platform_req_filter; if let Some(latest) = latest_version |
