aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/package/archiver
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-12 03:54:29 +0900
committernsfisis <nsfisis@gmail.com>2026-05-12 03:54:29 +0900
commitdb5a0d25d8bdb959a5796535dc450f020c5dd3c8 (patch)
treee5c3563e64cac4a9ee0cd070f9053ccb07a2bebc /crates/shirabe/src/package/archiver
parenta4c885e910f88b48df68e41005513685b16fc182 (diff)
downloadphp-shirabe-db5a0d25d8bdb959a5796535dc450f020c5dd3c8.tar.gz
php-shirabe-db5a0d25d8bdb959a5796535dc450f020c5dd3c8.tar.zst
php-shirabe-db5a0d25d8bdb959a5796535dc450f020c5dd3c8.zip
feat(port): port ArchivableFilesFilter.php
Diffstat (limited to 'crates/shirabe/src/package/archiver')
-rw-r--r--crates/shirabe/src/package/archiver/archivable_files_filter.rs45
1 files changed, 45 insertions, 0 deletions
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<dyn Iterator<Item = PathBuf>>,
+ dirs: Vec<String>,
+}
+
+impl ArchivableFilesFilter {
+ pub fn new(inner: Box<dyn Iterator<Item = PathBuf>>) -> 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<PathBuf> {
+ loop {
+ let file = self.inner.next()?;
+ if self.accept(&file) {
+ return Some(file);
+ }
+ }
+ }
+}