diff options
-rw-r--r-- | src/package/mod.rs | 4 | ||||
-rw-r--r-- | src/package/package.rs | 19 | ||||
-rw-r--r-- | src/package/tree.rs | 15 |
3 files changed, 27 insertions, 11 deletions
diff --git a/src/package/mod.rs b/src/package/mod.rs index 448a22d..1f9dc82 100644 --- a/src/package/mod.rs +++ b/src/package/mod.rs @@ -9,3 +9,7 @@ pub use loader::*; mod tree; pub use tree::*; + +mod version; +pub use version::*; + diff --git a/src/package/package.rs b/src/package/package.rs index b8c584f..8e2cf58 100644 --- a/src/package/package.rs +++ b/src/package/package.rs @@ -5,9 +5,14 @@ use url::Url; use getset::Getters; use serde::Deserialize; use anyhow::Result; +use anyhow::Error; +use anyhow::Context; +use resiter::AndThen; use crate::phase::{PhaseName, Phase}; use crate::package::util::*; +use crate::package::version::VersionParser; +use crate::package::version::NameVersionBuffer; use crate::util::docker::ImageName; use crate::util::executor::Executor; @@ -77,10 +82,16 @@ impl Package { pub fn get_all_dependencies(&self, executor: &dyn Executor, version_parser: &dyn VersionParser) -> Result<Vec<(PackageName, PackageVersionConstraint)>> { use std::convert::TryInto; - // TODO: Current implementation does not run dependency script - // - - self.dependencies.iter().map(|d| d.clone().try_into()).collect() + self.build_dependencies_script + .as_ref() + .map(|path| executor.execute_dependency_script(path)) + .transpose()? + .unwrap_or_default() + .into_iter() + .map(Ok) + .chain(self.dependencies.iter().cloned().map(|d| d.try_into().map_err(Error::from))) + .and_then_ok(|d| version_parser.parse(&d).with_context(|| format!("Failed to parse: '{:?}'", d)).map_err(Error::from)) + .collect() } } diff --git a/src/package/tree.rs b/src/package/tree.rs index 0e963e5..17e2aaa 100644 --- a/src/package/tree.rs +++ b/src/package/tree.rs @@ -5,6 +5,7 @@ use anyhow::anyhow; use crate::package::Package; use crate::package::Loader; +use crate::package::version::VersionParser; use crate::util::executor::Executor; pub struct Tree { @@ -17,11 +18,11 @@ impl Tree { Tree { root: BTreeMap::new() } } - pub fn add_package(&mut self, p: Package, loader: &Loader, executor: &dyn Executor) -> Result<()> { + pub fn add_package(&mut self, p: Package, loader: &Loader, executor: &dyn Executor, versionparser: &dyn VersionParser) -> Result<()> { macro_rules! mk_add_package_tree { - ($this:ident, $pack:ident, $loader:ident, $root:ident, $executor:ident) => {{ + ($this:ident, $pack:ident, $loader:ident, $root:ident, $executor:ident, $versionparser:ident) => {{ let mut subtree = Tree::new(); - ($pack).get_all_dependencies($executor)? + ($pack).get_all_dependencies($executor, $versionparser)? .into_iter() .map(|(name, constr)| { let pack = ($loader) @@ -35,7 +36,7 @@ impl Tree { return Err(anyhow!("Duplicate version of package {:?} found", ($pack))) } - add_package_tree(&mut subtree, pack, ($loader), ($root), ($executor)) + add_package_tree(&mut subtree, pack, ($loader), ($root), ($executor), ($versionparser)) }) .collect::<Result<Vec<()>>>()?; @@ -44,11 +45,11 @@ impl Tree { }} }; - fn add_package_tree(this: &mut Tree, p: Package, loader: &Loader, root: &mut Tree, executor: &dyn Executor) -> Result<()> { - mk_add_package_tree!(this, p, loader, root, executor) + fn add_package_tree(this: &mut Tree, p: Package, loader: &Loader, root: &mut Tree, executor: &dyn Executor, versionparser: &dyn VersionParser) -> Result<()> { + mk_add_package_tree!(this, p, loader, root, executor, versionparser) } - mk_add_package_tree!(self, p, loader, self, executor) + mk_add_package_tree!(self, p, loader, self, executor, versionparser) } pub fn has_package(&self, p: &Package) -> bool { |