From ba0a7f913b4b2a83d0c8862d657bdc867730a962 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 14 Jun 2026 14:06:06 +0900 Subject: fix(archiver): resolve infinite recursion in exclude filter dispatch The Phase B port invented an ArchivableFilesFilter trait whose filter impls called self.filter, recursing forever; the name also collided with the real ArchivableFilesFilter FilterIterator class. Composer has no such interface: the finder holds GitExcludeFilter/ComposerExcludeFilter (both extending BaseExcludeFilter) and calls $filter->filter(). Drop the invented trait, type the filters as Box, and implement BaseExcludeFilter on the concrete filters (accessors delegating to inner). Remove the unused generic default methods from the trait so it is dyn-compatible; they remain as inherent methods on BaseExcludeFilterBase, which is where every caller already reaches them. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/package/archiver/archivable_files_finder.rs | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) (limited to 'crates/shirabe/src/package/archiver/archivable_files_finder.rs') diff --git a/crates/shirabe/src/package/archiver/archivable_files_finder.rs b/crates/shirabe/src/package/archiver/archivable_files_finder.rs index c6a2d39..cb1c3e5 100644 --- a/crates/shirabe/src/package/archiver/archivable_files_finder.rs +++ b/crates/shirabe/src/package/archiver/archivable_files_finder.rs @@ -1,5 +1,6 @@ //! ref: composer/src/Composer/Package/Archiver/ArchivableFilesFinder.php +use crate::package::archiver::BaseExcludeFilter; use crate::package::archiver::ComposerExcludeFilter; use crate::package::archiver::GitExcludeFilter; use crate::util::Filesystem; @@ -35,7 +36,7 @@ impl ArchivableFilesFinder { } let sources = fs.normalize_path(&sources_real_path.unwrap()); - let filters: Vec> = if ignore_filters { + let filters: Vec> = if ignore_filters { vec![] } else { vec![ @@ -97,22 +98,6 @@ impl ArchivableFilesFinder { } } -trait ArchivableFilesFilter { - fn filter(&self, relative_path: &str, exclude: bool) -> bool; -} - -impl ArchivableFilesFilter for GitExcludeFilter { - fn filter(&self, relative_path: &str, exclude: bool) -> bool { - self.filter(relative_path, exclude) - } -} - -impl ArchivableFilesFilter for ComposerExcludeFilter { - fn filter(&self, relative_path: &str, exclude: bool) -> bool { - self.filter(relative_path, exclude) - } -} - impl Iterator for ArchivableFilesFinder { type Item = PathBuf; -- cgit v1.3.1