on master help sign in
Merge pull request #6407 from commercialhaskell/commenter-disabled
edd0f78Adam Bergmark
CURATORS.md+14
@@ -533,6 +533,20 @@ TARGET=nightly-2021-01-14 \ # the date doesn't matter
533 curator snapshot
533 curator snapshot
534```
534```
535
535
536+#### Finding disabled packages with lots of dependents
537+
538+`commenter disabled` prints the number of transitive dependents a disabled package has. Low hanging fruit to get a lot of packages included again.
539+
540+Example output:
541+```
542+[...]
543+stringable is disabled with 10 dependents
544+llvm-hs is disabled with 12 dependents
545+th-data-compat is disabled with 12 dependents
546+amazonka-core is disabled with 96 dependents
547+gogol-core is disabled with 96 dependents
548+```
549+
536## Adding new curators
550## Adding new curators
537
551
5381. Add public ssh key to `~/.ssh/authorized_keys` on build server
5521. Add public ssh key to `~/.ssh/authorized_keys` on build server
etc/commenter/src/lib.rs+117−2
@@ -188,6 +188,7 @@ enum State {
188 Done,
188 Done,
189}
189}
190
190
191+#[derive(PartialEq, Eq, Debug)]
191struct VersionedPackage {
192struct VersionedPackage {
192 package: Package,
193 package: Package,
193 version: Version,
194 version: Version,
@@ -352,7 +353,7 @@ struct SnapshotPackage {
352 // pantry-tree
353 // pantry-tree
353}
354}
354
355
355−#[derive(PartialOrd, Ord, PartialEq, Eq, Clone)]
356+#[derive(PartialOrd, Ord, PartialEq, Eq, Clone, Debug)]
356struct Package(String);
357struct Package(String);
357
358
358impl fmt::Display for Package {
359impl fmt::Display for Package {
@@ -361,7 +362,7 @@ impl fmt::Display for Package {
361 }
362 }
362}
363}
363
364
364−#[derive(Clone, PartialOrd, Ord, PartialEq, Eq)]
365+#[derive(Clone, PartialOrd, Ord, PartialEq, Eq, Debug)]
365struct Version(String);
366struct Version(String);
366
367
367impl fmt::Display for Version {
368impl fmt::Display for Version {
@@ -457,3 +458,117 @@ pub fn diff_snapshot(a: String, b: String) {
457 println!("{s}");
458 println!("{s}");
458 }
459 }
459}
460}
461+
462+#[derive(PartialEq, Eq, Debug)]
463+struct DisabledTransitively {
464+ child: VersionedPackage,
465+ parent: Package,
466+}
467+
468+fn parse_disabled_transitviely(s: &str) -> Option<DisabledTransitively> {
469+ let r = regex!(
470+ r#"- *([^ ]+) < *0 *# tried [^ ]+-([\d.]+), but its \*[^*]+\* requires the disabled package: ([^ ]+)"#
471+ );
472+ if let Some(caps) = r.captures(s) {
473+ let package = Package(caps.get(1).unwrap().as_str().to_owned());
474+ let version = Version(caps.get(2).unwrap().as_str().to_owned());
475+ let parent = Package(caps.get(3).unwrap().as_str().to_owned());
476+ Some(DisabledTransitively {
477+ child: VersionedPackage { package, version },
478+ parent,
479+ })
480+ } else {
481+ None
482+ }
483+}
484+
485+#[test]
486+fn test_parse_disabled_transitviely() {
487+ let s = "- Network-NineP < 0 # tried Network-NineP-0.4.7.1, but its *library* requires the disabled package: mstate";
488+ assert_eq!(
489+ parse_disabled_transitviely(s),
490+ Some(DisabledTransitively {
491+ child: VersionedPackage {
492+ package: Package("Network-NineP".to_owned()),
493+ version: Version("0.4.7.1".to_owned())
494+ },
495+ parent: Package("mstate".to_owned()),
496+ })
497+ )
498+}
499+
500+type M = BTreeMap<Package, (Vec<VersionedPackage>, Option<usize>)>;
501+
502+pub fn disabled() {
503+ let mut disabled_transitively: Vec<DisabledTransitively> = vec![];
504+ handle(false, |loc, lines| {
505+ match loc {
506+ Location::Lib => disabled_transitively.extend(
507+ lines
508+ .into_iter()
509+ .map(|line| parse_disabled_transitviely(&line))
510+ .flatten()
511+ .collect::<Vec<_>>(),
512+ ),
513+ Location::Test | Location::Bench => (),
514+ }
515+ vec![]
516+ });
517+
518+ let mut packages: BTreeSet<Package> = BTreeSet::new();
519+ let mut disabled: M = BTreeMap::new();
520+
521+ for DisabledTransitively { child, parent } in disabled_transitively {
522+ packages.insert(child.package.clone());
523+ packages.insert(parent.clone());
524+ disabled
525+ .entry(child.package.clone())
526+ .or_insert_with(|| (vec![], None));
527+ let t = disabled.entry(parent).or_insert_with(|| (vec![], None));
528+ t.0.push(child);
529+ }
530+
531+ let mut packages_len = packages.len();
532+ while packages_len > 0 {
533+ let mut new_packages: BTreeSet<Package> = BTreeSet::new();
534+ for package in packages {
535+ let (_, count) = disabled.get(&package).unwrap();
536+ if count.is_none() && !process(&package, &mut disabled) {
537+ new_packages.insert(package.clone());
538+ }
539+ }
540+ packages = new_packages;
541+ packages_len = packages.len();
542+ }
543+
544+ let mut v: Vec<_> = disabled
545+ .into_iter()
546+ .map(|(package, (_, count))| (count, package))
547+ .collect();
548+ v.sort();
549+ for (count, package) in v {
550+ let count = count.unwrap();
551+ if count != 0 {
552+ println!("{package} is disabled with {count} dependents");
553+ }
554+ }
555+}
556+
557+fn process(package: &Package, m: &mut M) -> bool {
558+ let (children, count) = m.get(package).unwrap();
559+ assert!(count.is_none(), "{:?}", package);
560+ let mut count = 0;
561+ for child in children {
562+ let (_, child_count) = m
563+ .get(&child.package)
564+ .unwrap_or_else(|| panic!("{}", child.package));
565+ match child_count {
566+ None => return false,
567+ Some(i) => count += 1 + i,
568+ }
569+ }
570+ m.entry(package.clone())
571+ .and_modify(|tup| tup.1 = Some(count))
572+ .or_insert_with(|| panic!("{}", package));
573+ true
574+}
etc/commenter/src/main.rs+6−4
@@ -19,19 +19,21 @@ enum Header {
19 about = "Automates generation of bounds in build-constraints.yaml"
19 about = "Automates generation of bounds in build-constraints.yaml"
20)]
20)]
21enum Opt {
21enum Opt {
22− Clear,
23 Add,
22 Add,
24− Outdated,
23+ Clear,
25 DiffSnapshot { a: String, b: String },
24 DiffSnapshot { a: String, b: String },
25+ Disabled,
26+ Outdated,
26}
27}
27
28
28fn main() {
29fn main() {
29 let opt = Opt::from_args();
30 let opt = Opt::from_args();
30 match opt {
31 match opt {
31− Opt::Clear => commenter::clear(),
32 Opt::Add => add(),
32 Opt::Add => add(),
33− Opt::Outdated => commenter::outdated(),
33+ Opt::Clear => commenter::clear(),
34 Opt::DiffSnapshot { a, b } => commenter::diff_snapshot(a, b),
34 Opt::DiffSnapshot { a, b } => commenter::diff_snapshot(a, b),
35+ Opt::Disabled => commenter::disabled(),
36+ Opt::Outdated => commenter::outdated(),
35 }
37 }
36}
38}
37
39