summaryrefslogtreecommitdiff
path: root/maintainers/scripts/check-maintainers-sorted.nix
blob: 606a72c0aa9bbadc2d8011c9f2611afb0edf7492 (about) (plain)
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
let
  lib = import ../../lib;
  inherit (lib)
    add
    attrNames
    elemAt
    foldl'
    genList
    length
    replaceStrings
    sort
    toLower
    trace
    ;

  maintainers = import ../maintainer-list.nix;
  simplify = replaceStrings [ "-" "_" ] [ "" "" ];
  compare = a: b: simplify (toLower a) < simplify (toLower b);
  namesSorted = sort (a: b: a.key < b.key) (
    map (
      n:
      let
        pos = builtins.unsafeGetAttrPos n maintainers;
      in
      assert pos == null -> throw "maintainers entry ${n} is malformed";
      {
        name = n;
        line = pos.line;
        key = toLower (simplify n);
      }
    ) (attrNames maintainers)
  );
  before =
    {
      name,
      line,
      key,
    }:
    foldl' (
      acc: n: if n.key < key && (acc == null || n.key > acc.key) then n else acc
    ) null namesSorted;
  errors = foldl' add 0 (
    map (
      i:
      let
        a = elemAt namesSorted i;
        b = elemAt namesSorted (i + 1);
        lim =
          let
            t = before a;
          in
          if t == null then "the initial {" else t.name;
      in
      if a.line >= b.line then
        trace (
          "maintainer ${a.name} (line ${toString a.line}) should be listed "
          + "after ${lim}, not after ${b.name} (line ${toString b.line})"
        ) 1
      else
        0
    ) (genList (i: i) (length namesSorted - 1))
  );
in
assert errors == 0;
"all good!"

# generate edit commands to sort the list.
# may everything following the last current entry (closing } ff) in the wrong place
# with lib;
# concatStringsSep
#   "\n"
#   (let first = foldl' (acc: n: if n.line < acc then n.line else acc) 999999999 namesSorted;
#        commands = map
#          (i: let e = elemAt namesSorted i;
#                  begin = foldl'
#                    (acc: n: if n.line < e.line && n.line > acc then n.line else acc)
#                    1
#                    namesSorted;
#                  end =
#                    foldl' (acc: n: if n.line > e.line && n.line < acc then n.line else acc)
#                      999999999
#                      namesSorted;
#              in "${toString e.line},${toString (end - 1)} p")
#          (genList (i: i) (length namesSorted));
#    in map
#      (c: "sed -ne '${c}' maintainers/maintainer-list.nix")
#      ([ "1,${toString (first - 1)} p" ] ++ commands))