on master help sign in
Merge pull request #6368 from commercialhaskell/outdated-v2
cbffdf9Adam Bergmark
CURATORS.md+21
@@ -488,6 +488,27 @@ commenter clear
488
488
489Repeat the second command until no updates are made to build-constraints.yaml.
489Repeat the second command until no updates are made to build-constraints.yaml.
490
490
491+#### Checking for new releases
492+
493+Run `stack update` before doing this.
494+
495+`commenter outdated` looks through all bounds issues and library
496+compilation failures and compares the marked version with the latest hackage release. Example output is
497+
498+```
499+Fin mismatch, manual: 0.2.8.0, hackage: 0.2.9.0
500+aeson mismatch, auto: 1.5.6.0, hackage: 2.0.2.0
501+```
502+
503+where "manual" means the bound was added manually by a curator,
504+perhaps due to a compilation failure so we could try re-enabling the
505+package. "auto" means it's part of the sections generated by
506+`commenter`, to update that run the `Re-enabling` step as documented
507+above.
508+
509+`outdated` only finds packages that are in the auto generated
510+sections, or that are of the form `- package < 0 # $version`.
511+
491#### Notes
512#### Notes
492
513
493* Please make sure to separate bounds issues from compilation failures/test run failures, as we cannot verify that a package builds or that tests pass without running the build!
514* Please make sure to separate bounds issues from compilation failures/test run failures, as we cannot verify that a package builds or that tests pass without running the build!
etc/commenter/src/lib.rs+57−12
@@ -23,29 +23,52 @@ pub fn add(lib: Vec<String>, test: Vec<String>, bench: Vec<String>) {
23 });
23 });
24 lines.sort();
24 lines.sort();
25 lines
25 lines
26− })
26+ });
27+}
28+
29+enum VersionTag {
30+ Manual(String),
31+ Auto(String),
32+}
33+
34+impl VersionTag {
35+
36+ fn tag(&self) -> &'static str {
37+ match self {
38+ VersionTag::Manual(_) => "manual",
39+ VersionTag::Auto(_) => "auto",
40+ }
41+ }
42+
43+ fn version(&self) -> &str {
44+ match self {
45+ VersionTag::Manual(s) => &s,
46+ VersionTag::Auto(s) => &s,
47+ }
48+ }
27}
49}
28
50
29pub fn outdated() {
51pub fn outdated() {
30− let mut all = vec![];
52+ let mut all: Vec<String> = vec![];
31− handle(false, |_loc, lines| {
53+ let disabled = handle(false, |_loc, lines| {
32 all.extend(lines);
54 all.extend(lines);
33 vec![]
55 vec![]
34 });
56 });
35− let mut map = BTreeMap::new();
57+ let mut map: BTreeMap<String, VersionTag> = BTreeMap::new();
58+ for DisabledPackage { package, version } in disabled {
59+ map.insert(package, VersionTag::Manual(version));
60+ }
36 let mut support: BTreeMap<(String, String), BTreeSet<(String, String)>> = BTreeMap::new();
61 let mut support: BTreeMap<(String, String), BTreeSet<(String, String)>> = BTreeMap::new();
37 for v in all.into_iter() {
62 for v in all.into_iter() {
38 let caps = regex!("tried ([^ ]+)-([^,-]+),").captures(&v).unwrap();
63 let caps = regex!("tried ([^ ]+)-([^,-]+),").captures(&v).unwrap();
39 let package = caps.get(1).unwrap().as_str().to_owned();
64 let package = caps.get(1).unwrap().as_str().to_owned();
40 let version = caps.get(2).unwrap().as_str().to_owned();
65 let version = caps.get(2).unwrap().as_str().to_owned();
41− map.insert(package.clone(), version.clone());
66+ map.insert(package.clone(), VersionTag::Auto(version.clone()));
42
67
43 if let Some(caps) = regex!("does not support: ([^ ]+)-([^-]+)").captures(&v) {
68 if let Some(caps) = regex!("does not support: ([^ ]+)-([^-]+)").captures(&v) {
44 let dep_package = caps.get(1).unwrap().as_str().to_owned();
69 let dep_package = caps.get(1).unwrap().as_str().to_owned();
45 let dep_version = caps.get(2).unwrap().as_str().to_owned();
70 let dep_version = caps.get(2).unwrap().as_str().to_owned();
46− let entry = support
47− .entry((dep_package, dep_version))
71+ let entry = support.entry((dep_package, dep_version)).or_default();
48− .or_default();
49 entry.insert((package, version));
72 entry.insert((package, version));
50 }
73 }
51 }
74 }
@@ -59,10 +82,10 @@ pub fn outdated() {
59 }
82 }
60 i += 1;
83 i += 1;
61 let latest = latest_version(&package);
84 let latest = latest_version(&package);
62− if version != latest {
85+ if version.version() != latest {
63 println!(
86 println!(
64− "{} mismatch, snapshot: {}, hackage: {}",
87+ "{} mismatch, {}: {}, hackage: {}",
65− package, version, latest
88+ package, version.tag(), version.version(), latest
66 );
89 );
67 }
90 }
68 }
91 }
@@ -112,16 +135,36 @@ enum State {
112 Done,
135 Done,
113}
136}
114
137
138+struct DisabledPackage {
139+ package: String,
140+ version: String,
141+}
142+
143+fn parse_disabled_package(s: &str) -> Option<DisabledPackage> {
144+ if let Some(caps) = regex!(r#"- *([^ ]+) < *0 *# *([\d.]+)"#).captures(s) {
145+ let package = caps.get(1).unwrap().as_str().to_owned();
146+ let version = caps.get(2).unwrap().as_str().to_owned();
147+ Some(DisabledPackage { package, version })
148+ } else {
149+ None
150+ }
151+}
152+
115−fn handle<F>(write: bool, mut f: F)
153+fn handle<F>(write: bool, mut f: F) -> Vec<DisabledPackage>
116where
154where
117 F: FnMut(Location, Vec<String>) -> Vec<String>,
155 F: FnMut(Location, Vec<String>) -> Vec<String>,
118{
156{
119 let path = "build-constraints.yaml";
157 let path = "build-constraints.yaml";
120 let mut new_lines: Vec<String> = vec![];
158 let mut new_lines: Vec<String> = vec![];
159+ let mut disabled_packages: Vec<DisabledPackage> = vec![];
121
160
122 let mut state = State::LookingForLibBounds;
161 let mut state = State::LookingForLibBounds;
123 let mut buf = vec![];
162 let mut buf = vec![];
124 for line in read_lines(path).map(|s| s.unwrap()) {
163 for line in read_lines(path).map(|s| s.unwrap()) {
164+ if let Some(disabled_package) = parse_disabled_package(&line) {
165+ disabled_packages.push(disabled_package);
166+ }
167+
125 match state {
168 match state {
126 State::LookingForLibBounds => {
169 State::LookingForLibBounds => {
127 if line == r#" "Library and exe bounds failures":"# {
170 if line == r#" "Library and exe bounds failures":"# {
@@ -189,6 +232,8 @@ where
189 }
232 }
190 file.flush().unwrap();
233 file.flush().unwrap();
191 }
234 }
235+
236+ disabled_packages
192}
237}
193
238
194enum Location {
239enum Location {