neovim-flake/docs/default.nix

171 lines
5.3 KiB
Nix
Raw Normal View History

{
2024-04-09 09:02:58 +02:00
inputs,
pkgs,
2024-04-09 09:02:58 +02:00
lib ? import ../lib/stdlib-extended.nix pkgs.lib inputs,
2024-04-18 20:07:19 +02:00
manpageUrls ? pkgs.path + "/doc/manpage-urls.json",
2023-12-09 20:03:58 +01:00
...
}: let
inherit (lib.modules) mkForce evalModules;
inherit (lib.strings) hasPrefix removePrefix;
inherit (lib.attrsets) isAttrs mapAttrs optionalAttrs recursiveUpdate isDerivation;
2024-04-18 20:07:19 +02:00
inherit (builtins) fromJSON readFile;
# release data
release-config = fromJSON (readFile ../release.json);
revision = release-config.release;
# From home-manager:
#
# Recursively replace each derivation in the given attribute set
# with the same derivation but with the `outPath` attribute set to
# the string `"\${pkgs.attribute.path}"`. This allows the
# documentation to refer to derivations through their values without
# establishing an actual dependency on the derivation output.
#
# This is not perfect, but it seems to cover a vast majority of use
# cases.
#
# Caveat: even if the package is reached by a different means, the
# path above will be shown and not e.g.
# `${config.services.foo.package}`.
scrubDerivations = prefixPath: attrs: let
scrubDerivation = name: value: let
pkgAttrName = prefixPath + "." + name;
in
if isAttrs value
then
scrubDerivations pkgAttrName value
// optionalAttrs (isDerivation value) {
outPath = "\${${pkgAttrName}}";
}
else value;
in
mapAttrs scrubDerivation attrs;
# Make sure the used package is scrubbed to avoid actually
# instantiating derivations.
scrubbedPkgsModule = {
imports = [
{
_module.args = {
pkgs = mkForce (scrubDerivations "pkgs" pkgs);
pkgs_i686 = mkForce {};
};
}
];
};
# Specify the path to the module entrypoint
2023-12-09 20:21:36 +01:00
nvimPath = toString ./..;
buildOptionsDocs = args @ {
modules,
2023-12-09 20:03:58 +01:00
includeModuleSystemOptions ? true,
2024-04-18 20:07:19 +02:00
warningsAreErrors ? true,
...
}: let
inherit ((evalModules {inherit modules;})) options;
# Declaration of the Github site URL.
2024-04-18 20:07:19 +02:00
# Takes a user, repo, and subpath, and returns a declaration site
# as a string.
githubDeclaration = user: repo: subpath: let
urlRef = "github.com";
branch = "main";
in {
url = "https://${urlRef}/${user}/${repo}/blob/${branch}/${subpath}";
name = "<${repo}/${subpath}>";
};
in
2023-12-09 20:03:58 +01:00
pkgs.buildPackages.nixosOptionsDoc ({
2024-04-18 20:07:19 +02:00
inherit warningsAreErrors;
options =
2023-12-09 20:03:58 +01:00
if includeModuleSystemOptions
then options
2023-12-09 20:03:58 +01:00
else builtins.removeAttrs options ["_module"];
2024-04-18 20:07:19 +02:00
transformOptions = opt:
recursiveUpdate opt {
# Clean up declaration sites to not refer to the neovim-flakee
2023-12-09 20:03:58 +01:00
# source tree.
declarations = map (decl:
if hasPrefix nvimPath (toString decl)
2023-12-09 20:03:58 +01:00
then
githubDeclaration "notashelf" "neovim-flake"
(removePrefix "/" (removePrefix nvimPath (toString decl)))
2023-12-09 20:03:58 +01:00
else if decl == "lib/modules.nix"
then
# TODO: handle this in a better way (may require upstream
# changes to nixpkgs)
githubDeclaration "NixOS" "nixpkgs" decl
else decl)
opt.declarations;
};
}
2023-12-09 20:03:58 +01:00
// builtins.removeAttrs args ["modules" "includeModuleSystemOptions"]);
nvimModuleDocs = buildOptionsDocs {
2024-04-18 20:07:19 +02:00
variablelistId = "neovim-flake-options";
modules =
2023-12-09 20:03:58 +01:00
import ../modules/modules.nix {
inherit lib pkgs;
check = false;
}
++ [scrubbedPkgsModule];
};
2023-12-09 20:03:58 +01:00
# Generate the `man home-configuration.nix` package
nvf-configuration-manual =
2023-12-09 20:03:58 +01:00
pkgs.runCommand "neovim-flake-reference-manpage" {
nativeBuildInputs = [pkgs.buildPackages.installShellFiles pkgs.nixos-render-docs];
allowedReferences = ["out"];
} ''
# Generate manpages.
mkdir -p $out/share/man/man5
mkdir -p $out/share/man/man1
2023-12-09 20:03:58 +01:00
nixos-render-docs -j $NIX_BUILD_CORES options manpage \
--revision ${revision} \
${nvimModuleDocs.optionsJSON}/share/doc/nixos/options.json \
2023-12-09 20:21:36 +01:00
$out/share/man/man5/neovim-flake.5
2023-12-09 20:21:36 +01:00
cp ${./neovim-flake.1} $out/share/man/man1/neovim-flake.1
'';
2023-12-09 20:03:58 +01:00
# Generate the HTML manual pages
neovim-flake-manual = pkgs.callPackage ./manual.nix {
2024-04-18 20:07:19 +02:00
inherit revision manpageUrls;
2023-12-09 20:03:58 +01:00
outputPath = "share/doc/neovim-flake";
options = {
neovim-flake = nvimModuleDocs.optionsJSON;
};
};
2023-12-09 20:03:58 +01:00
html = neovim-flake-manual;
htmlOpenTool = pkgs.callPackage ./html-open-tool.nix {} {inherit html;};
in {
2024-04-09 09:02:58 +02:00
inherit (inputs) nmd;
2023-12-09 20:03:58 +01:00
options = {
# TODO: Use `hmOptionsDocs.optionsJSON` directly once upstream
# `nixosOptionsDoc` is more customizable.
json =
pkgs.runCommand "options.json" {
meta.description = "List of neovim-flake options in JSON format";
2023-12-09 20:03:58 +01:00
} ''
mkdir -p $out/{share/doc,nix-support}
2023-12-09 20:21:36 +01:00
cp -a ${nvimModuleDocs.optionsJSON}/share/doc/nixos $out/share/doc/neovim-flake
2023-12-09 20:03:58 +01:00
substitute \
${nvimModuleDocs.optionsJSON}/nix-support/hydra-build-products \
$out/nix-support/hydra-build-products \
--replace \
'${nvimModuleDocs.optionsJSON}/share/doc/nixos' \
2023-12-09 20:21:36 +01:00
"$out/share/doc/neovim-flake"
2023-12-09 20:03:58 +01:00
'';
};
manPages = nvf-configuration-manual;
2023-12-09 20:03:58 +01:00
manual = {inherit html htmlOpenTool;};
}