ci,modules: Backport additions of #431450

Reason: keep ci directory in sync
- https://github.com/NixOS/nixpkgs/pull/431450#issuecomment-3209546418

This requires that we have a modules directory, in which case the
easy and robust solution is to only port the addition parts of the refactor.
It's about as easy as a .keep file, but more useful.

This means that some duplication is created, but we avoid backporting the
changes to the documentation generation, which is a somewhat complex
component I'd rather not touch until these changes have been proven out
on unstable.
This commit is contained in:
Robert Hensing
2025-08-21 11:04:15 +02:00
parent d37c84f41b
commit 02a696bccd
4 changed files with 107 additions and 0 deletions

View File

@@ -30,6 +30,7 @@ let
"doc" "doc"
"lib" "lib"
"maintainers" "maintainers"
"modules"
"nixos" "nixos"
"pkgs" "pkgs"
".version" ".version"

9
modules/README.md Normal file
View File

@@ -0,0 +1,9 @@
# `<nixpkgs>/modules`
This directory hosts subdirectories representing each module [class](https://nixos.org/manual/nixpkgs/stable/#module-system-lib-evalModules-param-class) for which the `nixpkgs` repository has user-importable modules.
Exceptions:
- `_class = "nixos";` modules go in the `<nixpkgs>/nixos/modules` tree
- modules whose only purpose is to test code in this repository
The emphasis is on _importable_ modules, i.e. ones that aren't inherent to and built into the Module System application.

View File

@@ -0,0 +1,63 @@
# 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.last: Perhaps this could be merged instead, if "at most once per module"
# is a problem (see option description).
${(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
];
}

View File

@@ -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