@@ -1,8 +1,7 @@
1−use std::collections::HashMap;
1+use std::collections::{HashMap};
3use std::io::{self, BufRead};
2use std::io::{self, BufRead};
6use regex::Regex;
5use regex::Regex;
8type H = HashMap<Header, Vec<(String, String, String)>>;
7type H = HashMap<Header, Vec<(String, String, String)>>;
@@ -18,43 +17,47 @@ fn main() {
18 let mut tests: H = Default::default();
17 let mut tests: H = Default::default();
19 let mut benches: H = Default::default();
18 let mut benches: H = Default::default();
20 let mut last_header: Option<Header> = None;
19 let mut last_header: Option<Header> = None;
21− let empty = Regex::new(r#"^\s*$"#).unwrap();
22− let header_versioned =
23− Regex::new(r#"^(?P<package>[a-zA-z]([a-zA-z0-9.-]*?))-(?P<version>(\d+(\.\d+)*)).+?is out of bounds for:$"#).unwrap();
25− Regex::new(r#"^(?P<package>[a-zA-z]([a-zA-z0-9.-]*)).+?depended on by:$"#).unwrap();
27− Regex::new(r#"^- \[ \] (?P<package>[a-zA-z]([a-zA-z0-9.-]*?))-(?P<version>(\d+(\.\d+)*)).+?Used by: (?P<component>.+)$"#)
30− if let Ok(lines) = read_lines("./comments.txt") {
21+ let header_versioned = regex!(
22+ r#"^(?P<package>[a-zA-z]([a-zA-z0-9.-]*?))-(?P<version>(\d+(\.\d+)*)).+?is out of bounds for:$"#
24+ let header_missing = regex!(r#"^(?P<package>[a-zA-z]([a-zA-z0-9.-]*)).+?depended on by:$"#);
25+ let package = regex!(
26+ r#"^- \[ \] (?P<package>[a-zA-z]([a-zA-z0-9.-]*?))-(?P<version>(\d+(\.\d+)*)).+?Used by: (?P<component>.+)$"#
29+ // Ignore everything until the bounds issues show up.
30+ let mut process_line = false;
31− for line in lines {
32+ for line in io::stdin().lock().lines().flatten() {
32− if let Ok(line) = line {
33+ if is_reg_match(&line, regex!(r#"^\s*$"#)) {
33− if empty.captures(&line).is_some() {
34+ // noop
35+ } else if line == "curator: Snapshot dependency graph contains errors:" {
37+ } else if !process_line {
38+ println!("[INFO] {}", line);
34− } else if let Some(cap) = package.captures(&line) {
39+ } else if let Some(cap) = package.captures(&line) {
35− let root = last_header.clone().unwrap();
40+ let root = last_header.clone().unwrap();
36− let package = cap.name("package").unwrap().as_str();
41+ let package = cap.name("package").unwrap().as_str();
37− let version = cap.name("version").unwrap().as_str();
42+ let version = cap.name("version").unwrap().as_str();
38− let component = cap.name("component").unwrap().as_str();
43+ let component = cap.name("component").unwrap().as_str();
39− match component {
44+ match component {
40− "library" | "executable" => {
45+ "library" | "executable" => {
41− insert(&mut lib_exes, root, package, version, component)
46+ insert(&mut lib_exes, root, package, version, component)
43− "benchmark" => insert(&mut benches, root, package, version, "benchmarks"),
44− "test-suite" => insert(&mut tests, root, package, version, component),
45− _ => panic!("Bad component: {}", component),
47− } else if let Some(cap) = header_versioned.captures(&line) {
48− let package = cap.name("package").unwrap().as_str().to_owned();
49− let version = cap.name("version").unwrap().as_str().to_owned();
50− last_header = Some(Header::Versioned { package, version });
51− } else if let Some(cap) = header_missing.captures(&line) {
52− let package = cap.name("package").unwrap().as_str().to_owned();
53− last_header = Some(Header::Missing { package });
55− panic!("Unhandled: {:?}", line);
48+ "benchmark" => insert(&mut benches, root, package, version, "benchmarks"),
49+ "test-suite" => insert(&mut tests, root, package, version, component),
50+ _ => panic!("Bad component: {}", component),
52+ } else if let Some(cap) = header_versioned.captures(&line) {
53+ let package = cap.name("package").unwrap().as_str().to_owned();
54+ let version = cap.name("version").unwrap().as_str().to_owned();
55+ last_header = Some(Header::Versioned { package, version });
56+ } else if let Some(cap) = header_missing.captures(&line) {
57+ let package = cap.name("package").unwrap().as_str().to_owned();
58+ last_header = Some(Header::Missing { package });
60+ panic!("Unhandled: {:?}", line);
@@ -93,7 +96,7 @@ fn printer(
93 version: &str,
96 version: &str,
94 component: &str,
97 component: &str,
95 header: &Header,
98 header: &Header,
97 let lt0 = if lt0 { " < 0" } else { "" };
100 let lt0 = if lt0 { " < 0" } else { "" };
98 println!(
101 println!(
99 "{indent}- {package}{lt0} # tried {package}-{version}, but its *{component}* {cause}",
102 "{indent}- {package}{lt0} # tried {package}-{version}, but its *{component}* {cause}",
@@ -117,17 +120,13 @@ fn printer(
119fn insert(h: &mut H, header: Header, package: &str, version: &str, component: &str) {
122fn insert(h: &mut H, header: Header, package: &str, version: &str, component: &str) {
120− (*h.entry(header).or_insert_with(|| vec![])).push((
123+ (*h.entry(header).or_insert_with(Vec::new)).push((
121 package.to_owned(),
124 package.to_owned(),
122 version.to_owned(),
125 version.to_owned(),
123 component.to_owned(),
126 component.to_owned(),
127−fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<File>>>
130+fn is_reg_match(s: &str, r: &Regex) -> bool {
128−where
131+ r.captures(s).is_some()
131− let file = File::open(filename)?;
132− Ok(io::BufReader::new(file).lines())