1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-08 11:36:05 +01:00
home-manager/lib/nix/extract-maintainers-meta.nix
Austin Horstman b8b7e5ec35
ci: extract-maintainers-meta tweaks (#7434)
Simplify extraction and generation of file. We dont need the comments
and can leverage the appropriate lib.generator function.

Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
2025-07-11 12:47:42 -05:00

114 lines
3.5 KiB
Nix

# Extract maintainers from Home Manager modules using meta.maintainers
# This script evaluates all Home Manager modules and extracts the merged maintainer information
let
pkgs = import <nixpkgs> { };
lib = import ../../modules/lib/stdlib-extended.nix pkgs.lib;
releaseInfo = pkgs.lib.importJSON ../../release.json;
docsLib = import ../../docs {
inherit lib pkgs;
inherit (releaseInfo) release isReleaseBranch;
};
moduleMaintainersJson = builtins.fromJSON (builtins.readFile docsLib.jsonModuleMaintainers);
maintainers = moduleMaintainersJson;
# TODO: Find a better solution for extracting maintainers outside `modules`
additionalFiles = [
../../docs/home-manager-manual.nix
];
extractAdditionalMaintainers =
files:
lib.concatLists (
map (
file:
let
fileContent = import file;
evaluated =
if lib.isFunction fileContent then
fileContent {
inherit (pkgs) stdenv lib;
documentation-highlighter = { };
revision = "unknown";
home-manager-options = {
home-manager = { };
nixos = { };
nix-darwin = { };
};
nixos-render-docs = { };
}
else
fileContent;
maintainersList = evaluated.meta.maintainers or [ ];
in
if lib.isList maintainersList then maintainersList else [ maintainersList ]
) files
);
additionalMaintainerObjects = extractAdditionalMaintainers additionalFiles;
extractMaintainerObjects =
maintainerData:
lib.pipe maintainerData [
lib.attrValues
lib.concatLists
lib.unique
];
allMaintainerObjects = extractMaintainerObjects maintainers ++ additionalMaintainerObjects;
allMaintainerNames = lib.filter (name: name != null) (
map (maintainer: maintainer.github or maintainer.name or null) allMaintainerObjects
);
hmMaintainers = import ../../modules/lib/maintainers.nix;
hmMaintainerNames = lib.attrNames hmMaintainers;
maintainerDetails = lib.pipe allMaintainerObjects [
(lib.filter (obj: (obj.github or obj.name or null) != null))
(map (obj: {
name = obj.github or obj.name;
value = obj // {
source =
if categorizedMaintainers.home-manager ? ${obj.github} then
"home-manager"
else if categorizedMaintainers.nixpkgs ? ${obj.github} then
"nixpkgs"
else
throw "${obj.github} is neither a home-manager or nixpkgs maintainer";
};
}))
lib.listToAttrs
];
partitionedMaintainers = lib.partition (nameValue: lib.elem nameValue.name hmMaintainerNames) (
lib.attrsToList maintainerDetails
);
categorizedMaintainers = {
home-manager = lib.listToAttrs partitionedMaintainers.right;
nixpkgs = lib.listToAttrs partitionedMaintainers.wrong;
};
formattedMaintainers = lib.generators.toPretty {
multiline = true;
indent = "";
} maintainerDetails;
in
{
raw = maintainers;
names = allMaintainerNames;
details = maintainerDetails;
categorized = categorizedMaintainers;
formatted = formattedMaintainers;
stats = {
totalFiles = lib.length (lib.attrNames maintainers);
totalMaintainers = lib.length allMaintainerNames;
hmMaintainers = lib.length (lib.attrNames categorizedMaintainers.home-manager);
nixpkgsMaintainers = lib.length (lib.attrNames categorizedMaintainers.nixpkgs);
};
}