From 0c156a71440105a9fe1fbc1d89275ff3fe94c92a Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Wed, 6 Aug 2025 14:32:45 +0200 Subject: [PATCH] modules/generic/meta-maintainers: init This factors out `meta.maintainers` from NixOS `misc/meta.nix` for use in arbitrary Module System applications. It is useful beyond NixOS and not coupled to it, although it is currently coupled to Nixpkgs' `lib.maintainers`. That restriction could be lifted optionally if there's future demand. --- modules/generic/meta-maintainers.nix | 61 +++++++++++++++++++++++ modules/generic/meta-maintainers/test.nix | 34 +++++++++++++ nixos/modules/misc/meta.nix | 52 +++---------------- 3 files changed, 101 insertions(+), 46 deletions(-) create mode 100644 modules/generic/meta-maintainers.nix create mode 100644 modules/generic/meta-maintainers/test.nix diff --git a/modules/generic/meta-maintainers.nix b/modules/generic/meta-maintainers.nix new file mode 100644 index 000000000000..e39d527764b2 --- /dev/null +++ b/modules/generic/meta-maintainers.nix @@ -0,0 +1,61 @@ +# Test: +# ./meta-maintainers/test.nix +{ lib, ... }: +let + inherit (lib) + mkOption + mkOptionType + types + ; + + maintainer = mkOptionType { + name = "maintainer"; + check = email: lib.elem email (lib.attrValues lib.maintainers); + merge = + loc: defs: + lib.listToAttrs (lib.singleton (lib.nameValuePair (lib.last defs).file (lib.last defs).value)); + }; + + listOfMaintainers = types.listOf maintainer // { + merge = + loc: defs: + lib.zipAttrs ( + lib.flatten ( + lib.imap1 ( + n: def: + lib.imap1 ( + m: def': + maintainer.merge (loc ++ [ "[${toString n}-${toString m}]" ]) [ + { + inherit (def) file; + value = def'; + } + ] + ) def.value + ) defs + ) + ); + }; +in +{ + _class = null; # not specific to NixOS + options = { + meta = { + maintainers = mkOption { + type = listOfMaintainers; + default = [ ]; + example = lib.literalExpression ''[ lib.maintainers.alice lib.maintainers.bob ]''; + description = '' + List of maintainers of each module. + This option should be defined at most once per module. + + The option value is not a list of maintainers, but an attribute set that maps module file names to lists of maintainers. + ''; + }; + }; + }; + meta.maintainers = with lib.maintainers; [ + pierron + roberth + ]; +} diff --git a/modules/generic/meta-maintainers/test.nix b/modules/generic/meta-maintainers/test.nix new file mode 100644 index 000000000000..73a431c34327 --- /dev/null +++ b/modules/generic/meta-maintainers/test.nix @@ -0,0 +1,34 @@ +# Run: +# $ nix-instantiate --eval 'modules/generic/meta-maintainers/test.nix' +# +# Expected output: +# { } +# +# Debugging: +# drop .test from the end of this file, then use nix repl on it +rec { + lib = import ../../../lib; + + example = lib.evalModules { + modules = [ + ../meta-maintainers.nix + { + _file = "eelco.nix"; + meta.maintainers = [ lib.maintainers.eelco ]; + } + ]; + }; + + test = + assert + example.config.meta.maintainers == { + ${toString ../meta-maintainers.nix} = [ + lib.maintainers.pierron + lib.maintainers.roberth + ]; + "eelco.nix" = [ lib.maintainers.eelco ]; + }; + { }; + +} +.test diff --git a/nixos/modules/misc/meta.nix b/nixos/modules/misc/meta.nix index 19886fcc29fc..20a2c99904d1 100644 --- a/nixos/modules/misc/meta.nix +++ b/nixos/modules/misc/meta.nix @@ -1,39 +1,5 @@ { lib, ... }: let - maintainer = lib.mkOptionType { - name = "maintainer"; - check = email: lib.elem email (lib.attrValues lib.maintainers); - merge = - loc: defs: - lib.listToAttrs (lib.singleton (lib.nameValuePair (lib.last defs).file (lib.last defs).value)); - }; - - listOfMaintainers = lib.types.listOf maintainer // { - # Returns list of - # { "module-file" = [ - # "maintainer1 " - # "maintainer2 " ]; - # } - merge = - loc: defs: - lib.zipAttrs ( - lib.flatten ( - lib.imap1 ( - n: def: - lib.imap1 ( - m: def': - maintainer.merge (loc ++ [ "[${toString n}-${toString m}]" ]) [ - { - inherit (def) file; - value = def'; - } - ] - ) def.value - ) defs - ) - ); - }; - docFile = lib.types.path // { # Returns tuples of # { file = "module location"; value = ; } @@ -42,20 +8,11 @@ let in { + imports = [ ../../../modules/generic/meta-maintainers.nix ]; + options = { meta = { - maintainers = lib.mkOption { - type = listOfMaintainers; - internal = true; - default = [ ]; - example = lib.literalExpression ''[ lib.maintainers.alice ]''; - description = '' - List of maintainers of each module. This option should be defined at - most once per module. - ''; - }; - doc = lib.mkOption { type = docFile; internal = true; @@ -84,5 +41,8 @@ in }; }; - meta.maintainers = lib.singleton lib.maintainers.pierron; + meta.maintainers = with lib.maintainers; [ + pierron + roberth + ]; }