From db5a0d25d8bdb959a5796535dc450f020c5dd3c8 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 12 May 2026 03:54:29 +0900 Subject: feat(port): port ArchivableFilesFilter.php --- .../package/archiver/archivable_files_filter.rs | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'crates/shirabe/src/package') diff --git a/crates/shirabe/src/package/archiver/archivable_files_filter.rs b/crates/shirabe/src/package/archiver/archivable_files_filter.rs index 890513a..a267cf1 100644 --- a/crates/shirabe/src/package/archiver/archivable_files_filter.rs +++ b/crates/shirabe/src/package/archiver/archivable_files_filter.rs @@ -1 +1,46 @@ //! ref: composer/src/Composer/Package/Archiver/ArchivableFilesFilter.php + +use std::path::PathBuf; +use shirabe_php_shim::PharData; + +pub struct ArchivableFilesFilter { + inner: Box>, + dirs: Vec, +} + +impl ArchivableFilesFilter { + pub fn new(inner: Box>) -> Self { + Self { + inner, + dirs: Vec::new(), + } + } + + fn accept(&mut self, file: &PathBuf) -> bool { + if file.is_dir() { + self.dirs.push(file.to_string_lossy().into_owned()); + return false; + } + true + } + + pub fn add_empty_dir(&self, phar: &PharData, sources: &str) { + for filepath in &self.dirs { + let localname = filepath.replace(&format!("{}/", sources), ""); + phar.add_empty_dir(&localname); + } + } +} + +impl Iterator for ArchivableFilesFilter { + type Item = PathBuf; + + fn next(&mut self) -> Option { + loop { + let file = self.inner.next()?; + if self.accept(&file) { + return Some(file); + } + } + } +} -- cgit v1.3.1