diff --git a/.github/workflows/check-maintainers-sorted.yaml b/.github/workflows/check-maintainers-sorted.yaml new file mode 100644 index 000000000000..73987f9b9168 --- /dev/null +++ b/.github/workflows/check-maintainers-sorted.yaml @@ -0,0 +1,21 @@ +name: "Check that maintainer list is sorted" + +on: + pull_request: + paths: + - 'maintainers/maintainer-list.nix' +permissions: + contents: read + +jobs: + nixos: + runs-on: ubuntu-latest + if: github.repository_owner == 'NixOS' + steps: + - uses: actions/checkout@v3 + - uses: cachix/install-nix-action@v19 + with: + # explicitly enable sandbox + extra_nix_config: sandbox = true + - name: Check that maintainer-list.nix is sorted + run: nix-instantiate --eval maintainers/scripts/check-maintainers-sorted.nix diff --git a/maintainers/scripts/check-maintainers-sorted.nix b/maintainers/scripts/check-maintainers-sorted.nix new file mode 100644 index 000000000000..3de4e07550c4 --- /dev/null +++ b/maintainers/scripts/check-maintainers-sorted.nix @@ -0,0 +1,57 @@ +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))