1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
use std::collections::HashMap; use coveralls_api::*; use tracer::TracerData; use config::Config; pub fn export(coverage_data: &[TracerData], config: &Config) { if let Some(ref key) = config.coveralls { let id = match config.ci_tool { Some(ref service) => Identity::ServiceToken(Service { service_name: service.clone(), service_job_id: key.clone() }), _ => Identity::RepoToken(key.clone()), }; let mut report = CoverallsReport::new(id); let files = coverage_data.iter() .fold(vec![], |mut acc, x| { if !acc.contains(&x.path.as_path()) { acc.push(x.path.as_path()); } acc }); for file in &files { let rel_path = if let Some(root) = config.manifest.parent() { file.strip_prefix(root).unwrap_or(file) } else { file }; let mut lines: HashMap<usize, usize> = HashMap::new(); let fcov = coverage_data.iter() .filter(|x| x.path == *file) .collect::<Vec<&TracerData>>(); for c in &fcov { lines.insert(c.line as usize, c.hits as usize); } if let Ok(source) = Source::new(rel_path, file, &lines, &None, false) { report.add_source(source); } } let res = report.send_to_coveralls(); if config.verbose { match res { Ok(_) => {}, Err(e) => println!("Coveralls send failed. {}", e), } } } else { panic!("No coveralls key specified."); } }