aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/package
diff options
context:
space:
mode:
Diffstat (limited to 'crates/shirabe/src/package')
-rw-r--r--crates/shirabe/src/package/alias_package.rs52
-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
-rw-r--r--crates/shirabe/src/package/package.rs53
5 files changed, 178 insertions, 10 deletions
diff --git a/crates/shirabe/src/package/alias_package.rs b/crates/shirabe/src/package/alias_package.rs
index a101a1f..a427913 100644
--- a/crates/shirabe/src/package/alias_package.rs
+++ b/crates/shirabe/src/package/alias_package.rs
@@ -13,7 +13,11 @@ use crate::repository::repository_interface::RepositoryInterface;
#[derive(Debug)]
pub struct AliasPackage {
- pub(crate) inner: BasePackage,
+ id: i64,
+ name: String,
+ pretty_name: String,
+ repository: Option<Box<dyn RepositoryInterface>>,
+
/// @var string
pub(crate) version: String,
/// @var string
@@ -427,3 +431,49 @@ impl PackageInterface for AliasPackage {
self.inner.get_repository()
}
}
+
+impl BasePackage for AliasPackage {
+ fn id(&self) -> i64 {
+ self.id
+ }
+
+ fn id_mut(&mut self) -> &mut i64 {
+ &mut self.id
+ }
+
+ fn name(&self) -> &str {
+ &self.name
+ }
+
+ fn name_mut(&mut self) -> &mut String {
+ &mut self.name
+ }
+
+ fn pretty_name(&self) -> &str {
+ &self.pretty_name
+ }
+
+ fn pretty_name_mut(&mut self) -> &mut String {
+ &mut self.pretty_name
+ }
+
+ fn repository_opt(&self) -> Option<&dyn RepositoryInterface> {
+ self.repository.as_ref()
+ }
+
+ fn set_repository_box(&mut self, repository: Box<dyn RepositoryInterface>) {
+ todo!()
+ }
+
+ fn take_repository(&mut self) -> Option<Box<dyn RepositoryInterface>> {
+ todo!()
+ }
+
+ fn as_any(&self) -> &dyn std::any::Any {
+ todo!()
+ }
+
+ fn clone_box(&self) -> Box<dyn BasePackage> {
+ todo!()
+ }
+}
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
diff --git a/crates/shirabe/src/package/package.rs b/crates/shirabe/src/package/package.rs
index 81d6131..ae94a20 100644
--- a/crates/shirabe/src/package/package.rs
+++ b/crates/shirabe/src/package/package.rs
@@ -9,6 +9,7 @@ use shirabe_php_shim::{E_USER_DEPRECATED, PhpMixed, strpos, trigger_error};
use crate::package::base_package::BasePackage;
use crate::package::link::Link;
use crate::package::version::version_parser::VersionParser;
+use crate::repository::repository_interface::RepositoryInterface;
/// Mirror entry, e.g. `['url' => 'https://...', 'preferred' => true]`.
#[derive(Debug, Clone)]
@@ -20,7 +21,11 @@ pub struct Mirror {
/// Core package definitions that are needed to resolve dependencies and install packages
#[derive(Debug)]
pub struct Package {
- pub(crate) inner: BasePackage,
+ id: i64,
+ name: String,
+ pretty_name: String,
+ repository: Option<Box<dyn RepositoryInterface>>,
+
pub(crate) r#type: Option<String>,
pub(crate) target_dir: Option<String>,
/// `'source'` | `'dist'` | `null`
@@ -523,3 +528,49 @@ impl Package {
new_links
}
}
+
+impl BasePackage for Package {
+ fn id(&self) -> i64 {
+ self.id
+ }
+
+ fn id_mut(&mut self) -> &mut i64 {
+ &mut self.id
+ }
+
+ fn name(&self) -> &str {
+ &self.name
+ }
+
+ fn name_mut(&mut self) -> &mut String {
+ &mut self.name
+ }
+
+ fn pretty_name(&self) -> &str {
+ &self.pretty_name
+ }
+
+ fn pretty_name_mut(&mut self) -> &mut String {
+ &mut self.pretty_name
+ }
+
+ fn repository_opt(&self) -> Option<&dyn RepositoryInterface> {
+ self.repository.as_ref()
+ }
+
+ fn set_repository_box(&mut self, repository: Box<dyn RepositoryInterface>) {
+ todo!()
+ }
+
+ fn take_repository(&mut self) -> Option<Box<dyn RepositoryInterface>> {
+ todo!()
+ }
+
+ fn as_any(&self) -> &dyn std::any::Any {
+ todo!()
+ }
+
+ fn clone_box(&self) -> Box<dyn BasePackage> {
+ todo!()
+ }
+}