diff options
-rw-r--r-- | src/commands/db.rs | 31 | ||||
-rw-r--r-- | src/commands/source.rs | 4 | ||||
-rw-r--r-- | src/log/parser.rs | 125 | ||||
-rw-r--r-- | src/package/package.rs | 10 |
4 files changed, 142 insertions, 28 deletions
diff --git a/src/commands/db.rs b/src/commands/db.rs index c38744b..5b9a85a 100644 --- a/src/commands/db.rs +++ b/src/commands/db.rs @@ -29,10 +29,12 @@ use diesel::RunQueryDsl; use itertools::Itertools; use log::debug; use log::info; +use log::trace; use crate::config::Configuration; use crate::db::models; use crate::db::DbConnectionConfig; +use crate::log::JobResult; use crate::package::Script; use crate::schema; @@ -271,9 +273,9 @@ fn submit(conn_cfg: DbConnectionConfig<'_>, matches: &ArgMatches) -> Result<()> for j in jobs.iter() { match crate::log::ParsedLog::from_str(&j.log_text)?.is_successfull() { - None => unkn += 1, - Some(true) => succ += 1, - Some(false) => err += 1, + JobResult::Unknown => unkn += 1, + JobResult::Success => succ += 1, + JobResult::Errored => err += 1, } } @@ -516,8 +518,11 @@ fn job(conn_cfg: DbConnectionConfig<'_>, config: &Configuration, matches: &ArgMa models::Image, )>(&conn)?; + trace!("Parsing log"); let parsed_log = crate::log::ParsedLog::from_str(&data.0.log_text)?; + trace!("Parsed log = {:?}", parsed_log); let success = parsed_log.is_successfull(); + trace!("log successfull = {:?}", success); if csv { let hdrs = crate::commands::util::mk_header(vec![ @@ -533,9 +538,9 @@ fn job(conn_cfg: DbConnectionConfig<'_>, config: &Configuration, matches: &ArgMa let data = vec![vec![ data.0.uuid.to_string(), String::from(match success { - Some(true) => "yes", - Some(false) => "no", - None => "unknown", + JobResult::Success => "yes", + JobResult::Errored => "no", + JobResult::Unknown => "unknown", }), data.3.name.to_string(), data.3.version.to_string(), @@ -577,15 +582,15 @@ fn job(conn_cfg: DbConnectionConfig<'_>, config: &Configuration, matches: &ArgMa "#, job_uuid = match success { - Some(true) => data.0.uuid.to_string().green(), - Some(false) => data.0.uuid.to_string().red(), - None => data.0.uuid.to_string().cyan(), + JobResult::Success => data.0.uuid.to_string().green(), + JobResult::Errored => data.0.uuid.to_string().red(), + JobResult::Unknown => data.0.uuid.to_string().cyan(), }, submit_uuid = data.1.uuid.to_string().cyan(), succeeded = match success { - Some(true) => String::from("yes").green(), - Some(false) => String::from("no").red(), - None => String::from("unknown").cyan(), + JobResult::Success => String::from("yes").green(), + JobResult::Errored => String::from("no").red(), + JobResult::Unknown => String::from("unknown").cyan(), }, package_name = data.3.name.cyan(), package_version = data.3.version.cyan(), @@ -729,6 +734,6 @@ fn releases(conn_cfg: DbConnectionConfig<'_>, config: &Configuration, matches: & /// /// Returns Ok(None) if cannot be decided fn is_job_successfull(job: &models::Job) -> Result<Option<bool>> { - crate::log::ParsedLog::from_str(&job.log_text).map(|pl| pl.is_successfull()) + crate::log::ParsedLog::from_str(&job.log_text).map(|pl| pl.is_successfull().to_bool()) } diff --git a/src/commands/source.rs b/src/commands/source.rs index cd33921..3e0167d 100644 --- a/src/commands/source.rs +++ b/src/commands/source.rs @@ -123,9 +123,9 @@ where info!("Verification processes finished"); if results.iter().any(Result::is_err) { - bar.finish_with_message("Source verication failed"); + bar.finish_with_message("Source verification failed"); } else { - bar.finish_with_message("Source verication successfull"); + bar.finish_with_message("Source verification successfull"); } let out = std::io::stdout(); diff --git a/src/log/parser.rs b/src/log/parser.rs index f83bdfb..c2328f8 100644 --- a/src/log/parser.rs +++ b/src/log/parser.rs @@ -38,6 +38,26 @@ where pub struct ParsedLog(Vec<LogItem>); +impl std::fmt::Debug for ParsedLog { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f, "ParsedLog [")?; + for (i, line) in self.0.iter().enumerate() { + match line { + LogItem::Line(l) => { + let s = std::str::from_utf8(l).unwrap_or("ERROR UTF8 ENCODING"); + writeln!(f, "[{}] Line('{}')", i, s)? + }, + LogItem::Progress(u) => writeln!(f, "[{}] Progress({})", i, u)?, + LogItem::CurrentPhase(s) => writeln!(f, "[{}] Phase({})", i, s)?, + LogItem::State(Ok(_)) => writeln!(f, "[{}] State::OK", i)?, + LogItem::State(Err(_)) => writeln!(f, "[{}] State::Err", i)?, + } + } + + writeln!(f, "]") + } +} + impl FromStr for ParsedLog { type Err = anyhow::Error; @@ -50,17 +70,35 @@ impl FromStr for ParsedLog { } } +#[derive(Debug, Eq, PartialEq)] +pub enum JobResult { + Success, + Errored, + Unknown +} + +impl JobResult { + pub fn to_bool(&self) -> Option<bool> { + match self { + JobResult::Success => Some(true), + JobResult::Errored => Some(false), + JobResult::Unknown => None, + } + } +} + impl ParsedLog { - pub fn is_successfull(&self) -> Option<bool> { + pub fn is_successfull(&self) -> JobResult { self.0 .iter() .rev() .filter_map(|line| match line { - LogItem::State(Ok(_)) => Some(true), - LogItem::State(Err(_)) => Some(false), + LogItem::State(Ok(_)) => Some(JobResult::Success), + LogItem::State(Err(_)) => Some(JobResult::Errored), _ => None, }) .next() + .unwrap_or(JobResult::Unknown) } pub fn into_iter(self) -> impl Iterator<Item = LogItem> { @@ -345,4 +383,85 @@ mod tests { assert!(i.next().is_none()); } } + + #[test] + fn test_is_successfull_1() { + let buffer: &'static str = indoc::indoc! {" + foo bar + "}; + + let log = ParsedLog::from_str(buffer).unwrap(); + assert_eq!(log.is_successfull(), JobResult::Unknown); + } + + #[test] + fn test_is_successfull_2() { + let buffer: &'static str = indoc::indoc! {" + #BUTIDO:PROGRESS:1 + "}; + + let log = ParsedLog::from_str(buffer).unwrap(); + assert_eq!(log.is_successfull(), JobResult::Unknown); + } + + #[test] + fn test_is_successfull_3() { + let buffer: &'static str = indoc::indoc! {" + #BUTIDO:PHASE:a + "}; + + let log = ParsedLog::from_str(buffer).unwrap(); + assert_eq!(log.is_successfull(), JobResult::Unknown); + } + + #[test] + fn test_successfull_4() { + let buffer: &'static str = indoc::indoc! {" + #BUTIDO:STATE:OK + "}; + + let log = ParsedLog::from_str(buffer).unwrap(); + assert_eq!(log.is_successfull(), JobResult::Success); + } + + #[test] + fn test_successfull_5() { + let buffer: &'static str = indoc::indoc! {" + #BUTIDO:STATE:ERR:FOO + "}; + + let log = ParsedLog::from_str(buffer).unwrap(); + assert_eq!(log.is_successfull(), JobResult::Errored); + } + + #[test] + fn test_successfull_6() { + let buffer: &'static str = indoc::indoc! {" + #BUTIDO:PROGRESS:0 + Some log line + #BUTIDO:PHASE:configure + Some log line + Some log line + Some log line + #BUTIDO:PHASE:Build + Some other log line + Some other log line + Some other log line + #BUTIDO:STATE:OK + "}; + + let log = ParsedLog::from_str(buffer).unwrap(); + assert_eq!(log.is_successfull(), JobResult::Success); + } + + #[test] + fn test_successfull_7() { + let buffer: &'static str = indoc::indoc! {" + make: *** No targets specified and no makefile found. Stop. + #BUTIDO:STATE:ERR:make failed + "}; + + let log = ParsedLog::from_str(buffer).unwrap(); + assert_eq!(log.is_successfull(), JobResult::Errored); + } } diff --git a/src/package/package.rs b/src/package/package.rs index b9b2251..5343d21 100644 --- a/src/package/package.rs +++ b/src/package/package.rs @@ -52,10 +52,6 @@ pub struct Package { #[getset(get = "pub")] #[serde(skip_serializing_if = "Option::is_none")] - flags: Option<PackageFlags>, - - #[getset(get = "pub")] - #[serde(skip_serializing_if = "Option::is_none")] allowed_images: Option<Vec<ImageName>>, #[getset(get = "pub")] @@ -99,7 +95,6 @@ impl Package { dependencies, patches: vec![], environment: None, - flags: None, allowed_images: None, denied_images: None, phases: HashMap::new(), @@ -170,11 +165,6 @@ impl Ord for Package { impl Eq for Package {} -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct PackageFlags { - build_parallel: bool, -} - #[derive(Clone, Debug, Serialize, Deserialize, Getters)] pub struct Dependencies { #[getset(get = "pub")] |