summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/commands/db.rs31
-rw-r--r--src/commands/source.rs4
-rw-r--r--src/log/parser.rs125
-rw-r--r--src/package/package.rs10
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")]