aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/package/archiver
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-19 00:10:22 +0900
committernsfisis <nsfisis@gmail.com>2026-05-19 00:11:03 +0900
commitc839244d8d09f3036ebfee8eef7eb6b147e593ab (patch)
treefe48c94f2c2e62468beef5ff1a8f3cff6adeef4f /crates/shirabe/src/package/archiver
parent48839250146b217e2756ed3c0e624fd341b54d6c (diff)
downloadphp-shirabe-c839244d8d09f3036ebfee8eef7eb6b147e593ab.tar.gz
php-shirabe-c839244d8d09f3036ebfee8eef7eb6b147e593ab.tar.zst
php-shirabe-c839244d8d09f3036ebfee8eef7eb6b147e593ab.zip
fix(compile): fix various compile errors
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/package/archiver')
-rw-r--r--crates/shirabe/src/package/archiver/archivable_files_finder.rs18
-rw-r--r--crates/shirabe/src/package/archiver/archive_manager.rs27
-rw-r--r--crates/shirabe/src/package/archiver/base_exclude_filter.rs4
-rw-r--r--crates/shirabe/src/package/archiver/git_exclude_filter.rs7
-rw-r--r--crates/shirabe/src/package/archiver/phar_archiver.rs14
-rw-r--r--crates/shirabe/src/package/archiver/zip_archiver.rs8
6 files changed, 53 insertions, 25 deletions
diff --git a/crates/shirabe/src/package/archiver/archivable_files_finder.rs b/crates/shirabe/src/package/archiver/archivable_files_finder.rs
index 35ec36f..72ffabf 100644
--- a/crates/shirabe/src/package/archiver/archivable_files_finder.rs
+++ b/crates/shirabe/src/package/archiver/archivable_files_finder.rs
@@ -23,7 +23,7 @@ impl std::fmt::Debug for ArchivableFilesFinder {
impl ArchivableFilesFinder {
pub fn new(sources: &str, excludes: Vec<String>, ignore_filters: bool) -> anyhow::Result<Self> {
- let fs = Filesystem::new();
+ let fs = Filesystem::new(None);
let sources_real_path = realpath(sources);
if sources_real_path.is_none() {
@@ -39,8 +39,8 @@ impl ArchivableFilesFinder {
vec![]
} else {
vec![
- Box::new(GitExcludeFilter::new(&sources)),
- Box::new(ComposerExcludeFilter::new(&sources, excludes)),
+ Box::new(GitExcludeFilter::new(sources.clone())),
+ Box::new(ComposerExcludeFilter::new(sources.clone(), excludes)),
]
};
@@ -61,7 +61,8 @@ impl ArchivableFilesFinder {
&format!("^{}", preg_quote(&sources_clone, Some('#'))),
"",
&fs.normalize_path(&realpath),
- );
+ )
+ .unwrap_or_default();
let mut exclude = false;
for f in &filters {
@@ -72,13 +73,14 @@ impl ArchivableFilesFinder {
};
finder
- .in_dir(&sources)
- .filter(Box::new(filter))
+ .r#in(&sources)
+ // TODO(phase-b): symfony Finder filter takes Box<dyn Fn(&SplFileInfo) -> bool>; signature not yet wired
.ignore_vcs(true)
.ignore_dot_files(false)
.sort_by_name();
+ let _ = filter;
- let inner_iter = finder.get_iterator();
+ let inner_iter: Box<dyn Iterator<Item = SplFileInfo>> = Box::new(finder.get_iterator());
Ok(Self { finder, inner_iter })
}
@@ -88,7 +90,7 @@ impl ArchivableFilesFinder {
return true;
}
- let path = current.to_string();
+ let path = current.get_pathname();
match std::fs::read_dir(&path) {
Ok(mut iter) => iter.next().is_none(),
Err(_) => false,
diff --git a/crates/shirabe/src/package/archiver/archive_manager.rs b/crates/shirabe/src/package/archiver/archive_manager.rs
index 3f7bfe0..73b0d84 100644
--- a/crates/shirabe/src/package/archiver/archive_manager.rs
+++ b/crates/shirabe/src/package/archiver/archive_manager.rs
@@ -19,8 +19,8 @@ use crate::util::r#loop::Loop;
use crate::util::sync_helper::SyncHelper;
pub struct ArchiveManager {
- pub(crate) download_manager: DownloadManager,
- pub(crate) r#loop: Loop,
+ pub(crate) download_manager: std::rc::Rc<std::cell::RefCell<DownloadManager>>,
+ pub(crate) r#loop: std::rc::Rc<std::cell::RefCell<Loop>>,
pub(crate) archivers: Vec<Box<dyn ArchiverInterface>>,
pub(crate) overwrite_files: bool,
}
@@ -34,7 +34,10 @@ impl std::fmt::Debug for ArchiveManager {
}
impl ArchiveManager {
- pub fn new(download_manager: DownloadManager, r#loop: Loop) -> Self {
+ pub fn new(
+ download_manager: std::rc::Rc<std::cell::RefCell<DownloadManager>>,
+ r#loop: std::rc::Rc<std::cell::RefCell<Loop>>,
+ ) -> Self {
Self {
download_manager,
r#loop,
@@ -144,7 +147,7 @@ impl ArchiveManager {
}
};
- let filesystem = Filesystem::new();
+ let filesystem = Filesystem::new(None);
let is_root = package.as_any().is::<dyn RootPackageInterface>();
let source_path: String;
@@ -158,10 +161,16 @@ impl ArchiveManager {
filesystem.ensure_directory_exists(&source_path)?;
let download_result = (|| -> anyhow::Result<()> {
- let promise = self.download_manager.download(package, &source_path)?;
- SyncHelper::r#await(&self.r#loop, promise)?;
- let promise = self.download_manager.install(package, &source_path)?;
- SyncHelper::r#await(&self.r#loop, promise)?;
+ let promise =
+ self.download_manager
+ .borrow()
+ .download(package, &source_path, None)?;
+ SyncHelper::r#await(&self.r#loop, Some(promise))?;
+ let promise = self
+ .download_manager
+ .borrow()
+ .install(package, &source_path)?;
+ SyncHelper::r#await(&self.r#loop, Some(promise))?;
Ok(())
})();
@@ -172,7 +181,7 @@ impl ArchiveManager {
let composer_json_path = format!("{}/composer.json", source_path);
if file_exists(&composer_json_path) {
- let json_file = JsonFile::new(composer_json_path, None, None);
+ let json_file = JsonFile::new(composer_json_path, None, None)?;
let json_data = json_file.read()?;
if let Some(archive) = json_data.get("archive") {
if let Some(name) = archive.get("name").and_then(|v| v.as_str()) {
diff --git a/crates/shirabe/src/package/archiver/base_exclude_filter.rs b/crates/shirabe/src/package/archiver/base_exclude_filter.rs
index c7d2557..1a716d0 100644
--- a/crates/shirabe/src/package/archiver/base_exclude_filter.rs
+++ b/crates/shirabe/src/package/archiver/base_exclude_filter.rs
@@ -59,7 +59,7 @@ impl BaseExcludeFilterBase {
let rule = rule.trim_matches('/');
- let glob_regex = Glob::to_regex(rule);
+ let glob_regex = Glob::to_regex(rule, true, true);
let rule_regex = &glob_regex[2..glob_regex.len() - 2];
(
@@ -143,7 +143,7 @@ pub trait BaseExcludeFilter {
let rule = rule.trim_matches('/');
// remove delimiters as well as caret (^) and dollar sign ($) from the regex
- let glob_regex = Glob::to_regex(rule);
+ let glob_regex = Glob::to_regex(rule, true, true);
let rule_regex = &glob_regex[2..glob_regex.len() - 2];
(
diff --git a/crates/shirabe/src/package/archiver/git_exclude_filter.rs b/crates/shirabe/src/package/archiver/git_exclude_filter.rs
index dddad12..1a0ec4d 100644
--- a/crates/shirabe/src/package/archiver/git_exclude_filter.rs
+++ b/crates/shirabe/src/package/archiver/git_exclude_filter.rs
@@ -34,14 +34,17 @@ impl GitExcludeFilter {
}
fn parse_git_attributes_line_static(line: &str) -> Option<(String, bool, bool)> {
- let parts = Preg::split(r"\s+", line);
+ let parts = Preg::split(r"\s+", line).unwrap_or_default();
if parts.len() == 2 && parts[1] == "export-ignore" {
return Some(BaseExcludeFilterBase::generate_pattern(&parts[0]));
}
if parts.len() == 2 && parts[1] == "-export-ignore" {
- return BaseExcludeFilterBase::generate_pattern(&format!("!{}", parts[0]));
+ return Some(BaseExcludeFilterBase::generate_pattern(&format!(
+ "!{}",
+ parts[0]
+ )));
}
None
diff --git a/crates/shirabe/src/package/archiver/phar_archiver.rs b/crates/shirabe/src/package/archiver/phar_archiver.rs
index 2e9d96e..7b5142b 100644
--- a/crates/shirabe/src/package/archiver/phar_archiver.rs
+++ b/crates/shirabe/src/package/archiver/phar_archiver.rs
@@ -29,6 +29,12 @@ fn compress_formats() -> IndexMap<&'static str, i64> {
#[derive(Debug)]
pub struct PharArchiver;
+impl PharArchiver {
+ pub fn new() -> Self {
+ Self
+ }
+}
+
impl ArchiverInterface for PharArchiver {
fn archive(
&self,
@@ -46,6 +52,7 @@ impl ArchiverInterface for PharArchiver {
unlink(&target);
}
+ let target_outer = target.clone();
let inner = (|| -> anyhow::Result<String> {
let pos = strrpos(&target, &format).unwrap_or(target.len());
let filename = target[..pos.saturating_sub(1)].to_string();
@@ -63,7 +70,10 @@ impl ArchiverInterface for PharArchiver {
*formats.get(format.as_str()).unwrap_or(&Phar::TAR),
);
let files = ArchivableFilesFinder::new(&sources, excludes, ignore_filters)?;
- let mut files_only = ArchivableFilesFilter::new(files);
+ // TODO(phase-b): unify iterator types (ArchivableFilesFinder yields SplFileInfo,
+ // ArchivableFilesFilter expects PathBuf).
+ let mut files_only =
+ ArchivableFilesFilter::new(Box::new(files.map(|f| f.get_pathname().into())));
phar.build_from_iterator(&mut files_only, &sources);
files_only.add_empty_dir(&phar, &sources);
@@ -137,7 +147,7 @@ impl ArchiverInterface for PharArchiver {
inner.map_err(|e| {
let message = format!(
"Could not create archive '{}' from '{}': {}",
- target, sources, e
+ target_outer, sources, e
);
anyhow::anyhow!(RuntimeException { message, code: 0 })
})
diff --git a/crates/shirabe/src/package/archiver/zip_archiver.rs b/crates/shirabe/src/package/archiver/zip_archiver.rs
index ef5b40a..471352f 100644
--- a/crates/shirabe/src/package/archiver/zip_archiver.rs
+++ b/crates/shirabe/src/package/archiver/zip_archiver.rs
@@ -13,6 +13,10 @@ use shirabe_php_shim::{
pub struct ZipArchiver;
impl ZipArchiver {
+ pub fn new() -> Self {
+ Self
+ }
+
fn formats() -> IndexMap<String, bool> {
let mut map = IndexMap::new();
map.insert("zip".to_string(), true);
@@ -33,7 +37,7 @@ impl ArchiverInterface for ZipArchiver {
excludes: Vec<String>,
ignore_filters: bool,
) -> anyhow::Result<String> {
- let fs = Filesystem::new();
+ let fs = Filesystem::new(None);
let sources_realpath = realpath(&sources);
let sources = if let Some(p) = sources_realpath {
p
@@ -47,7 +51,7 @@ impl ArchiverInterface for ZipArchiver {
let files = ArchivableFilesFinder::new(&sources, excludes, ignore_filters)?;
for file in files {
let filepath = file.get_pathname();
- let mut relative_path = file.get_relative_pathname();
+ let mut relative_path = file.get_relative_path_name();
if Platform::is_windows() {
relative_path = shirabe_php_shim::strtr(&relative_path, "\\", "/");