aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/package/archiver
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/package/archiver')
-rw-r--r--crates/shirabe/src/package/archiver/base_exclude_filter.rs67
-rw-r--r--crates/shirabe/src/package/archiver/composer_exclude_filter.rs6
-rw-r--r--crates/shirabe/src/package/archiver/git_exclude_filter.rs10
3 files changed, 75 insertions, 8 deletions
diff --git a/crates/shirabe/src/package/archiver/base_exclude_filter.rs b/crates/shirabe/src/package/archiver/base_exclude_filter.rs
index 6522d79..c7d2557 100644
--- a/crates/shirabe/src/package/archiver/base_exclude_filter.rs
+++ b/crates/shirabe/src/package/archiver/base_exclude_filter.rs
@@ -3,6 +3,73 @@
use shirabe_external_packages::composer::pcre::preg::Preg;
use shirabe_external_packages::symfony::component::finder::glob::Glob;
+#[derive(Debug)]
+pub struct BaseExcludeFilterBase {
+ pub source_path: String,
+ pub exclude_patterns: Vec<(String, bool, bool)>,
+}
+
+impl BaseExcludeFilterBase {
+ pub fn new(source_path: String) -> Self {
+ Self {
+ source_path,
+ exclude_patterns: Vec::new(),
+ }
+ }
+
+ pub fn parse_lines<F>(&self, lines: Vec<String>, line_parser: F) -> Vec<(String, bool, bool)>
+ where
+ F: Fn(&str) -> Option<(String, bool, bool)>,
+ {
+ lines
+ .into_iter()
+ .filter_map(|line| {
+ let line = line.trim().to_string();
+ if line.is_empty() || line.starts_with('#') {
+ return None;
+ }
+ line_parser(&line)
+ })
+ .collect()
+ }
+
+ pub fn generate_patterns(&self, rules: Vec<String>) -> Vec<(String, bool, bool)> {
+ rules
+ .into_iter()
+ .map(|rule| Self::generate_pattern(&rule))
+ .collect()
+ }
+
+ pub fn generate_pattern(rule: &str) -> (String, bool, bool) {
+ let mut negate = false;
+ let mut pattern = String::new();
+
+ let mut rule = rule.to_string();
+ if !rule.is_empty() && rule.starts_with('!') {
+ negate = true;
+ rule = rule.trim_start_matches('!').to_string();
+ }
+
+ let first_slash_position = rule.find('/');
+ if first_slash_position == Some(0) {
+ pattern = "^/".to_string();
+ } else if first_slash_position.is_none() || first_slash_position == Some(rule.len() - 1) {
+ pattern = "/".to_string();
+ }
+
+ let rule = rule.trim_matches('/');
+
+ let glob_regex = Glob::to_regex(rule);
+ let rule_regex = &glob_regex[2..glob_regex.len() - 2];
+
+ (
+ format!("{{{}{}(?=$|/)}}", pattern, rule_regex),
+ negate,
+ false,
+ )
+ }
+}
+
pub trait BaseExcludeFilter {
fn source_path(&self) -> &str;
fn exclude_patterns(&self) -> &[(String, bool, bool)];
diff --git a/crates/shirabe/src/package/archiver/composer_exclude_filter.rs b/crates/shirabe/src/package/archiver/composer_exclude_filter.rs
index b9a32f4..979e67e 100644
--- a/crates/shirabe/src/package/archiver/composer_exclude_filter.rs
+++ b/crates/shirabe/src/package/archiver/composer_exclude_filter.rs
@@ -1,15 +1,15 @@
//! ref: composer/src/Composer/Package/Archiver/ComposerExcludeFilter.php
-use super::base_exclude_filter::BaseExcludeFilter;
+use super::base_exclude_filter::BaseExcludeFilterBase;
#[derive(Debug)]
pub struct ComposerExcludeFilter {
- inner: BaseExcludeFilter,
+ inner: BaseExcludeFilterBase,
}
impl ComposerExcludeFilter {
pub fn new(source_path: String, exclude_rules: Vec<String>) -> Self {
- let mut inner = BaseExcludeFilter::new(source_path);
+ let mut inner = BaseExcludeFilterBase::new(source_path);
inner.exclude_patterns = inner.generate_patterns(exclude_rules);
Self { inner }
}
diff --git a/crates/shirabe/src/package/archiver/git_exclude_filter.rs b/crates/shirabe/src/package/archiver/git_exclude_filter.rs
index 8028c15..dddad12 100644
--- a/crates/shirabe/src/package/archiver/git_exclude_filter.rs
+++ b/crates/shirabe/src/package/archiver/git_exclude_filter.rs
@@ -1,16 +1,16 @@
//! ref: composer/src/Composer/Package/Archiver/GitExcludeFilter.php
-use crate::package::archiver::base_exclude_filter::BaseExcludeFilter;
+use crate::package::archiver::base_exclude_filter::BaseExcludeFilterBase;
use shirabe_external_packages::composer::pcre::preg::Preg;
use std::path::Path;
pub struct GitExcludeFilter {
- inner: BaseExcludeFilter,
+ inner: BaseExcludeFilterBase,
}
impl GitExcludeFilter {
pub fn new(source_path: String) -> Self {
- let inner = BaseExcludeFilter::new(source_path.clone());
+ let inner = BaseExcludeFilterBase::new(source_path.clone());
let mut filter = Self { inner };
let gitattributes_path = format!("{}/.gitattributes", source_path);
@@ -37,11 +37,11 @@ impl GitExcludeFilter {
let parts = Preg::split(r"\s+", line);
if parts.len() == 2 && parts[1] == "export-ignore" {
- return BaseExcludeFilter::generate_pattern(&parts[0]);
+ return Some(BaseExcludeFilterBase::generate_pattern(&parts[0]));
}
if parts.len() == 2 && parts[1] == "-export-ignore" {
- return BaseExcludeFilter::generate_pattern(&format!("!{}", parts[0]));
+ return BaseExcludeFilterBase::generate_pattern(&format!("!{}", parts[0]));
}
None