From 698bccd425ccefcb4728c4035fa08ebd9dd258f6 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 12 May 2026 04:18:58 +0900 Subject: feat(port): port GitExcludeFilter.php --- .../src/package/archiver/git_exclude_filter.rs | 49 ++++++++++++++++++++++ 1 file changed, 49 insertions(+) (limited to 'crates/shirabe/src/package') diff --git a/crates/shirabe/src/package/archiver/git_exclude_filter.rs b/crates/shirabe/src/package/archiver/git_exclude_filter.rs index dcde08a..b3e43dc 100644 --- a/crates/shirabe/src/package/archiver/git_exclude_filter.rs +++ b/crates/shirabe/src/package/archiver/git_exclude_filter.rs @@ -1 +1,50 @@ //! ref: composer/src/Composer/Package/Archiver/GitExcludeFilter.php + +use std::path::Path; +use shirabe_external_packages::composer::pcre::preg::Preg; +use crate::package::archiver::base_exclude_filter::BaseExcludeFilter; + +pub struct GitExcludeFilter { + inner: BaseExcludeFilter, +} + +impl GitExcludeFilter { + pub fn new(source_path: String) -> Self { + let inner = BaseExcludeFilter::new(source_path.clone()); + let mut filter = Self { inner }; + + let gitattributes_path = format!("{}/.gitattributes", source_path); + if Path::new(&gitattributes_path).exists() { + let lines: Vec = std::fs::read_to_string(&gitattributes_path) + .unwrap_or_default() + .lines() + .map(|l| l.to_string()) + .collect(); + let patterns = filter.inner.parse_lines( + lines, + |line| GitExcludeFilter::parse_git_attributes_line_static(line), + ); + filter.inner.exclude_patterns.extend(patterns); + } + + filter + } + + pub fn parse_git_attributes_line(&self, line: &str) -> Option<(String, bool, bool)> { + Self::parse_git_attributes_line_static(line) + } + + fn parse_git_attributes_line_static(line: &str) -> Option<(String, bool, bool)> { + let parts = Preg::split(r"\s+", line); + + if parts.len() == 2 && parts[1] == "export-ignore" { + return BaseExcludeFilter::generate_pattern(&parts[0]); + } + + if parts.len() == 2 && parts[1] == "-export-ignore" { + return BaseExcludeFilter::generate_pattern(&format!("!{}", parts[0])); + } + + None + } +} -- cgit v1.3.1