diff options
-rw-r--r-- | src/bin/get-test-duration.rs | 30 | ||||
-rw-r--r-- | src/bin/get-test-job.rs | 52 | ||||
-rw-r--r-- | src/lib.rs | 49 |
3 files changed, 80 insertions, 51 deletions
diff --git a/src/bin/get-test-duration.rs b/src/bin/get-test-duration.rs new file mode 100644 index 0000000..79dc819 --- /dev/null +++ b/src/bin/get-test-duration.rs @@ -0,0 +1,30 @@ +use std::fs::File; +use memmap::MmapOptions; +use std::process; +use ci_cgi::{ciconfig_read, test_duration}; +use clap::Parser; + +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +struct Args { + test: String, + subtest: String, +} + +fn main() { + let args = Args::parse(); + + let rc = ciconfig_read(); + if let Err(e) = rc { + eprintln!("could not read config; {}", e); + process::exit(1); + } + let rc = rc.unwrap(); + let rc = rc.ktest; + + let durations_file = File::open(rc.output_dir.join("test_durations.capnp")).ok(); + let durations_map = durations_file.map(|x| unsafe { MmapOptions::new().map(&x).ok() } ).flatten(); + let durations = durations_map.as_ref().map(|x| x.as_ref()); + + println!("{:?}", test_duration(durations, &args.test, &args.subtest)); +} diff --git a/src/bin/get-test-job.rs b/src/bin/get-test-job.rs index b60498a..0d1294e 100644 --- a/src/bin/get-test-job.rs +++ b/src/bin/get-test-job.rs @@ -34,8 +34,7 @@ use memmap::MmapOptions; use std::fs::OpenOptions; use std::str; -use ci_cgi::durations_capnp::durations; -use capnp::serialize; +use ci_cgi::test_duration; fn commit_test_matches(job: &Option<TestJob>, commit: &str, test: &str) -> bool { if let Some(job) = job { @@ -47,55 +46,6 @@ fn commit_test_matches(job: &Option<TestJob>, commit: &str, test: &str) -> bool false } -fn test_duration(durations: Option<&[u8]>, test: &str, subtest: &str) -> Option<u64> { - - if let Some(d) = durations { - let mut d = d; - let d_reader = serialize::read_message_from_flat_slice(&mut d, capnp::message::ReaderOptions::new()).ok(); - let d = d_reader.as_ref().map(|x| x.get_root::<durations::Reader>().ok()).flatten(); - if d.is_none() { - return None; - } - let d = d.unwrap(); - - let d = d.get_entries(); - if let Err(e) = d.as_ref() { - eprintln!("error getting test duration entries: {}", e); - return None; - } - let d = d.unwrap(); - - let full_test = subtest_full_name(test, subtest); - let full_test = full_test.as_str(); - - let mut l = 0; - let mut r = d.len(); - - while l < r { - let m = l + (r - l) / 2; - let d_m = d.get(m); - let d_m_test = d_m.get_test(); - - // why does this happen? */ - if d_m_test.is_err() { - eprintln!("no test at idx {}/){}", m, d.len()); - return None; - } - - let d_m_test = d_m_test.unwrap().to_str().unwrap(); - - use std::cmp::Ordering::*; - match full_test.cmp(d_m_test) { - Less => r = m, - Equal => return Some(d_m.get_duration()), - Greater => l = m, - } - } - } - - None -} - fn get_test_job(args: &Args, rc: &Ktestrc, durations: Option<&[u8]>) -> Option<TestJob> { let file = OpenOptions::new() .read(true) @@ -420,3 +420,52 @@ pub fn lockfile_exists(rc: &Ktestrc, commit: &str, test_name: &str, create: bool r.is_ok() } } + +use durations_capnp::durations; +pub fn test_duration(durations: Option<&[u8]>, test: &str, subtest: &str) -> Option<u64> { + + if let Some(d) = durations { + let mut d = d; + let d_reader = serialize::read_message_from_flat_slice(&mut d, capnp::message::ReaderOptions::new()).ok(); + let d = d_reader.as_ref().map(|x| x.get_root::<durations::Reader>().ok()).flatten(); + if d.is_none() { + return None; + } + + let d = d.unwrap().get_entries(); + if let Err(e) = d.as_ref() { + eprintln!("error getting test duration entries: {}", e); + return None; + } + let d = d.unwrap(); + + let full_test = subtest_full_name(test, subtest); + let full_test = full_test.as_str(); + + let mut l = 0; + let mut r = d.len(); + + while l < r { + let m = l + (r - l) / 2; + let d_m = d.get(m); + let d_m_test = d_m.get_test(); + + // why does this happen? */ + if d_m_test.is_err() { + eprintln!("no test at idx {}/){}", m, d.len()); + return None; + } + + let d_m_test = d_m_test.unwrap().to_str().unwrap(); + + use std::cmp::Ordering::*; + match full_test.cmp(d_m_test) { + Less => r = m, + Equal => return Some(d_m.get_duration()), + Greater => l = m, + } + } + } + + None +} |