diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-06-06 14:29:50 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-06-06 14:29:50 +0900 |
| commit | e89e1785e3df047a869c48b91709289a3b145b49 (patch) | |
| tree | e7ae86b6657821cf32bd1c4244d1c374af1ce911 /crates/shirabe/src/package/archiver/archivable_files_finder.rs | |
| parent | 558c22c072d7e7e77e0e5e3493a71727301f7c73 (diff) | |
| download | php-shirabe-e89e1785e3df047a869c48b91709289a3b145b49.tar.gz php-shirabe-e89e1785e3df047a869c48b91709289a3b145b49.tar.zst php-shirabe-e89e1785e3df047a869c48b91709289a3b145b49.zip | |
refactor(archiver): yield PathBuf from ArchivableFilesFinder, drop SplFileInfo
Migrate ArchivableFilesFinder off Symfony's SplFileInfo onto Path/PathBuf,
resolving the phar_archiver TODO(phase-b) that required a .map() adapter to
bridge SplFileInfo -> PathBuf.
- ArchivableFilesFinder now yields PathBuf; accept() takes &Path; the exclude
closure receives &Path and uses Path::canonicalize / is_symlink. The
SplFileInfo -> PathBuf conversion happens once at the symfony get_iterator
boundary (get_iterator stays SplFileInfo for cache.rs).
- symfony Finder::filter callback changed to FnMut(&Path) (sole caller is the
finder).
- PharArchiver passes the finder straight into ArchivableFilesFilter, mirroring
PHP's new ArchivableFilesFilter($files).
- ZipArchiver consumes PathBuf items, computing the relative path via
strip_prefix(sources) in place of SplFileInfo::getRelativePathname.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/package/archiver/archivable_files_finder.rs')
| -rw-r--r-- | crates/shirabe/src/package/archiver/archivable_files_finder.rs | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/crates/shirabe/src/package/archiver/archivable_files_finder.rs b/crates/shirabe/src/package/archiver/archivable_files_finder.rs index 09041a3..f88f9b8 100644 --- a/crates/shirabe/src/package/archiver/archivable_files_finder.rs +++ b/crates/shirabe/src/package/archiver/archivable_files_finder.rs @@ -5,12 +5,12 @@ use crate::package::archiver::GitExcludeFilter; use crate::util::Filesystem; use shirabe_external_packages::composer::pcre::Preg; use shirabe_external_packages::symfony::component::finder::Finder; -use shirabe_external_packages::symfony::component::finder::SplFileInfo; use shirabe_php_shim::{RuntimeException, preg_quote, realpath}; +use std::path::{Path, PathBuf}; pub struct ArchivableFilesFinder { pub(crate) finder: Finder, - inner_iter: Box<dyn Iterator<Item = SplFileInfo>>, + inner_iter: Box<dyn Iterator<Item = PathBuf>>, } impl std::fmt::Debug for ArchivableFilesFinder { @@ -47,20 +47,18 @@ impl ArchivableFilesFinder { let mut finder = Finder::new(); let sources_clone = sources.clone(); - let filter = move |file: &SplFileInfo| -> bool { - let realpath = file.get_real_path(); - if realpath.is_none() { + let filter = move |file: &Path| -> bool { + let Ok(realpath) = file.canonicalize() else { return false; - } - let realpath = realpath.unwrap(); - if file.is_link() && !realpath.starts_with(sources_clone.as_str()) { + }; + if file.is_symlink() && !realpath.starts_with(&sources_clone) { return false; } let relative_path = Preg::replace( &format!("^{}", preg_quote(&sources_clone, Some('#'))), "", - &fs.normalize_path(&realpath), + &fs.normalize_path(&realpath.to_string_lossy()), ) .unwrap_or_default(); @@ -79,18 +77,21 @@ impl ArchivableFilesFinder { .ignore_dot_files(false) .sort_by_name(); - let inner_iter: Box<dyn Iterator<Item = SplFileInfo>> = Box::new(finder.get_iterator()); + let inner_iter: Box<dyn Iterator<Item = PathBuf>> = Box::new( + finder + .get_iterator() + .map(|f| PathBuf::from(f.get_pathname())), + ); Ok(Self { finder, inner_iter }) } - pub fn accept(&self, current: &SplFileInfo) -> bool { + pub fn accept(&self, current: &Path) -> bool { if !current.is_dir() { return true; } - let path = current.get_pathname(); - match std::fs::read_dir(&path) { + match std::fs::read_dir(current) { Ok(mut iter) => iter.next().is_none(), Err(_) => false, } @@ -114,7 +115,7 @@ impl ArchivableFilesFilter for ComposerExcludeFilter { } impl Iterator for ArchivableFilesFinder { - type Item = SplFileInfo; + type Item = PathBuf; fn next(&mut self) -> Option<Self::Item> { loop { |
