pub mod compare;
pub mod digest;
pub mod file;
pub mod generic;
pub mod glob;
pub mod glob_items;
pub mod line_items;
pub mod lines;
pub mod param;
pub mod regex;
pub mod regex_items;
pub mod step;
pub mod url;
use itertools::Itertools;
pub use param::*;
use serde::{Deserialize, Serialize};
use crate::error::{Error, Result};
use xvc_config::XvcConfig;
use xvc_core::{glob_includes, glob_paths, XvcPath, XvcPathMetadataMap, XvcRoot};
use xvc_ecs::{persist, HStore, XvcStore};
pub use self::file::FileDep;
pub use self::generic::GenericDep;
pub use self::glob::GlobDep;
pub use self::glob_items::GlobItemsDep;
pub use self::line_items::LineItemsDep;
pub use self::lines::LinesDep;
pub use self::regex::RegexDep;
pub use self::regex_items::RegexItemsDep;
pub use self::step::StepDep;
pub use self::url::UrlDigestDep;
pub fn conf_params_file(conf: &XvcConfig) -> Result<String> {
Ok(conf.get_str("pipeline.default_params_file")?.option)
}
#[derive(
Debug, strum_macros::Display, PartialOrd, Ord, Clone, Eq, PartialEq, Serialize, Deserialize,
)]
pub enum XvcDependency {
Step(StepDep),
Generic(GenericDep),
File(FileDep),
GlobItems(GlobItemsDep),
Glob(GlobDep),
RegexItems(RegexItemsDep),
Regex(RegexDep),
Param(ParamDep),
LineItems(LineItemsDep),
Lines(LinesDep),
UrlDigest(UrlDigestDep),
}
persist!(XvcDependency, "xvc-dependency");
impl XvcDependency {
pub fn xvc_path(&self) -> Option<XvcPath> {
match self {
XvcDependency::File(file_dep) => Some(file_dep.path.clone()),
XvcDependency::RegexItems(dep) => Some(dep.path.clone()),
XvcDependency::Regex(dep) => Some(dep.path.clone()),
XvcDependency::Param(dep) => Some(dep.path.clone()),
XvcDependency::LineItems(dep) => Some(dep.path.clone()),
XvcDependency::Lines(dep) => Some(dep.path.clone()),
XvcDependency::Step(_) => None,
XvcDependency::Generic(_) => None,
XvcDependency::GlobItems(_) => None,
XvcDependency::Glob(_) => None,
XvcDependency::UrlDigest(_) => None,
}
}
pub fn items(&self) -> Option<Vec<String>> {
match self {
XvcDependency::GlobItems(dep) => Some(
dep.xvc_path_metadata_map
.keys()
.into_iter()
.map(|xp| xp.to_string())
.sorted()
.collect::<Vec<String>>(),
),
XvcDependency::RegexItems(dep) => {
Some(dep.lines.clone().into_iter().sorted().collect())
}
XvcDependency::LineItems(dep) => Some(dep.lines.clone().into_iter().sorted().collect()),
XvcDependency::Step(_)
| XvcDependency::Generic(_)
| XvcDependency::File(_)
| XvcDependency::Glob(_)
| XvcDependency::Regex(_)
| XvcDependency::Param(_)
| XvcDependency::Lines(_)
| XvcDependency::UrlDigest(_) => None,
}
}
}
pub fn dependencies_to_path(
xvc_root: &XvcRoot,
pmm: &XvcPathMetadataMap,
pipeline_rundir: &XvcPath,
all_deps: &XvcStore<XvcDependency>,
to_path: &XvcPath,
) -> HStore<XvcDependency> {
let mut deps_to_path = HStore::<XvcDependency>::with_capacity(all_deps.len());
for (dep_e, dep) in all_deps.iter() {
let has_path = match dep {
XvcDependency::Glob(dep) => {
glob_includes(xvc_root, pmm, pipeline_rundir, dep.glob.as_str(), to_path)
.unwrap_or_else(|e| {
e.warn();
false
})
}
XvcDependency::File(dep) => dep.path == *to_path,
XvcDependency::GlobItems(dep) => dep.xvc_path_metadata_map.keys().contains(to_path),
XvcDependency::RegexItems(dep) => dep.path == *to_path,
XvcDependency::Regex(dep) => dep.path == *to_path,
XvcDependency::Param(dep) => dep.path == *to_path,
XvcDependency::LineItems(dep) => dep.path == *to_path,
XvcDependency::Lines(dep) => dep.path == *to_path,
XvcDependency::Generic(_) | XvcDependency::Step(_) | XvcDependency::UrlDigest(_) => {
false
}
};
if has_path {
deps_to_path.insert(*dep_e, dep.clone());
}
}
deps_to_path
}
pub fn dependency_paths(
xvc_root: &XvcRoot,
pmm: &XvcPathMetadataMap,
pipeline_rundir: &XvcPath,
dep: &XvcDependency,
) -> XvcPathMetadataMap {
let make_map = |xp: &XvcPath| {
let mut result_map = XvcPathMetadataMap::with_capacity(1);
match pmm.get(xp) {
Some(md) => {
result_map.insert(xp.clone(), *md);
}
None => {
Error::PathNotFound {
path: xp.to_absolute_path(xvc_root).as_os_str().to_owned(),
}
.warn();
}
}
result_map
};
let empty = XvcPathMetadataMap::with_capacity(0);
match dep {
XvcDependency::Generic(_) => empty,
XvcDependency::Step(_) => empty,
XvcDependency::File(dep) => make_map(&dep.path),
XvcDependency::GlobItems(dep) => dep
.xvc_path_metadata_map
.iter()
.map(|(xp, xmd)| (xp.clone(), xmd.clone()))
.collect(),
XvcDependency::Glob(dep) => glob_paths(xvc_root, pmm, pipeline_rundir, &dep.glob).unwrap(),
XvcDependency::UrlDigest(_) => empty,
XvcDependency::Param(dep) => make_map(&dep.path),
XvcDependency::RegexItems(dep) => make_map(&dep.path),
XvcDependency::LineItems(dep) => make_map(&dep.path),
XvcDependency::Regex(dep) => make_map(&dep.path),
XvcDependency::Lines(dep) => make_map(&dep.path),
}
}