git.iko.soy/typeable/nixpkgs
on master help sign in
22191 files changed+1002428−519396
since splitsnapshots
unifiedsplit
.editorconfig+5−14 .git-blame-ignore-revs+32 .github/CODEOWNERS+116−53 .github/CONTRIBUTING.md−74 .github/ISSUE_TEMPLATE/bug_report.md+10−13 .github/ISSUE_TEMPLATE/out_of_date_package_report.md+3−3 .github/PULL_REQUEST_TEMPLATE.md+30−19 .github/STALE-BOT.md+1−1 .github/labeler.yml+11−6 .github/workflows/backport.yml+16−4 .github/workflows/basic-eval.yml+26 .github/workflows/direct-push.yml+4−1 .github/workflows/editorconfig.yml+10−13 .github/workflows/labels.yml+6−1 .github/workflows/manual-nixos.yml+4−4 .github/workflows/manual-nixpkgs.yml+4−4 .github/workflows/merge-staging.yml−41 .github/workflows/nixos-manual.yml+2−2 .github/workflows/no-channel.yml+21 .github/workflows/pending-set.yml+5 .github/workflows/periodic-merge-24h.yml+57 .github/workflows/periodic-merge-6h.yml+51 .github/workflows/rebase.yml−134 .github/workflows/update-terraform-providers.yml+48 .gitignore+7 .version+1−1 CONTRIBUTING.md+130 COPYING+1−1 README.md+15−9 doc/Makefile+10−4 doc/build-aux/pandoc-filters/docbook-reader/citerefentry-to-rst-role.lua+23 doc/build-aux/pandoc-filters/docbook-writer/labelless-link-is-xref.lua+34 doc/build-aux/pandoc-filters/docbook-writer/rst-roles.lua+36 doc/build-aux/pandoc-filters/link-unix-man-references.lua+17 doc/build-aux/pandoc-filters/myst-reader/roles.lua+29 doc/build-aux/pandoc-filters/myst-writer/roles.lua+25 doc/builders/fetchers.chapter.md+49−12 doc/builders/images/dockertools.section.md+14−8 doc/builders/images/ocitools.section.md+3−3 doc/builders/images/snaptools.section.md+1−1 doc/builders/packages/citrix.section.md+5−5 doc/builders/packages/eclipse.section.md+5−5 doc/builders/packages/elm.section.md+1−1 doc/builders/packages/emacs.section.md+4−4 doc/builders/packages/etc-files.section.md+18 doc/builders/packages/firefox.section.md+9−7 doc/builders/packages/fish.section.md+1−1 doc/builders/packages/fuse.section.md+2−2 doc/builders/packages/ibus.section.md+3−3 doc/builders/packages/index.xml+1 doc/builders/packages/linux.section.md+11−11 doc/builders/packages/locales.section.md+2−2 doc/builders/packages/nginx.section.md+2−2 doc/builders/packages/opengl.section.md+1−1 doc/builders/packages/shell-helpers.section.md+1−1 doc/builders/packages/steam.section.md+8−17 doc/builders/packages/urxvt.section.md+4−4 doc/builders/packages/weechat.section.md+6−6 doc/builders/special/fhs-environments.section.md+6−2 doc/builders/special/mkshell.section.md+26−6 doc/builders/testers.chapter.md+82 doc/builders/trivial-builders.chapter.md+127−3 doc/contributing/coding-conventions.chapter.md+73−12 doc/contributing/contributing-to-documentation.chapter.md+7 doc/contributing/reviewing-contributions.chapter.md+5−4 doc/contributing/submitting-changes.chapter.md+33−12 doc/doc-support/lib-function-docs.nix+1 doc/functions.xml+1−1 doc/functions/generators.section.md+56 doc/functions/generators.xml−74 doc/functions/library.xml+2 doc/functions/library/attrsets.xml+4−4 doc/hooks/index.xml+10 doc/hooks/postgresql-test-hook.section.md+59 doc/labelless-link-is-xref.lua−24 doc/languages-frameworks/agda.section.md+63−1 doc/languages-frameworks/beam.section.md+133−55 doc/languages-frameworks/chicken.section.md+49 doc/languages-frameworks/coq.section.md+4−2 doc/languages-frameworks/crystal.section.md+2−2 doc/languages-frameworks/cuda.section.md+34 doc/languages-frameworks/dhall.section.md+46−15 doc/languages-frameworks/dotnet.section.md+63−6 doc/languages-frameworks/emscripten.section.md+2−2 doc/languages-frameworks/gnome.section.md+36−4 doc/languages-frameworks/go.section.md+21−15 doc/languages-frameworks/hy.section.md+31 doc/languages-frameworks/idris.section.md+1−4 doc/languages-frameworks/index.xml+7−1 doc/languages-frameworks/java.section.md+9 doc/languages-frameworks/javascript.section.md+278 doc/languages-frameworks/lua.section.md+4−6 doc/languages-frameworks/nim.section.md+91 doc/languages-frameworks/node.section.md−51 doc/languages-frameworks/ocaml.section.md+86−25 doc/languages-frameworks/octave.section.md+92 doc/languages-frameworks/perl.section.md+5−9 doc/languages-frameworks/python.section.md+91−13 doc/languages-frameworks/r.section.md+12−8 doc/languages-frameworks/ruby.section.md+14−1 doc/languages-frameworks/rust.section.md+161−85 doc/languages-frameworks/texlive.section.md+1−1 doc/languages-frameworks/vim.section.md+37−7 doc/manual.xml+2 doc/stdenv/cross-compilation.chapter.md+37−12 doc/stdenv/meta.chapter.md+62−5 doc/stdenv/multiple-output.chapter.md+1−1 doc/stdenv/stdenv.chapter.md+137−31 doc/using/overlays.chapter.md+21−3 doc/using/overrides.chapter.md+6−2 flake.nix+9−41 lib/asserts.nix+10−12 lib/attrsets.nix+141−29 lib/customisation.nix+50−3 lib/default.nix+25−15 lib/deprecated.nix+5−5 lib/fixed-points.nix+5−5 lib/flake.nix+1−1 lib/flakes.nix+22 lib/generators.nix+77−5 lib/licenses.nix+201−143 lib/lists.nix+11−13 lib/meta.nix+42−1 lib/modules.nix+341−92 lib/options.nix+84−19 lib/sources.nix+170−66 lib/strings.nix+212−8 lib/systems/default.nix+4−1 lib/systems/doubles.nix+18−8 lib/systems/examples.nix+39 lib/systems/inspect.nix+11−1 lib/systems/parse.nix+18−5 lib/systems/platforms.nix+60−5 lib/systems/supported.nix+26 lib/tests/flakes/subflakeTest/flake.nix+8 lib/tests/flakes/subflakeTest/subflake/flake.nix+5 lib/tests/maintainers.nix+6−2 lib/tests/misc.nix+464−2 lib/tests/modules.sh+180−121 lib/tests/modules/adhoc-freeformType-survives-type-merge.nix+14 lib/tests/modules/declare-attrsOf.nix+8−1 lib/tests/modules/declare-bare-submodule-deep-option-duplicate.nix+10 lib/tests/modules/declare-bare-submodule-deep-option.nix+10 lib/tests/modules/declare-bare-submodule-nested-option.nix+19 lib/tests/modules/declare-bare-submodule.nix+18 lib/tests/modules/declare-set.nix+12 lib/tests/modules/declare-submodule-via-evalModules.nix+28 lib/tests/modules/declare-variants.nix+9 lib/tests/modules/define-bare-submodule-values.nix+4 lib/tests/modules/define-shorthandOnlyDefinesConfig-true.nix+1 lib/tests/modules/define-variant.nix+22 lib/tests/modules/emptyValues.nix+36 lib/tests/modules/extendModules-168767-imports.nix+41 lib/tests/modules/freeform-nested.nix+8−1 lib/tests/modules/freeform-submodules.nix+22 lib/tests/modules/optionTypeFile.nix+28 lib/tests/modules/optionTypeMerging.nix+27 lib/tests/modules/raw.nix+30 lib/tests/modules/types-anything/functions.nix+9−3 lib/tests/release.nix+9−1 lib/tests/sources.sh+61 lib/tests/systems.nix+6−3 lib/trivial.nix+128−10 lib/types.nix+153−52 maintainers/maintainer-list.nix+2981−212 maintainers/scripts/check-maintainer-github-handles.sh+9−9 maintainers/scripts/copy-tarballs.pl+15−1 maintainers/scripts/db-to-md.sh+88 maintainers/scripts/dep-licenses.sh+1−1 maintainers/scripts/doc/escape-code-markup.py+97 maintainers/scripts/doc/replace-xrefs-by-empty-links.py+32 maintainers/scripts/doc/unknown-code-language.lua+12 maintainers/scripts/feature-freeze-teams.pl+98 maintainers/scripts/find-tarballs.nix+1−1 maintainers/scripts/haskell/dependencies.nix+10 maintainers/scripts/haskell/hydra-report.hs+115−33 maintainers/scripts/haskell/maintained-broken-pkgs.nix+22 maintainers/scripts/haskell/maintainer-handles.nix+7 maintainers/scripts/haskell/mark-broken.sh+8−6 maintainers/scripts/haskell/merge-and-open-pr.sh+122 maintainers/scripts/haskell/regenerate-hackage-packages.sh+2−2 maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh+1−1 maintainers/scripts/haskell/test-configurations.nix+136 maintainers/scripts/haskell/update-stackage.sh+26−24 maintainers/scripts/haskell/upload-nixos-package-list-to-hackage.sh+22 maintainers/scripts/luarocks-packages.csv+87−87 maintainers/scripts/pluginupdate.py+358−212 maintainers/scripts/rebuild-amount.sh+86−79 maintainers/scripts/remove-old-aliases.py+211 maintainers/scripts/update-luarocks-packages+207−125 maintainers/scripts/update-luarocks-shell.nix+4−3 maintainers/scripts/update-ruby-packages+4−1 maintainers/scripts/update.nix+3−3 maintainers/scripts/update.py+5−1 maintainers/scripts/vanity.sh+19−19 maintainers/team-list.nix+468−5 nixos/default.nix+1−24 nixos/doc/manual/README−3 nixos/doc/manual/README.md+3 nixos/doc/manual/administration/boot-problems.section.md+41 nixos/doc/manual/administration/boot-problems.xml−126 nixos/doc/manual/administration/cleaning-store.chapter.md+62 nixos/doc/manual/administration/cleaning-store.xml−63 nixos/doc/manual/administration/container-networking.section.md+44 nixos/doc/manual/administration/container-networking.xml−59 nixos/doc/manual/administration/containers.chapter.md+28 nixos/doc/manual/administration/containers.xml−34 nixos/doc/manual/administration/control-groups.chapter.md+59 nixos/doc/manual/administration/control-groups.xml−65 nixos/doc/manual/administration/declarative-containers.section.md+48 nixos/doc/manual/administration/declarative-containers.xml−60 nixos/doc/manual/administration/imperative-containers.section.md+115 nixos/doc/manual/administration/imperative-containers.xml−123 nixos/doc/manual/administration/logging.chapter.md+38 nixos/doc/manual/administration/logging.xml−43 nixos/doc/manual/administration/maintenance-mode.section.md+11 nixos/doc/manual/administration/maintenance-mode.xml−16 nixos/doc/manual/administration/network-problems.section.md+21 nixos/doc/manual/administration/network-problems.xml−27 nixos/doc/manual/administration/rebooting.chapter.md+30 nixos/doc/manual/administration/rebooting.xml−35 nixos/doc/manual/administration/rollback.section.md+38 nixos/doc/manual/administration/rollback.xml−41 nixos/doc/manual/administration/running.xml+8−8 nixos/doc/manual/administration/service-mgmt.chapter.md+120 nixos/doc/manual/administration/service-mgmt.xml−140 nixos/doc/manual/administration/store-corruption.section.md+28 nixos/doc/manual/administration/store-corruption.xml−36 nixos/doc/manual/administration/troubleshooting.chapter.md+12 nixos/doc/manual/administration/troubleshooting.xml−16 nixos/doc/manual/administration/user-sessions.chapter.md+43 nixos/doc/manual/administration/user-sessions.xml−45 nixos/doc/manual/configuration/ad-hoc-network-config.section.md+13 nixos/doc/manual/configuration/ad-hoc-network-config.xml−20 nixos/doc/manual/configuration/ad-hoc-packages.section.md+51 nixos/doc/manual/configuration/ad-hoc-packages.xml−61 nixos/doc/manual/configuration/adding-custom-packages.section.md+74 nixos/doc/manual/configuration/adding-custom-packages.xml−73 nixos/doc/manual/configuration/config-file.section.md+175 nixos/doc/manual/configuration/config-file.xml−216 nixos/doc/manual/configuration/config-syntax.chapter.md+19 nixos/doc/manual/configuration/config-syntax.xml−25 nixos/doc/manual/configuration/configuration.xml+13−13 nixos/doc/manual/configuration/customizing-packages.section.md+74 nixos/doc/manual/configuration/customizing-packages.xml−86 nixos/doc/manual/configuration/declarative-packages.section.md+46 nixos/doc/manual/configuration/declarative-packages.xml−54 nixos/doc/manual/configuration/file-systems.chapter.md+42 nixos/doc/manual/configuration/file-systems.xml−57 nixos/doc/manual/configuration/firewall.section.md+32 nixos/doc/manual/configuration/firewall.xml−37 nixos/doc/manual/configuration/gpu-accel.chapter.md+204 nixos/doc/manual/configuration/gpu-accel.xml−263 nixos/doc/manual/configuration/ipv4-config.section.md+35 nixos/doc/manual/configuration/ipv4-config.xml−43 nixos/doc/manual/configuration/ipv6-config.section.md+42 nixos/doc/manual/configuration/ipv6-config.xml−54 nixos/doc/manual/configuration/kubernetes.chapter.md+104 nixos/doc/manual/configuration/kubernetes.xml−112 nixos/doc/manual/configuration/linux-kernel.chapter.md+140 nixos/doc/manual/configuration/linux-kernel.xml−138 nixos/doc/manual/configuration/luks-file-systems.section.md+77 nixos/doc/manual/configuration/luks-file-systems.xml−78 nixos/doc/manual/configuration/modularity.section.md+133 nixos/doc/manual/configuration/modularity.xml−146 nixos/doc/manual/configuration/network-manager.section.md+42 nixos/doc/manual/configuration/network-manager.xml−48 nixos/doc/manual/configuration/networking.chapter.md+16 nixos/doc/manual/configuration/networking.xml−20 nixos/doc/manual/configuration/package-mgmt.chapter.md+18 nixos/doc/manual/configuration/package-mgmt.xml−31 nixos/doc/manual/configuration/profiles.chapter.md+34 nixos/doc/manual/configuration/profiles.xml−39 nixos/doc/manual/configuration/profiles/all-hardware.section.md+11 nixos/doc/manual/configuration/profiles/all-hardware.xml−21 nixos/doc/manual/configuration/profiles/base.section.md+7 nixos/doc/manual/configuration/profiles/base.xml−15 nixos/doc/manual/configuration/profiles/clone-config.section.md+11 nixos/doc/manual/configuration/profiles/clone-config.xml−21 nixos/doc/manual/configuration/profiles/demo.section.md+4 nixos/doc/manual/configuration/profiles/demo.xml−14 nixos/doc/manual/configuration/profiles/docker-container.section.md+7 nixos/doc/manual/configuration/profiles/docker-container.xml−16 nixos/doc/manual/configuration/profiles/graphical.section.md+10 nixos/doc/manual/configuration/profiles/graphical.xml−20 nixos/doc/manual/configuration/profiles/hardened.section.md+20 nixos/doc/manual/configuration/profiles/hardened.xml−32 nixos/doc/manual/configuration/profiles/headless.section.md+9 nixos/doc/manual/configuration/profiles/headless.xml−19 nixos/doc/manual/configuration/profiles/installation-device.section.md+24 nixos/doc/manual/configuration/profiles/installation-device.xml−36 nixos/doc/manual/configuration/profiles/minimal.section.md+9 nixos/doc/manual/configuration/profiles/minimal.xml−17 nixos/doc/manual/configuration/profiles/qemu-guest.section.md+7 nixos/doc/manual/configuration/profiles/qemu-guest.xml−17 nixos/doc/manual/configuration/renaming-interfaces.section.md+51 nixos/doc/manual/configuration/renaming-interfaces.xml−67 nixos/doc/manual/configuration/ssh.section.md+19 nixos/doc/manual/configuration/ssh.xml−27 nixos/doc/manual/configuration/sshfs-file-systems.section.md+104 nixos/doc/manual/configuration/subversion.chapter.md+102 nixos/doc/manual/configuration/subversion.xml−140 nixos/doc/manual/configuration/summary.section.md+46 nixos/doc/manual/configuration/summary.xml−227 nixos/doc/manual/configuration/user-mgmt.chapter.md+92 nixos/doc/manual/configuration/user-mgmt.xml−88 nixos/doc/manual/configuration/wayland.chapter.md+27 nixos/doc/manual/configuration/wayland.xml−23 nixos/doc/manual/configuration/wireless.section.md+67 nixos/doc/manual/configuration/wireless.xml−70 nixos/doc/manual/configuration/x-windows.chapter.md+337 nixos/doc/manual/configuration/x-windows.xml−352 nixos/doc/manual/configuration/xfce.chapter.md+52 nixos/doc/manual/configuration/xfce.xml−59 nixos/doc/manual/default.nix+19−6 nixos/doc/manual/development/activation-script.section.md+72 nixos/doc/manual/development/assertions.section.md+40 nixos/doc/manual/development/assertions.xml−74 nixos/doc/manual/development/building-nixos.chapter.md−18 nixos/doc/manual/development/building-parts.chapter.md+74 nixos/doc/manual/development/building-parts.xml−121 nixos/doc/manual/development/development.xml+7−7 nixos/doc/manual/development/freeform-modules.section.md+79 nixos/doc/manual/development/freeform-modules.xml−68 nixos/doc/manual/development/importing-modules.section.md+46 nixos/doc/manual/development/importing-modules.xml−56 nixos/doc/manual/development/linking-nixos-tests-to-packages.section.md+6 nixos/doc/manual/development/meta-attributes.section.md+66 nixos/doc/manual/development/meta-attributes.xml−63 nixos/doc/manual/development/nixos-tests.chapter.md+13 nixos/doc/manual/development/nixos-tests.xml−19 nixos/doc/manual/development/option-declarations.section.md+221 nixos/doc/manual/development/option-declarations.xml−199 nixos/doc/manual/development/option-def.section.md+91 nixos/doc/manual/development/option-def.xml−99 nixos/doc/manual/development/option-types.section.md+583 nixos/doc/manual/development/option-types.xml−914 nixos/doc/manual/development/replace-modules.section.md+64 nixos/doc/manual/development/replace-modules.xml−79 nixos/doc/manual/development/running-nixos-tests-interactively.section.md+35 nixos/doc/manual/development/running-nixos-tests-interactively.xml−49 nixos/doc/manual/development/running-nixos-tests.section.md+31 nixos/doc/manual/development/running-nixos-tests.xml−36 nixos/doc/manual/development/settings-options.section.md+251 nixos/doc/manual/development/settings-options.xml−226 nixos/doc/manual/development/sources.chapter.md+77 nixos/doc/manual/development/sources.xml−85 nixos/doc/manual/development/testing-installer.chapter.md+18 nixos/doc/manual/development/testing-installer.xml−22 nixos/doc/manual/development/unit-handling.section.md+62 nixos/doc/manual/development/what-happens-during-a-system-switch.chapter.md+53 nixos/doc/manual/development/writing-documentation.chapter.md+93 nixos/doc/manual/development/writing-documentation.xml−150 nixos/doc/manual/development/writing-modules.chapter.md+208 nixos/doc/manual/development/writing-modules.xml−191 nixos/doc/manual/development/writing-nixos-tests.section.md+382 nixos/doc/manual/development/writing-nixos-tests.xml−517 nixos/doc/manual/from_md/administration/boot-problems.section.xml+144 nixos/doc/manual/from_md/administration/cleaning-store.chapter.xml+72 nixos/doc/manual/from_md/administration/container-networking.section.xml+54 nixos/doc/manual/from_md/administration/containers.chapter.xml+31 nixos/doc/manual/from_md/administration/control-groups.chapter.xml+67 nixos/doc/manual/from_md/administration/declarative-containers.section.xml+60 nixos/doc/manual/from_md/administration/imperative-containers.section.xml+132 nixos/doc/manual/from_md/administration/logging.chapter.xml+45 nixos/doc/manual/from_md/administration/maintenance-mode.section.xml+14 nixos/doc/manual/from_md/administration/network-problems.section.xml+25 nixos/doc/manual/from_md/administration/rebooting.chapter.xml+38 nixos/doc/manual/from_md/administration/rollback.section.xml+42 nixos/doc/manual/from_md/administration/service-mgmt.chapter.xml+141 nixos/doc/manual/from_md/administration/store-corruption.section.xml+34 nixos/doc/manual/from_md/administration/troubleshooting.chapter.xml+12 nixos/doc/manual/from_md/administration/user-sessions.chapter.xml+46 nixos/doc/manual/from_md/configuration/ad-hoc-network-config.section.xml+16 nixos/doc/manual/from_md/configuration/ad-hoc-packages.section.xml+59 nixos/doc/manual/from_md/configuration/adding-custom-packages.section.xml+80 nixos/doc/manual/from_md/configuration/config-file.section.xml+231 nixos/doc/manual/from_md/configuration/config-syntax.chapter.xml+21 nixos/doc/manual/from_md/configuration/customizing-packages.section.xml+90 nixos/doc/manual/from_md/configuration/declarative-packages.section.xml+53 nixos/doc/manual/from_md/configuration/file-systems.chapter.xml+55 nixos/doc/manual/from_md/configuration/firewall.section.xml+39 nixos/doc/manual/from_md/configuration/gpu-accel.chapter.xml+239 nixos/doc/manual/from_md/configuration/ipv4-config.section.xml+43 nixos/doc/manual/from_md/configuration/ipv6-config.section.xml+47 nixos/doc/manual/from_md/configuration/kubernetes.chapter.xml+126 nixos/doc/manual/from_md/configuration/linux-kernel.chapter.xml+157 nixos/doc/manual/from_md/configuration/luks-file-systems.section.xml+84 nixos/doc/manual/from_md/configuration/modularity.section.xml+152 nixos/doc/manual/from_md/configuration/network-manager.section.xml+49 nixos/doc/manual/from_md/configuration/networking.chapter.xml+15 nixos/doc/manual/from_md/configuration/package-mgmt.chapter.xml+28 nixos/doc/manual/from_md/configuration/profiles.chapter.xml+38 nixos/doc/manual/from_md/configuration/profiles/all-hardware.section.xml+15 nixos/doc/manual/from_md/configuration/profiles/base.section.xml+10 nixos/doc/manual/from_md/configuration/profiles/clone-config.section.xml+16 nixos/doc/manual/from_md/configuration/profiles/demo.section.xml+10 nixos/doc/manual/from_md/configuration/profiles/docker-container.section.xml+12 nixos/doc/manual/from_md/configuration/profiles/graphical.section.xml+14 nixos/doc/manual/from_md/configuration/profiles/hardened.section.xml+25 nixos/doc/manual/from_md/configuration/profiles/headless.section.xml+15 nixos/doc/manual/from_md/configuration/profiles/installation-device.section.xml+32 nixos/doc/manual/from_md/configuration/profiles/minimal.section.xml+13 nixos/doc/manual/from_md/configuration/profiles/qemu-guest.section.xml+11 nixos/doc/manual/from_md/configuration/renaming-interfaces.section.xml+62 nixos/doc/manual/from_md/configuration/ssh.section.xml+23 nixos/doc/manual/from_md/configuration/sshfs-file-systems.section.xml+139 nixos/doc/manual/from_md/configuration/subversion.chapter.xml+121 nixos/doc/manual/from_md/configuration/summary.section.xml+332 nixos/doc/manual/from_md/configuration/user-mgmt.chapter.xml+105 nixos/doc/manual/from_md/configuration/wayland.chapter.xml+31 nixos/doc/manual/from_md/configuration/wireless.section.xml+73 nixos/doc/manual/from_md/configuration/x-windows.chapter.xml+381 nixos/doc/manual/from_md/configuration/xfce.chapter.xml+62 nixos/doc/manual/from_md/development/activation-script.section.xml+150 nixos/doc/manual/from_md/development/assertions.section.xml+58 nixos/doc/manual/from_md/development/building-nixos.chapter.xml−33 nixos/doc/manual/from_md/development/building-parts.chapter.xml+124 nixos/doc/manual/from_md/development/freeform-modules.section.xml+87 nixos/doc/manual/from_md/development/importing-modules.section.xml+47 nixos/doc/manual/from_md/development/linking-nixos-tests-to-packages.section.xml+10 nixos/doc/manual/from_md/development/meta-attributes.section.xml+95 nixos/doc/manual/from_md/development/nixos-tests.chapter.xml+14 nixos/doc/manual/from_md/development/option-declarations.section.xml+327 nixos/doc/manual/from_md/development/option-def.section.xml+104 nixos/doc/manual/from_md/development/option-types.section.xml+1038 nixos/doc/manual/from_md/development/replace-modules.section.xml+70 nixos/doc/manual/from_md/development/running-nixos-tests-interactively.section.xml+39 nixos/doc/manual/from_md/development/running-nixos-tests.section.xml+34 nixos/doc/manual/from_md/development/settings-options.section.xml+421 nixos/doc/manual/from_md/development/sources.chapter.xml+90 nixos/doc/manual/from_md/development/testing-installer.chapter.xml+22 nixos/doc/manual/from_md/development/unit-handling.section.xml+131 nixos/doc/manual/from_md/development/what-happens-during-a-system-switch.chapter.xml+122 nixos/doc/manual/from_md/development/writing-documentation.chapter.xml+144 nixos/doc/manual/from_md/development/writing-modules.chapter.xml+245 nixos/doc/manual/from_md/development/writing-nixos-tests.section.xml+655 nixos/doc/manual/from_md/installation/building-nixos.chapter.xml+106 nixos/doc/manual/from_md/installation/changing-config.chapter.xml+117 nixos/doc/manual/from_md/installation/installing-behind-a-proxy.section.xml+41 nixos/doc/manual/from_md/installation/installing-from-other-distro.section.xml+388 nixos/doc/manual/from_md/installation/installing-pxe.section.xml+42 nixos/doc/manual/from_md/installation/installing-usb.section.xml+35 nixos/doc/manual/from_md/installation/installing-virtualbox-guest.section.xml+92 nixos/doc/manual/from_md/installation/installing.chapter.xml+645 nixos/doc/manual/from_md/installation/obtaining.chapter.xml+48 nixos/doc/manual/from_md/installation/upgrading.chapter.xml+152 nixos/doc/manual/from_md/release-notes/rl-1310.section.xml+6 nixos/doc/manual/from_md/release-notes/rl-1404.section.xml+189 nixos/doc/manual/from_md/release-notes/rl-1412.section.xml+466 nixos/doc/manual/from_md/release-notes/rl-1509.section.xml+776 nixos/doc/manual/from_md/release-notes/rl-1603.section.xml+695 nixos/doc/manual/from_md/release-notes/rl-1609.section.xml+273 nixos/doc/manual/from_md/release-notes/rl-1703.section.xml+818 nixos/doc/manual/from_md/release-notes/rl-1709.section.xml+922 nixos/doc/manual/from_md/release-notes/rl-1803.section.xml+879 nixos/doc/manual/from_md/release-notes/rl-1809.section.xml+941 nixos/doc/manual/from_md/release-notes/rl-1903.section.xml+790 nixos/doc/manual/from_md/release-notes/rl-1909.section.xml+1197 nixos/doc/manual/from_md/release-notes/rl-2003.section.xml+1497 nixos/doc/manual/from_md/release-notes/rl-2009.section.xml+2210 nixos/doc/manual/from_md/release-notes/rl-2105.section.xml+1567 nixos/doc/manual/from_md/release-notes/rl-2111.section.xml+2037−27 nixos/doc/manual/from_md/release-notes/rl-2205.section.xml+2470 nixos/doc/manual/installation/building-nixos.chapter.md+77 nixos/doc/manual/installation/changing-config.chapter.md+100 nixos/doc/manual/installation/changing-config.xml−97 nixos/doc/manual/installation/installation.xml+5−4 nixos/doc/manual/installation/installing-behind-a-proxy.section.md+29 nixos/doc/manual/installation/installing-behind-a-proxy.xml−48 nixos/doc/manual/installation/installing-from-other-distro.section.md+279 nixos/doc/manual/installation/installing-from-other-distro.xml−364 nixos/doc/manual/installation/installing-pxe.section.md+32 nixos/doc/manual/installation/installing-pxe.xml−50 nixos/doc/manual/installation/installing-usb.section.md+31 nixos/doc/manual/installation/installing-usb.xml−40 nixos/doc/manual/installation/installing-virtualbox-guest.section.md+59 nixos/doc/manual/installation/installing-virtualbox-guest.xml−103 nixos/doc/manual/installation/installing.chapter.md+482 nixos/doc/manual/installation/installing.xml−579 nixos/doc/manual/installation/obtaining.chapter.md+26 nixos/doc/manual/installation/obtaining.xml−54 nixos/doc/manual/installation/upgrading.chapter.md+118 nixos/doc/manual/installation/upgrading.xml−139 nixos/doc/manual/man-nixos-install.xml+9−4 nixos/doc/manual/man-nixos-rebuild.xml+61−7 nixos/doc/manual/man-pages.xml+7−2 nixos/doc/manual/md-to-db.sh+28−12 nixos/doc/manual/preface.xml+7−6 nixos/doc/manual/release-notes/release-notes.xml+16−15 nixos/doc/manual/release-notes/rl-1310.section.md+3 nixos/doc/manual/release-notes/rl-1310.xml−11 nixos/doc/manual/release-notes/rl-1404.section.md+81 nixos/doc/manual/release-notes/rl-1404.xml−179 nixos/doc/manual/release-notes/rl-1412.section.md+171 nixos/doc/manual/release-notes/rl-1412.xml−467 nixos/doc/manual/release-notes/rl-1509.section.md+319 nixos/doc/manual/release-notes/rl-1509.xml−750 nixos/doc/manual/release-notes/rl-1603.section.md+282 nixos/doc/manual/release-notes/rl-1603.xml−671 nixos/doc/manual/release-notes/rl-1609.section.md+73 nixos/doc/manual/release-notes/rl-1609.xml−277 nixos/doc/manual/release-notes/rl-1703.section.md+303 nixos/doc/manual/release-notes/rl-1703.xml−817 nixos/doc/manual/release-notes/rl-1709.section.md+316 nixos/doc/manual/release-notes/rl-1709.xml−899 nixos/doc/manual/release-notes/rl-1803.section.md+286 nixos/doc/manual/release-notes/rl-1803.xml−855 nixos/doc/manual/release-notes/rl-1809.section.md+332 nixos/doc/manual/release-notes/rl-1809.xml−933 nixos/doc/manual/release-notes/rl-1903.section.md+214 nixos/doc/manual/release-notes/rl-1903.xml−768 nixos/doc/manual/release-notes/rl-1909.section.md+313 nixos/doc/manual/release-notes/rl-1909.xml−902 nixos/doc/manual/release-notes/rl-2003.section.md+507 nixos/doc/manual/release-notes/rl-2003.xml−1252 nixos/doc/manual/release-notes/rl-2009.section.md+747 nixos/doc/manual/release-notes/rl-2009.xml−1838 nixos/doc/manual/release-notes/rl-2105.section.md+428 nixos/doc/manual/release-notes/rl-2105.xml−1266 nixos/doc/manual/release-notes/rl-2111.section.md+561−20 nixos/doc/manual/release-notes/rl-2205.section.md+878 nixos/lib/build-vms.nix+17−10 nixos/lib/default.nix+33 nixos/lib/eval-cacheable-options.nix+53 nixos/lib/eval-config-minimal.nix+49 nixos/lib/eval-config.nix+54−16 nixos/lib/make-disk-image.nix+67−24 nixos/lib/make-iso9660-image.sh+1 nixos/lib/make-multi-disk-zfs-image.nix+333 nixos/lib/make-options-doc/default.nix+78−103 nixos/lib/make-options-doc/generateAsciiDoc.py+37 nixos/lib/make-options-doc/generateCommonMark.py+27 nixos/lib/make-options-doc/mergeJSON.py+95 nixos/lib/make-options-doc/options-to-docbook.xsl+30−20 nixos/lib/make-options-doc/optionsJSONtoXML.nix+6 nixos/lib/make-options-doc/sortXML.py+27 nixos/lib/make-single-disk-zfs-image.nix+322 nixos/lib/make-squashfs.nix+8−1 nixos/lib/qemu-common.nix+32 nixos/lib/qemu-flags.nix−32 nixos/lib/systemd-lib.nix+426 nixos/lib/systemd-types.nix+69 nixos/lib/systemd-unit-options.nix+711 nixos/lib/test-driver/default.nix+32 nixos/lib/test-driver/setup.py+13 nixos/lib/test-driver/test-driver.py−1016 nixos/lib/test-driver/test_driver/__init__.py+128 nixos/lib/test-driver/test_driver/driver.py+226 nixos/lib/test-driver/test_driver/logger.py+105 nixos/lib/test-driver/test_driver/machine.py+1023 nixos/lib/test-driver/test_driver/polling_condition.py+77 nixos/lib/test-driver/test_driver/vlan.py+58 nixos/lib/testing-python.nix+176−259 nixos/lib/utils.nix+78−6 nixos/maintainers/scripts/azure-new/examples/basic/image.nix+1−1 nixos/maintainers/scripts/azure-new/examples/basic/system.nix+1−1 nixos/maintainers/scripts/ec2/amazon-image-zfs.nix+12 nixos/maintainers/scripts/ec2/amazon-image.nix+98−28 nixos/maintainers/scripts/ec2/create-amis.sh+83−45 nixos/maintainers/scripts/lxd/lxd-image-inner.nix+102 nixos/maintainers/scripts/lxd/lxd-image.nix+34 nixos/maintainers/scripts/lxd/nix.tpl+9 nixos/maintainers/scripts/openstack/openstack-image-zfs.nix+101 nixos/maintainers/scripts/openstack/openstack-image.nix+9−8 nixos/modules/config/console.nix+30−11 nixos/modules/config/fonts/fontconfig.nix+1−17 nixos/modules/config/fonts/fontdir.nix+2−2 nixos/modules/config/fonts/fonts.nix+46−21 nixos/modules/config/gtk/gtk-icon-cache.nix+1 nixos/modules/config/i18n.nix+7−1 nixos/modules/config/krb5/default.nix+8−8 nixos/modules/config/ldap.nix+1−1 nixos/modules/config/malloc.nix+22−3 nixos/modules/config/networking.nix+11−7 nixos/modules/config/nsswitch.nix+9−6 nixos/modules/config/power-management.nix+2−2 nixos/modules/config/pulseaudio.nix+11−11 nixos/modules/config/resolvconf.nix+2−4 nixos/modules/config/shells-environment.nix+15−5 nixos/modules/config/swap.nix+34−7 nixos/modules/config/sysctl.nix+1−1 nixos/modules/config/system-environment.nix+34−36 nixos/modules/config/system-path.nix+19−9 nixos/modules/config/terminfo.nix+25−1 nixos/modules/config/unix-odbc-drivers.nix+1−1 nixos/modules/config/update-users-groups.pl+29−16 nixos/modules/config/users-groups.nix+64−27 nixos/modules/config/xdg/mime.nix+64−2 nixos/modules/config/xdg/portal.nix+23−12 nixos/modules/config/xdg/portals/wlr.nix+67 nixos/modules/hardware/all-firmware.nix+24−6 nixos/modules/hardware/ckb-next.nix+1−1 nixos/modules/hardware/corectrl.nix+62 nixos/modules/hardware/cpu/intel-sgx.nix+69 nixos/modules/hardware/device-tree.nix+5−5 nixos/modules/hardware/digitalbitbox.nix+1−1 nixos/modules/hardware/flirc.nix+12 nixos/modules/hardware/gkraken.nix+18 nixos/modules/hardware/gpgsmartcards.nix+37 nixos/modules/hardware/hackrf.nix+23 nixos/modules/hardware/keyboard/zsa.nix−3 nixos/modules/hardware/network/b43.nix−4 nixos/modules/hardware/onlykey.udev−4 nixos/modules/hardware/onlykey.nix → nixos/modules/hardware/onlykey/default.nix nixos/modules/hardware/onlykey/onlykey.udev+18 nixos/modules/hardware/opengl.nix+2−2 nixos/modules/hardware/openrazer.nix+18−5 nixos/modules/hardware/opentabletdriver.nix+1−1 nixos/modules/hardware/pcmcia.nix+1 nixos/modules/hardware/printers.nix+6−11 nixos/modules/hardware/raid/hpsa.nix+4−1 nixos/modules/hardware/rtl-sdr.nix+8−4 nixos/modules/hardware/sata.nix+1−1 nixos/modules/hardware/sensor/iio.nix+1−1 nixos/modules/hardware/system-76.nix+33−3 nixos/modules/hardware/video/amdgpu-pro.nix+25−22 nixos/modules/hardware/video/capture/mwprocapture.nix−5 nixos/modules/hardware/video/nvidia.nix+59−24 nixos/modules/hardware/video/uvcvideo/default.nix+1−1 nixos/modules/hardware/video/webcam/facetimehd.nix+14−6 nixos/modules/hardware/xone.nix+23 nixos/modules/i18n/input-method/fcitx.nix+4−1 nixos/modules/i18n/input-method/fcitx5.nix+21−12 nixos/modules/i18n/input-method/ibus.nix+5−2 nixos/modules/i18n/input-method/kime.nix+4−2 nixos/modules/installer/cd-dvd/channel.nix+2−1 nixos/modules/installer/cd-dvd/installation-cd-base.nix+16 nixos/modules/installer/cd-dvd/installation-cd-graphical-base.nix+14−8 nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares-gnome.nix+59 nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares-plasma5.nix+49 nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares.nix+20 nixos/modules/installer/cd-dvd/installation-cd-graphical-gnome.nix+3−5 nixos/modules/installer/cd-dvd/installation-cd-graphical-plasma5.nix+1−3 nixos/modules/installer/cd-dvd/iso-image.nix+104−72 nixos/modules/installer/cd-dvd/system-tarball-fuloong2f.nix+1−1 nixos/modules/installer/cd-dvd/system-tarball-pc.nix+1−1 nixos/modules/installer/cd-dvd/system-tarball-sheevaplug.nix+4−4 nixos/modules/installer/cd-dvd/system-tarball.nix+2−2 nixos/modules/installer/kexec/kexec-boot.nix+51 nixos/modules/installer/netboot/netboot.nix+14−6 nixos/modules/installer/sd-card/sd-image-aarch64.nix+15 nixos/modules/installer/sd-card/sd-image-raspberrypi.nix+1−1 nixos/modules/installer/sd-card/sd-image-riscv64-qemu-installer.nix+10 nixos/modules/installer/sd-card/sd-image-riscv64-qemu.nix+32 nixos/modules/installer/sd-card/sd-image-x86_64.nix+27 nixos/modules/installer/sd-card/sd-image.nix+22−6 nixos/modules/installer/tools/nix-fallback-paths.nix+5−4 nixos/modules/installer/tools/nixos-build-vms/build-vms.nix+18−5 nixos/modules/installer/tools/nixos-build-vms/nixos-build-vms.sh+4−3 nixos/modules/installer/tools/nixos-enter.sh+33−1 nixos/modules/installer/tools/nixos-generate-config.pl+24−6 nixos/modules/installer/tools/nixos-install.sh+19−18 nixos/modules/installer/tools/nixos-option/default.nix+1−11 nixos/modules/installer/tools/nixos-version.sh+1 nixos/modules/installer/tools/tools.nix+30−6 nixos/modules/installer/virtualbox-demo.nix+1−1 nixos/modules/misc/crashdump.nix+1−1 nixos/modules/misc/documentation.nix+129−53 nixos/modules/misc/extra-arguments.nix+2−2 nixos/modules/misc/ids.nix+69−56 nixos/modules/misc/locate.nix+134−69 nixos/modules/misc/man-db.nix+73 nixos/modules/misc/mandoc.nix+61 nixos/modules/misc/meta.nix+16−1 nixos/modules/misc/nixpkgs.nix+18−10 nixos/modules/misc/nixpkgs/test.nix+8 nixos/modules/misc/version.nix+52−18 nixos/modules/misc/wordlist.nix+59 nixos/modules/module-list.nix+167−34 nixos/modules/profiles/all-hardware.nix+5−2 nixos/modules/profiles/base.nix+1 nixos/modules/profiles/hardened.nix+1−1 nixos/modules/profiles/headless.nix+1−1 nixos/modules/profiles/installation-device.nix+10 nixos/modules/profiles/minimal.nix+2 nixos/modules/profiles/qemu-guest.nix+2−2 nixos/modules/programs/_1password-gui.nix+68 nixos/modules/programs/_1password.nix+44 nixos/modules/programs/adb.nix+1−2 nixos/modules/programs/appgate-sdp.nix+5−3 nixos/modules/programs/atop.nix+11−4 nixos/modules/programs/bandwhich.nix+3−1 nixos/modules/programs/bash/bash-completion.nix+1−1 nixos/modules/programs/bash/bash.nix+4−4 nixos/modules/programs/bcc.nix+3−3 nixos/modules/programs/calls.nix+27 nixos/modules/programs/captive-browser.nix+45−19 nixos/modules/programs/ccache.nix+2 nixos/modules/programs/chromium.nix+13−2 nixos/modules/programs/cnping.nix+21 nixos/modules/programs/command-not-found/command-not-found.nix+6−6 nixos/modules/programs/command-not-found/command-not-found.pl+37−12 nixos/modules/programs/dconf.nix+1−1 nixos/modules/programs/digitalbitbox/default.nix+1−1 nixos/modules/programs/dmrconfig.nix+1−1 nixos/modules/programs/environment.nix+9−2 nixos/modules/programs/evince.nix+13−4 nixos/modules/programs/extra-container.nix+17 nixos/modules/programs/feedbackd.nix+1 nixos/modules/programs/file-roller.nix+13−4 nixos/modules/programs/firejail.nix+15−8 nixos/modules/programs/flashrom.nix+26 nixos/modules/programs/flexoptix-app.nix+1−1 nixos/modules/programs/freetds.nix+1−1 nixos/modules/programs/gamemode.nix+3−1 nixos/modules/programs/git.nix+69 nixos/modules/programs/gnupg.nix+4−1 nixos/modules/programs/hamster.nix+1−1 nixos/modules/programs/htop.nix+58 nixos/modules/programs/iftop.nix+3−1 nixos/modules/programs/iotop.nix+3−1 nixos/modules/programs/java.nix+1−1 nixos/modules/programs/k3b.nix+52 nixos/modules/programs/k40-whisperer.nix+40 nixos/modules/programs/kbdlight.nix+6−1 nixos/modules/programs/kclock.nix+13 nixos/modules/programs/kdeconnect.nix+35 nixos/modules/programs/less.nix+9−6 nixos/modules/programs/liboping.nix+3−1 nixos/modules/programs/mininet.nix+2−2 nixos/modules/programs/mosh.nix+1−1 nixos/modules/programs/msmtp.nix+2 nixos/modules/programs/mtr.nix+4−1 nixos/modules/programs/nbd.nix+19 nixos/modules/programs/neovim.nix+29−28 nixos/modules/programs/nethoscope.nix+30 nixos/modules/programs/nix-ld.nix+12 nixos/modules/programs/nncp.nix+101 nixos/modules/programs/noisetorch.nix+4−1 nixos/modules/programs/npm.nix+3−2 nixos/modules/programs/pantheon-tweaks.nix+19 nixos/modules/programs/phosh.nix+13−10 nixos/modules/programs/plotinus.nix+1−1 nixos/modules/programs/proxychains.nix+1−1 nixos/modules/programs/qt5ct.nix+1−1 nixos/modules/programs/shadow.nix+15−8 nixos/modules/programs/singularity.nix+6−1 nixos/modules/programs/slock.nix+6−1 nixos/modules/programs/spacefm.nix+6−6 nixos/modules/programs/ssh.nix+72−18 nixos/modules/programs/ssmtp.nix−187 nixos/modules/programs/starship.nix+51 nixos/modules/programs/sway.nix+7−5 nixos/modules/programs/thefuck.nix+7−6 nixos/modules/programs/tilp2.nix−28 nixos/modules/programs/tmux.nix+14−1 nixos/modules/programs/traceroute.nix+3−1 nixos/modules/programs/tsm-client.nix+8−8 nixos/modules/programs/udevil.nix+6−1 nixos/modules/programs/vim.nix+2−2 nixos/modules/programs/wavemon.nix+3−1 nixos/modules/programs/weylus.nix+47 nixos/modules/programs/wireshark.nix+1−1 nixos/modules/programs/wshowkeys.nix+6−1 nixos/modules/programs/xonsh.nix+2−1 nixos/modules/programs/xss-lock.nix+2−1 nixos/modules/programs/xwayland.nix+13−8 nixos/modules/programs/yabar.nix+2−1 nixos/modules/programs/zsh/oh-my-zsh.nix+1−1 nixos/modules/programs/zsh/zsh-autoenv.nix+1−1 nixos/modules/programs/zsh/zsh-autosuggestions.nix+20−11 nixos/modules/programs/zsh/zsh-syntax-highlighting.nix+2−2 nixos/modules/programs/zsh/zsh.nix+14−6 nixos/modules/rename.nix+63−44 nixos/modules/security/acme.nix−770 nixos/modules/security/acme.xml−298 nixos/modules/security/acme/default.nix+921 nixos/modules/security/acme/doc.xml+413 nixos/modules/security/acme/mk-cert-ownership-assertion.nix+4 nixos/modules/security/apparmor/includes.nix+1−1 nixos/modules/security/ca.nix+11−12 nixos/modules/security/chromium-suid-sandbox.nix+6−1 nixos/modules/security/dhparams.nix+5−3 nixos/modules/security/doas.nix+8−5 nixos/modules/security/duosec.nix+6−1 nixos/modules/security/google_oslogin.nix+6−3 nixos/modules/security/lock-kernel-modules.nix+19−9 nixos/modules/security/misc.nix+2−2 nixos/modules/security/pam.nix+435−151 nixos/modules/security/pam_mount.nix+102−7 nixos/modules/security/pam_usb.nix+12−2 nixos/modules/security/polkit.nix+15−7 nixos/modules/security/rtkit.nix+4−1 nixos/modules/security/sudo.nix+3−3 nixos/modules/security/systemd-confinement.nix+7−9 nixos/modules/security/tpm2.nix+5−5 nixos/modules/security/wrappers/default.nix+189−98 nixos/modules/services/admin/meshcentral.nix+53 nixos/modules/services/admin/oxidized.nix+2−2 nixos/modules/services/admin/pgadmin.nix+127 nixos/modules/services/amqp/activemq/default.nix+2−1 nixos/modules/services/amqp/rabbitmq.nix+26−9 nixos/modules/services/audio/alsa.nix+8−8 nixos/modules/services/audio/botamusique.nix+1 nixos/modules/services/audio/hqplayerd.nix+142 nixos/modules/services/audio/icecast.nix+1 nixos/modules/services/audio/jack.nix+7−7 nixos/modules/services/audio/jmusicbot.nix+8−1 nixos/modules/services/audio/liquidsoap.nix+3−3 nixos/modules/services/audio/mopidy.nix+1−1 nixos/modules/services/audio/mpd.nix+24−44 nixos/modules/services/audio/mpdscribble.nix+12−1 nixos/modules/services/audio/navidrome.nix+71 nixos/modules/services/audio/networkaudiod.nix+19 nixos/modules/services/audio/roon-bridge.nix+76 nixos/modules/services/audio/roon-server.nix+9−4 nixos/modules/services/audio/slimserver.nix+2−1 nixos/modules/services/audio/snapserver.nix+31−23 nixos/modules/services/audio/spotifyd.nix+26−1 nixos/modules/services/audio/squeezelite.nix+17−21 nixos/modules/services/audio/ympd.nix+1−1 nixos/modules/services/backup/automysqlbackup.nix+3−2 nixos/modules/services/backup/bacula.nix+3 nixos/modules/services/backup/borgbackup.nix+77−23 nixos/modules/services/backup/btrbk.nix+220 nixos/modules/services/backup/duplicati.nix+26−9 nixos/modules/services/backup/duplicity.nix+1−1 nixos/modules/services/backup/mysql-backup.nix+2−1 nixos/modules/services/backup/postgresql-backup.nix+44−9 nixos/modules/services/backup/postgresql-wal-receiver.nix+5−5 nixos/modules/services/backup/restic-rest-server.nix+5−1 nixos/modules/services/backup/restic.nix+17−5 nixos/modules/services/backup/sanoid.nix+143−152 nixos/modules/services/backup/syncoid.nix+390−185 nixos/modules/services/backup/tarsnap.nix+25−18 nixos/modules/services/backup/tsm.nix+33−14 nixos/modules/services/backup/znapzend.nix+8−8 nixos/modules/services/backup/zrepl.nix+3 nixos/modules/services/blockchain/ethereum/geth.nix+3−2 nixos/modules/services/cluster/corosync/default.nix+112 nixos/modules/services/cluster/hadoop/conf.nix+25−12 nixos/modules/services/cluster/hadoop/default.nix+175−23 nixos/modules/services/cluster/hadoop/hdfs.nix+175−44 nixos/modules/services/cluster/hadoop/yarn.nix+155−29 nixos/modules/services/cluster/k3s/default.nix+27−13 nixos/modules/services/cluster/kubernetes/addon-manager.nix+7−3 nixos/modules/services/cluster/kubernetes/addons/dashboard.nix−332 nixos/modules/services/cluster/kubernetes/addons/dns.nix+50−15 nixos/modules/services/cluster/kubernetes/apiserver.nix+11−8 nixos/modules/services/cluster/kubernetes/controller-manager.nix+10−1 nixos/modules/services/cluster/kubernetes/default.nix+31−21 nixos/modules/services/cluster/kubernetes/flannel.nix+4−2 nixos/modules/services/cluster/kubernetes/kubelet.nix+14−3 nixos/modules/services/cluster/kubernetes/pki.nix+5−1 nixos/modules/services/cluster/kubernetes/proxy.nix+10−2 nixos/modules/services/cluster/kubernetes/scheduler.nix+10−3 nixos/modules/services/cluster/pacemaker/default.nix+52 nixos/modules/services/cluster/spark/default.nix+162 nixos/modules/services/computing/boinc/client.nix+2−2 nixos/modules/services/computing/foldingathome/client.nix+1−1 nixos/modules/services/computing/slurm/slurm.nix+18−9 nixos/modules/services/continuous-integration/buildbot/master.nix+11−8 nixos/modules/services/continuous-integration/buildbot/worker.nix+6−4 nixos/modules/services/continuous-integration/buildkite-agents.nix+4−3 nixos/modules/services/continuous-integration/github-runner.nix+58−37 nixos/modules/services/continuous-integration/gitlab-runner.nix+22−9 nixos/modules/services/continuous-integration/gocd-agent/default.nix+12−2 nixos/modules/services/continuous-integration/gocd-server/default.nix+17−2 nixos/modules/services/continuous-integration/hail.nix+1−1 nixos/modules/services/continuous-integration/hercules-ci-agent/common.nix+75−19 nixos/modules/services/continuous-integration/hercules-ci-agent/default.nix+4−4 nixos/modules/services/continuous-integration/hydra/default.nix+18−14 nixos/modules/services/continuous-integration/jenkins/default.nix+30−9 nixos/modules/services/continuous-integration/jenkins/job-builder.nix+2−2 nixos/modules/services/continuous-integration/jenkins/slave.nix+15−1 nixos/modules/services/databases/aerospike.nix+1−1 nixos/modules/services/databases/cassandra.nix+6−4 nixos/modules/services/databases/clickhouse.nix+13−4 nixos/modules/services/databases/cockroachdb.nix+38−30 nixos/modules/services/databases/couchdb.nix+22−5 nixos/modules/services/databases/firebird.nix+3−5 nixos/modules/services/databases/hbase.nix+39−17 nixos/modules/services/databases/influxdb.nix+4−4 nixos/modules/services/databases/influxdb2.nix+66 nixos/modules/services/databases/memcached.nix+2 nixos/modules/services/databases/monetdb.nix+1−1 nixos/modules/services/databases/mongodb.nix+4−2 nixos/modules/services/databases/mysql.nix+191−201 nixos/modules/services/databases/neo4j.nix+12−2 nixos/modules/services/databases/openldap.nix+7−6 nixos/modules/services/databases/opentsdb.nix+1−2 nixos/modules/services/databases/pgmanage.nix+1−1 nixos/modules/services/databases/postgresql.nix+13−10 nixos/modules/services/databases/postgresql.xml+54−32 nixos/modules/services/databases/redis.nix+275−222 nixos/modules/services/databases/riak.nix+1−2 nixos/modules/services/databases/victoriametrics.nix+9−1 nixos/modules/services/databases/virtuoso.nix−99 nixos/modules/services/desktops/bamf.nix+2−2 nixos/modules/services/desktops/cpupower-gui.nix+56 nixos/modules/services/desktops/espanso.nix−1 nixos/modules/services/desktops/flatpak.nix+2 nixos/modules/services/desktops/geoclue2.nix+4−4 nixos/modules/services/desktops/gnome/evolution-data-server.nix+1−1 nixos/modules/services/desktops/gnome/glib-networking.nix+1−1 nixos/modules/services/desktops/gnome/gnome-keyring.nix+3−1 nixos/modules/services/desktops/gnome/gnome-settings-daemon.nix+4−18 nixos/modules/services/desktops/gnome/tracker-miners.nix+2 nixos/modules/services/desktops/gnome/tracker.nix+24−1 nixos/modules/services/desktops/gsignond.nix+1−1 nixos/modules/services/desktops/gvfs.nix+3−2 nixos/modules/services/desktops/pantheon/files.nix−13 nixos/modules/services/desktops/pipewire/client-rt.conf.json → nixos/modules/services/desktops/pipewire/daemon/client-rt.conf.json+1−1 nixos/modules/services/desktops/pipewire/client.conf.json → nixos/modules/services/desktops/pipewire/daemon/client.conf.json nixos/modules/services/desktops/pipewire/daemon/jack.conf.json+38 nixos/modules/services/desktops/pipewire/daemon/minimal.conf.json+118 nixos/modules/services/desktops/pipewire/daemon/pipewire-pulse.conf.json+100 nixos/modules/services/desktops/pipewire/pipewire.conf.json → nixos/modules/services/desktops/pipewire/daemon/pipewire.conf.json+17−3 nixos/modules/services/desktops/pipewire/jack.conf.json−28 nixos/modules/services/desktops/pipewire/alsa-monitor.conf.json → nixos/modules/services/desktops/pipewire/media-session/alsa-monitor.conf.json nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json → nixos/modules/services/desktops/pipewire/media-session/bluez-monitor.conf.json nixos/modules/services/desktops/pipewire/media-session.conf.json → nixos/modules/services/desktops/pipewire/media-session/media-session.conf.json+1 nixos/modules/services/desktops/pipewire/v4l2-monitor.conf.json → nixos/modules/services/desktops/pipewire/media-session/v4l2-monitor.conf.json nixos/modules/services/desktops/pipewire/pipewire-media-session.nix+29−17 nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.json−41 nixos/modules/services/desktops/pipewire/pipewire.nix+73−13 nixos/modules/services/desktops/pipewire/wireplumber.nix+54 nixos/modules/services/desktops/tumbler.nix+2−2 nixos/modules/services/desktops/zeitgeist.nix+2−2 nixos/modules/services/development/blackfire.nix+4−9 nixos/modules/services/development/blackfire.xml+2−1 nixos/modules/services/development/distccd.nix+155 nixos/modules/services/development/hoogle.nix+5−4 nixos/modules/services/development/jupyter/default.nix+4−5 nixos/modules/services/development/jupyter/kernel-options.nix+4−4 nixos/modules/services/development/jupyterhub/default.nix+20−8 nixos/modules/services/development/lorri.nix+1−2 nixos/modules/services/development/rstudio-server/default.nix+107 nixos/modules/services/development/zammad.nix+323 nixos/modules/services/display-managers/greetd.nix+9−4 nixos/modules/services/editors/emacs.nix+1−1 nixos/modules/services/editors/haste.nix+86 nixos/modules/services/editors/infinoted.nix+2−2 nixos/modules/services/finance/odoo.nix+122 nixos/modules/services/games/asf.nix+236 nixos/modules/services/games/crossfire-server.nix+179 nixos/modules/services/games/deliantra-server.nix+172 nixos/modules/services/games/factorio.nix+14−5 nixos/modules/services/games/minecraft-server.nix+29−6 nixos/modules/services/games/quake3-server.nix+1 nixos/modules/services/games/terraria.nix+5−4 nixos/modules/services/hardware/acpid.nix+1−1 nixos/modules/services/hardware/actkbd.nix+2−2 nixos/modules/services/hardware/auto-cpufreq.nix+8−2 nixos/modules/services/hardware/bluetooth.nix+3−7 nixos/modules/services/hardware/ddccontrol.nix+39 nixos/modules/services/hardware/fancontrol.nix+1 nixos/modules/services/hardware/freefall.nix+1−1 nixos/modules/services/hardware/fwupd.nix+2−1 nixos/modules/services/hardware/interception-tools.nix+1 nixos/modules/services/hardware/joycond.nix+36 nixos/modules/services/hardware/lirc.nix+1−1 nixos/modules/services/hardware/pcscd.nix+2−2 nixos/modules/services/hardware/power-profiles-daemon.nix+2 nixos/modules/services/hardware/rasdaemon.nix+170 nixos/modules/services/hardware/sane.nix+28−2 nixos/modules/services/hardware/sane_extra_backends/brscan4.nix+4−4 nixos/modules/services/hardware/sane_extra_backends/brscan4_etc_files.nix+1−2 nixos/modules/services/hardware/sane_extra_backends/brscan5.nix+4−4 nixos/modules/services/hardware/spacenavd.nix−1 nixos/modules/services/hardware/tcsd.nix+7−5 nixos/modules/services/hardware/thermald.nix+4−2 nixos/modules/services/hardware/thinkfan.nix+2−2 nixos/modules/services/hardware/triggerhappy.nix+2−2 nixos/modules/services/hardware/udev.nix+127−24 nixos/modules/services/hardware/udisks2.nix+41 nixos/modules/services/hardware/undervolt.nix+2−4 nixos/modules/services/hardware/upower.nix+7−8 nixos/modules/services/hardware/usbrelayd.nix+44 nixos/modules/services/hardware/vdr.nix+2−2 nixos/modules/services/home-automation/home-assistant.nix+552 nixos/modules/services/misc/zigbee2mqtt.nix → nixos/modules/services/home-automation/zigbee2mqtt.nix+6−9 nixos/modules/services/logging/SystemdJournal2Gelf.nix+1 nixos/modules/services/logging/awstats.nix+4−4 nixos/modules/services/logging/filebeat.nix+253 nixos/modules/services/logging/fluentd.nix+1−1 nixos/modules/services/logging/graylog.nix+5−4 nixos/modules/services/logging/journalbeat.nix+4−17 nixos/modules/services/logging/journalwatch.nix+1 nixos/modules/services/logging/klogd.nix+6−34 nixos/modules/services/logging/logcheck.nix+6−2 nixos/modules/services/logging/logrotate.nix+267−33 nixos/modules/services/logging/logstash.nix+23−9 nixos/modules/services/logging/promtail.nix+5−1 nixos/modules/services/logging/syslog-ng.nix+2−2 nixos/modules/services/mail/davmail.nix+1−1 nixos/modules/services/mail/dovecot.nix+19−48 nixos/modules/services/mail/exim.nix+8−3 nixos/modules/services/mail/maddy.nix+273 nixos/modules/services/mail/mail.nix+2−1 nixos/modules/services/mail/mailman.nix+16−9 nixos/modules/services/mail/nullmailer.nix+1−1 nixos/modules/services/mail/offlineimap.nix+2−2 nixos/modules/services/mail/opendkim.nix+1 nixos/modules/services/mail/opensmtpd.nix+5−2 nixos/modules/services/mail/postfix.nix+32−22 nixos/modules/services/mail/postfixadmin.nix+199 nixos/modules/services/mail/roundcube.nix+5−4 nixos/modules/services/mail/rspamd.nix+9−11 nixos/modules/services/mail/sympa.nix+4−4 nixos/modules/services/misc/matrix-synapse-log_config.yaml → nixos/modules/services/matrix/matrix-synapse-log_config.yaml nixos/modules/services/matrix/matrix-synapse.nix+773 nixos/modules/services/misc/matrix-synapse.xml → nixos/modules/services/matrix/matrix-synapse.xml+18−17 nixos/modules/services/matrix/mjolnir.nix+242 nixos/modules/services/matrix/mjolnir.xml+134 nixos/modules/services/matrix/pantalaimon-options.nix+70 nixos/modules/services/matrix/pantalaimon.nix+70 nixos/modules/services/misc/airsonic.nix+32−8 nixos/modules/services/misc/ananicy.nix+107 nixos/modules/services/misc/ankisyncd.nix+1−1 nixos/modules/services/misc/apache-kafka.nix+5−3 nixos/modules/services/misc/autofs.nix+1−1 nixos/modules/services/misc/autorandr.nix+309−2 nixos/modules/services/misc/bees.nix+44−35 nixos/modules/services/misc/cfdyndns.nix+1−1 nixos/modules/services/misc/cgminer.nix+7−3 nixos/modules/services/misc/clipcat.nix+31 nixos/modules/services/misc/clipmenu.nix+1−1 nixos/modules/services/misc/confd.nix+1−1 nixos/modules/services/misc/couchpotato.nix−42 nixos/modules/services/misc/dendrite.nix+100−8 nixos/modules/services/misc/dictd.nix+2−2 nixos/modules/services/misc/disnix.nix+1−2 nixos/modules/services/misc/docker-registry.nix+3−1 nixos/modules/services/misc/dwm-status.nix+2−2 nixos/modules/services/misc/dysnomia.nix+6 nixos/modules/services/misc/etcd.nix+14−4 nixos/modules/services/misc/etebase-server.nix+4−4 nixos/modules/services/misc/ethminer.nix+4−4 nixos/modules/services/misc/exhibitor.nix+4−1 nixos/modules/services/misc/felix.nix+1−1 nixos/modules/services/misc/freeswitch.nix+4−5 nixos/modules/services/misc/gammu-smsd.nix+2−2 nixos/modules/services/misc/geoipupdate.nix+46−4 nixos/modules/services/misc/gitea.nix+52−36 nixos/modules/services/misc/gitit.nix+27−27 nixos/modules/services/misc/gitlab.nix+101−36 nixos/modules/services/misc/gitolite.nix+7−5 nixos/modules/services/misc/gitweb.nix+1 nixos/modules/services/misc/gogs.nix+4−1 nixos/modules/services/misc/gollum.nix+1 nixos/modules/services/misc/gpsd.nix+2−1 nixos/modules/services/misc/greenclip.nix+1−1 nixos/modules/services/misc/headphones.nix+3−1 nixos/modules/services/misc/heisenbridge.nix+222 nixos/modules/services/misc/home-assistant.nix−350 nixos/modules/services/misc/ihaskell.nix+4−3 nixos/modules/services/misc/input-remapper.nix+30 nixos/modules/services/misc/jackett.nix+1−1 nixos/modules/services/misc/jellyfin.nix+6−4 nixos/modules/services/misc/klipper.nix+70−12 nixos/modules/services/misc/leaps.nix+1−1 nixos/modules/services/misc/libreddit.nix+66 nixos/modules/services/misc/lidarr.nix+1−1 nixos/modules/services/misc/mame.nix+3−1 nixos/modules/services/misc/matrix-appservice-discord.nix+7−2 nixos/modules/services/misc/matrix-appservice-irc.nix+4−1 nixos/modules/services/misc/matrix-conduit.nix+149 nixos/modules/services/misc/matrix-synapse.nix−766 nixos/modules/services/misc/mautrix-facebook.nix+195 nixos/modules/services/misc/mautrix-telegram.nix+6−3 nixos/modules/services/misc/mbpfan.nix+59−61 nixos/modules/services/misc/mediatomb.nix+10−7 nixos/modules/services/misc/moonraker.nix+178 nixos/modules/services/misc/mwlib.nix−258 nixos/modules/services/misc/mx-puppet-discord.nix+122 nixos/modules/services/misc/n8n.nix+2−1 nixos/modules/services/misc/nitter.nix+358 nixos/modules/services/misc/nix-daemon.nix+509−283 nixos/modules/services/misc/nix-gc.nix+9−3 nixos/modules/services/misc/nix-optimise.nix+8−2 nixos/modules/services/misc/nix-ssh-serve.nix+10−2 nixos/modules/services/misc/nzbget.nix+36−18 nixos/modules/services/misc/nzbhydra2.nix+1−1 nixos/modules/services/misc/octoprint.nix+6−3 nixos/modules/services/misc/owncast.nix+98 nixos/modules/services/misc/packagekit.nix+4−2 nixos/modules/services/misc/paperless.nix+204−67 nixos/modules/services/misc/plex.nix+43−14 nixos/modules/services/misc/prowlarr.nix+41 nixos/modules/services/misc/redmine.nix+10−9 nixos/modules/services/misc/ripple-data-api.nix+3−1 nixos/modules/services/misc/rippled.nix+11−5 nixos/modules/services/misc/rmfakecloud.nix+147 nixos/modules/services/misc/safeeyes.nix+4 nixos/modules/services/misc/sickbeard.nix+6−3 nixos/modules/services/misc/signald.nix+105 nixos/modules/services/misc/snapper.nix+42−19 nixos/modules/services/misc/sourcehut/builds.nix+22−6 nixos/modules/services/misc/sourcehut/default.nix+1321−133 nixos/modules/services/misc/sourcehut/dispatch.nix+3−1 nixos/modules/services/misc/sourcehut/git.nix+6−3 nixos/modules/services/misc/sourcehut/hg.nix+3−1 nixos/modules/services/misc/sourcehut/hub.nix+3−1 nixos/modules/services/misc/sourcehut/lists.nix+3−1 nixos/modules/services/misc/sourcehut/man.nix+3−1 nixos/modules/services/misc/sourcehut/meta.nix+3−1 nixos/modules/services/misc/sourcehut/paste.nix+3−1 nixos/modules/services/misc/sourcehut/service.nix+370−61 nixos/modules/services/misc/sourcehut/sourcehut.xml+14−10 nixos/modules/services/misc/sourcehut/todo.nix+3−1 nixos/modules/services/misc/ssm-agent.nix+1−1 nixos/modules/services/misc/subsonic.nix+10−6 nixos/modules/services/misc/synergy.nix+21−1 nixos/modules/services/misc/taskserver/default.nix+15−10 nixos/modules/services/misc/taskserver/doc.xml+1−1 nixos/modules/services/misc/taskserver/helper-tool.py+5−5 nixos/modules/services/misc/tautulli.nix+1−1 nixos/modules/services/misc/tp-auto-kbbl.nix+58 nixos/modules/services/misc/uhub.nix+85−153 nixos/modules/services/misc/weechat.nix+9−5 nixos/modules/services/misc/xmr-stak.nix+1−1 nixos/modules/services/misc/xmrig.nix+76 nixos/modules/services/misc/zoneminder.nix+4−4 nixos/modules/services/misc/zookeeper.nix+12−3 nixos/modules/services/monitoring/alerta.nix−4 nixos/modules/services/monitoring/arbtt.nix+1−2 nixos/modules/services/monitoring/bosun.nix+1−2 nixos/modules/services/monitoring/cadvisor.nix+2 nixos/modules/services/monitoring/collectd.nix+56−28 nixos/modules/services/monitoring/datadog-agent.nix+9−7 nixos/modules/services/monitoring/grafana-reporter.nix+3−2 nixos/modules/services/monitoring/grafana.nix+41−5 nixos/modules/services/monitoring/graphite.nix+16−4 nixos/modules/services/monitoring/heapster.nix+4−2 nixos/modules/services/monitoring/incron.nix+7−2 nixos/modules/services/monitoring/kapacitor.nix+1−4 nixos/modules/services/monitoring/loki.nix+2−2 nixos/modules/services/monitoring/mackerel-agent.nix−1 nixos/modules/services/monitoring/metricbeat.nix+3−4 nixos/modules/services/monitoring/mimir.nix+63 nixos/modules/services/monitoring/munin.nix+7−5 nixos/modules/services/monitoring/nagios.nix+7−6 nixos/modules/services/monitoring/netdata.nix+82−42 nixos/modules/services/monitoring/parsedmarc.md+113 nixos/modules/services/monitoring/parsedmarc.nix+542 nixos/modules/services/monitoring/parsedmarc.xml+125 nixos/modules/services/monitoring/prometheus/alertmanager.nix+1−1 nixos/modules/services/monitoring/prometheus/default.nix+1263−386 nixos/modules/services/monitoring/prometheus/exporters.nix+32−4 nixos/modules/services/monitoring/prometheus/exporters.xml+21 nixos/modules/services/monitoring/prometheus/exporters/bird.nix+5−1 nixos/modules/services/monitoring/prometheus/exporters/buildkite-agent.nix+64 nixos/modules/services/monitoring/prometheus/exporters/dmarc.nix+117 nixos/modules/services/monitoring/prometheus/exporters/dovecot.nix+4 nixos/modules/services/monitoring/prometheus/exporters/fastly.nix+41 nixos/modules/services/monitoring/prometheus/exporters/flow.nix+1−1 nixos/modules/services/monitoring/prometheus/exporters/influxdb.nix+34 nixos/modules/services/monitoring/prometheus/exporters/kea.nix+10−1 nixos/modules/services/monitoring/prometheus/exporters/knot.nix+5−1 nixos/modules/services/monitoring/prometheus/exporters/mail.nix+1−1 nixos/modules/services/monitoring/prometheus/exporters/mikrotik.nix+2−2 nixos/modules/services/monitoring/prometheus/exporters/modemmanager.nix+4 nixos/modules/services/monitoring/prometheus/exporters/nginx.nix+5−5 nixos/modules/services/monitoring/prometheus/exporters/node.nix+11−2 nixos/modules/services/monitoring/prometheus/exporters/pihole.nix+2−2 nixos/modules/services/monitoring/prometheus/exporters/postfix.nix+3 nixos/modules/services/monitoring/prometheus/exporters/postgres.nix+4 nixos/modules/services/monitoring/prometheus/exporters/process.nix+6−8 nixos/modules/services/monitoring/prometheus/exporters/pve.nix+118 nixos/modules/services/monitoring/prometheus/exporters/rspamd.nix+2−2 nixos/modules/services/monitoring/prometheus/exporters/rtl_433.nix+5 nixos/modules/services/monitoring/prometheus/exporters/script.nix+1−1 nixos/modules/services/monitoring/prometheus/exporters/smartctl.nix+75 nixos/modules/services/monitoring/prometheus/exporters/smokeping.nix+1 nixos/modules/services/monitoring/prometheus/exporters/snmp.nix+7−9 nixos/modules/services/monitoring/prometheus/exporters/sql.nix+4 nixos/modules/services/monitoring/prometheus/exporters/systemd.nix+5−1 nixos/modules/services/monitoring/prometheus/exporters/unbound.nix+4 nixos/modules/services/monitoring/prometheus/exporters/varnish.nix+3−2 nixos/modules/services/monitoring/prometheus/exporters/wireguard.nix+5 nixos/modules/services/monitoring/prometheus/pushgateway.nix+1−1 nixos/modules/services/monitoring/scollector.nix+2−3 nixos/modules/services/monitoring/smartd.nix+6−1 nixos/modules/services/monitoring/teamviewer.nix+6−3 nixos/modules/services/monitoring/telegraf.nix+9−6 nixos/modules/services/monitoring/thanos.nix+8−5 nixos/modules/services/monitoring/tuptime.nix+1 nixos/modules/services/monitoring/unifi-poller.nix+80−4 nixos/modules/services/monitoring/uptime.nix+7−3 nixos/modules/services/monitoring/zabbix-agent.nix+9−6 nixos/modules/services/monitoring/zabbix-proxy.nix+18−7 nixos/modules/services/monitoring/zabbix-server.nix+17−6 nixos/modules/services/network-filesystems/ceph.nix+12−22 nixos/modules/services/network-filesystems/drbd.nix+5−7 nixos/modules/services/network-filesystems/glusterfs.nix+1−4 nixos/modules/services/network-filesystems/ipfs.nix+100−62 nixos/modules/services/network-filesystems/litestream/default.nix+100 nixos/modules/services/network-filesystems/litestream/litestream.xml+65 nixos/modules/services/network-filesystems/moosefs.nix+249 nixos/modules/services/network-filesystems/openafs/client.nix+7−8 nixos/modules/services/network-filesystems/openafs/server.nix+3−3 nixos/modules/services/network-filesystems/orangefs/client.nix−1 nixos/modules/services/network-filesystems/orangefs/server.nix+9−9 nixos/modules/services/network-filesystems/rsyncd.nix+1−1 nixos/modules/services/network-filesystems/samba.nix+17−6 nixos/modules/services/network-filesystems/tahoe.nix+2−4 nixos/modules/services/network-filesystems/webdav-server-rs.nix+144 nixos/modules/services/network-filesystems/webdav.nix+107 nixos/modules/services/network-filesystems/xtreemfs.nix+2−2 nixos/modules/services/networking/3proxy.nix+3−16 nixos/modules/services/networking/adguardhome.nix+67−5 nixos/modules/services/networking/amuled.nix+6−2 nixos/modules/services/networking/antennas.nix+80 nixos/modules/services/networking/asterisk.nix+13−45 nixos/modules/services/networking/atftpd.nix+1−1 nixos/modules/services/networking/autossh.nix+1−1 nixos/modules/services/networking/avahi-daemon.nix+5−5 nixos/modules/services/networking/babeld.nix+7−1 nixos/modules/services/networking/bee.nix+2−2 nixos/modules/services/networking/biboumi.nix+1 nixos/modules/services/networking/bind.nix+38−8 nixos/modules/services/networking/bird.nix+90−75 nixos/modules/services/networking/bitcoind.nix+2−2 nixos/modules/services/networking/bitlbee.nix+8−16 nixos/modules/services/networking/blockbook-frontend.nix+6−9 nixos/modules/services/networking/blocky.nix+40 nixos/modules/services/networking/charybdis.nix+8−1 nixos/modules/services/networking/cjdns.nix+3−3 nixos/modules/services/networking/cloudflare-dyndns.nix+93 nixos/modules/services/networking/connman.nix+6−4 nixos/modules/services/networking/consul.nix+40−10 nixos/modules/services/networking/coredns.nix+1−1 nixos/modules/services/networking/corerad.nix+4−4 nixos/modules/services/networking/coturn.nix+68−37 nixos/modules/services/networking/create_ap.nix+50 nixos/modules/services/networking/croc.nix+1−1 nixos/modules/services/networking/ddclient.nix+54−24 nixos/modules/services/networking/dhcpcd.nix+22−1 nixos/modules/services/networking/dhcpd.nix+49−50 nixos/modules/services/networking/dnscache.nix+1−1 nixos/modules/services/networking/dnscrypt-proxy2.nix+6−3 nixos/modules/services/networking/dnscrypt-wrapper.nix+2 nixos/modules/services/networking/dnsmasq.nix+3−1 nixos/modules/services/networking/doh-proxy-rust.nix+1−1 nixos/modules/services/networking/ejabberd.nix+2−2 nixos/modules/services/networking/envoy.nix+84 nixos/modules/services/networking/epmd.nix+17−3 nixos/modules/services/networking/ergo.nix+4−2 nixos/modules/services/networking/ergochat.nix+155 nixos/modules/services/networking/eternal-terminal.nix+2−2 nixos/modules/services/networking/ferm.nix+2−2 nixos/modules/services/networking/firefox/sync-server.nix−183 nixos/modules/services/networking/firewall.nix+8−9 nixos/modules/services/networking/flannel.nix+5−2 nixos/modules/services/networking/freeradius.nix+2 nixos/modules/services/networking/frr.nix+211 nixos/modules/services/networking/gale.nix−181 nixos/modules/services/networking/ghostunnel.nix+2−2 nixos/modules/services/networking/git-daemon.nix+2−1 nixos/modules/services/networking/globalprotect-vpn.nix+43 nixos/modules/services/networking/gnunet.nix+15−11 nixos/modules/services/networking/go-neb.nix+30−4 nixos/modules/services/networking/gobgpd.nix+1−1 nixos/modules/services/networking/gogoclient.nix−87 nixos/modules/services/networking/hans.nix+1−1 nixos/modules/services/networking/headscale.nix+490 nixos/modules/services/networking/https-dns-proxy.nix+128 nixos/modules/services/networking/hylafax/options.nix+11−13 nixos/modules/services/networking/i2pd.nix+19−12 nixos/modules/services/networking/icecream/daemon.nix+1−1 nixos/modules/services/networking/icecream/scheduler.nix+1−1 nixos/modules/services/networking/inspircd.nix+2−2 nixos/modules/services/networking/iodine.nix+2−1 nixos/modules/services/networking/ircd-hybrid/default.nix+2−2 nixos/modules/services/networking/iscsi/initiator.nix+1−1 nixos/modules/services/networking/iscsi/root-initiator.nix+9 nixos/modules/services/networking/iwd.nix+43−6 nixos/modules/services/networking/jibri/default.nix+417 nixos/modules/services/networking/jibri/logging.properties-journal+32 nixos/modules/services/networking/jicofo.nix+1−1 nixos/modules/services/networking/jitsi-videobridge.nix+5−3 nixos/modules/services/networking/kea.nix+449 nixos/modules/services/networking/keepalived/vrrp-instance-options.nix+1−3 nixos/modules/services/networking/keepalived/vrrp-script-options.nix+1−1 nixos/modules/services/networking/kippo.nix−117 nixos/modules/services/networking/knot.nix+43−8 nixos/modules/services/networking/kresd.nix+7−6 nixos/modules/services/networking/lambdabot.nix+1−1 nixos/modules/services/networking/libreswan.nix+2−2 nixos/modules/services/networking/lxd-image-server.nix+133 nixos/modules/services/networking/mailpile.nix−74 nixos/modules/services/networking/matterbridge.nix+3−3 nixos/modules/services/networking/minidlna.nix+1−1 nixos/modules/services/networking/miredo.nix+1−1 nixos/modules/services/networking/monero.nix+2−2 nixos/modules/services/networking/morty.nix+4−5 nixos/modules/services/networking/mosquitto.md+102 nixos/modules/services/networking/mosquitto.nix+541−175 nixos/modules/services/networking/mosquitto.xml+147 nixos/modules/services/networking/mozillavpn.nix+19 nixos/modules/services/networking/mtr-exporter.nix+87 nixos/modules/services/networking/mullvad-vpn.nix+5−1 nixos/modules/services/networking/multipath.nix+557 nixos/modules/services/networking/murmur.nix+4−4 nixos/modules/services/networking/mxisd.nix+1−1 nixos/modules/services/networking/namecoind.nix+1−1 nixos/modules/services/networking/nar-serve.nix+1−1 nixos/modules/services/networking/nat.nix+1−1 nixos/modules/services/networking/nats.nix+158 nixos/modules/services/networking/nbd.nix+159 nixos/modules/services/networking/ncdns.nix+6−3 nixos/modules/services/networking/ndppd.nix+1−1 nixos/modules/services/networking/nebula.nix+6−8 nixos/modules/services/networking/networkmanager.nix+86−61 nixos/modules/services/networking/nftables.nix+7−12 nixos/modules/services/networking/ngircd.nix+5−2 nixos/modules/services/networking/nix-serve.nix+20−10 nixos/modules/services/networking/nixops-dns.nix−1 nixos/modules/services/networking/nntp-proxy.nix+18−18 nixos/modules/services/networking/nomad.nix+20−7 nixos/modules/services/networking/nsd.nix+11−16 nixos/modules/services/networking/ntopng.nix+57−13 nixos/modules/services/networking/ntp/chrony.nix+22−12 nixos/modules/services/networking/ntp/ntpd.nix+8−7 nixos/modules/services/networking/ntp/openntpd.nix+4−1 nixos/modules/services/networking/nylon.nix+1−1 nixos/modules/services/networking/ofono.nix+1−1 nixos/modules/services/networking/onedrive.nix+1−2 nixos/modules/services/networking/openconnect.nix+137 nixos/modules/services/networking/openfire.nix−56 nixos/modules/services/networking/openvpn.nix+1−1 nixos/modules/services/networking/ostinato.nix+2−2 nixos/modules/services/networking/pdns-recursor.nix+13−8 nixos/modules/services/networking/pleroma.nix+12−4 nixos/modules/services/networking/pleroma.xml+177−121 nixos/modules/services/networking/powerdns.nix+2−2 nixos/modules/services/networking/pppd.nix+23−5 nixos/modules/services/networking/privoxy.nix+1−1 nixos/modules/services/networking/prosody.nix+3−2 nixos/modules/services/networking/prosody.xml+1−1 nixos/modules/services/networking/quassel.nix+6−3 nixos/modules/services/networking/quicktun.nix+1−1 nixos/modules/services/networking/quorum.nix+5−3 nixos/modules/services/networking/racoon.nix−45 nixos/modules/services/networking/radicale.nix+9−5 nixos/modules/services/networking/radvd.nix+4−1 nixos/modules/services/networking/rdnssd.nix+3−1 nixos/modules/services/networking/resilio.nix+1 nixos/modules/services/networking/sabnzbd.nix+8−1 nixos/modules/services/networking/seafile.nix+287 nixos/modules/services/networking/searx.nix+3−4 nixos/modules/services/networking/shadowsocks.nix+4−6 nixos/modules/services/networking/shairport-sync.nix+29−2 nixos/modules/services/networking/shellhub-agent.nix+26−17 nixos/modules/services/networking/shorewall.nix+1−1 nixos/modules/services/networking/shorewall6.nix+1−1 nixos/modules/services/networking/shout.nix+4−2 nixos/modules/services/networking/skydns.nix+2−1 nixos/modules/services/networking/smartdns.nix+2−1 nixos/modules/services/networking/smokeping.nix+61−21 nixos/modules/services/networking/sniproxy.nix+6−17 nixos/modules/services/networking/snowflake-proxy.nix+81 nixos/modules/services/networking/softether.nix+1−1 nixos/modules/services/networking/soju.nix+114 nixos/modules/services/networking/solanum.nix+10−2 nixos/modules/services/networking/spacecookie.nix+2−2 nixos/modules/services/networking/spiped.nix+1−1 nixos/modules/services/networking/squid.nix+23−4 nixos/modules/services/networking/ssh/sshd.nix+33−22 nixos/modules/services/networking/strongswan-swanctl/module.nix+1−1 nixos/modules/services/networking/strongswan-swanctl/swanctl-params.nix+10 nixos/modules/services/networking/strongswan.nix+2−2 nixos/modules/services/networking/stubby.nix+46−174 nixos/modules/services/networking/stunnel.nix+3−2 nixos/modules/services/networking/supplicant.nix+3−3 nixos/modules/services/networking/supybot.nix+4−3 nixos/modules/services/networking/syncplay.nix+19−3 nixos/modules/services/networking/syncthing.nix+372−308 nixos/modules/services/networking/tailscale.nix+20−3 nixos/modules/services/networking/teamspeak3.nix+20−2 nixos/modules/services/networking/tedicross.nix+1−1 nixos/modules/services/networking/teleport.nix+99 nixos/modules/services/networking/tetrd.nix+96 nixos/modules/services/networking/thelounge.nix+39−8 nixos/modules/services/networking/tinc.nix+11−8 nixos/modules/services/networking/tinydns.nix+5−1 nixos/modules/services/networking/tox-bootstrapd.nix+8−13 nixos/modules/services/networking/tox-node.nix+1−6 nixos/modules/services/networking/toxvpn.nix+4−2 nixos/modules/services/networking/trickster.nix+1−1 nixos/modules/services/networking/tvheadend.nix+3−1 nixos/modules/services/networking/ucarp.nix+183 nixos/modules/services/networking/unbound.nix+13−3 nixos/modules/services/networking/unifi.nix+80−60 nixos/modules/services/networking/v2ray.nix+15−7 nixos/modules/services/networking/vsftpd.nix+5−2 nixos/modules/services/networking/wakeonlan.nix−56 nixos/modules/services/networking/wasabibackend.nix+4−2 nixos/modules/services/networking/websockify.nix+1−1 nixos/modules/services/networking/wg-netmanager.nix+42 nixos/modules/services/networking/wg-quick.nix+12−13 nixos/modules/services/networking/wicd.nix−40 nixos/modules/services/networking/wireguard.nix+7−7 nixos/modules/services/networking/wpa_supplicant.nix+343−102 nixos/modules/programs/x2goserver.nix → nixos/modules/services/networking/x2goserver.nix+24−9 nixos/modules/services/networking/xandikos.nix+2−2 nixos/modules/services/networking/xrdp.nix+17−3 nixos/modules/services/networking/yggdrasil.nix+1−1 nixos/modules/services/networking/yggdrasil.xml−1 nixos/modules/services/networking/zeronet.nix+5−7 nixos/modules/services/networking/zerotierone.nix+1−2 nixos/modules/services/networking/znc/default.nix+5−5 nixos/modules/services/networking/znc/options.nix+6−6 nixos/modules/services/printing/cupsd.nix+1−1 nixos/modules/services/scheduling/atd.nix+3−1 nixos/modules/services/scheduling/cron.nix+7−2 nixos/modules/services/scheduling/fcron.nix+3 nixos/modules/services/search/elasticsearch.nix+43−12 nixos/modules/services/search/hound.nix+13−11 nixos/modules/services/search/kibana.nix+9−4 nixos/modules/services/search/meilisearch.md+39 nixos/modules/services/search/meilisearch.nix+132 nixos/modules/services/search/meilisearch.xml+85 nixos/modules/services/search/solr.nix+1−1 nixos/modules/services/security/aesmd.nix+236 nixos/modules/services/security/bitwarden_rs/default.nix−161 nixos/modules/services/security/certmgr.nix+2−2 nixos/modules/services/security/cfssl.nix+56−43 nixos/modules/services/security/clamav.nix+4−5 nixos/modules/services/security/fail2ban.nix+24−6 nixos/modules/services/security/fprintd.nix+2−2 nixos/modules/services/security/fprot.nix−82 nixos/modules/services/security/haka.nix+1−1 nixos/modules/services/security/haveged.nix+39−29 nixos/modules/services/security/hockeypuck.nix+106 nixos/modules/services/security/nginx-sso.nix+2−2 nixos/modules/services/security/oauth2_proxy.nix+10−5 nixos/modules/services/security/oauth2_proxy_nginx.nix+1 nixos/modules/services/security/opensnitch.nix+125 nixos/modules/services/security/physlock.nix+6−4 nixos/modules/services/security/privacyidea.nix+12−8 nixos/modules/services/security/shibboleth-sp.nix+1−1 nixos/modules/services/security/sks.nix+2−2 nixos/modules/services/security/sslmate-agent.nix+32 nixos/modules/services/security/step-ca.nix+13−1 nixos/modules/services/security/tor.nix+28−7 nixos/modules/services/security/torsocks.nix+1 nixos/modules/services/security/usbguard.nix+1−1 nixos/modules/services/security/vault.nix+8−2 nixos/modules/services/security/bitwarden_rs/backup.sh → nixos/modules/services/security/vaultwarden/backup.sh+1−1 nixos/modules/services/security/vaultwarden/default.nix+185 nixos/modules/services/security/yubikey-agent.nix+8−2 nixos/modules/services/system/cachix-agent/default.nix+57 nixos/modules/services/system/cloud-init.nix+15−1 nixos/modules/services/system/earlyoom.nix+134−97 nixos/modules/services/system/kerberos/heimdal.nix+1−1 nixos/modules/services/system/localtime.nix+2 nixos/modules/services/system/nscd.nix+20−9 nixos/modules/services/system/saslauthd.nix+1−1 nixos/modules/services/system/self-deploy.nix+3−2 nixos/modules/services/system/systembus-notify.nix+27 nixos/modules/services/system/uptimed.nix+7−3 nixos/modules/services/torrent/deluge.nix+9−2 nixos/modules/services/torrent/flexget.nix+1−1 nixos/modules/services/torrent/magnetico.nix+3−1 nixos/modules/services/torrent/opentracker.nix+1−1 nixos/modules/services/torrent/peerflix.nix+8−2 nixos/modules/services/torrent/rtorrent.nix+4−2 nixos/modules/services/torrent/transmission.nix+225−135 nixos/modules/services/ttys/getty.nix+20−14 nixos/modules/services/ttys/kmscon.nix+24−5 nixos/modules/services/video/epgstation/default.nix+192−153 nixos/modules/services/video/epgstation/streaming.json+129−108 nixos/modules/services/video/mirakurun.nix+5−5 nixos/modules/services/video/replay-sorcery.nix+72 nixos/modules/services/video/rtsp-simple-server.nix+80 nixos/modules/services/video/unifi-video.nix+271 nixos/modules/services/wayland/cage.nix+7−2 nixos/modules/services/web-apps/atlassian/confluence.nix+2−2 nixos/modules/services/web-apps/atlassian/crowd.nix+2−2 nixos/modules/services/web-apps/atlassian/jira.nix+3−2 nixos/modules/services/web-apps/baget.nix+170 nixos/modules/services/web-apps/bookstack.nix+154−73 nixos/modules/services/web-apps/code-server.nix+139 nixos/modules/services/web-apps/cryptpad.nix+2−2 nixos/modules/services/web-apps/dex.nix+118 nixos/modules/services/web-apps/discourse.nix+69−44 nixos/modules/services/web-apps/discourse.xml+44−12 nixos/modules/services/web-apps/documize.nix+1 nixos/modules/services/web-apps/dokuwiki.nix+325−274 nixos/modules/services/web-apps/engelsystem.nix+2−2 nixos/modules/services/web-apps/ethercalc.nix+62 nixos/modules/services/web-apps/fluidd.nix+66 nixos/modules/services/web-apps/galene.nix+36−2 nixos/modules/services/web-apps/gerrit.nix+4−1 nixos/modules/services/web-apps/hedgedoc.nix+72−8 nixos/modules/services/web-apps/hledger-web.nix+2−2 nixos/modules/services/web-apps/icingaweb2/icingaweb2.nix+19−1 nixos/modules/services/web-apps/ihatemoney/default.nix+17−2 nixos/modules/services/web-apps/invidious.nix+264 nixos/modules/services/web-apps/invoiceplane.nix+305 nixos/modules/services/web-apps/isso.nix+69 nixos/modules/services/web-apps/jirafeau.nix+10−6 nixos/modules/services/web-apps/jitsi-meet.nix+130−12 nixos/modules/services/web-apps/jitsi-meet.xml+2−2 nixos/modules/services/web-apps/keycloak.nix+546−599 nixos/modules/services/web-apps/keycloak.xml+65−69 nixos/modules/services/web-apps/lemmy.md+34 nixos/modules/services/web-apps/lemmy.nix+236 nixos/modules/services/web-apps/lemmy.xml+56 nixos/modules/services/web-apps/limesurvey.nix+5−5 nixos/modules/services/web-apps/mastodon.nix+50−11 nixos/modules/services/web-apps/matomo.nix+44−15 nixos/modules/services/web-apps/mattermost.nix+145−37 nixos/modules/services/web-apps/mediawiki.nix+6−5 nixos/modules/services/web-apps/miniflux.nix+49−29 nixos/modules/services/web-apps/moinmoin.nix−304 nixos/modules/services/web-apps/moodle.nix+7−7 nixos/modules/services/web-apps/netbox.nix+265 nixos/modules/services/web-apps/nextcloud.nix+376−101 nixos/modules/services/web-apps/nextcloud.xml+92−40 nixos/modules/services/web-apps/nexus.nix+22 nixos/modules/services/web-apps/nifi.nix+318 nixos/modules/services/web-apps/node-red.nix+149 nixos/modules/services/web-apps/openwebrx.nix+34 nixos/modules/services/web-apps/peertube.nix+475 nixos/modules/services/web-apps/pgpkeyserver-lite.nix+5−2 nixos/modules/services/web-apps/pict-rs.md+88 nixos/modules/services/web-apps/pict-rs.nix+50 nixos/modules/services/web-apps/pict-rs.xml+162 nixos/modules/services/web-apps/plantuml-server.nix+21−4 nixos/modules/services/web-apps/plausible.nix+54−35 nixos/modules/services/web-apps/powerdns-admin.nix+152 nixos/modules/services/web-apps/prosody-filer.nix+86 nixos/modules/services/web-apps/restya-board.nix+1−4 nixos/modules/services/web-apps/rss-bridge.nix+2−4 nixos/modules/services/web-apps/selfoss.nix−1 nixos/modules/services/web-apps/shiori.nix+1−1 nixos/modules/services/web-apps/timetagger.nix+80 nixos/modules/services/web-apps/trac.nix−79 nixos/modules/services/web-apps/tt-rss.nix+96−87 nixos/modules/services/web-apps/vikunja.nix+145 nixos/modules/services/web-apps/whitebophir.nix+1−1 nixos/modules/services/web-apps/wordpress.nix+172−60 nixos/modules/services/web-apps/youtrack.nix+3−2 nixos/modules/services/web-apps/zabbix.nix+12−5 nixos/modules/services/web-servers/agate.nix+148 nixos/modules/services/web-servers/apache-httpd/default.nix+46−30 nixos/modules/services/web-servers/apache-httpd/vhost-options.nix+26−6 nixos/modules/services/web-servers/caddy.nix−171 nixos/modules/services/web-servers/caddy/default.nix+339 nixos/modules/services/web-servers/caddy/vhost-options.nix+79 nixos/modules/services/web-servers/darkhttpd.nix+1−1 nixos/modules/services/web-servers/hydron.nix+1−1 nixos/modules/services/web-servers/lighttpd/cgit.nix+7−5 nixos/modules/services/web-servers/lighttpd/collectd.nix+5−1 nixos/modules/services/web-servers/lighttpd/default.nix+14−2 nixos/modules/services/web-servers/minio.nix+30−7 nixos/modules/services/web-servers/molly-brown.nix+1−1 nixos/modules/services/web-servers/nginx/default.nix+110−31 nixos/modules/services/web-servers/nginx/gitweb.nix+1−1 nixos/modules/services/web-servers/nginx/location-options.nix+2−2 nixos/modules/services/web-servers/nginx/vhost-options.nix+50−10 nixos/modules/services/web-servers/phpfpm/default.nix+5−5 nixos/modules/services/web-servers/pomerium.nix+7−3 nixos/modules/services/web-servers/shellinabox.nix−122 nixos/modules/services/web-servers/tomcat.nix+6−5 nixos/modules/services/web-servers/traefik.nix+3−3 nixos/modules/services/web-servers/trafficserver.nix−318 nixos/modules/services/web-servers/trafficserver/default.nix+310 nixos/modules/services/web-servers/trafficserver/ip_allow.json+36 nixos/modules/services/web-servers/trafficserver/logging.json+37 nixos/modules/services/web-servers/ttyd.nix+2−2 nixos/modules/services/web-servers/unit/default.nix+2−2 nixos/modules/services/web-servers/uwsgi.nix+10−12 nixos/modules/services/web-servers/varnish/default.nix+9−7 nixos/modules/services/web-servers/zope2.nix+6−2 nixos/modules/services/x11/clight.nix+8 nixos/modules/services/x11/desktop-managers/cde.nix+4−3 nixos/modules/services/x11/desktop-managers/cinnamon.nix+15−7 nixos/modules/services/x11/desktop-managers/default.nix+1−1 nixos/modules/services/x11/desktop-managers/enlightenment.nix+24−3 nixos/modules/services/x11/desktop-managers/gnome.nix+69−77 nixos/modules/services/x11/desktop-managers/gnome.xml−24 nixos/modules/services/x11/desktop-managers/kodi.nix+2−2 nixos/modules/services/x11/desktop-managers/lumina.nix+4 nixos/modules/services/x11/desktop-managers/lxqt.nix+12−3 nixos/modules/services/x11/desktop-managers/mate.nix+10−38 nixos/modules/services/x11/desktop-managers/none.nix+44−5 nixos/modules/services/x11/desktop-managers/pantheon.nix+37−22 nixos/modules/services/x11/desktop-managers/pantheon.xml+11−5 nixos/modules/services/x11/desktop-managers/plasma5.nix+330−130 nixos/modules/services/x11/desktop-managers/retroarch.nix+40 nixos/modules/services/x11/desktop-managers/surf-display.nix+2−1 nixos/modules/services/x11/desktop-managers/xfce.nix+10−3 nixos/modules/services/x11/desktop-managers/xterm.nix+2−2 nixos/modules/services/x11/display-managers/account-service-util.nix+1−1 nixos/modules/services/x11/display-managers/default.nix+16−12 nixos/modules/services/x11/display-managers/gdm.nix+45−56 nixos/modules/services/x11/display-managers/lightdm-greeters/enso-os.nix+3−3 nixos/modules/services/x11/display-managers/lightdm-greeters/gtk.nix+3−3 nixos/modules/services/x11/display-managers/lightdm-greeters/pantheon.nix+2−2 nixos/modules/services/x11/display-managers/lightdm.nix+8−6 nixos/modules/services/x11/display-managers/sddm.nix+10−9 nixos/modules/services/x11/display-managers/set-session.py+3 nixos/modules/services/x11/display-managers/startx.nix−3 nixos/modules/services/x11/display-managers/sx.nix+34 nixos/modules/services/x11/extra-layouts.nix+9−48 nixos/modules/services/x11/hardware/libinput.nix+41−25 nixos/modules/services/x11/hardware/synaptics.nix+6−1 nixos/modules/services/x11/imwheel.nix+11−9 nixos/modules/services/x11/picom.nix+13−3 nixos/modules/services/x11/redshift.nix+1−1 nixos/modules/services/x11/touchegg.nix+38 nixos/modules/services/x11/unclutter-xfixes.nix+1−1 nixos/modules/services/x11/unclutter.nix+1−1 nixos/modules/services/x11/urxvtd.nix+1−1 nixos/modules/services/x11/window-managers/awesome.nix+1−1 nixos/modules/services/x11/window-managers/bspwm.nix+6−6 nixos/modules/services/x11/window-managers/clfswm.nix+13−3 nixos/modules/services/x11/window-managers/default.nix+1 nixos/modules/services/x11/window-managers/exwm.nix+4−3 nixos/modules/services/x11/window-managers/fvwm.nix+1−1 nixos/modules/services/x11/window-managers/herbstluftwm.nix+1−1 nixos/modules/services/x11/window-managers/i3.nix+3−3 nixos/modules/services/x11/window-managers/mlvwm.nix+41 nixos/modules/services/x11/window-managers/qtile.nix+11−4 nixos/modules/services/x11/window-managers/wmderland.nix+1−1 nixos/modules/services/x11/window-managers/xmonad.nix+51−15 nixos/modules/services/x11/xautolock.nix+4−3 nixos/modules/services/x11/xserver.nix+77−40 nixos/modules/system/activation/activation-script.nix+77−46 nixos/modules/system/activation/switch-to-configuration.pl+697−254 nixos/modules/system/activation/top-level.nix+100−35 nixos/modules/system/boot/binfmt.nix+52−10 nixos/modules/system/boot/initrd-openvpn.nix+1−1 nixos/modules/system/boot/initrd-ssh.nix+1−1 nixos/modules/system/boot/kernel.nix+16−13 nixos/modules/system/boot/kernel_config.nix+1−1 nixos/modules/system/boot/kexec.nix+3−3 nixos/modules/system/boot/loader/generic-extlinux-compatible/default.nix+18−1 nixos/modules/system/boot/loader/generic-extlinux-compatible/extlinux-conf-builder.sh+9−3 nixos/modules/system/boot/loader/grub/grub.nix+36−7 nixos/modules/system/boot/loader/grub/install-grub.pl+115−86 nixos/modules/system/boot/loader/grub/ipxe.nix+1−1 nixos/modules/system/boot/loader/systemd-boot/systemd-boot-builder.py+102−60 nixos/modules/system/boot/loader/systemd-boot/systemd-boot.nix+152−3 nixos/modules/system/boot/luksroot.nix+77−9 nixos/modules/system/boot/modprobe.nix+2 nixos/modules/system/boot/networkd.nix+328−14 nixos/modules/system/boot/plymouth.nix+9−2 nixos/modules/system/boot/resolved.nix+3−1 nixos/modules/system/boot/stage-1-init.sh+41−40 nixos/modules/system/boot/stage-1.nix+92−23 nixos/modules/system/boot/stage-2-init.sh+71−100 nixos/modules/system/boot/stage-2.nix+2−39 nixos/modules/system/boot/systemd-lib.nix−237 nixos/modules/system/boot/systemd-nspawn.nix−133 nixos/modules/system/boot/systemd-unit-options.nix−536 nixos/modules/system/boot/systemd.nix+87−673 nixos/modules/system/boot/systemd/coredump.nix+57 nixos/modules/system/boot/systemd/initrd-secrets.nix+36 nixos/modules/system/boot/systemd/initrd.nix+502 nixos/modules/system/boot/systemd/journald.nix+131 nixos/modules/system/boot/systemd/logind.nix+114 nixos/modules/system/boot/systemd/nspawn.nix+131 nixos/modules/system/boot/systemd/shutdown.nix+58 nixos/modules/system/boot/systemd/tmpfiles.nix+120 nixos/modules/system/boot/systemd/user.nix+153 nixos/modules/system/boot/timesyncd.nix+19−5 nixos/modules/system/boot/tmp.nix+20−2 nixos/modules/system/build.nix+21 nixos/modules/system/etc/etc-activation.nix+12 nixos/modules/system/etc/etc.nix+60−21 nixos/modules/system/etc/make-etc.sh−45 nixos/modules/system/etc/setup-etc.pl+6 nixos/modules/system/etc/test.nix+70 nixos/modules/tasks/auto-upgrade.nix+105−20 nixos/modules/tasks/bcache.nix+16−6 nixos/modules/tasks/encrypted-devices.nix+1−1 nixos/modules/tasks/filesystems.nix+72−17 nixos/modules/tasks/filesystems/apfs.nix+22 nixos/modules/tasks/filesystems/btrfs.nix+14−5 nixos/modules/tasks/filesystems/cifs.nix+1−1 nixos/modules/tasks/filesystems/ecryptfs.nix+12−2 nixos/modules/tasks/filesystems/exfat.nix+5−3 nixos/modules/tasks/filesystems/ext.nix+10−4 nixos/modules/tasks/filesystems/f2fs.nix+1−1 nixos/modules/tasks/filesystems/jfs.nix+1−1 nixos/modules/tasks/filesystems/nfs.nix+1−1 nixos/modules/tasks/filesystems/reiserfs.nix+1−1 nixos/modules/tasks/filesystems/unionfs-fuse.nix+13−2 nixos/modules/tasks/filesystems/vfat.nix+1−1 nixos/modules/tasks/filesystems/xfs.nix+2−2 nixos/modules/tasks/filesystems/zfs.nix+85−7 nixos/modules/tasks/lvm.nix+73−14 nixos/modules/tasks/network-interfaces-scripted.nix+71 nixos/modules/tasks/network-interfaces-systemd.nix+115−5 nixos/modules/tasks/network-interfaces.nix+251−34 nixos/modules/tasks/snapraid.nix+230 nixos/modules/tasks/swraid.nix+35−9 nixos/modules/tasks/trackpoint.nix+5−4 nixos/modules/testing/test-instrumentation.nix+32−32 nixos/modules/virtualisation/amazon-ec2-amis.nix+444 nixos/modules/virtualisation/amazon-image.nix+33−10 nixos/modules/virtualisation/amazon-options.nix+54−1 nixos/modules/virtualisation/anbox.nix+1−1 nixos/modules/virtualisation/azure-agent.nix+6−10 nixos/modules/virtualisation/azure-common.nix+5−1 nixos/modules/virtualisation/build-vm.nix+58 nixos/modules/virtualisation/container-config.nix+1−1 nixos/modules/virtualisation/containerd.nix+7−2 nixos/modules/virtualisation/containers.nix+4−4 nixos/modules/virtualisation/cri-o.nix+52−33 nixos/modules/virtualisation/digital-ocean-init.nix+1−1 nixos/modules/virtualisation/docker-rootless.nix+102 nixos/modules/virtualisation/docker.nix+32−8 nixos/modules/virtualisation/ec2-amis.nix+9−371 nixos/modules/virtualisation/ecs-agent.nix+1−1 nixos/modules/virtualisation/fetch-instance-ssh-keys.bash−36 nixos/modules/virtualisation/google-compute-config.nix+32−103 nixos/modules/virtualisation/google-compute-image.nix+10−1 nixos/modules/virtualisation/hyperv-guest.nix+1−1 nixos/modules/virtualisation/kubevirt.nix+30 nixos/modules/virtualisation/kvmgt.nix+1−1 nixos/modules/virtualisation/libvirtd.nix+166−67 nixos/modules/virtualisation/lxc-container.nix+161−13 nixos/modules/virtualisation/lxd.nix+5−5 nixos/modules/virtualisation/nixos-containers.nix+31−16 nixos/modules/virtualisation/oci-containers.nix+48−20 nixos/modules/virtualisation/openstack-config.nix+39−7 nixos/modules/virtualisation/openstack-metadata-fetcher.nix+5−4 nixos/modules/virtualisation/openstack-options.nix+71 nixos/modules/virtualisation/openvswitch.nix+9−54 nixos/modules/virtualisation/parallels-guest.nix+1−2 nixos/modules/virtualisation/podman-network-socket.nix−91 nixos/modules/virtualisation/podman.nix−184 nixos/modules/virtualisation/podman/default.nix+187 nixos/modules/virtualisation/podman-dnsname.nix → nixos/modules/virtualisation/podman/dnsname.nix nixos/modules/virtualisation/podman-network-socket-ghostunnel.nix → nixos/modules/virtualisation/podman/network-socket-ghostunnel.nix nixos/modules/virtualisation/podman/network-socket.nix+95 nixos/modules/virtualisation/proxmox-image.nix+169 nixos/modules/virtualisation/proxmox-lxc.nix+64 nixos/modules/virtualisation/qemu-guest-agent.nix+2−1 nixos/modules/virtualisation/qemu-vm.nix+366−89 nixos/modules/virtualisation/railcar.nix+3−4 nixos/modules/virtualisation/spice-usb-redirection.nix+4−2 nixos/modules/virtualisation/virtualbox-guest.nix+2−2 nixos/modules/virtualisation/virtualbox-host.nix+10−2 nixos/modules/virtualisation/virtualbox-image.nix+22−2 nixos/modules/virtualisation/vmware-guest.nix+27−1 nixos/modules/virtualisation/vmware-host.nix+166 nixos/modules/virtualisation/waydroid.nix+75 nixos/modules/virtualisation/xen-dom0.nix+4−5 nixos/release-combined.nix+4−2 nixos/release-small.nix+4−2 nixos/release.nix+47−2 nixos/tests/acme.nix+372−206 nixos/tests/adguardhome.nix+57 nixos/tests/aesmd.nix+62 nixos/tests/agda.nix+2−5 nixos/tests/airsonic.nix+1−5 nixos/tests/all-terminfo.nix+31 nixos/tests/all-tests.nix+184−38 nixos/tests/amazon-init-shell.nix+1−1 nixos/tests/ammonite.nix−20 nixos/tests/apfs.nix+54 nixos/tests/apparmor.nix+1−1 nixos/tests/atd.nix+1−1 nixos/tests/atop.nix+6−16 nixos/tests/avahi.nix+1−1 nixos/tests/awscli.nix−17 nixos/tests/bat.nix−12 nixos/tests/bazarr.nix+1−1 nixos/tests/bcachefs.nix+8−9 nixos/tests/beanstalkd.nix+1−1 nixos/tests/bees.nix+1−1 nixos/tests/bind.nix+1−1 nixos/tests/bird.nix+129 nixos/tests/bitcoind.nix+1−1 nixos/tests/bittorrent.nix+1−1 nixos/tests/bitwarden.nix−189 nixos/tests/blockbook-frontend.nix+1−1 nixos/tests/blocky.nix+34 nixos/tests/boot-stage1.nix+3−1 nixos/tests/boot.nix+61−18 nixos/tests/borgbackup.nix+34−1 nixos/tests/botamusique.nix+4 nixos/tests/bpf.nix+29 nixos/tests/breitbandmessung.nix+33 nixos/tests/brscan5.nix+2−1 nixos/tests/btrbk.nix+110 nixos/tests/buildkite-agents.nix+1−1 nixos/tests/caddy.nix+56−40 nixos/tests/cage.nix+1−2 nixos/tests/cagebreak.nix+1−2 nixos/tests/calibre-web.nix−10 nixos/tests/cassandra.nix−1 nixos/tests/ceph-multi-node.nix+1−2 nixos/tests/ceph-single-node-bluestore.nix−1 nixos/tests/ceph-single-node.nix−1 nixos/tests/cfssl.nix+1−1 nixos/tests/chromium.nix+80−78 nixos/tests/cifs-utils.nix−12 nixos/tests/clickhouse.nix+1−1 nixos/tests/cloud-init.nix+27−2 nixos/tests/cntr.nix+75 nixos/tests/collectd.nix+38 nixos/tests/common/acme/client/default.nix+4−2 nixos/tests/common/acme/server/default.nix+5 nixos/tests/common/ec2.nix+1 nixos/tests/common/lxd/config.yaml+24 nixos/tests/common/wayland-cage.nix+13 nixos/tests/containers-bridge.nix+2−3 nixos/tests/containers-custom-pkgs.nix+1−1 nixos/tests/containers-ephemeral.nix+4−5 nixos/tests/containers-extra_veth.nix+2−3 nixos/tests/containers-hosts.nix+1−2 nixos/tests/containers-imperative.nix+11−12 nixos/tests/containers-ip.nix+2−3 nixos/tests/containers-macvlans.nix−2 nixos/tests/containers-names.nix+1−1 nixos/tests/containers-nested.nix+1−1 nixos/tests/containers-physical_interfaces.nix−4 nixos/tests/containers-portforward.nix+2−3 nixos/tests/containers-tmpfs.nix+7−8 nixos/tests/coturn.nix+29 nixos/tests/couchdb.nix+3 nixos/tests/cri-o.nix+1−1 nixos/tests/croc.nix+1−1 nixos/tests/cryptpad.nix+18 nixos/tests/custom-ca.nix+104−79 nixos/tests/deluge.nix+11−57 nixos/tests/dex-oidc.nix+78 nixos/tests/disable-installer-tools.nix+29 nixos/tests/discourse.nix+4−2 nixos/tests/dnsdist.nix+48 nixos/tests/doas.nix+16−1 nixos/tests/docker-rootless.nix+41 nixos/tests/docker-tools-cross.nix+2−2 nixos/tests/docker-tools.nix+47−6 nixos/tests/documize.nix+1−1 nixos/tests/doh-proxy-rust.nix+1−1 nixos/tests/dokuwiki.nix+60−25 nixos/tests/domination.nix+26 nixos/tests/dovecot.nix+1−1 nixos/tests/drbd.nix+87 nixos/tests/earlyoom.nix+16 nixos/tests/ec2.nix+5 nixos/tests/ecryptfs.nix+1−1 nixos/tests/elk.nix+98−45 nixos/tests/emacs-daemon.nix+2−2 nixos/tests/empty-file nixos/tests/enlightenment.nix+4−5 nixos/tests/env.nix+1−1 nixos/tests/envoy.nix+33 nixos/tests/ergochat.nix+97 nixos/tests/etebase-server.nix+1−1 nixos/tests/etesync-dav.nix+2−2 nixos/tests/fancontrol.nix+1−1 nixos/tests/fcitx/default.nix+1−2 nixos/tests/fenics.nix+1−2 nixos/tests/firefox.nix+9−11 nixos/tests/fish.nix+1−1 nixos/tests/fluentd.nix+1−1 nixos/tests/fluidd.nix+21 nixos/tests/fontconfig-default-fonts.nix+1−1 nixos/tests/frr.nix+104 nixos/tests/fsck.nix+1−1 nixos/tests/ft2-clone.nix+2−2 nixos/tests/gerrit.nix−1 nixos/tests/geth.nix+2−2 nixos/tests/ghostunnel.nix+2−3 nixos/tests/gitlab.nix+311−27 nixos/tests/gitolite-fcgiwrap.nix+2−2 nixos/tests/gnome-xorg.nix+17−2 nixos/tests/gnome.nix+17−2 nixos/tests/go-neb.nix+6−6 nixos/tests/google-oslogin/default.nix+2−2 nixos/tests/google-oslogin/server.nix+2−4 nixos/tests/google-oslogin/server.py nixos/tests/gotify-server.nix+1−1 nixos/tests/graphite.nix−1 nixos/tests/graylog.nix+2−2 nixos/tests/grocy.nix+2−2 nixos/tests/grub.nix+1−1 nixos/tests/hadoop/default.nix+7 nixos/tests/hadoop/hadoop.nix+255 nixos/tests/hadoop/hdfs.nix+57−27 nixos/tests/hadoop/yarn.nix+22−23 nixos/tests/handbrake.nix−31 nixos/tests/haproxy.nix−1 nixos/tests/hardened.nix+6−31 nixos/tests/haste-server.nix+23 nixos/tests/hbase.nix+30 nixos/tests/herbstluftwm.nix+1−2 nixos/tests/hibernate.nix+21−8 nixos/tests/hitch/default.nix+1−1 nixos/tests/hocker-fetchdocker/default.nix+1−1 nixos/tests/hockeypuck.nix+63 nixos/tests/home-assistant.nix+85−34 nixos/tests/hostname.nix+1−1 nixos/tests/hound.nix+1−1 nixos/tests/hydra/common.nix+1−1 nixos/tests/hydra/default.nix+2−2 nixos/tests/i3wm.nix+1−1 nixos/tests/ihatemoney.nix−62 nixos/tests/ihatemoney/default.nix+78 nixos/tests/ihatemoney/rates.json+39 nixos/tests/ihatemoney/server.crt+28 nixos/tests/ihatemoney/server.key+52 nixos/tests/incron.nix+1−1 nixos/tests/initrd-network.nix+1−1 nixos/tests/initrd-secrets.nix+9−3 nixos/tests/input-remapper.nix+52 nixos/tests/installed-tests/appstream-qt.nix+9 nixos/tests/installed-tests/appstream.nix+9 nixos/tests/installed-tests/default.nix+4−1 nixos/tests/installed-tests/flatpak.nix+1 nixos/tests/installed-tests/fwupd.nix−1 nixos/tests/installed-tests/gjs.nix+6 nixos/tests/installed-tests/power-profiles-daemon.nix+9 nixos/tests/installer-systemd-stage-1.nix+33 nixos/tests/installer.nix+44−37 nixos/tests/invidious.nix+81 nixos/tests/invoiceplane.nix+82 nixos/tests/ipfs.nix+5 nixos/tests/iscsi-multipath-root.nix+267 nixos/tests/iscsi-root.nix+5−5 nixos/tests/isso.nix+30 nixos/tests/jellyfin.nix+1−1 nixos/tests/jenkins-cli.nix+30 nixos/tests/jenkins.nix+85−2 nixos/tests/jibri.nix+69 nixos/tests/jitsi-meet.nix+2−8 nixos/tests/k3s-single-node-docker.nix+84 nixos/tests/k3s-single-node.nix+82 nixos/tests/k3s.nix−78 nixos/tests/kafka.nix+2−4 nixos/tests/kbd-setfont-decompress.nix+21 nixos/tests/kbd-update-search-paths-patch.nix+19 nixos/tests/kea.nix+73 nixos/tests/keepassxc.nix+43−9 nixos/tests/kerberos/heimdal.nix+2−2 nixos/tests/kerberos/mit.nix+1−1 nixos/tests/kernel-generic.nix+18−15 nixos/tests/kernel-latest-ath-user-regd.nix+1−1 nixos/tests/kexec.nix+44−19 nixos/tests/keycloak.nix+33−14 nixos/tests/keymap.nix+1−1 nixos/tests/knot.nix+6 nixos/tests/krb5/deprecated-config.nix+1−1 nixos/tests/krb5/example-config.nix+1−1 nixos/tests/ksm.nix+1−1 nixos/tests/kubernetes/base.nix+3−4 nixos/tests/kubernetes/default.nix+13−5 nixos/tests/kubernetes/dns.nix+3−3 nixos/tests/kubernetes/e2e.nix+1−1 nixos/tests/kubernetes/rbac.nix+9−9 nixos/tests/libinput.nix+38 nixos/tests/libreddit.nix+19 nixos/tests/libresprite.nix+30 nixos/tests/libreswan.nix+1−1 nixos/tests/lightdm.nix+1−1 nixos/tests/limesurvey.nix+1−1 nixos/tests/litestream.nix+93 nixos/tests/login.nix+1−1 nixos/tests/logrotate.nix+152 nixos/tests/loki.nix+1−1 nixos/tests/lorri/default.nix+1−1 nixos/tests/lsd.nix−12 nixos/tests/lvm2/default.nix+45 nixos/tests/lvm2/systemd-stage-1.nix+104 nixos/tests/lvm2/thinpool.nix+32 nixos/tests/lvm2/vdo.nix+27 nixos/tests/lxd-image-server.nix+94 nixos/tests/lxd-nftables.nix+1−1 nixos/tests/lxd.nix+41−68 nixos/tests/maddy.nix+58 nixos/tests/maestral.nix+72 nixos/tests/magic-wormhole-mailbox-server.nix+1−1 nixos/tests/magnetico.nix+1−1 nixos/tests/mailcatcher.nix+8−3 nixos/tests/mailhog.nix+1−1 nixos/tests/man.nix+100 nixos/tests/matomo.nix+1−1 nixos/tests/matrix-appservice-irc.nix+125−63 nixos/tests/matrix-conduit.nix+95 nixos/tests/matrix-synapse.nix+140−9 nixos/tests/matrix/mjolnir.nix+170 nixos/tests/matrix/pantalaimon.nix+88 nixos/tests/mattermost.nix+124 nixos/tests/mediawiki.nix+1−1 nixos/tests/meilisearch.nix+60 nixos/tests/memcached.nix+1−1 nixos/tests/metabase.nix−1 nixos/tests/minecraft.nix+1−1 nixos/tests/minidlna.nix+4−2 nixos/tests/miniflux.nix+19−7 nixos/tests/minio.nix+4−1 nixos/tests/misc.nix+7−6 nixos/tests/mod_perl.nix+53 nixos/tests/moinmoin.nix−28 nixos/tests/mongodb.nix+4 nixos/tests/moodle.nix+1−1 nixos/tests/moonraker.nix+45 nixos/tests/moosefs.nix+89 nixos/tests/mosquitto.nix+166−51 nixos/tests/mpd.nix+1−1 nixos/tests/mpv.nix+28 nixos/tests/mtp.nix+109 nixos/tests/mumble.nix+2−2 nixos/tests/musescore.nix+2−2 nixos/tests/mutable-users.nix+28 nixos/tests/mysql/common.nix+10 nixos/tests/mysql/mariadb-galera-mariabackup.nix−223 nixos/tests/mysql/mariadb-galera-rsync.nix−216 nixos/tests/mysql/mariadb-galera.nix+250 nixos/tests/mysql/mysql-autobackup.nix+48−33 nixos/tests/mysql/mysql-backup.nix+60−44 nixos/tests/mysql/mysql-replication.nix+84−74 nixos/tests/mysql/mysql.nix+134−174 nixos/tests/nagios.nix+1−1 nixos/tests/nano.nix−44 nixos/tests/nar-serve.nix+1−1 nixos/tests/nats.nix+63 nixos/tests/navidrome.nix+12 nixos/tests/nbd.nix+103 nixos/tests/ncdns.nix+6−9 nixos/tests/networking-proxy.nix−1 nixos/tests/networking.nix+223−14 nixos/tests/nextcloud/basic.nix+13−3 nixos/tests/nextcloud/default.nix+20−8 nixos/tests/nextcloud/with-mysql-and-memcached.nix+8−18 nixos/tests/nextcloud/with-postgresql-and-redis.nix+5−2 nixos/tests/nexus.nix+1−1 nixos/tests/nfs/simple.nix+1−1 nixos/tests/nginx-etag.nix+1−2 nixos/tests/nginx-modsecurity.nix+39 nixos/tests/nginx-pubhtml.nix+1−1 nixos/tests/nginx-sandbox.nix+1−1 nixos/tests/nginx-sso.nix+1−1 nixos/tests/nginx-variants.nix+2−2 nixos/tests/nitter.nix+18 nixos/tests/nix-ld.nix+20 nixos/tests/nix-serve-ssh.nix+45 nixos/tests/nix-serve.nix+22 nixos/tests/nix-ssh-serve.nix−45 nixos/tests/nixops/default.nix+114 nixos/tests/nixops/legacy/base-configuration.nix+31 nixos/tests/nixops/legacy/nixops.nix+15 nixos/tests/nixos-generate-config.nix+1−1 nixos/tests/node-red.nix+31 nixos/tests/noto-fonts.nix+44 nixos/tests/novacomd.nix+1−1 nixos/tests/nsd.nix+1 nixos/tests/nzbget.nix+17−1 nixos/tests/odoo.nix+27 nixos/tests/oh-my-zsh.nix+1−1 nixos/tests/openarena.nix+2−2 nixos/tests/openldap.nix+3−3 nixos/tests/openresty-lua.nix+55 nixos/tests/opensmtpd-rspamd.nix−1 nixos/tests/openssh.nix+12−6 nixos/tests/opentabletdriver.nix+1−1 nixos/tests/os-prober.nix+10−10 nixos/tests/osrm-backend.nix+1−1 nixos/tests/overlayfs.nix+28−31 nixos/tests/owncast.nix+42 nixos/tests/pacemaker.nix+110 nixos/tests/packagekit.nix+1−1 nixos/tests/pam/pam-file-contents.nix+25 nixos/tests/pam-oath-login.nix → nixos/tests/pam/pam-oath-login.nix+3−3 nixos/tests/pam-u2f.nix → nixos/tests/pam/pam-u2f.nix+2−2 nixos/tests/pam/pam-ussh.nix+70 nixos/tests/pam/test_chfn.py+27 nixos/tests/pantheon.nix+7−8 nixos/tests/paperless.nix+25−17 nixos/tests/parsedmarc/default.nix+235 nixos/tests/pdns-recursor.nix+4−1 nixos/tests/pgadmin4-standalone.nix+43 nixos/tests/pgadmin4.nix+132 nixos/tests/php/default.nix+3−2 nixos/tests/php/fpm.nix+18−16 nixos/tests/php/httpd.nix+11−9 nixos/tests/php/pcre.nix+12−10 nixos/tests/pict-rs.nix+17 nixos/tests/plasma5-systemd-start.nix+42 nixos/tests/plasma5.nix+5−6 nixos/tests/plausible.nix+4−1 nixos/tests/pleroma.nix+4−20 nixos/tests/plikd.nix+1−1 nixos/tests/plotinus.nix+2−2 nixos/tests/podman-dnsname.nix−42 nixos/tests/podman-tls-ghostunnel.nix−150 nixos/tests/podman.nix−144 nixos/tests/podman/default.nix+144 nixos/tests/podman/dnsname.nix+42 nixos/tests/podman/tls-ghostunnel.nix+150 nixos/tests/postfix-raise-smtpd-tls-security-level.nix+1−1 nixos/tests/postfix.nix+1−1 nixos/tests/postfixadmin.nix+31 nixos/tests/postgresql-wal-receiver.nix+1−1 nixos/tests/postgresql.nix+50−3 nixos/tests/power-profiles-daemon.nix+1−1 nixos/tests/powerdns-admin.nix+117 nixos/tests/powerdns.nix+1 nixos/tests/predictable-interface-names.nix+1−1 nixos/tests/printing.nix+2−10 nixos/tests/privacyidea.nix+1−2 nixos/tests/privoxy.nix+1−1 nixos/tests/prometheus-exporters.nix+141−43 nixos/tests/prometheus.nix+91−1 nixos/tests/prowlarr.nix+18 nixos/tests/pt2-clone.nix+2−2 nixos/tests/pulseaudio.nix+71 nixos/tests/qboot.nix+1−1 nixos/tests/quorum.nix+32−9 nixos/tests/rabbitmq.nix+8−2 nixos/tests/radicale.nix+1−1 nixos/tests/rasdaemon.nix+34 nixos/tests/redis.nix+19−17 nixos/tests/redmine.nix+1−1 nixos/tests/restart-by-activation-script.nix+73 nixos/tests/retroarch.nix+49 nixos/tests/riak.nix+1−1 nixos/tests/rspamd.nix+5−10 nixos/tests/rstudio-server.nix+24 nixos/tests/rsyslogd.nix+2−2 nixos/tests/run-in-machine.nix−23 nixos/tests/sabnzbd.nix+22 nixos/tests/samba-wsdd.nix+1−1 nixos/tests/samba.nix+1−2 nixos/tests/sanoid.nix+16−3 nixos/tests/sddm.nix+2−2 nixos/tests/seafile.nix+121 nixos/tests/service-runner.nix+1−1 nixos/tests/sfxr-qt.nix+32 nixos/tests/shattered-pixel-dungeon.nix+3−2 nixos/tests/shiori.nix+1−2 nixos/tests/signal-desktop.nix+23−8 nixos/tests/simple.nix+1−1 nixos/tests/slurm.nix+1−1 nixos/tests/snapcast.nix+9 nixos/tests/snapper.nix+1−1 nixos/tests/soapui.nix+24 nixos/tests/solanum.nix+8 nixos/tests/solr.nix+1−1 nixos/tests/sourcehut.nix+193−10 nixos/tests/spark/default.nix+27 nixos/tests/spark/spark_sample.py+40 nixos/tests/spike.nix−22 nixos/tests/ssh-keys.nix+1−1 nixos/tests/sssd-ldap.nix+79−81 nixos/tests/sssd.nix+1−1 nixos/tests/starship.nix+42 nixos/tests/step-ca.nix+77 nixos/tests/sudo.nix+5−1 nixos/tests/sway.nix+54−22 nixos/tests/switch-test.nix+1016−6 nixos/tests/sympa.nix+1−2 nixos/tests/syncthing-init.nix+9−9 nixos/tests/syncthing-relay.nix+1−1 nixos/tests/syncthing.nix+2−2 nixos/tests/systemd-analyze.nix+1−1 nixos/tests/systemd-binfmt.nix+86−20 nixos/tests/systemd-boot.nix+169−5 nixos/tests/systemd-confinement.nix+45−24 nixos/tests/systemd-cryptenroll.nix+54 nixos/tests/systemd-escaping.nix+45 nixos/tests/systemd-initrd-btrfs-raid.nix+45 nixos/tests/systemd-initrd-luks-keyfile.nix+53 nixos/tests/systemd-initrd-luks-password.nix+48 nixos/tests/systemd-initrd-simple.nix+44 nixos/tests/systemd-initrd-swraid.nix+50 nixos/tests/systemd-journal.nix+1−1 nixos/tests/systemd-machinectl.nix+85 nixos/tests/systemd-misc.nix+62 nixos/tests/systemd-networkd-dhcpserver-static-leases.nix+81 nixos/tests/systemd-networkd-ipv6-prefix-delegation.nix+5−12 nixos/tests/systemd-networkd-vrf.nix+2 nixos/tests/systemd-networkd.nix+10 nixos/tests/systemd-shutdown.nix+26 nixos/tests/systemd-unit-path.nix−47 nixos/tests/systemd.nix+17−2 nixos/tests/taskserver.nix+1 nixos/tests/teeworlds.nix+2−2 nixos/tests/telegraf.nix+1−1 nixos/tests/teleport.nix+99 nixos/tests/terminal-emulators.nix+207 nixos/tests/thelounge.nix+29 nixos/tests/tigervnc.nix+53 nixos/tests/tinydns.nix+15−1 nixos/tests/tinywl.nix+57 nixos/tests/tomcat.nix+21 nixos/tests/tor.nix+10−15 nixos/tests/trac.nix−19 nixos/tests/traefik.nix+2 nixos/tests/trafficserver.nix+1 nixos/tests/transmission.nix+1−1 nixos/tests/tsm-client-gui.nix+57 nixos/tests/tuptime.nix+1−1 nixos/tests/turbovnc-headless-server.nix+5−4 nixos/tests/tuxguitar.nix+24 nixos/tests/txredisapi.nix+29 nixos/tests/ucarp.nix+66 nixos/tests/ucg.nix−18 nixos/tests/udisks2.nix+2−2 nixos/tests/unbound.nix+11−2 nixos/tests/unifi.nix+36 nixos/tests/usbguard.nix+2−2 nixos/tests/user-activation-scripts.nix+33 nixos/tests/uwsgi.nix+1−1 nixos/tests/v2ray.nix+1−1 nixos/tests/vault-postgresql.nix+2−3 nixos/tests/vault.nix+4−3 nixos/tests/vaultwarden.nix+187 nixos/tests/vector.nix+1−1 nixos/tests/vengi-tools.nix+29 nixos/tests/vikunja.nix+65 nixos/tests/virtualbox.nix+2−2 nixos/tests/vscodium.nix+66−35 nixos/tests/vsftpd.nix+42 nixos/tests/wasabibackend.nix+1−1 nixos/tests/web-apps/mastodon.nix+170 nixos/tests/web-apps/netbox.nix+30 nixos/tests/web-apps/nifi.nix+30 nixos/tests/web-apps/peertube.nix+131 nixos/tests/web-servers/agate.nix+29 nixos/tests/web-servers/unit-php.nix+1−1 nixos/tests/wiki-js.nix+1−1 nixos/tests/wine.nix+48 nixos/tests/wireguard/wg-quick.nix+1−1 nixos/tests/without-nix.nix+32 nixos/tests/wmderland.nix+1−1 nixos/tests/wordpress.nix+56−23 nixos/tests/wpa_supplicant.nix+96 nixos/tests/xautolock.nix+1−1 nixos/tests/xfce.nix+2−3 nixos/tests/xmonad-xdg-autostart.nix+35 nixos/tests/xmonad.nix+84−17 nixos/tests/xmpp/prosody-mysql.nix+65−33 nixos/tests/xmpp/prosody.nix+3−2 nixos/tests/xmpp/xmpp-sendmessage.nix+1−4 nixos/tests/xrdp.nix+2−2 nixos/tests/xss-lock.nix+1−1 nixos/tests/xterm.nix+2−2 nixos/tests/xxh.nix+67 nixos/tests/yabar.nix+2−2 nixos/tests/yggdrasil.nix+7−11 nixos/tests/yq.nix−12 nixos/tests/zammad.nix+60 nixos/tests/zfs.nix+74−1 nixos/tests/zigbee2mqtt.nix+1−1 nixos/tests/zoneminder.nix+1−1 nixos/tests/zrepl.nix+66 nixos/tests/zsh-history.nix+1−1 pkgs/applications/accessibility/contrast/default.nix+14−14 pkgs/applications/accessibility/espeakup/default.nix+46 pkgs/applications/accessibility/squeekboard/default.nix+9−6 pkgs/applications/accessibility/svkbd/default.nix+2−2 pkgs/applications/accessibility/wvkbd/default.nix+36 pkgs/applications/audio/CHOWTapeModel/default.nix+41−33 pkgs/applications/audio/ChowCentaur/default.nix+53 pkgs/applications/audio/ChowKick/default.nix+106 pkgs/applications/audio/ChowPhaser/default.nix+76 pkgs/applications/audio/LibreArp/default.nix+53 pkgs/applications/audio/LibreArp/lv2.nix+53 pkgs/applications/audio/MMA/default.nix+6−6 pkgs/applications/audio/a2jmidid/default.nix+2−2 pkgs/applications/audio/aacgain/default.nix+3−2 pkgs/applications/audio/adlplug/default.nix+76−14 pkgs/applications/audio/aeolus/default.nix+2−2 pkgs/applications/audio/aether-lv2/default.nix+33 pkgs/applications/audio/airwave/default.nix+2−2 pkgs/applications/audio/aj-snapshot/default.nix+4−5 pkgs/applications/audio/amberol/default.nix+75 pkgs/applications/audio/ams/default.nix+3−3 pkgs/applications/audio/ardour/5.nix−161 pkgs/applications/audio/ardour/default.nix+5−5 pkgs/applications/audio/ashuffle/default.nix+2−2 pkgs/applications/audio/audacious/default.nix+10−8 pkgs/applications/audio/audacity/default.nix+99−52 pkgs/applications/audio/audio-recorder/default.nix+1−1 pkgs/applications/audio/aumix/default.nix+28−13 pkgs/applications/audio/axoloti/libusb1.nix+7−6 pkgs/applications/audio/bambootracker/default.nix+9−21 pkgs/applications/audio/bchoppr/default.nix+2−2 pkgs/applications/audio/bespokesynth/default.nix+148 pkgs/applications/audio/bitwig-studio/bitwig-studio1.nix+2−2 pkgs/applications/audio/bitwig-studio/bitwig-studio2.nix+1−1 pkgs/applications/audio/bitwig-studio/bitwig-studio3.nix+7−3 pkgs/applications/audio/bitwig-studio/bitwig-studio4.nix+80 pkgs/applications/audio/bjumblr/default.nix+2−2 pkgs/applications/audio/blanket/default.nix+69 pkgs/applications/audio/boops/default.nix+2−2 pkgs/applications/audio/bristol/default.nix+2−2 pkgs/applications/audio/bschaffl/default.nix+2−2 pkgs/applications/audio/bsequencer/default.nix+2−2 pkgs/applications/audio/bucklespring/default.nix+3−3 pkgs/applications/audio/cadence/default.nix+48−38 pkgs/applications/audio/callaudiod/default.nix+7−5 pkgs/applications/audio/cantata/default.nix+2−2 pkgs/applications/audio/cardinal/default.nix+67 pkgs/applications/audio/carla/default.nix+13−5 pkgs/applications/audio/caudec/default.nix+6−10 pkgs/applications/audio/cava/default.nix+2−2 pkgs/applications/audio/cdparanoia/default.nix+16−6 pkgs/applications/audio/chuck/default.nix+4−4 pkgs/applications/audio/cider/default.nix+30 pkgs/applications/audio/clementine/default.nix+5−12 pkgs/applications/audio/clerk/default.nix+33−10 pkgs/applications/audio/cmt/default.nix+2−2 pkgs/applications/audio/cmus/default.nix+6−6 pkgs/applications/audio/cmusfm/default.nix+16−10 pkgs/applications/audio/cozy-audiobooks/default.nix−87 pkgs/applications/audio/cozy/default.nix+92 pkgs/applications/audio/crip/default.nix+3−2 pkgs/applications/audio/csound/default.nix+6−9 pkgs/applications/audio/cyanrip/default.nix+34 pkgs/applications/audio/deadbeef/default.nix+3−4 pkgs/applications/audio/deadbeef/plugins/statusnotifier.nix+39 pkgs/applications/audio/denemo/default.nix+2−2 pkgs/applications/audio/dfasma/default.nix+1−3 pkgs/applications/audio/diopser/default.nix+2−2 pkgs/applications/audio/dirt/default.nix+2−1 pkgs/applications/audio/distrho/default.nix+2−2 pkgs/applications/audio/dragonfly-reverb/default.nix+2−2 pkgs/applications/audio/drumgizmo/default.nix+2−2 pkgs/applications/audio/drumkv1/default.nix+4−4 pkgs/applications/audio/easyeffects/default.nix+113 pkgs/applications/audio/ecasound/default.nix+13−2 pkgs/applications/audio/eflite/default.nix+2−2 pkgs/applications/audio/ensemble-chorus/default.nix+2−2 pkgs/applications/audio/espeak-ng/default.nix+10 pkgs/applications/audio/espeak/default.nix+3−2 pkgs/applications/audio/espeak/edit.nix+3−2 pkgs/applications/audio/eteroj.lv2/default.nix−23 pkgs/applications/audio/exaile/default.nix+107 pkgs/applications/audio/faust/faust2.nix+11−3 pkgs/applications/audio/faust/faust2alqt.nix+2−2 pkgs/applications/audio/faust/faust2alsa.nix+2−2 pkgs/applications/audio/faust/faust2jack.nix+2−2 pkgs/applications/audio/faust/faust2jaqt.nix+2−2 pkgs/applications/audio/faust/faustlive.nix+11−14 pkgs/applications/audio/faustPhysicalModeling/default.nix+2−2 pkgs/applications/audio/flac/default.nix+2−10 pkgs/applications/audio/fluidsynth/default.nix+9−25 pkgs/applications/audio/fmit/default.nix+3−5 pkgs/applications/audio/fomp/default.nix+4−4 pkgs/applications/audio/foo-yc20/default.nix−29 pkgs/applications/audio/freac/default.nix+2−2 pkgs/applications/audio/freewheeling/default.nix+4−4 pkgs/applications/audio/freqtweak/default.nix+1−1 pkgs/applications/audio/friture/default.nix+21−8 pkgs/applications/audio/friture/factorial.patch−13 pkgs/applications/audio/friture/unlock_constraints.patch−34 pkgs/applications/audio/ft2-clone/default.nix+4−4 pkgs/applications/audio/furnace/default.nix+100 pkgs/applications/audio/game-music-emu/default.nix+1−1 pkgs/applications/audio/gbsplay/default.nix+17−13 pkgs/applications/audio/geonkick/default.nix+2−2 pkgs/applications/audio/giada/default.nix+40−26 pkgs/applications/audio/gigedit/default.nix+20−3 pkgs/applications/audio/gmu/default.nix+22−3 pkgs/applications/audio/gnome-podcasts/default.nix+15−3 pkgs/applications/audio/goattracker/default.nix+2−3 pkgs/applications/audio/google-play-music-desktop-player/default.nix+2−2 pkgs/applications/audio/gpodder/default.nix+15−5 pkgs/applications/audio/gpodder/disable-autoupdate.patch+8−29 pkgs/applications/audio/grandorgue/default.nix+2−2 pkgs/applications/audio/greg/default.nix+3−3 pkgs/applications/audio/gspeech/default.nix+2−2 pkgs/applications/audio/gtklick/default.nix−34 pkgs/applications/audio/gtkpod/default.nix+5−4 pkgs/applications/audio/guitarix/default.nix+4−2 pkgs/applications/audio/gwc/default.nix+2−2 pkgs/applications/audio/helio-workstation/default.nix+7−7 pkgs/applications/audio/helm/default.nix+7−12 pkgs/applications/audio/helvum/default.nix+36−23 pkgs/applications/audio/hivelytracker/default.nix+1−1 pkgs/applications/audio/hqplayer-desktop/default.nix+92 pkgs/applications/audio/hushboard/default.nix+73 pkgs/applications/audio/hybridreverb2/default.nix+45−10 pkgs/applications/audio/hydrogen/0.nix+28−6 pkgs/applications/audio/hydrogen/default.nix+4−4 pkgs/applications/audio/iannix/default.nix+2−4 pkgs/applications/audio/in-formant/default.nix+45 pkgs/applications/audio/indicator-sound-switcher/default.nix+62 pkgs/applications/audio/industrializer/default.nix+3−5 pkgs/applications/audio/jaaa/default.nix+2−2 pkgs/applications/audio/jack-rack/default.nix+5−4 pkgs/applications/audio/jackmeter/default.nix+3−2 pkgs/applications/audio/jackmix/default.nix+2−2 pkgs/applications/audio/jacktrip/default.nix+61 pkgs/applications/audio/jamesdsp/default.nix+95 pkgs/applications/audio/jamin/default.nix+1−1 pkgs/applications/audio/jamulus/default.nix+2−2 pkgs/applications/audio/japa/default.nix+4−4 pkgs/applications/audio/jconvolver/default.nix+114 pkgs/applications/audio/jellycli/default.nix+33 pkgs/applications/audio/jellycli/fix-test-dir.patch+13 pkgs/applications/audio/jmusicbot/default.nix+3−3 pkgs/applications/audio/kapitonov-plugins-pack/default.nix+1−1 pkgs/applications/audio/kid3/default.nix+2−2 pkgs/applications/audio/kmetronome/default.nix+2−2 pkgs/applications/audio/ladspa-plugins/default.nix+17−7 pkgs/applications/audio/lash/default.nix+2−2 pkgs/applications/audio/lastfmsubmitd/default.nix−21 pkgs/applications/audio/librespot/cargo-lock.patch−3817 pkgs/applications/audio/librespot/default.nix+13−19 pkgs/applications/audio/lingot/default.nix+2−2 pkgs/applications/audio/linuxband/default.nix−37 pkgs/applications/audio/linuxsampler/default.nix+2−2 pkgs/applications/audio/lmms/default.nix+5−5 pkgs/applications/audio/lollypop/default.nix+2−2 pkgs/applications/audio/losslessaudiochecker/default.nix+29 pkgs/applications/audio/lsp-plugins/default.nix+10−3 pkgs/applications/audio/lv2lint/default.nix+22 pkgs/applications/audio/lyrebird/default.nix+2−2 pkgs/applications/audio/magnetophonDSP/faustCompressors/default.nix+1−1 pkgs/applications/audio/mamba/default.nix+2−2 pkgs/applications/audio/mbrola/default.nix+3 pkgs/applications/audio/meters_lv2/default.nix+43−36 pkgs/applications/audio/mhwaveedit/default.nix+2−2 pkgs/applications/audio/mi2ly/default.nix+16−25 pkgs/applications/audio/mi2ly/default.upstream−3 pkgs/applications/audio/mid2key/default.nix+8−5 pkgs/applications/audio/midas/generic.nix+6−7 pkgs/applications/audio/midi-visualizer/default.nix+2−2 pkgs/applications/audio/mikmod/default.nix+3−2 pkgs/applications/audio/milkytracker/default.nix+10−4 pkgs/applications/audio/mimic/default.nix+15−7 pkgs/applications/audio/mimms/default.nix−31 pkgs/applications/audio/miniaudicle/default.nix+4−4 pkgs/applications/audio/mixxx/default.nix+118−34 pkgs/applications/audio/mmtc/default.nix+6−7 pkgs/applications/audio/moc/default.nix+6−4 pkgs/applications/audio/mod-arpeggiator-lv2/default.nix+26 pkgs/applications/audio/mod-distortion/default.nix+2−2 pkgs/applications/audio/molot-lite/default.nix+5−4 pkgs/applications/audio/mopidy/default.nix+6 pkgs/applications/audio/mopidy/iris.nix+2−2 pkgs/applications/audio/mopidy/jellyfin.nix+25 pkgs/applications/audio/mopidy/mopidy.nix+3−3 pkgs/applications/audio/mopidy/mpd.nix+2−2 pkgs/applications/audio/mopidy/mpris.nix+2−2 pkgs/applications/audio/mopidy/muse.nix+29 pkgs/applications/audio/mopidy/spotify.nix+9−7 pkgs/applications/audio/mopidy/youtube.nix+43−15 pkgs/applications/audio/mopidy/ytmusic.nix+35 pkgs/applications/audio/mousai/default.nix+12−2 pkgs/applications/audio/mousai/paths.patch+13 pkgs/applications/audio/mp3blaster/default.nix+11−1 pkgs/applications/audio/mp3gain/default.nix+4−3 pkgs/applications/audio/mp3info/default.nix+3−2 pkgs/applications/audio/mpc/default.nix+41−13 pkgs/applications/audio/mpdevil/default.nix+4−3 pkgs/applications/audio/mpg123/default.nix+36−13 pkgs/applications/audio/mpg321/default.nix+2−2 pkgs/applications/audio/munt/default.nix−38 pkgs/applications/audio/munt/libmt32emu.nix+38 pkgs/applications/audio/munt/mt32emu-qt.nix+75 pkgs/applications/audio/munt/mt32emu-smf2wav.nix+50 pkgs/applications/audio/muse/default.nix+2−2 pkgs/applications/audio/musescore/darwin.nix−1 pkgs/applications/audio/musescore/default.nix+8−7 pkgs/applications/audio/musikcube/default.nix+21−6 pkgs/applications/audio/mympd/default.nix+2−2 pkgs/applications/audio/ncmpc/default.nix+2−2 pkgs/applications/audio/ncspot/default.nix+15−17 pkgs/applications/audio/netease-cloud-music-gtk/cargo-lock.patch+2007 pkgs/applications/audio/netease-cloud-music-gtk/default.nix+60 pkgs/applications/audio/netease-cloud-music-gtk/update-cargo-lock.sh+20 pkgs/applications/audio/netease-music-tui/default.nix+5−5 pkgs/applications/audio/new-session-manager/default.nix+3−3 pkgs/applications/audio/noise-repellent/default.nix+11−9 pkgs/applications/audio/noisetorch/default.nix+11−18 pkgs/applications/audio/noisetorch/version.patch−37 pkgs/applications/audio/non/default.nix+7−7 pkgs/applications/audio/nootka/default.nix+5−4 pkgs/applications/audio/nootka/unstable.nix+25−7 pkgs/applications/audio/ocenaudio/default.nix+5−5 pkgs/applications/audio/odin2/default.nix+79 pkgs/applications/audio/open-music-kontrollers/eteroj.nix+10 pkgs/applications/audio/open-music-kontrollers/generic.nix+37 pkgs/applications/audio/open-music-kontrollers/jit.nix+12 pkgs/applications/audio/open-music-kontrollers/mephisto.nix+17 pkgs/applications/audio/open-music-kontrollers/midi_matrix.nix+10 pkgs/applications/audio/open-music-kontrollers/moony.nix+13 pkgs/applications/audio/open-music-kontrollers/orbit.nix+12 pkgs/applications/audio/open-music-kontrollers/patchmatrix.nix+13 pkgs/applications/audio/open-music-kontrollers/router.nix+11 pkgs/applications/audio/open-music-kontrollers/sherlock.nix+12 pkgs/applications/audio/open-music-kontrollers/synthpod.nix+13 pkgs/applications/audio/open-music-kontrollers/vm.nix+10 pkgs/applications/audio/openmpt123/default.nix−31 pkgs/applications/audio/opus-tools/default.nix+4−2 pkgs/applications/audio/orca-c/default.nix+5−2 pkgs/applications/audio/osdlyrics/default.nix+87 pkgs/applications/audio/osmid/default.nix+2−2 pkgs/applications/audio/oxefmsynth/default.nix+1−1 pkgs/applications/audio/padthv1/default.nix+4−4 pkgs/applications/audio/pamix/default.nix+15−1 pkgs/applications/audio/pamixer/default.nix+6−6 pkgs/applications/audio/paprefs/default.nix+6−4 pkgs/applications/audio/parlatype/default.nix−68 pkgs/applications/audio/patchage/default.nix+33−11 pkgs/applications/audio/pavucontrol/default.nix+24−15 pkgs/applications/audio/pd-plugins/zexy/default.nix+2−1 pkgs/applications/audio/petrifoo/default.nix+2−2 pkgs/applications/audio/pianobar/default.nix+2−2 pkgs/applications/audio/pianobooster/default.nix+2−2 pkgs/applications/audio/pianoteq/default.nix+200 pkgs/applications/audio/picard/default.nix+6−3 pkgs/applications/audio/picoloop/default.nix+2−2 pkgs/applications/audio/pifi/Gemfile−2 pkgs/applications/audio/pifi/Gemfile.lock−39 pkgs/applications/audio/pifi/default.nix−18 pkgs/applications/audio/pifi/gemset.nix−137 pkgs/applications/audio/pipecontrol/default.nix+50 pkgs/applications/audio/pithos/default.nix+2−2 pkgs/applications/audio/plexamp/default.nix+6−7 pkgs/applications/audio/plujain-ramp/default.nix+1−1 pkgs/applications/audio/pmidi/default.nix+2−2 pkgs/applications/audio/pocket-casts/default.nix+55 pkgs/applications/audio/polyphone/default.nix+2−2 pkgs/applications/audio/praat/default.nix+17−13 pkgs/applications/audio/psst/default.nix+39 pkgs/applications/audio/pt2-clone/default.nix+4−4 pkgs/applications/audio/ptcollab/default.nix+15−10 pkgs/applications/audio/puddletag/default.nix+46−9 pkgs/applications/audio/pulseaudio-ctl/default.nix+2−2 pkgs/applications/audio/pulseaudio-dlna/0001-setup.py-remove-dbus-python-from-list.patch+25 pkgs/applications/audio/pulseaudio-dlna/default.nix+54−33 pkgs/applications/audio/pulseaudio-modules-bt/default.nix−91 pkgs/applications/audio/pulseaudio-modules-bt/fix-install-path.patch−11 pkgs/applications/audio/pulseeffects/default.nix−127 pkgs/applications/audio/puredata/default.nix+2−2 pkgs/applications/audio/pyradio/default.nix+30 pkgs/applications/audio/qjackctl/default.nix+4−4 pkgs/applications/audio/qmidiarp/default.nix+4−4 pkgs/applications/audio/qmidinet/default.nix+4−4 pkgs/applications/audio/qmidiroute/default.nix+2−2 pkgs/applications/audio/qmmp/default.nix+5−5 pkgs/applications/audio/qpwgraph/default.nix+34 pkgs/applications/audio/qsynth/default.nix+4−4 pkgs/applications/audio/qtractor/default.nix+4−4 pkgs/applications/audio/quodlibet/default.nix+1−1 pkgs/applications/audio/r128gain/default.nix+2−8 pkgs/applications/audio/radiotray-ng/default.nix+2−2 pkgs/applications/audio/rakarrack/default.nix+2−2 pkgs/applications/audio/reaper/default.nix+10−7 pkgs/applications/audio/redux/default.nix+49 pkgs/applications/audio/renoise/default.nix+2−2 pkgs/applications/audio/rhvoice/default.nix+2−2 pkgs/applications/audio/rhythmbox/default.nix+50−5 pkgs/applications/audio/rofi-pulse-select/default.nix+40 pkgs/applications/audio/roomeqwizard/default.nix+118 pkgs/applications/audio/rosegarden/default.nix+28−10 pkgs/applications/audio/rubyripper/default.nix+23−11 pkgs/applications/audio/rymcast/default.nix+2−2 pkgs/applications/audio/samplv1/default.nix+4−4 pkgs/applications/audio/sayonara/default.nix+2−2 pkgs/applications/audio/sc68/default.nix+3−3 pkgs/applications/audio/schismtracker/default.nix+8−6 pkgs/applications/audio/scream/default.nix+7−4 pkgs/applications/audio/seq24/default.nix+2−2 pkgs/applications/audio/seq66/default.nix+2−2 pkgs/applications/audio/setbfree/default.nix+8−6 pkgs/applications/audio/sfizz/default.nix+15−12 pkgs/applications/audio/sfxr-qt/default.nix+29−3 pkgs/applications/audio/sfxr-qt/test-export-square-wave/default.nix+6 pkgs/applications/audio/sfxr-qt/test-export-square-wave/input.sfxj+29 pkgs/applications/audio/shortwave/default.nix+13−15 pkgs/applications/audio/sidplayfp/default.nix+11−4 pkgs/applications/audio/sisco.lv2/default.nix+2−2 pkgs/applications/audio/snapcast/default.nix+8−5 pkgs/applications/audio/snd/default.nix+7−4 pkgs/applications/audio/sndpeek/default.nix+2−2 pkgs/applications/audio/songrec/default.nix+10−5 pkgs/applications/audio/sonic-lineup/default.nix+2−2 pkgs/applications/audio/sonic-pi/default.nix+62−39 pkgs/applications/audio/sonic-visualiser/default.nix+2−2 pkgs/applications/audio/sonixd/default.nix+27 pkgs/applications/audio/sony-headphones-client/default.nix+44 pkgs/applications/audio/sooperlooper/default.nix+2−2 pkgs/applications/audio/sorcer/default.nix+2−2 pkgs/applications/audio/sound-juicer/default.nix+10 pkgs/applications/audio/soundconverter/default.nix+85 pkgs/applications/audio/soundkonverter/default.nix+1−1 pkgs/applications/audio/soundscape-renderer/default.nix+13−11 pkgs/applications/audio/soundtracker/default.nix+29−11 pkgs/applications/audio/soundwireserver/default.nix+40 pkgs/applications/audio/spectmorph/default.nix+2−2 pkgs/applications/audio/split2flac/default.nix+2−2 pkgs/applications/audio/spot/default.nix+14−9 pkgs/applications/audio/spotify-qt/default.nix+2−2 pkgs/applications/audio/spotify-tui/default.nix+4−3 pkgs/applications/audio/spotify/default.nix+17−12 pkgs/applications/audio/spotifyd/default.nix+12−11 pkgs/applications/audio/sptlrx/default.nix+24 pkgs/applications/audio/squeezelite/default.nix+48−30 pkgs/applications/audio/squishyball/default.nix+21−11 pkgs/applications/audio/stochas/default.nix+2−2 pkgs/applications/audio/strawberry/default.nix+29−20 pkgs/applications/audio/sublime-music/default.nix+14−7 pkgs/applications/audio/sunvox/default.nix+5−5 pkgs/applications/audio/surge-XT/default.nix+93 pkgs/applications/audio/swh-lv2/default.nix+6−4 pkgs/applications/audio/synaesthesia/default.nix+33 pkgs/applications/audio/synthv1/default.nix+4−4 pkgs/applications/audio/tageditor/default.nix−2 pkgs/applications/audio/tagutil/default.nix+45 pkgs/applications/audio/tauon/default.nix+122 pkgs/applications/audio/tenacity/default.nix+148 pkgs/applications/audio/termusic/default.nix+28 pkgs/applications/audio/timemachine/default.nix+2−2 pkgs/applications/audio/tonelib-gfx/default.nix+58 pkgs/applications/audio/tonelib-jam/default.nix+61 pkgs/applications/audio/tonelib-metal/default.nix+60 pkgs/applications/audio/tonelib-zoom/default.nix+63 pkgs/applications/audio/tony/default.nix+5−4 pkgs/applications/audio/transcode/default.nix+3−2 pkgs/applications/audio/transcribe/default.nix+50−13 pkgs/applications/audio/traverso/default.nix+2−2 pkgs/applications/audio/tunefish/default.nix+2−2 pkgs/applications/audio/uade123/default.nix+62−13 pkgs/applications/audio/vcv-rack/default.nix+2−2 pkgs/applications/audio/vgmstream/default.nix+42 pkgs/applications/audio/vgmstream/update.sh+77 pkgs/applications/audio/vimpc/default.nix+11 pkgs/applications/audio/viper4linux-gui/default.nix+82 pkgs/applications/audio/viper4linux/default.nix+61 pkgs/applications/audio/virtual-ans/default.nix+2−2 pkgs/applications/audio/vkeybd/default.nix+2−2 pkgs/applications/audio/vmpk/default.nix+2−2 pkgs/applications/audio/vocal/default.nix+9−2 pkgs/applications/audio/wavegain/default.nix+15−2 pkgs/applications/audio/whipper/default.nix+19−1 pkgs/applications/audio/x42-avldrums/default.nix+2−2 pkgs/applications/audio/x42-plugins/default.nix+2−2 pkgs/applications/audio/xmp/default.nix+5−4 pkgs/applications/audio/xsynth-dssi/default.nix+3−2 pkgs/applications/audio/yoshimi/default.nix+49−18 pkgs/applications/audio/zam-plugins/default.nix+2−2 pkgs/applications/audio/zita-ajbridge/default.nix+5−4 pkgs/applications/audio/zita-at1/default.nix+3−2 pkgs/applications/audio/zita-njbridge/default.nix+2−2 pkgs/applications/audio/zrythm/default.nix+174 pkgs/applications/audio/zynaddsubfx/default.nix+16−3 pkgs/applications/backup/areca/default.nix+6−3 pkgs/applications/backup/deja-dup/default.nix+12−12 pkgs/applications/backup/deja-dup/fix-paths.patch+3−3 pkgs/applications/backup/pika-backup/default.nix+12−3 pkgs/applications/backup/restique/default.nix+41 pkgs/applications/backup/urbackup-client/default.nix+23 pkgs/applications/backup/vorta/default.nix+59−13 pkgs/applications/blockchains/aeon/default.nix+2−2 pkgs/applications/blockchains/alfis/default.nix+56 pkgs/applications/blockchains/besu/default.nix+29 pkgs/applications/blockchains/bisq-desktop/default.nix+101 pkgs/applications/blockchains/bisq-desktop/update.sh+22 pkgs/applications/blockchains/bitcoin-abc.nix−50 pkgs/applications/blockchains/bitcoin-abc/default.nix+76 pkgs/applications/blockchains/bitcoin-abc/fix-bitcoin-qt-build.patch pkgs/applications/blockchains/bitcoin-classic.nix−56 pkgs/applications/blockchains/bitcoin-classic/default.nix+76 pkgs/applications/blockchains/bitcoin-gold/default.nix pkgs/applications/blockchains/bitcoin-knots.nix−41 pkgs/applications/blockchains/bitcoin-knots/default.nix+83 pkgs/applications/blockchains/bitcoin-unlimited.nix−66 pkgs/applications/blockchains/bitcoin-unlimited/default.nix+66 pkgs/applications/blockchains/bitcoin.nix−104 pkgs/applications/blockchains/bitcoin/default.nix+108 pkgs/applications/blockchains/btcpayserver/default.nix+14−38 pkgs/applications/blockchains/btcpayserver/deps.nix+687−602 pkgs/applications/blockchains/btcpayserver/update.sh+2−1 pkgs/applications/blockchains/cgminer/default.nix+2−2 pkgs/applications/blockchains/charge-lnd/default.nix+2−2 pkgs/applications/blockchains/chia-plotter/default.nix+72 pkgs/applications/blockchains/chia-plotter/dont_fetch_dependencies.patch+63 pkgs/applications/blockchains/chia/default.nix+37−12 pkgs/applications/blockchains/chia/dependencies.patch−13 pkgs/applications/blockchains/clightning.nix−63 pkgs/applications/blockchains/clightning/default.nix+71 pkgs/applications/blockchains/crypto-org-wallet.nix−33 pkgs/applications/blockchains/crypto-org-wallet/default.nix+33 pkgs/applications/blockchains/cryptop/default.nix+2−2 pkgs/applications/blockchains/dashpay.nix−44 pkgs/applications/blockchains/dashpay/default.nix+44 pkgs/applications/blockchains/dcrd/default.nix pkgs/applications/blockchains/dcrwallet/default.nix pkgs/applications/blockchains/dero.nix−25 pkgs/applications/blockchains/digibyte/default.nix pkgs/applications/blockchains/dogecoin.nix−41 pkgs/applications/blockchains/dogecoin/default.nix+41 pkgs/applications/blockchains/eclair/default.nix+38 pkgs/applications/blockchains/electrs.nix−30 pkgs/applications/blockchains/electrs/default.nix+42 pkgs/applications/blockchains/electrs/update.sh+40 pkgs/applications/blockchains/elements/default.nix+84 pkgs/applications/blockchains/ergo/default.nix+2−2 pkgs/applications/blockchains/erigon.nix+34 pkgs/applications/blockchains/ethabi/default.nix−1 pkgs/applications/blockchains/exodus/default.nix+6−5 pkgs/applications/blockchains/faraday/default.nix+4−4 pkgs/applications/blockchains/fulcrum/default.nix+36 pkgs/applications/blockchains/go-ethereum.nix−59 pkgs/applications/blockchains/go-ethereum/default.nix+61 pkgs/applications/blockchains/groestlcoin/default.nix+93 pkgs/applications/blockchains/ledger-live-desktop/default.nix+18−5 pkgs/applications/blockchains/ledger-live-desktop/systemd.patch+14 pkgs/applications/blockchains/lightning-loop/default.nix+27 pkgs/applications/blockchains/lightning-pool/default.nix+27 pkgs/applications/blockchains/lightwalletd/default.nix+37 pkgs/applications/blockchains/litecoin.nix−55 pkgs/applications/blockchains/litecoin/default.nix+54 pkgs/applications/blockchains/lnd.nix−40 pkgs/applications/blockchains/lnd/default.nix+40 pkgs/applications/blockchains/lndconnect/default.nix+1−1 pkgs/applications/blockchains/lndmanage.nix−44 pkgs/applications/blockchains/lndmanage/default.nix+44 pkgs/applications/blockchains/masari/default.nix pkgs/applications/blockchains/monero-cli/default.nix+60 pkgs/applications/blockchains/monero-cli/use-system-libraries.patch+52 pkgs/applications/blockchains/monero-gui/default.nix+14−19 pkgs/applications/blockchains/monero/default.nix−68 pkgs/applications/blockchains/monero/use-system-libraries.patch−69 pkgs/applications/blockchains/mycrypto/default.nix+4−4 pkgs/applications/blockchains/namecoin.nix−48 pkgs/applications/blockchains/namecoin/default.nix+47 pkgs/applications/blockchains/nano-wallet/default.nix+4−3 pkgs/applications/blockchains/nbxplorer/default.nix+12−36 pkgs/applications/blockchains/nbxplorer/deps.nix+263−243 pkgs/applications/blockchains/nbxplorer/update.sh+1−1 pkgs/applications/blockchains/nbxplorer/util/create-deps.sh+4−3 pkgs/applications/blockchains/nbxplorer/util/update-common.sh+5−4 pkgs/applications/blockchains/nearcore/default.nix+42 pkgs/applications/blockchains/openethereum/default.nix+6−6 pkgs/applications/blockchains/oxen/default.nix+68 pkgs/applications/blockchains/parity-ui/default.nix−48 pkgs/applications/blockchains/parity-ui/env.nix−19 pkgs/applications/blockchains/particl-core/default.nix+56 pkgs/applications/blockchains/particl/particl-core.nix−53 pkgs/applications/blockchains/pivx.nix−59 pkgs/applications/blockchains/pivx/default.nix+78 pkgs/applications/blockchains/polkadot/default.nix+27−4 pkgs/applications/blockchains/quorum/default.nix pkgs/applications/blockchains/snarkos/default.nix+61 pkgs/applications/blockchains/solana/default.nix+61 pkgs/applications/blockchains/solana/pin.json+5 pkgs/applications/blockchains/solana/update.sh+33 pkgs/applications/blockchains/stellar-core.nix−46 pkgs/applications/blockchains/stellar-core/default.nix+50 pkgs/applications/blockchains/sumokoin/default.nix pkgs/applications/blockchains/tessera/default.nix pkgs/applications/blockchains/trezor-suite/default.nix+6−6 pkgs/applications/blockchains/turbo-geth.nix−30 pkgs/applications/blockchains/vertcoin/default.nix pkgs/applications/blockchains/wasabibackend/create_deps.sh−98 pkgs/applications/blockchains/wasabibackend/default.nix+22−72 pkgs/applications/blockchains/wasabibackend/deps.nix+202−955 pkgs/applications/blockchains/wasabiwallet/default.nix+6−5 pkgs/applications/blockchains/whirlpool-gui/default.nix−104 pkgs/applications/blockchains/wownero.nix−60 pkgs/applications/blockchains/wownero/default.nix+61 pkgs/applications/blockchains/zcash/default.nix+6−6 pkgs/applications/display-managers/lightdm-enso-os-greeter/default.nix+8−7 pkgs/applications/display-managers/lightdm/default.nix+1−1 pkgs/applications/display-managers/ly/default.nix+1−1 pkgs/applications/display-managers/sddm/default.nix+7 pkgs/applications/display-managers/sddm/sddm-default-session.patch+71 pkgs/applications/editors/aewan/default.nix+12−1 pkgs/applications/editors/android-studio/common.nix+23−18 pkgs/applications/editors/android-studio/default.nix+8−8 pkgs/applications/editors/apostrophe/default.nix+14−8 pkgs/applications/editors/aseprite/skia.nix+10−1 pkgs/applications/editors/atom/default.nix+4−4 pkgs/applications/editors/atom/env.nix+5−4 pkgs/applications/editors/bless/default.nix+12−6 pkgs/applications/editors/bluefish/default.nix+25−8 pkgs/applications/editors/bluej/default.nix+37−10 pkgs/applications/editors/bonzomatic/default.nix+5−5 pkgs/applications/editors/bviplus/default.nix+13−1 pkgs/applications/editors/code-browser/default.nix+31−20 pkgs/applications/editors/cpeditor/default.nix+40 pkgs/applications/editors/cudatext/default.nix+5−3 pkgs/applications/editors/cudatext/deps.json+22−22 pkgs/applications/editors/cudatext/update.sh+23 pkgs/applications/editors/deadpixi-sam/default.nix+9−7 pkgs/applications/editors/eclipse/build-eclipse.nix+7−7 pkgs/applications/editors/eclipse/default.nix+18−14 pkgs/applications/editors/eclipse/plugins.nix+98−3 pkgs/applications/editors/ed/default.nix+2−2 pkgs/applications/editors/elvis/default.nix+10−7 pkgs/applications/editors/em/default.nix+29 pkgs/applications/editors/emacs/27.nix−7 pkgs/applications/editors/emacs/28.nix+5 pkgs/applications/editors/emacs/at-fdcwd.patch−15 pkgs/applications/editors/emacs/elisp-packages/agda-input/default.nix+18 pkgs/applications/editors/emacs/elisp-packages/agda2-mode/default.nix+27 pkgs/applications/editors/emacs/elisp-packages/apheleia/default.nix+23−25 pkgs/applications/editors/emacs/elisp-packages/bqn-mode/default.nix+22 pkgs/applications/editors/emacs/elisp-packages/cedet/default.nix−51 pkgs/applications/editors/emacs/elisp-packages/cedille/default.nix+12−9 pkgs/applications/editors/emacs/elisp-packages/color-theme-solarized/default.nix+22−17 pkgs/applications/editors/emacs/elisp-packages/control-lock/default.nix+23 pkgs/applications/editors/emacs/elisp-packages/ebuild-mode/default.nix+17 pkgs/applications/editors/emacs/elisp-packages/elpa-generated.nix+1006−227 pkgs/applications/editors/emacs/elisp-packages/elpa-packages.nix+52−5 pkgs/applications/editors/emacs/elisp-packages/emacs2nix.nix+5−4 pkgs/applications/editors/emacs/elisp-packages/emacspeak/default.nix+30−12 pkgs/applications/editors/emacs/elisp-packages/ement/default.nix+44 pkgs/applications/editors/emacs/elisp-packages/ement/handle-nil-images.patch+28 pkgs/applications/editors/emacs/elisp-packages/ess-R-object-popup/default.nix+21−13 pkgs/applications/editors/emacs/elisp-packages/evil-markdown/default.nix+19−31 pkgs/applications/editors/emacs/elisp-packages/fetchelpa.nix+21 pkgs/applications/editors/emacs/elisp-packages/font-lock-plus/default.nix+16−13 pkgs/applications/editors/emacs/elisp-packages/git-undo/default.nix+13−23 pkgs/applications/editors/emacs/elisp-packages/header-file-mode/default.nix+30 pkgs/applications/editors/emacs/elisp-packages/helm-words/default.nix+20−15 pkgs/applications/editors/emacs/elisp-packages/ido-ubiquitous/default.nix−27 pkgs/applications/editors/emacs/elisp-packages/isearch-plus/default.nix+14−25 pkgs/applications/editors/emacs/elisp-packages/isearch-prop/default.nix+14−24 pkgs/applications/editors/emacs/elisp-packages/jam-mode/default.nix+10−3 pkgs/applications/editors/emacs/elisp-packages/libgenerated.nix+5−3 pkgs/applications/editors/emacs/elisp-packages/llvm-mode/default.nix+17 pkgs/applications/editors/emacs/elisp-packages/manual-packages.nix+88−117 pkgs/applications/editors/emacs/elisp-packages/melpa-packages.nix+89−67 pkgs/applications/editors/emacs/elisp-packages/mu4e-patch/default.nix−38 pkgs/applications/editors/emacs/elisp-packages/nano-theme/default.nix+5−12 pkgs/applications/editors/emacs/elisp-packages/nongnu-generated.nix+2393 pkgs/applications/editors/emacs/elisp-packages/nongnu-packages.nix+37 pkgs/applications/editors/emacs/elisp-packages/org-generated.nix−33 pkgs/applications/editors/emacs/elisp-packages/org-mac-link/default.nix−31 pkgs/applications/editors/emacs/elisp-packages/org-packages.nix−32 pkgs/applications/editors/emacs/elisp-packages/ott-mode/default.nix+19 pkgs/applications/editors/emacs/elisp-packages/perl-completion/default.nix+1−1 pkgs/applications/editors/emacs/elisp-packages/plz/default.nix+31 pkgs/applications/editors/emacs/elisp-packages/power-mode/default.nix+4−11 pkgs/applications/editors/emacs/elisp-packages/prolog/default.nix+2−2 pkgs/applications/editors/emacs/elisp-packages/railgun/default.nix−22 pkgs/applications/editors/emacs/elisp-packages/recipes-archive-melpa.json+13180−8659 pkgs/applications/editors/emacs/elisp-packages/rect-mark/default.nix+19−25 pkgs/applications/editors/emacs/elisp-packages/session-management-for-emacs/default.nix+11−9 pkgs/applications/editors/emacs/elisp-packages/sunrise-commander/default.nix+5−18 pkgs/applications/editors/emacs/elisp-packages/sv-kalender/default.nix+2−5 pkgs/applications/editors/emacs/elisp-packages/tramp/default.nix−28 pkgs/applications/editors/emacs/elisp-packages/tree-sitter-langs/default-grammars.json+32 pkgs/applications/editors/emacs/elisp-packages/tree-sitter-langs/default.nix+44 pkgs/applications/editors/emacs/elisp-packages/tree-sitter-langs/update-defaults.py+74 pkgs/applications/editors/emacs/elisp-packages/tsc/default.nix+89 pkgs/applications/editors/emacs/elisp-packages/tsc/src.json+10 pkgs/applications/editors/emacs/elisp-packages/tsc/update.py+122 pkgs/applications/editors/emacs/elisp-packages/update+10 pkgs/applications/editors/emacs/elisp-packages/update-from-overlay−4 pkgs/applications/editors/emacs/elisp-packages/update-manual+7 pkgs/applications/editors/emacs/elisp-packages/update-manual.nix+11 pkgs/applications/editors/emacs/elisp-packages/update-nongnu+4 pkgs/applications/editors/emacs/elisp-packages/update-org−4 pkgs/applications/editors/emacs/elisp-packages/urweb-mode/default.nix+27 pkgs/applications/editors/emacs/elisp-packages/youtube-dl/default.nix+13−21 pkgs/applications/editors/emacs/elisp-packages/zeitgeist/default.nix−25 pkgs/applications/editors/emacs/generic.nix+41−15 pkgs/applications/editors/emacs/macport.nix+5−4 pkgs/applications/editors/emacs/tramp-detect-wrapped-gvfsd-26.patch−14 pkgs/applications/editors/emacs/tramp-detect-wrapped-gvfsd.patch−11 pkgs/applications/editors/featherpad/default.nix+2−2 pkgs/applications/editors/focuswriter/default.nix−2 pkgs/applications/editors/fte/default.nix+2−1 pkgs/applications/editors/geany/default.nix+2−2 pkgs/applications/editors/ghostwriter/default.nix+19−3 pkgs/applications/editors/glow/default.nix+1−1 pkgs/applications/editors/gnome-builder/default.nix+24−21 pkgs/applications/editors/gobby/default.nix+1−1 pkgs/applications/editors/gophernotes/default.nix+3−3 pkgs/applications/editors/greenfoot/default.nix+2−2 pkgs/applications/editors/helix/default.nix+37 pkgs/applications/editors/heme/default.nix−29 pkgs/applications/editors/hexcurse/default.nix+16 pkgs/applications/editors/hexdino/default.nix+6−6 pkgs/applications/editors/jetbrains/common.nix−91 pkgs/applications/editors/jetbrains/darwin.nix+36 pkgs/applications/editors/jetbrains/default.nix+132−114 pkgs/applications/editors/jetbrains/linux.nix+93 pkgs/applications/editors/jetbrains/update.pl−92 pkgs/applications/editors/jetbrains/update.py+100 pkgs/applications/editors/jetbrains/versions.json+296 pkgs/applications/editors/jove/default.nix+2−1 pkgs/applications/editors/jucipp/default.nix+3−4 pkgs/applications/editors/jupyter-kernels/clojupyter/default.nix+73 pkgs/applications/editors/jupyter-kernels/clojupyter/deps.edn+1 pkgs/applications/editors/jupyter-kernels/clojupyter/deps.nix+1107 pkgs/applications/editors/jupyter-kernels/clojupyter/update.sh+16 pkgs/applications/editors/jupyter-kernels/octave/default.nix+61 pkgs/applications/editors/jupyter-kernels/octave/kernel.nix+28 pkgs/applications/editors/jupyter-kernels/wolfram/default.nix+22 pkgs/applications/editors/jupyter-kernels/wolfram/kernel.nix+32 pkgs/applications/editors/kakoune/default.nix+5−12 pkgs/applications/editors/kakoune/plugins/aliases.nix+1−1 pkgs/applications/editors/kakoune/plugins/build-kakoune-plugin.nix+2−2 pkgs/applications/editors/kakoune/plugins/default.nix+1−1 pkgs/applications/editors/kakoune/plugins/kakoune-plugin-names+20−19 pkgs/applications/editors/kakoune/plugins/update-shell.nix+15 pkgs/applications/editors/kakoune/plugins/update.py+44−39 pkgs/applications/editors/kdevelop5/kdev-php.nix+3−3 pkgs/applications/editors/kdevelop5/kdev-python.nix+3−3 pkgs/applications/editors/kdevelop5/kdevelop.nix+2−2 pkgs/applications/editors/kile/default.nix+3−2 pkgs/applications/editors/kodestudio/default.nix+3−3 pkgs/applications/editors/lapce/default.nix+99 pkgs/applications/editors/leo-editor/default.nix+6−7 pkgs/applications/editors/libresprite/default.nix+111 pkgs/applications/editors/lifeograph/default.nix+40 pkgs/applications/editors/lighttable/default.nix+4−4 pkgs/applications/editors/lite-xl/0001-replace-unpack-with-table-unpack.patch+91 pkgs/applications/editors/lite-xl/default.nix+52 pkgs/applications/editors/manuskript/default.nix+3−3 pkgs/applications/editors/marker/default.nix+6−3 pkgs/applications/editors/mg/default.nix+7−3 pkgs/applications/editors/micro/default.nix+7−5 pkgs/applications/editors/micro/test-with-expect.nix+30 pkgs/applications/editors/mindforger/default.nix+31−8 pkgs/applications/editors/mindforger/paths.patch pkgs/applications/editors/mle/default.nix+11−1 pkgs/applications/editors/moe/default.nix+2−2 pkgs/applications/editors/monodevelop/default.nix−81 pkgs/applications/editors/monodevelop/git-revert-12d610fb3f6dce121df538e36f21d8c2eeb0a6e3.patch−57 pkgs/applications/editors/music/tuxguitar/default.nix+7−7 pkgs/applications/editors/nano/default.nix+6−4 pkgs/applications/editors/nano/nanorc/default.nix−2 pkgs/applications/editors/nano/test-with-expect.nix+35 pkgs/applications/editors/ne/default.nix+3−3 pkgs/applications/editors/neovim/default.nix+20−22 pkgs/applications/editors/neovim/neovide/Cargo.lock−3292 pkgs/applications/editors/neovim/neovide/default.nix+63−44 pkgs/applications/editors/neovim/neovide/skia-externals.json+10−10 pkgs/applications/editors/neovim/neovim-override.vim pkgs/applications/editors/neovim/neovim-qt.nix+2−1 pkgs/applications/editors/neovim/neovim-remote.nix+2−3 pkgs/applications/editors/neovim/ruby_provider/Gemfile.lock+3−3 pkgs/applications/editors/neovim/ruby_provider/gemset.nix+12−6 pkgs/applications/editors/neovim/tests.nix+174 pkgs/applications/editors/neovim/utils.nix+11−1 pkgs/applications/editors/neovim/wrapper.nix+7−3 pkgs/applications/editors/netbeans/default.nix+5−5 pkgs/applications/editors/nvi/default.nix+1 pkgs/applications/editors/nvpy/default.nix+11−7 pkgs/applications/editors/oed/default.nix+32 pkgs/applications/editors/okteta/default.nix+4−2 pkgs/applications/editors/oni2/common.nix+251 pkgs/applications/editors/oni2/default.nix+16 pkgs/applications/editors/oni2/esy_skia_use_nixpkgs.patch+13 pkgs/applications/editors/oni2/extensions.lock+497 pkgs/applications/editors/oni2/extensions.nix+629 pkgs/applications/editors/oni2/node.lock+376 pkgs/applications/editors/oni2/node.nix+453 pkgs/applications/editors/pinegrow/default.nix+80 pkgs/applications/editors/poke/default.nix+27−7 pkgs/applications/editors/quartus-prime/default.nix+9−101 pkgs/applications/editors/quartus-prime/quartus.nix+97 pkgs/applications/editors/quilter/default.nix−55 pkgs/applications/editors/qxmledit/default.nix+1−1 pkgs/applications/editors/rednotebook/default.nix+4−3 pkgs/applications/editors/rehex/default.nix+27−14 pkgs/applications/editors/retext/default.nix+37−16 pkgs/applications/editors/rstudio/clang-location.patch+51−15 pkgs/applications/editors/rstudio/default.nix+202−104 pkgs/applications/editors/rstudio/package.json+83 pkgs/applications/editors/rstudio/r-location.patch+20−15 pkgs/applications/editors/rstudio/yarn.lock+3835 pkgs/applications/editors/rstudio/yarndeps.nix+4373 pkgs/applications/editors/setzer/default.nix+3−2 pkgs/applications/editors/sigil/default.nix+2−2 pkgs/applications/editors/spacevim/default.nix+19−7 pkgs/applications/editors/standardnotes/default.nix+9−8 pkgs/applications/editors/sublime/2/default.nix+11−9 pkgs/applications/editors/sublime/3/common.nix+2−2 pkgs/applications/editors/sublime/4/common.nix+2−2 pkgs/applications/editors/sublime/4/packages.nix+6−6 pkgs/applications/editors/supertux-editor/default.nix+2−2 pkgs/applications/editors/texmacs/default.nix+2−2 pkgs/applications/editors/texmaker/default.nix+4−6 pkgs/applications/editors/texstudio/default.nix+2−2 pkgs/applications/editors/texworks/default.nix+2−2 pkgs/applications/editors/thiefmd/default.nix+48 pkgs/applications/editors/thonny/default.nix+18−3 pkgs/applications/editors/tiled/default.nix+4−6 pkgs/applications/editors/typora/default.nix−72 pkgs/applications/editors/uivonim/yarn.nix+1−1 pkgs/applications/editors/vim/common.nix+2−2 pkgs/applications/editors/vim/configurable.nix+19−35 pkgs/applications/editors/vim/default.nix+1−3 pkgs/applications/editors/vim/macvim.nix+3−3 pkgs/applications/editors/vim/macvim.patch+32−34 pkgs/applications/editors/vim/plugins/aliases.nix+143 pkgs/applications/editors/vim/plugins/build-vim-plugin.nix+54 pkgs/applications/editors/vim/plugins/default.nix+52 pkgs/applications/editors/vim/plugins/deprecated.json+42 pkgs/applications/editors/vim/plugins/generated.nix+12184 pkgs/applications/editors/vim/plugins/markdown-preview-nvim/fix-node-paths.patch+46 pkgs/applications/editors/vim/plugins/markdown-preview-nvim/package.json+17 pkgs/applications/editors/vim/plugins/overrides.nix+1160 pkgs/applications/editors/vim/plugins/patches/fruzzy/get_version.patch pkgs/applications/editors/vim/plugins/patches/lens-vim/remove_duplicate_g_lens_animate.patch pkgs/applications/editors/vim/plugins/patches/sniprun/fix-paths.patch+36 pkgs/applications/editors/vim/plugins/patches/vim-grammarous/set_default_languagetool.patch

19191 more files changed are not listed.

.editorconfig+5−14
@@ -55,13 +55,15 @@ trim_trailing_whitespace = unset
5555[*.lock]
5656indent_size = unset
5757
58−[eggs.nix]
58+# trailing whitespace is an actual syntax element of classic Markdown/
59+# CommonMark to enforce a line break
60+[*.md]
5961trim_trailing_whitespace = unset
6062
61−[nixos/modules/services/networking/ircd-hybrid/*.{conf,in}]
63+[eggs.nix]
6264trim_trailing_whitespace = unset
6365
64−[nixos/tests/systemd-networkd-vrf.nix]
66+[nixos/modules/services/networking/ircd-hybrid/*.{conf,in}]
6567trim_trailing_whitespace = unset
6668
6769[pkgs/build-support/dotnetenv/Wrapper/**]
@@ -70,10 +72,6 @@ indent_style = unset
7072insert_final_newline = unset
7173trim_trailing_whitespace = unset
7274
73−[pkgs/build-support/upstream-updater/**]
74−indent_style = unset
75−trim_trailing_whitespace = unset
76−
7775[pkgs/development/compilers/elm/registry.dat]
7876end_of_line = unset
7977insert_final_newline = unset
@@ -87,10 +85,3 @@ trim_trailing_whitespace = unset
8785
8886[pkgs/tools/misc/timidity/timidity.cfg]
8987trim_trailing_whitespace = unset
90−
91−[pkgs/tools/security/enpass/data.json]
92−insert_final_newline = unset
93−trim_trailing_whitespace = unset
94−
95−[pkgs/top-level/emscripten-packages.nix]
96−trim_trailing_whitespace = unset
.git-blame-ignore-revsnew file+32
@@ -0,0 +1,32 @@
1+# This file contains a list of commits that are not likely what you
2+# are looking for in a blame, such as mass reformatting or renaming.
3+# You can set this file as a default ignore file for blame by running
4+# the following command.
5+#
6+# $ git config blame.ignoreRevsFile .git-blame-ignore-revs
7+#
8+# To temporarily not use this file add
9+# --ignore-revs-file=""
10+# to your blame command.
11+#
12+# The ignoreRevsFile can't be set globally due to blame failing if the file isn't present.
13+# To not have to set the option in every repository it is needed in,
14+# save the following script in your path with the name "git-bblame"
15+# now you can run
16+# $ git bblame $FILE
17+# to use the .git-blame-ignore-revs file if it is present.
18+#
19+# #!/usr/bin/env bash
20+# repo_root=$(git rev-parse --show-toplevel)
21+# if [[ -e $repo_root/.git-blame-ignore-revs ]]; then
22+# git blame --ignore-revs-file="$repo_root/.git-blame-ignore-revs" $@
23+# else
24+# git blame $@
25+# fi
26+
27+
28+# nixos/modules/rename: Sort alphabetically
29+1f71224fe86605ef4cd23ed327b3da7882dad382
30+
31+# nixos: fix module paths in rename.nix
32+d08ede042b74b8199dc748323768227b88efcf7c
.github/CODEOWNERS+116−53
@@ -6,6 +6,10 @@
66#
77# For documentation on this file, see https://help.github.com/articles/about-codeowners/
88# Mentioned users will get code review requests.
9+#
10+# IMPORTANT NOTE: in order to actually get pinged, commit access is required.
11+# This also holds true for GitHub teams. Since almost none of our teams have write
12+# permissions, you need to list all members of the team with commit access individually.
913
1014# This file
1115/.github/CODEOWNERS @edolstra
@@ -19,7 +23,7 @@
1923
2024# Libraries
2125/lib @edolstra @nbp @infinisil
22−/lib/systems @nbp @ericson2314 @matthewbauer
26+/lib/systems @alyssais @nbp @ericson2314 @matthewbauer
2327/lib/generators.nix @edolstra @nbp @Profpatsch
2428/lib/cli.nix @edolstra @nbp @Profpatsch
2529/lib/debug.nix @edolstra @nbp @Profpatsch
@@ -34,19 +38,25 @@
3438/pkgs/top-level/release-cross.nix @Ericson2314 @matthewbauer
3539/pkgs/stdenv/generic @Ericson2314 @matthewbauer
3640/pkgs/stdenv/cross @Ericson2314 @matthewbauer
37−/pkgs/build-support/cc-wrapper @Ericson2314 @orivej
38−/pkgs/build-support/bintools-wrapper @Ericson2314 @orivej
41+/pkgs/build-support/cc-wrapper @Ericson2314
42+/pkgs/build-support/bintools-wrapper @Ericson2314
3943/pkgs/build-support/setup-hooks @Ericson2314
40−/pkgs/build-support/setup-hooks/auto-patchelf.sh @aszlig
44+/pkgs/build-support/setup-hooks/auto-patchelf.sh @layus
45+/pkgs/build-support/setup-hooks/auto-patchelf.py @layus
4146
4247# Nixpkgs build-support
4348/pkgs/build-support/writers @lassulus @Profpatsch
4449
50+# Nixpkgs documentation
51+/maintainers/scripts/db-to-md.sh @jtojnar @ryantm
52+/maintainers/scripts/doc @jtojnar @ryantm
53+/doc/build-aux/pandoc-filters @jtojnar
54+/doc/contributing/contributing-to-documentation.chapter.md @jtojnar
55+
4556# NixOS Internals
4657/nixos/default.nix @nbp @infinisil
4758/nixos/lib/from-env.nix @nbp @infinisil
4859/nixos/lib/eval-config.nix @nbp @infinisil
49−/nixos/doc @ryantm
5060/nixos/doc/manual/configuration/abstractions.xml @nbp
5161/nixos/doc/manual/configuration/config-file.xml @nbp
5262/nixos/doc/manual/configuration/config-syntax.xml @nbp
@@ -60,10 +70,17 @@
6070/nixos/doc/manual/development/writing-modules.xml @nbp
6171/nixos/doc/manual/man-nixos-option.xml @nbp
6272/nixos/modules/installer/tools/nixos-option.sh @nbp
73+/nixos/modules/system @dasJ
6374
6475# NixOS integration test driver
6576/nixos/lib/test-driver @tfc
6677
78+# Systemd
79+/nixos/modules/system/boot/systemd.nix @NixOS/systemd
80+/nixos/modules/system/boot/systemd @NixOS/systemd
81+/nixos/lib/systemd-*.nix @NixOS/systemd
82+/pkgs/os-specific/linux/systemd @NixOS/systemd
83+
6784# Updaters
6885## update.nix
6986/maintainers/scripts/update.nix @jtojnar
@@ -78,26 +95,25 @@
7895/pkgs/development/python-modules @FRidh @jonringer
7996/doc/languages-frameworks/python.section.md @FRidh
8097/pkgs/development/tools/poetry2nix @adisbladis
81−/pkgs/development/interpreters/python/hooks @FRidh @jonringer @DavHau
82−/pkgs/development/interpreters/python/conda @DavHau
98+/pkgs/development/interpreters/python/hooks @FRidh @jonringer
8399
84100# Haskell
85−/doc/languages-frameworks/haskell.section.md @cdepillabout @sternenseemann @maralorn
86−/maintainers/scripts/haskell @cdepillabout @sternenseemann @maralorn
87−/pkgs/development/compilers/ghc @cdepillabout @sternenseemann @maralorn
88−/pkgs/development/haskell-modules @cdepillabout @sternenseemann @maralorn
89−/pkgs/test/haskell @cdepillabout @sternenseemann @maralorn
90−/pkgs/top-level/release-haskell.nix @cdepillabout @sternenseemann @maralorn
91−/pkgs/top-level/haskell-packages.nix @cdepillabout @sternenseemann @maralorn
101+/doc/languages-frameworks/haskell.section.md @cdepillabout @sternenseemann @maralorn @expipiplus1
102+/maintainers/scripts/haskell @cdepillabout @sternenseemann @maralorn @expipiplus1
103+/pkgs/development/compilers/ghc @cdepillabout @sternenseemann @maralorn @expipiplus1
104+/pkgs/development/haskell-modules @cdepillabout @sternenseemann @maralorn @expipiplus1
105+/pkgs/test/haskell @cdepillabout @sternenseemann @maralorn @expipiplus1
106+/pkgs/top-level/release-haskell.nix @cdepillabout @sternenseemann @maralorn @expipiplus1
107+/pkgs/top-level/haskell-packages.nix @cdepillabout @sternenseemann @maralorn @expipiplus1
92108
93109# Perl
94−/pkgs/development/interpreters/perl @volth @stigtsp
95−/pkgs/top-level/perl-packages.nix @volth @stigtsp
96−/pkgs/development/perl-modules @volth @stigtsp
110+/pkgs/development/interpreters/perl @stigtsp @zakame
111+/pkgs/top-level/perl-packages.nix @stigtsp @zakame
112+/pkgs/development/perl-modules @stigtsp @zakame
97113
98114# R
99−/pkgs/applications/science/math/R @peti
100−/pkgs/development/r-modules @peti
115+/pkgs/applications/science/math/R @jbedo
116+/pkgs/development/r-modules @jbedo
101117
102118# Ruby
103119/pkgs/development/interpreters/ruby @marsam
@@ -105,11 +121,8 @@
105121
106122# Rust
107123/pkgs/development/compilers/rust @Mic92 @LnL7 @zowoq
108−/pkgs/build-support/rust @andir @danieldk @zowoq
109−
110−# Darwin-related
111−/pkgs/stdenv/darwin @NixOS/darwin-maintainers
112−/pkgs/os-specific/darwin @NixOS/darwin-maintainers
124+/pkgs/build-support/rust @zowoq
125+/doc/languages-frameworks/rust.section.md @zowoq
113126
114127# C compilers
115128/pkgs/development/compilers/gcc @matthewbauer
@@ -119,14 +132,14 @@
119132/pkgs/top-level/unix-tools.nix @matthewbauer
120133/pkgs/development/tools/xcbuild @matthewbauer
121134
122−# Beam-related (Erlang, Elixir, LFE, etc)
123−/pkgs/development/beam-modules @gleber
124−/pkgs/development/interpreters/erlang @gleber
125−/pkgs/development/interpreters/lfe @gleber
126−/pkgs/development/interpreters/elixir @gleber
127−/pkgs/development/tools/build-managers/rebar @gleber
128−/pkgs/development/tools/build-managers/rebar3 @gleber
129−/pkgs/development/tools/erlang @gleber
135+# Audio
136+/nixos/modules/services/audio/botamusique.nix @mweinelt
137+/nixos/modules/services/audio/snapserver.nix @mweinelt
138+/nixos/tests/modules/services/audio/botamusique.nix @mweinelt
139+/nixos/tests/snapcast.nix @mweinelt
140+
141+# Browsers
142+/pkgs/applications/networking/browsers/firefox @mweinelt
130143
131144# Jetbrains
132145/pkgs/applications/editors/jetbrains @edwtjo
@@ -154,12 +167,30 @@
154167/nixos/tests/hardened.nix @joachifm
155168/pkgs/os-specific/linux/kernel/hardened-config.nix @joachifm
156169
170+# Home Automation
171+/nixos/modules/services/misc/home-assistant.nix @mweinelt
172+/nixos/modules/services/misc/zigbee2mqtt.nix @mweinelt
173+/nixos/tests/home-assistant.nix @mweinelt
174+/nixos/tests/zigbee2mqtt.nix @mweinelt
175+/pkgs/servers/home-assistant @mweinelt
176+/pkgs/tools/misc/esphome @mweinelt
177+
157178# Network Time Daemons
158179/pkgs/tools/networking/chrony @thoughtpolice
159180/pkgs/tools/networking/ntp @thoughtpolice
160181/pkgs/tools/networking/openntpd @thoughtpolice
161182/nixos/modules/services/networking/ntp @thoughtpolice
162183
184+# Network
185+/pkgs/tools/networking/kea/default.nix @mweinelt
186+/pkgs/tools/networking/babeld/default.nix @mweinelt
187+/nixos/modules/services/networking/babeld.nix @mweinelt
188+/nixos/modules/services/networking/kea.nix @mweinelt
189+/nixos/modules/services/networking/knot.nix @mweinelt
190+/nixos/tests/babeld.nix @mweinelt
191+/nixos/tests/kea.nix @mweinelt
192+/nixos/tests/knot.nix @mweinelt
193+
163194# Dhall
164195/pkgs/development/dhall-modules @Gabriel439 @Profpatsch @ehmry
165196/pkgs/development/interpreters/dhall @Gabriel439 @Profpatsch @ehmry
@@ -168,7 +199,7 @@
168199/pkgs/development/idris-modules @Infinisil
169200
170201# Bazel
171−/pkgs/development/tools/build-managers/bazel @mboes @Profpatsch
202+/pkgs/development/tools/build-managers/bazel @Profpatsch
172203
173204# NixOS modules for e-mail and dns services
174205/nixos/modules/services/mail/mailman.nix @peti
@@ -177,18 +208,18 @@
177208/nixos/modules/services/mail/rspamd.nix @peti
178209
179210# Emacs
180−/pkgs/applications/editors/emacs-modes @adisbladis
181−/pkgs/applications/editors/emacs @adisbladis
182−/pkgs/top-level/emacs-packages.nix @adisbladis
211+/pkgs/applications/editors/emacs/elisp-packages @adisbladis
212+/pkgs/applications/editors/emacs @adisbladis
213+/pkgs/top-level/emacs-packages.nix @adisbladis
183214
184215# Neovim
185216/pkgs/applications/editors/neovim @jonringer @teto
186217
187218# VimPlugins
188−/pkgs/misc/vim-plugins @jonringer @softinio
219+/pkgs/applications/editors/vim/plugins @jonringer
189220
190221# VsCode Extensions
191−/pkgs/misc/vscode-extensions @jonringer
222+/pkgs/applications/editors/vscode/extensions @jonringer
192223
193224# Prometheus exporter modules and tests
194225/nixos/modules/services/monitoring/prometheus/exporters.nix @WilliButz
@@ -196,33 +227,65 @@
196227/nixos/tests/prometheus-exporters.nix @WilliButz
197228
198229# PHP interpreter, packages, extensions, tests and documentation
199−/doc/languages-frameworks/php.section.md @NixOS/php
200−/nixos/tests/php @NixOS/php
201−/pkgs/build-support/build-pecl.nix @NixOS/php
202−/pkgs/development/interpreters/php @NixOS/php @jtojnar
203−/pkgs/development/php-packages @NixOS/php
204−/pkgs/top-level/php-packages.nix @NixOS/php @jtojnar
230+/doc/languages-frameworks/php.section.md @aanderse @etu @globin @ma27 @talyz
231+/nixos/tests/php @aanderse @etu @globin @ma27 @talyz
232+/pkgs/build-support/build-pecl.nix @aanderse @etu @globin @ma27 @talyz
233+/pkgs/development/interpreters/php @jtojnar @aanderse @etu @globin @ma27 @talyz
234+/pkgs/development/php-packages @aanderse @etu @globin @ma27 @talyz
235+/pkgs/top-level/php-packages.nix @jtojnar @aanderse @etu @globin @ma27 @talyz
205236
206237# Podman, CRI-O modules and related
207−/nixos/modules/virtualisation/containers.nix @NixOS/podman @zowoq
208−/nixos/modules/virtualisation/cri-o.nix @NixOS/podman @zowoq
209−/nixos/modules/virtualisation/podman.nix @NixOS/podman @zowoq
210−/nixos/tests/cri-o.nix @NixOS/podman @zowoq
211−/nixos/tests/podman.nix @NixOS/podman @zowoq
238+/nixos/modules/virtualisation/containers.nix @zowoq @adisbladis
239+/nixos/modules/virtualisation/cri-o.nix @zowoq @adisbladis
240+/nixos/modules/virtualisation/podman @zowoq @adisbladis
241+/nixos/tests/cri-o.nix @zowoq @adisbladis
242+/nixos/tests/podman @zowoq @adisbladis
212243
213244# Docker tools
214−/pkgs/build-support/docker @roberth @utdemir
215−/nixos/tests/docker-tools-overlay.nix @roberth
216−/nixos/tests/docker-tools.nix @roberth
217−/doc/builders/images/dockertools.xml @roberth
245+/pkgs/build-support/docker @roberth
246+/nixos/tests/docker-tools* @roberth
247+/doc/builders/images/dockertools.section.md @roberth
218248
219249# Blockchains
220250/pkgs/applications/blockchains @mmahut @RaghavSood
221251
222252# Go
253+/doc/languages-frameworks/go.section.md @kalbasit @Mic92 @zowoq
223254/pkgs/development/compilers/go @kalbasit @Mic92 @zowoq
224255/pkgs/development/go-modules @kalbasit @Mic92 @zowoq
225256/pkgs/development/go-packages @kalbasit @Mic92 @zowoq
226257
258+# GNOME
259+/pkgs/desktops/gnome @jtojnar @hedning
260+/pkgs/desktops/gnome/extensions @piegamesde @jtojnar @hedning
261+
227262# Cinnamon
228263/pkgs/desktops/cinnamon @mkg20001
264+
265+# nim
266+/pkgs/development/compilers/nim @ehmry
267+/pkgs/development/nim-packages @ehmry
268+/pkgs/top-level/nim-packages.nix @ehmry
269+
270+# terraform providers
271+/pkgs/applications/networking/cluster/terraform-providers @zowoq
272+
273+# kubernetes
274+/nixos/doc/manual/configuration/kubernetes.chapter.md @zowoq
275+/nixos/modules/services/cluster/kubernetes @zowoq
276+/nixos/tests/kubernetes @zowoq
277+/pkgs/applications/networking/cluster/kubernetes @zowoq
278+
279+# Matrix
280+/pkgs/servers/heisenbridge @piegamesde
281+/pkgs/servers/matrix-conduit @piegamesde
282+/pkgs/servers/matrix-synapse/matrix-appservice-irc @piegamesde
283+/nixos/modules/services/misc/heisenbridge.nix @piegamesde
284+/nixos/modules/services/misc/matrix-appservice-irc.nix @piegamesde
285+/nixos/modules/services/misc/matrix-conduit.nix @piegamesde
286+/nixos/tests/matrix-appservice-irc.nix @piegamesde
287+/nixos/tests/matrix-conduit.nix @piegamesde
288+
289+# Dotnet
290+/pkgs/build-support/dotnet @IvarWithoutBones
291+/pkgs/development/compilers/dotnet @IvarWithoutBones
.github/CONTRIBUTING.mddeleted−74
@@ -1,74 +0,0 @@
1−# How to contribute
2−
3−Note: contributing implies licensing those contributions
4−under the terms of [COPYING](../COPYING), which is an MIT-like license.
5−
6−## Opening issues
7−
8−* Make sure you have a [GitHub account](https://github.com/signup/free)
9−* Make sure there is no open issue on the topic
10−* [Submit a new issue](https://github.com/NixOS/nixpkgs/issues/new/choose) by choosing the kind of topic and fill out the template
11−
12−## Submitting changes
13−
14−* Format the commit messages in the following way:
15−
16− ```
17− (pkg-name | nixos/<module>): (from -> to | init at version | refactor | etc)
18−
19− (Motivation for change. Additional information.)
20− ```
21−
22− For consistency, there should not be a period at the end of the commit message's summary line (the first line of the commit message).
23−
24− Examples:
25−
26− * nginx: init at 2.0.1
27− * firefox: 54.0.1 -> 55.0
28− * nixos/hydra: add bazBaz option
29−
30− Dual baz behavior is needed to do foo.
31− * nixos/nginx: refactor config generation
32−
33− The old config generation system used impure shell scripts and could break in specific circumstances (see #1234).
34−
35−* `meta.description` should:
36− * Be capitalized.
37− * Not start with the package name.
38− * Not have a period at the end.
39−* `meta.license` must be set and fit the upstream license.
40− * If there is no upstream license, `meta.license` should default to `lib.licenses.unfree`.
41−* `meta.maintainers` must be set.
42−
43−See the nixpkgs manual for more details on [standard meta-attributes](https://nixos.org/nixpkgs/manual/#sec-standard-meta-attributes) and on how to [submit changes to nixpkgs](https://nixos.org/nixpkgs/manual/#chap-submitting-changes).
44−
45−## Writing good commit messages
46−
47−In addition to writing properly formatted commit messages, it's important to include relevant information so other developers can later understand *why* a change was made. While this information usually can be found by digging code, mailing list/Discourse archives, pull request discussions or upstream changes, it may require a lot of work.
48−
49−For package version upgrades and such a one-line commit message is usually sufficient.
50−
51−## Backporting changes
52−
53−Follow these steps to backport a change into a release branch in compliance with the [commit policy](https://nixos.org/nixpkgs/manual/#submitting-changes-stable-release-branches).
54−
55−1. Take note of the commits in which the change was introduced into `master` branch.
56−2. Check out the target _release branch_, e.g. `release-20.09`. Do not use a _channel branch_ like `nixos-20.09` or `nixpkgs-20.09`.
57−3. Create a branch for your change, e.g. `git checkout -b backport`.
58−4. When the reason to backport is not obvious from the original commit message, use `git cherry-pick -xe <original commit>` and add a reason. Otherwise use `git cherry-pick -x <original commit>`. That's fine for minor version updates that only include security and bug fixes, commits that fixes an otherwise broken package or similar. Please also ensure the commits exists on the master branch; in the case of squashed or rebased merges, the commit hash will change and the new commits can be found in the merge message at the bottom of the master pull request.
59−5. Push to GitHub and open a backport pull request. Make sure to select the release branch (e.g. `release-20.09`) as the target branch of the pull request, and link to the pull request in which the original change was comitted to `master`. The pull request title should be the commit title with the release version as prefix, e.g. `[20.09]`.
60−6. When the backport pull request is merged and you have the necessary privileges you can also replace the label `9.needs: port to stable` with `8.has: port to stable` on the original pull request. This way maintainers can keep track of missing backports easier.
61−
62−## Generating 21.11 Release Notes
63−
64−Documentation in nixpkgs is transitioning to a markdown-centric workflow. Release notes now require a translation step to convert from markdown to a compatible docbook document.
65−
66−Steps for updating 21.11 Release notes:
67−
68−1. Edit `nixos/doc/manual/release-notes/rl-2111.section.md` with the desired changes
69−2. Run `./nixos/doc/manual/md-to-db.sh` to render `nixos/doc/manual/from_md/release-notes/rl-2111.section.xml`
70−3. Include changes to `rl-2111.section.md` and `rl-2111.section.xml` in the same commit.
71−
72−## Reviewing contributions
73−
74−See the nixpkgs manual for more details on how to [Review contributions](https://nixos.org/nixpkgs/manual/#chap-reviewing-contributions).
.github/ISSUE_TEMPLATE/bug_report.md+10−13
@@ -7,37 +7,34 @@ assignees: ''
77
88---
99
10−**Describe the bug**
10+### Describe the bug
1111A clear and concise description of what the bug is.
1212
13−**To Reproduce**
13+### Steps To Reproduce
1414Steps to reproduce the behavior:
15151. ...
16162. ...
17173. ...
1818
19−**Expected behavior**
19+### Expected behavior
2020A clear and concise description of what you expected to happen.
2121
22−**Screenshots**
22+### Screenshots
2323If applicable, add screenshots to help explain your problem.
2424
25−**Additional context**
25+### Additional context
2626Add any other context about the problem here.
2727
28−**Notify maintainers**
28+### Notify maintainers
2929<!--
3030Please @ people who are in the `meta.maintainers` list of the offending package or module.
3131If in doubt, check `git blame` for whoever last touched something.
3232-->
3333
34−**Metadata**
34+### Metadata
3535Please run `nix-shell -p nix-info --run "nix-info -m"` and paste the result.
3636
37−Maintainer information:
38−```yaml
39−# a list of nixpkgs attributes affected by the problem
40−attribute:
41−# a list of nixos modules affected by the problem
42−module:
37+```console
38+[user@system:~]$ nix-shell -p nix-info --run "nix-info -m"
39+output here
4340```
.github/ISSUE_TEMPLATE/out_of_date_package_report.md+3−3
@@ -13,10 +13,10 @@ assignees: ''
1313<!-- Note that these are hard requirements -->
1414
1515<!--
16−You can use the "Go to file" functionality on github to find the package
16+You can use the "Go to file" functionality on GitHub to find the package
1717Then you can go to the history for this package
1818Find the latest "package_name: old_version -> new_version" commit
19−The "new_version" is the the current version of the package
19+The "new_version" is the current version of the package
2020-->
2121- [ ] Checked the [nixpkgs master branch](https://github.com/NixOS/nixpkgs)
2222<!--
@@ -29,7 +29,7 @@ There's a high chance that you'll have the new version right away while helping
2929###### Project name
3030`nix search` name:
3131<!--
32−The current version can be found easily with the same process than above for checking the master branch
32+The current version can be found easily with the same process as above for checking the master branch
3333If an open PR is present for the package, take this version as the current one and link to the PR
3434-->
3535current version:
.github/PULL_REQUEST_TEMPLATE.md+30−19
@@ -1,30 +1,41 @@
1+###### Description of changes
2+
13<!--
2−To help with the large amounts of pull requests, we would appreciate your
3−reviews of other pull requests, especially simple package updates. Just leave a
4−comment describing what you have tested in the relevant package/service.
5−Reviewing helps to reduce the average time-to-merge for everyone.
6−Thanks a lot if you do!
7−List of open PRs: https://github.com/NixOS/nixpkgs/pulls
8−Reviewing guidelines: https://nixos.org/manual/nixpkgs/unstable/#chap-reviewing-contributions
4+For package updates please link to a changelog or describe changes, this helps your fellow maintainers discover breaking updates.
5+For new packages please briefly describe the package or provide a link to its homepage.
96-->
107
11−###### Motivation for this change
12−
13−
148###### Things done
159
1610<!-- Please check what applies. Note that these are not hard requirements but merely serve as information for reviewers. -->
1711
18−- [ ] Tested using sandboxing ([nix.useSandbox](https://nixos.org/nixos/manual/options.html#opt-nix.useSandbox) on NixOS, or option `sandbox` in [`nix.conf`](https://nixos.org/nix/manual/#sec-conf-file) on non-NixOS linux)
1912- Built on platform(s)
20− - [ ] NixOS
21− - [ ] macOS
22− - [ ] other Linux distributions
23−- [ ] Tested via one or more NixOS test(s) if existing and applicable for the change (look inside [nixos/tests](https://github.com/NixOS/nixpkgs/blob/master/nixos/tests))
24−- [ ] Tested compilation of all pkgs that depend on this change using `nix-shell -p nixpkgs-review --run "nixpkgs-review wip"`
25−- [ ] Tested execution of all binary files (usually in `./result/bin/`)
26−- [21.11 Release Notes](https://github.com/NixOS/nixpkgs/blob/master/.github/CONTRIBUTING.md#generating-2111-release-notes)
13+ - [ ] x86_64-linux
14+ - [ ] aarch64-linux
15+ - [ ] x86_64-darwin
16+ - [ ] aarch64-darwin
17+- [ ] For non-Linux: Is `sandbox = true` set in `nix.conf`? (See [Nix manual](https://nixos.org/manual/nix/stable/command-ref/conf-file.html))
18+- [ ] Tested, as applicable:
19+ - [NixOS test(s)](https://nixos.org/manual/nixos/unstable/index.html#sec-nixos-tests) (look inside [nixos/tests](https://github.com/NixOS/nixpkgs/blob/master/nixos/tests))
20+ - and/or [package tests](https://nixos.org/manual/nixpkgs/unstable/#sec-package-tests)
21+ - or, for functions and "core" functionality, tests in [lib/tests](https://github.com/NixOS/nixpkgs/blob/master/lib/tests) or [pkgs/test](https://github.com/NixOS/nixpkgs/blob/master/pkgs/test)
22+ - made sure NixOS tests are [linked](https://nixos.org/manual/nixpkgs/unstable/#ssec-nixos-tests-linking) to the relevant packages
23+- [ ] Tested compilation of all packages that depend on this change using `nix-shell -p nixpkgs-review --run "nixpkgs-review rev HEAD"`. Note: all changes have to be committed, also see [nixpkgs-review usage](https://github.com/Mic92/nixpkgs-review#usage)
24+- [ ] Tested basic functionality of all binary files (usually in `./result/bin/`)
25+- [22.05 Release Notes (or backporting 21.11 Release notes)](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#generating-2205-release-notes)
2726 - [ ] (Package updates) Added a release notes entry if the change is major or breaking
2827 - [ ] (Module updates) Added a release notes entry if the change is significant
2928 - [ ] (Module addition) Added a release notes entry if adding a new NixOS module
30−- [ ] Fits [CONTRIBUTING.md](https://github.com/NixOS/nixpkgs/blob/master/.github/CONTRIBUTING.md).
29+ - [ ] (Release notes changes) Ran `nixos/doc/manual/md-to-db.sh` to update generated release notes
30+- [ ] Fits [CONTRIBUTING.md](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md).
31+
32+<!--
33+To help with the large amounts of pull requests, we would appreciate your
34+reviews of other pull requests, especially simple package updates. Just leave a
35+comment describing what you have tested in the relevant package/service.
36+Reviewing helps to reduce the average time-to-merge for everyone.
37+Thanks a lot if you do!
38+
39+List of open PRs: https://github.com/NixOS/nixpkgs/pulls
40+Reviewing guidelines: https://nixos.org/manual/nixpkgs/unstable/#chap-reviewing-contributions
41+-->
.github/STALE-BOT.md+1−1
@@ -3,7 +3,7 @@
33- Thanks for your contribution!
44- To remove the stale label, just leave a new comment.
55- _How to find the right people to ping?_ &rarr; [`git blame`](https://git-scm.com/docs/git-blame) to the rescue! (or GitHub's history and blame buttons.)
6−- You can always ask for help on [our Discourse Forum](https://discourse.nixos.org/) or on the [#nixos IRC channel](https://webchat.freenode.net/#nixos).
6+- You can always ask for help on [our Discourse Forum](https://discourse.nixos.org/), [our Matrix room](https://matrix.to/#/#nix:nixos.org), or on the [#nixos IRC channel](https://web.libera.chat/#nixos).
77
88## Suggestions for PRs
99
.github/labeler.yml+11−6
@@ -5,10 +5,6 @@
55 - pkgs/development/libraries/agda/**/*
66 - pkgs/top-level/agda-packages.nix
77
8−"6.topic: bsd":
9− - pkgs/os-specific/bsd/**/*
10− - pkgs/stdenv/freebsd/**/*
11−
128"6.topic: cinnamon":
139 - pkgs/desktops/cinnamon/**/*
1410
@@ -16,7 +12,7 @@
1612 - nixos/modules/services/editors/emacs.nix
1713 - nixos/modules/services/editors/emacs.xml
1814 - nixos/tests/emacs-daemon.nix
19− - pkgs/applications/editors/emacs-modes/**/*
15+ - pkgs/applications/editors/emacs/elisp-packages/**/*
2016 - pkgs/applications/editors/emacs/**/*
2117 - pkgs/build-support/emacs/**/*
2218 - pkgs/top-level/emacs-packages.nix
@@ -70,6 +66,13 @@
7066
7167"6.topic: nixos":
7268 - nixos/**/*
69+ - pkgs/os-specific/linux/nixos-rebuild/**/*
70+
71+"6.topic: nim":
72+ - doc/languages-frameworks/nim.section.md
73+ - pkgs/development/compilers/nim/*
74+ - pkgs/development/nim-packages/**/*
75+ - pkgs/top-level/nim-packages.nix
7376
7477"6.topic: ocaml":
7578 - doc/languages-frameworks/ocaml.section.md
@@ -135,7 +138,9 @@
135138"6.topic: vim":
136139 - doc/languages-frameworks/vim.section.md
137140 - pkgs/applications/editors/vim/**/*
138− - pkgs/misc/vim-plugins/**/*
141+ - pkgs/applications/editors/vim/plugins/**/*
142+ - nixos/modules/programs/neovim.nix
143+ - pkgs/applications/editors/neovim/**/*
139144
140145"6.topic: xfce":
141146 - nixos/doc/manual/configuration/xfce.xml
.github/workflows/backport.yml+16−4
@@ -2,22 +2,34 @@ name: Backport
22on:
33 pull_request_target:
44 types: [closed, labeled]
5+
6+# WARNING:
7+# When extending this action, be aware that $GITHUB_TOKEN allows write access to
8+# the GitHub repository. This means that it should not evaluate user input in a
9+# way that allows code injection.
10+
511jobs:
612 backport:
713 name: Backport Pull Request
8− if: github.repository_owner == 'NixOS' && github.event.pull_request.merged == true
14+ if: github.repository_owner == 'NixOS' && github.event.pull_request.merged == true && (github.event_name != 'labeled' || startsWith('backport', github.event.label.name))
915 runs-on: ubuntu-latest
1016 steps:
11− - uses: actions/checkout@v2
17+ - uses: actions/checkout@v3
1218 with:
1319 # required to find all branches
1420 fetch-depth: 0
1521 ref: ${{ github.event.pull_request.head.sha }}
1622 - name: Create backport PRs
1723 # should be kept in sync with `version`
18− uses: zeebe-io/backport-action@9b8949dcd4295d364b0939f07d0c7593598d26cd
24+ uses: zeebe-io/backport-action@v0.0.5
1925 with:
26+ # Config README: https://github.com/zeebe-io/backport-action#backport-action
2027 github_token: ${{ secrets.GITHUB_TOKEN }}
2128 github_workspace: ${{ github.workspace }}
2229 # should be kept in sync with `uses`
23− version: 9b8949dcd4295d364b0939f07d0c7593598d26cd
30+ version: v0.0.5
31+ pull_description: |-
32+ Bot-based backport to `${target_branch}`, triggered by a label in #${pull_number}.
33+
34+ * [ ] Before merging, ensure that this backport complies with the [Criteria for Backporting](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#criteria-for-backporting-changes).
35+ * Even as a non-commiter, if you find that it does not comply, leave a comment.
.github/workflows/basic-eval.ymlnew file+26
@@ -0,0 +1,26 @@
1+name: Basic evaluation checks
2+
3+on:
4+ workflow_dispatch
5+ # pull_request:
6+ # branches:
7+ # - master
8+ # - release-**
9+ # push:
10+ # branches:
11+ # - master
12+ # - release-**
13+jobs:
14+ tests:
15+ runs-on: ubuntu-latest
16+ # we don't limit this action to only NixOS repo since the checks are cheap and useful developer feedback
17+ steps:
18+ - uses: actions/checkout@v3
19+ - uses: cachix/install-nix-action@v17
20+ - uses: cachix/cachix-action@v10
21+ with:
22+ # This cache is for the nixpkgs repo checks and should not be trusted or used elsewhere.
23+ name: nixpkgs-ci
24+ signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
25+ # explicit list of supportedSystems is needed until aarch64-darwin becomes part of the trunk jobset
26+ - run: nix-build pkgs/top-level/release.nix -A tarball.nixpkgs-basic-release-checks --arg supportedSystems '[ "aarch64-darwin" "aarch64-linux" "x86_64-linux" "x86_64-darwin" ]'
.github/workflows/direct-push.yml+4−1
@@ -17,9 +17,12 @@ jobs:
1717 run: |
1818 ISMERGE=$(curl -H 'Accept: application/vnd.github.groot-preview+json' -H "authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" https://api.github.com/repos/${{ env.GITHUB_REPOSITORY }}/commits/${{ env.GITHUB_SHA }}/pulls | jq -r '.[] | select(.merge_commit_sha == "${{ env.GITHUB_SHA }}") | any')
1919 echo "::set-output name=ismerge::$ISMERGE"
20+ # github events are eventually consistent, so wait until changes propagate to thier DB
21+ - run: sleep 60
22+ if: steps.ismerge.outputs.ismerge != 'true'
2023 - name: Warn if the commit was a direct push
2124 if: steps.ismerge.outputs.ismerge != 'true'
22− uses: peter-evans/commit-comment@v1
25+ uses: peter-evans/commit-comment@v2
2326 with:
2427 body: |
2528 @${{ github.actor }}, you pushed a commit directly to master/release branch
.github/workflows/editorconfig.yml+10−13
@@ -11,36 +11,33 @@ on:
1111jobs:
1212 tests:
1313 runs-on: ubuntu-latest
14− if: github.repository_owner == 'NixOS'
14+ if: "github.repository_owner == 'NixOS' && !contains(github.event.pull_request.title, '[skip editorconfig]')"
1515 steps:
1616 - name: Get list of changed files from PR
1717 env:
1818 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
1919 run: |
20− echo 'PR_DIFF<<EOF' >> $GITHUB_ENV
2120 gh api \
2221 repos/NixOS/nixpkgs/pulls/${{github.event.number}}/files --paginate \
2322 | jq '.[] | select(.status != "removed") | .filename' \
24− >> $GITHUB_ENV
25− echo 'EOF' >> $GITHUB_ENV
26− - uses: actions/checkout@v2
23+ > "$HOME/changed_files"
24+ - name: print list of changed files
25+ run: |
26+ cat "$HOME/changed_files"
27+ - uses: actions/checkout@v3
2728 with:
2829 # pull_request_target checks out the base branch by default
2930 ref: refs/pull/${{ github.event.pull_request.number }}/merge
30− if: env.PR_DIFF
31− - uses: cachix/install-nix-action@v13
32− if: env.PR_DIFF
31+ - uses: cachix/install-nix-action@v17
3332 with:
3433 # nixpkgs commit is pinned so that it doesn't break
35− nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/f93ecc4f6bc60414d8b73dbdf615ceb6a2c604df.tar.gz
34+ # editorconfig-checker 2.4.0
35+ nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/c473cc8714710179df205b153f4e9fa007107ff9.tar.gz
3636 - name: install editorconfig-checker
3737 run: nix-env -iA editorconfig-checker -f '<nixpkgs>'
38− if: env.PR_DIFF
3938 - name: Checking EditorConfig
40− if: env.PR_DIFF
4139 run: |
42− echo "$PR_DIFF" | xargs editorconfig-checker -disable-indent-size
40+ cat "$HOME/changed_files" | xargs -r editorconfig-checker -disable-indent-size
4341 - if: ${{ failure() }}
4442 run: |
4543 echo "::error :: Hey! It looks like your changes don't follow our editorconfig settings. Read https://editorconfig.org/#download to configure your editor so you never see this error again."
46−
.github/workflows/labels.yml+6−1
@@ -4,6 +4,11 @@ on:
44 pull_request_target:
55 types: [edited, opened, synchronize, reopened]
66
7+# WARNING:
8+# When extending this action, be aware that $GITHUB_TOKEN allows some write
9+# access to the GitHub API. This means that it should not evaluate user input in
10+# a way that allows code injection.
11+
712permissions:
813 contents: read
914 pull-requests: write
@@ -13,7 +18,7 @@ jobs:
1318 runs-on: ubuntu-latest
1419 if: github.repository_owner == 'NixOS'
1520 steps:
16− - uses: actions/labeler@v3
21+ - uses: actions/labeler@v4
1722 with:
1823 repo-token: ${{ secrets.GITHUB_TOKEN }}
1924 sync-labels: true
.github/workflows/manual-nixos.yml+4−4
@@ -14,17 +14,17 @@ jobs:
1414 runs-on: ubuntu-latest
1515 if: github.repository_owner == 'NixOS'
1616 steps:
17− - uses: actions/checkout@v2
17+ - uses: actions/checkout@v3
1818 with:
1919 # pull_request_target checks out the base branch by default
2020 ref: refs/pull/${{ github.event.pull_request.number }}/merge
21− - uses: cachix/install-nix-action@v13
21+ - uses: cachix/install-nix-action@v17
2222 with:
2323 # explicitly enable sandbox
2424 extra_nix_config: sandbox = true
25− - uses: cachix/cachix-action@v9
25+ - uses: cachix/cachix-action@v10
2626 with:
27− # This cache is for the nixos/nixpkgs manual builds and should not be trusted or used elsewhere.
27+ # This cache is for the nixpkgs repo checks and should not be trusted or used elsewhere.
2828 name: nixpkgs-ci
2929 signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
3030 - name: Building NixOS manual
.github/workflows/manual-nixpkgs.yml+4−4
@@ -14,17 +14,17 @@ jobs:
1414 runs-on: ubuntu-latest
1515 if: github.repository_owner == 'NixOS'
1616 steps:
17− - uses: actions/checkout@v2
17+ - uses: actions/checkout@v3
1818 with:
1919 # pull_request_target checks out the base branch by default
2020 ref: refs/pull/${{ github.event.pull_request.number }}/merge
21− - uses: cachix/install-nix-action@v13
21+ - uses: cachix/install-nix-action@v17
2222 with:
2323 # explicitly enable sandbox
2424 extra_nix_config: sandbox = true
25− - uses: cachix/cachix-action@v9
25+ - uses: cachix/cachix-action@v10
2626 with:
27− # This cache is for the nixos/nixpkgs manual builds and should not be trusted or used elsewhere.
27+ # This cache is for the nixpkgs repo checks and should not be trusted or used elsewhere.
2828 name: nixpkgs-ci
2929 signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
3030 - name: Building Nixpkgs manual
.github/workflows/merge-staging.ymldeleted−41
@@ -1,41 +0,0 @@
1−name: "merge staging(-next)"
2−
3−on:
4− schedule:
5− # * is a special character in YAML so you have to quote this string
6− # Merge every 6 hours
7− - cron: '0 */6 * * *'
8−
9−jobs:
10− sync-branch:
11− if: github.repository_owner == 'NixOS'
12− runs-on: ubuntu-latest
13− steps:
14− - uses: actions/checkout@v2
15−
16− - name: Merge master into staging-next
17− id: staging_next
18− uses: devmasx/merge-branch@v1.3.1
19− with:
20− type: now
21− from_branch: master
22− target_branch: staging-next
23− github_token: ${{ secrets.GITHUB_TOKEN }}
24−
25− - name: Merge staging-next into staging
26− id: staging
27− uses: devmasx/merge-branch@v1.3.1
28− with:
29− type: now
30− from_branch: staging-next
31− target_branch: staging
32− github_token: ${{ secrets.GITHUB_TOKEN }}
33−
34− - name: Comment on failure
35− uses: peter-evans/create-or-update-comment@v1
36− if: ${{ failure() }}
37− with:
38− issue-number: 105153
39− body: |
40− An automatic merge${{ (steps.staging_next.outcome == 'failure' && ' from master to staging-next') || ((steps.staging.outcome == 'failure' && ' from staging-next to staging') || '') }} [failed](https://github.com/NixOS/nixpkgs/actions/runs/${{ github.run_id }}).
41−
.github/workflows/nixos-manual.yml+2−2
@@ -15,11 +15,11 @@ jobs:
1515 runs-on: ubuntu-latest
1616 if: github.repository_owner == 'NixOS'
1717 steps:
18− - uses: actions/checkout@v2
18+ - uses: actions/checkout@v3
1919 with:
2020 # pull_request_target checks out the base branch by default
2121 ref: refs/pull/${{ github.event.pull_request.number }}/merge
22− - uses: cachix/install-nix-action@v12
22+ - uses: cachix/install-nix-action@v17
2323 - name: Check DocBook files generated from Markdown are consistent
2424 run: |
2525 nixos/doc/manual/md-to-db.sh
.github/workflows/no-channel.ymlnew file+21
@@ -0,0 +1,21 @@
1+name: "No channel PR"
2+
3+on:
4+ pull_request:
5+ branches:
6+ - 'nixos-**'
7+ - 'nixpkgs-**'
8+
9+jobs:
10+ fail:
11+ name: "This PR is is targeting a channel branch"
12+ runs-on: ubuntu-latest
13+ steps:
14+ - run: |
15+ cat <<EOF
16+ The nixos-* and nixpkgs-* branches are pushed to by the channel
17+ release script and should not be merged into directly.
18+
19+ Please target the equivalent release-* branch or master instead.
20+ EOF
21+ exit 1
.github/workflows/pending-set.yml+5
@@ -3,6 +3,11 @@ name: "set pending status"
33on:
44 pull_request_target:
55
6+# WARNING:
7+# When extending this action, be aware that $GITHUB_TOKEN allows write access to
8+# the GitHub repository. This means that it should not evaluate user input in a
9+# way that allows code injection.
10+
611jobs:
712 action:
813 runs-on: ubuntu-latest
.github/workflows/periodic-merge-24h.ymlnew file+57
@@ -0,0 +1,57 @@
1+# This action periodically merges base branches into staging branches.
2+# This is done to
3+# * prevent conflicts or rather resolve them early
4+# * make all potential breakage happen on the staging branch
5+# * and make sure that all major rebuilds happen before the staging
6+# branch get’s merged back into its base branch.
7+
8+name: "Periodic Merges (24h)"
9+
10+
11+on:
12+ schedule:
13+ # * is a special character in YAML so you have to quote this string
14+ # Merge every 24 hours
15+ - cron: '0 0 * * *'
16+
17+jobs:
18+ periodic-merge:
19+ if: github.repository_owner == 'NixOS'
20+ runs-on: ubuntu-latest
21+ strategy:
22+ # don't fail fast, so that all pairs are tried
23+ fail-fast: false
24+ # certain branches need to be merged in order, like master->staging-next->staging
25+ # and disabling parallelism ensures the order of the pairs below.
26+ max-parallel: 1
27+ matrix:
28+ pairs:
29+ - from: master
30+ into: haskell-updates
31+ - from: release-21.05
32+ into: staging-next-21.05
33+ - from: staging-next-21.05
34+ into: staging-21.05
35+ - from: release-21.11
36+ into: staging-next-21.11
37+ - from: staging-next-21.11
38+ into: staging-21.11
39+ name: ${{ matrix.pairs.from }} → ${{ matrix.pairs.into }}
40+ steps:
41+ - uses: actions/checkout@v3
42+
43+ - name: ${{ matrix.pairs.from }} → ${{ matrix.pairs.into }}
44+ uses: devmasx/merge-branch@1.4.0
45+ with:
46+ type: now
47+ from_branch: ${{ matrix.pairs.from }}
48+ target_branch: ${{ matrix.pairs.into }}
49+ github_token: ${{ secrets.GITHUB_TOKEN }}
50+
51+ - name: Comment on failure
52+ uses: peter-evans/create-or-update-comment@v2
53+ if: ${{ failure() }}
54+ with:
55+ issue-number: 105153
56+ body: |
57+ Periodic merge from `${{ matrix.pairs.from }}` into `${{ matrix.pairs.into }}` has [failed](https://github.com/NixOS/nixpkgs/actions/runs/${{ github.run_id }}).
.github/workflows/periodic-merge-6h.ymlnew file+51
@@ -0,0 +1,51 @@
1+# This action periodically merges base branches into staging branches.
2+# This is done to
3+# * prevent conflicts or rather resolve them early
4+# * make all potential breakage happen on the staging branch
5+# * and make sure that all major rebuilds happen before the staging
6+# branch get’s merged back into its base branch.
7+
8+name: "Periodic Merges (6h)"
9+
10+
11+on:
12+ schedule:
13+ # * is a special character in YAML so you have to quote this string
14+ # Merge every 6 hours
15+ - cron: '0 */6 * * *'
16+
17+jobs:
18+ periodic-merge:
19+ if: github.repository_owner == 'NixOS'
20+ runs-on: ubuntu-latest
21+ strategy:
22+ # don't fail fast, so that all pairs are tried
23+ fail-fast: false
24+ # certain branches need to be merged in order, like master->staging-next->staging
25+ # and disabling parallelism ensures the order of the pairs below.
26+ max-parallel: 1
27+ matrix:
28+ pairs:
29+ - from: master
30+ into: staging-next
31+ - from: staging-next
32+ into: staging
33+ name: ${{ matrix.pairs.from }} → ${{ matrix.pairs.into }}
34+ steps:
35+ - uses: actions/checkout@v3
36+
37+ - name: ${{ matrix.pairs.from }} → ${{ matrix.pairs.into }}
38+ uses: devmasx/merge-branch@1.4.0
39+ with:
40+ type: now
41+ from_branch: ${{ matrix.pairs.from }}
42+ target_branch: ${{ matrix.pairs.into }}
43+ github_token: ${{ secrets.GITHUB_TOKEN }}
44+
45+ - name: Comment on failure
46+ uses: peter-evans/create-or-update-comment@v2
47+ if: ${{ failure() }}
48+ with:
49+ issue-number: 105153
50+ body: |
51+ Periodic merge from `${{ matrix.pairs.from }}` into `${{ matrix.pairs.into }}` has [failed](https://github.com/NixOS/nixpkgs/actions/runs/${{ github.run_id }}).
.github/workflows/rebase.ymldeleted−134
@@ -1,134 +0,0 @@
1−on:
2− issue_comment:
3− types:
4− - created
5−
6−# This action allows people with write access to the repo to rebase a PRs base branch
7−# by commenting `/rebase ${branch}` on the PR while avoiding CODEOWNER notifications.
8−
9−jobs:
10− rebase:
11− runs-on: ubuntu-latest
12− if: github.repository_owner == 'NixOS' && github.event.issue.pull_request != '' && contains(github.event.comment.body, '/rebase')
13− steps:
14− - uses: peter-evans/create-or-update-comment@v1
15− with:
16− comment-id: ${{ github.event.comment.id }}
17− reactions: eyes
18− - uses: scherermichael-oss/action-has-permission@1.0.6
19− id: check-write-access
20− with:
21− required-permission: write
22− env:
23− GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
24− - name: check permissions
25− run: |
26− echo "Commenter doesn't have write access to the repo"
27− exit 1
28− if: "! steps.check-write-access.outputs.has-permission"
29− - name: setup
30− run: |
31− curl "https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.issue.number }}" 2>/dev/null >pr.json
32− cat <<EOF >>"$GITHUB_ENV"
33− CAN_MODIFY=$(jq -r '.maintainer_can_modify' pr.json)
34− COMMITS=$(jq -r '.commits' pr.json)
35− CURRENT_BASE=$(jq -r '.base.ref' pr.json)
36− PR_BRANCH=$(jq -r '.head.ref' pr.json)
37− COMMENT_BRANCH=$(echo ${{ github.event.comment.body }} | awk "/^\/rebase / {print \$2}")
38− PULL_REQUEST=${{ github.event.issue.number }}
39− EOF
40− rm pr.json
41− - name: check branch
42− env:
43− PERMANENT_BRANCHES: "haskell-updates|master|nixos|nixpkgs|python-unstable|release|staging"
44− VALID_BRANCHES: "haskell-updates|master|python-unstable|release-20.09|release-21.05|staging|staging-20.09|staging-21.05|staging-next|staging-next-21.05"
45− run: |
46− message() {
47− cat <<EOF
48− Can't rebase $PR_BRANCH from $CURRENT_BASE onto $COMMENT_BRANCH (PR:$PULL_REQUEST COMMITS:$COMMITS)
49− EOF
50− }
51− if ! [[ "$COMMENT_BRANCH" =~ ^($VALID_BRANCHES)$ ]]; then
52− cat <<EOF
53− Check that the branch from the comment is valid:
54−
55− $(message)
56−
57− This action can only rebase onto these branches:
58−
59− $VALID_BRANCHES
60−
61− \`/rebase \${branch}\` must be at the start of the line
62− EOF
63− exit 1
64− fi
65− if [[ "$COMMENT_BRANCH" == "$CURRENT_BASE" ]]; then
66− cat <<EOF
67− Check that the branch from the comment isn't the current base branch:
68−
69− $(message)
70− EOF
71− exit 1
72− fi
73− if [[ "$COMMENT_BRANCH" == "$PR_BRANCH" ]]; then
74− cat <<EOF
75− Check that the branch from the comment isn't the current branch:
76−
77− $(message)
78− EOF
79− exit 1
80− fi
81− if [[ "$PR_BRANCH" =~ ^($PERMANENT_BRANCHES) ]]; then
82− cat <<EOF
83− Check that the PR branch isn't a permanent branch:
84−
85− $(message)
86− EOF
87− exit 1
88− fi
89− if [[ "$CAN_MODIFY" != "true" ]]; then
90− cat <<EOF
91− Check that maintainers can edit the PR branch:
92−
93− $(message)
94− EOF
95− exit 1
96− fi
97− - uses: actions/checkout@v2
98− with:
99− fetch-depth: 0
100− - name: rebase pull request
101− env:
102− GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
103− run: |
104− git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
105− git config --global user.name "github-actions[bot]"
106− git fetch origin
107− gh pr checkout "$PULL_REQUEST"
108− git rebase \
109− --onto="$(git merge-base origin/"$CURRENT_BASE" origin/"$COMMENT_BRANCH")" \
110− "HEAD~$COMMITS"
111− git push --force
112− curl \
113− -X POST \
114− -H "Accept: application/vnd.github.v3+json" \
115− -H "Authorization: token $GITHUB_TOKEN" \
116− -d "{ \"base\": \"$COMMENT_BRANCH\" }" \
117− "https://api.github.com/repos/${{ github.repository }}/pulls/$PULL_REQUEST"
118− curl \
119− -X PATCH \
120− -H "Accept: application/vnd.github.v3+json" \
121− -H "Authorization: token $GITHUB_TOKEN" \
122− -d '{ "state": "closed" }' \
123− "https://api.github.com/repos/${{ github.repository }}/pulls/$PULL_REQUEST"
124− - uses: peter-evans/create-or-update-comment@v1
125− with:
126− issue-number: ${{ github.event.issue.number }}
127− body: |
128− Rebased, please reopen the pull request to restart CI
129− - uses: peter-evans/create-or-update-comment@v1
130− if: failure()
131− with:
132− issue-number: ${{ github.event.issue.number }}
133− body: |
134− [Failed to rebase](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})
.github/workflows/update-terraform-providers.ymlnew file+48
@@ -0,0 +1,48 @@
1+name: "Update terraform-providers"
2+
3+on:
4+ schedule:
5+ - cron: "14 3 * * 1"
6+ workflow_dispatch:
7+
8+jobs:
9+ tf-providers:
10+ if: github.repository_owner == 'NixOS' && github.ref == 'refs/heads/master' # ensure workflow_dispatch only runs on master
11+ runs-on: ubuntu-latest
12+ steps:
13+ - uses: actions/checkout@v3
14+ - uses: cachix/install-nix-action@v17
15+ - name: setup
16+ id: setup
17+ run: |
18+ echo ::set-output name=title::"terraform-providers: update $(date -u +"%Y-%m-%d")"
19+ - name: update terraform-providers
20+ run: |
21+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
22+ git config user.name "github-actions[bot]"
23+ pushd pkgs/applications/networking/cluster/terraform-providers
24+ ./update-all-providers --no-build
25+ git commit -m "${{ steps.setup.outputs.title }}" providers.json
26+ popd
27+ - name: create PR
28+ uses: peter-evans/create-pull-request@v4
29+ with:
30+ body: |
31+ Automatic update by [update-terraform-providers](https://github.com/NixOS/nixpkgs/blob/master/.github/workflows/update-terraform-providers.yml) action.
32+
33+ Check that all providers build with:
34+ ```
35+ @ofborg build terraform-full
36+ ```
37+ branch: terraform-providers-update
38+ delete-branch: false
39+ labels: "2.status: work-in-progress"
40+ title: ${{ steps.setup.outputs.title }}
41+ token: ${{ secrets.GITHUB_TOKEN }}
42+ - name: comment on failure
43+ uses: peter-evans/create-or-update-comment@v2
44+ if: ${{ failure() }}
45+ with:
46+ issue-number: 153416
47+ body: |
48+ Automatic update of terraform providers [failed](https://github.com/NixOS/nixpkgs/actions/runs/${{ github.run_id }}).
.gitignore+7
@@ -2,8 +2,12 @@
22,*
33.*.swp
44.*.swo
5+.idea/
6+.vscode/
7+outputs/
58result
69result-*
10+source/
711/doc/NEWS.html
812/doc/NEWS.txt
913/doc/manual.html
@@ -20,3 +24,6 @@ __pycache__
2024
2125# generated by pkgs/common-updater/update-script.nix
2226update-git-commits.txt
27+
28+# JetBrains IDEA module declaration file
29+/nixpkgs.iml
.version+1−1
@@ -1 +1 @@
1−21.11
1+22.05
CONTRIBUTING.mdnew file+130
@@ -0,0 +1,130 @@
1+# How to contribute
2+
3+Note: contributing implies licensing those contributions
4+under the terms of [COPYING](COPYING), which is an MIT-like license.
5+
6+## Opening issues
7+
8+* Make sure you have a [GitHub account](https://github.com/signup/free)
9+* Make sure there is no open issue on the topic
10+* [Submit a new issue](https://github.com/NixOS/nixpkgs/issues/new/choose) by choosing the kind of topic and fill out the template
11+
12+## Submitting changes
13+
14+Read the ["Submitting changes"](https://nixos.org/nixpkgs/manual/#chap-submitting-changes) section of the nixpkgs manual. It explains how to write, test, and iterate on your change, and which branch to base your pull request against.
15+
16+Below is a short excerpt of some points in there:
17+
18+* Format the commit messages in the following way:
19+
20+ ```
21+ (pkg-name | nixos/<module>): (from -> to | init at version | refactor | etc)
22+
23+ (Motivation for change. Link to release notes. Additional information.)
24+ ```
25+
26+ For consistency, there should not be a period at the end of the commit message's summary line (the first line of the commit message).
27+
28+ Examples:
29+
30+ * nginx: init at 2.0.1
31+ * firefox: 54.0.1 -> 55.0
32+ https://www.mozilla.org/en-US/firefox/55.0/releasenotes/
33+ * nixos/hydra: add bazBaz option
34+
35+ Dual baz behavior is needed to do foo.
36+ * nixos/nginx: refactor config generation
37+
38+ The old config generation system used impure shell scripts and could break in specific circumstances (see #1234).
39+
40+* `meta.description` should:
41+ * Be capitalized.
42+ * Not start with the package name.
43+ * Not have a period at the end.
44+* `meta.license` must be set and fit the upstream license.
45+ * If there is no upstream license, `meta.license` should default to `lib.licenses.unfree`.
46+* `meta.maintainers` must be set.
47+
48+See the nixpkgs manual for more details on [standard meta-attributes](https://nixos.org/nixpkgs/manual/#sec-standard-meta-attributes).
49+
50+## Writing good commit messages
51+
52+In addition to writing properly formatted commit messages, it's important to include relevant information so other developers can later understand *why* a change was made. While this information usually can be found by digging code, mailing list/Discourse archives, pull request discussions or upstream changes, it may require a lot of work.
53+
54+For package version upgrades and such a one-line commit message is usually sufficient.
55+
56+## Rebasing between branches (i.e. from master to staging)
57+
58+From time to time, changes between branches must be rebased, for example, if the
59+number of new rebuilds they would cause is too large for the target branch. When
60+rebasing, care must be taken to include only the intended changes, otherwise
61+many CODEOWNERS will be inadvertently requested for review. To achieve this,
62+rebasing should not be performed directly on the target branch, but on the merge
63+base between the current and target branch.
64+
65+In the following example, we see a rebase from `master` onto the merge base
66+between `master` and `staging`, so that a change can eventually be retargeted to
67+`staging`. The example uses `upstream` as the remote for `NixOS/nixpkgs.git`
68+while the `origin` remote is used for the remote you are pushing to.
69+
70+
71+```console
72+# Find the common base between two branches
73+common=$(git merge-base upstream/master upstream/staging)
74+# Find the common base between your feature branch and master
75+commits=$(git merge-base $(git branch --show-current) upstream/master)
76+# Rebase all commits onto the common base
77+git rebase --onto=$common $commits
78+# Force push your changes
79+git push origin $(git branch --show-current) --force-with-lease
80+```
81+
82+Then change the base branch in the GitHub PR using the *Edit* button in the upper
83+right corner, and switch from `master` to `staging`. After the PR has been
84+retargeted it might be necessary to do a final rebase onto the target branch, to
85+resolve any outstanding merge conflicts.
86+
87+```console
88+# Rebase onto target branch
89+git rebase upstream/staging
90+# Review and fixup possible conflicts
91+git status
92+# Force push your changes
93+git push origin $(git branch --show-current) --force-with-lease
94+```
95+
96+## Backporting changes
97+
98+Follow these steps to backport a change into a release branch in compliance with the [commit policy](https://nixos.org/nixpkgs/manual/#submitting-changes-stable-release-branches).
99+
100+1. Take note of the commits in which the change was introduced into `master` branch.
101+2. Check out the target _release branch_, e.g. `release-21.11`. Do not use a _channel branch_ like `nixos-21.11` or `nixpkgs-21.11-darwin`.
102+3. Create a branch for your change, e.g. `git checkout -b backport`.
103+4. When the reason to backport is not obvious from the original commit message, use `git cherry-pick -xe <original commit>` and add a reason. Otherwise use `git cherry-pick -x <original commit>`. That's fine for minor version updates that only include security and bug fixes, commits that fixes an otherwise broken package or similar. Please also ensure the commits exists on the master branch; in the case of squashed or rebased merges, the commit hash will change and the new commits can be found in the merge message at the bottom of the master pull request.
104+5. Push to GitHub and open a backport pull request. Make sure to select the release branch (e.g. `release-21.11`) as the target branch of the pull request, and link to the pull request in which the original change was comitted to `master`. The pull request title should be the commit title with the release version as prefix, e.g. `[21.11]`.
105+6. When the backport pull request is merged and you have the necessary privileges you can also replace the label `9.needs: port to stable` with `8.has: port to stable` on the original pull request. This way maintainers can keep track of missing backports easier.
106+
107+## Criteria for Backporting changes
108+
109+Anything that does not cause user or downstream dependency regressions can be backported. This includes:
110+- New Packages / Modules
111+- Security / Patch updates
112+- Version updates which include new functionality (but no breaking changes)
113+- Services which require a client to be up-to-date regardless. (E.g. `spotify`, `steam`, or `discord`)
114+- Security critical applications (E.g. `firefox`)
115+
116+## Generating 22.05 Release Notes
117+
118+(This section also applies to backporting 21.11 release notes: substitute "rl-2205" for "rl-2111".)
119+
120+Documentation in nixpkgs is transitioning to a markdown-centric workflow. Release notes now require a translation step to convert from markdown to a compatible docbook document.
121+
122+Steps for updating 22.05 Release notes:
123+
124+1. Edit `nixos/doc/manual/release-notes/rl-2205.section.md` with the desired changes
125+2. Run `./nixos/doc/manual/md-to-db.sh` to render `nixos/doc/manual/from_md/release-notes/rl-2205.section.xml`
126+3. Include changes to `rl-2205.section.md` and `rl-2205.section.xml` in the same commit.
127+
128+## Reviewing contributions
129+
130+See the nixpkgs manual for more details on how to [Review contributions](https://nixos.org/nixpkgs/manual/#chap-reviewing-contributions).
COPYING+1−1
@@ -1,4 +1,4 @@
1−Copyright (c) 2003-2021 Eelco Dolstra and the Nixpkgs/NixOS contributors
1+Copyright (c) 2003-2022 Eelco Dolstra and the Nixpkgs/NixOS contributors
22
33Permission is hereby granted, free of charge, to any person obtaining
44a copy of this software and associated documentation files (the
README.md+15−9
@@ -1,14 +1,19 @@
11<p align="center">
2− <a href="https://nixos.org/nixos"><img src="https://nixos.org/logo/nixos-hires.png" width="500px" alt="NixOS logo" /></a>
2+ <a href="https://nixos.org#gh-light-mode-only">
3+ <img src="https://raw.githubusercontent.com/NixOS/nixos-homepage/master/logo/nixos-hires.png" width="500px" alt="NixOS logo"/>
4+ </a>
5+ <a href="https://nixos.org#gh-dark-mode-only">
6+ <img src="https://raw.githubusercontent.com/NixOS/nixos-artwork/master/logo/nixos-white.png" width="500px" alt="NixOS logo"/>
7+ </a>
38</p>
49
510<p align="center">
6− <a href="https://www.codetriage.com/nixos/nixpkgs"><img src="https://www.codetriage.com/nixos/nixpkgs/badges/users.svg" alt="Code Triagers badge" /></a>
7− <a href="https://opencollective.com/nixos"><img src="https://opencollective.com/nixos/tiers/supporter/badge.svg?label=Supporter&color=brightgreen" alt="Open Collective supporters" /></a>
11+ <a href="https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md"><img src="https://img.shields.io/github/contributors-anon/NixOS/nixpkgs" alt="Contributors badge" /></a>
12+ <a href="https://opencollective.com/nixos"><img src="https://opencollective.com/nixos/tiers/supporter/badge.svg?label=supporters&color=brightgreen" alt="Open Collective supporters" /></a>
813</p>
914
1015[Nixpkgs](https://github.com/nixos/nixpkgs) is a collection of over
11−60,000 software packages that can be installed with the
16+80,000 software packages that can be installed with the
1217[Nix](https://nixos.org/nix/) package manager. It also implements
1318[NixOS](https://nixos.org/nixos/), a purely-functional Linux distribution.
1419
@@ -46,14 +51,14 @@ Nixpkgs and NixOS are built and tested by our continuous integration
4651system, [Hydra](https://hydra.nixos.org/).
4752
4853* [Continuous package builds for unstable/master](https://hydra.nixos.org/jobset/nixos/trunk-combined)
49−* [Continuous package builds for the NixOS 20.09 release](https://hydra.nixos.org/jobset/nixos/release-20.09)
54+* [Continuous package builds for the NixOS 21.11 release](https://hydra.nixos.org/jobset/nixos/release-21.11)
5055* [Tests for unstable/master](https://hydra.nixos.org/job/nixos/trunk-combined/tested#tabs-constituents)
51−* [Tests for the NixOS 20.09 release](https://hydra.nixos.org/job/nixos/release-20.09/tested#tabs-constituents)
56+* [Tests for the NixOS 21.11 release](https://hydra.nixos.org/job/nixos/release-21.11/tested#tabs-constituents)
5257
5358Artifacts successfully built with Hydra are published to cache at
5459https://cache.nixos.org/. When successful build and test criteria are
5560met, the Nixpkgs expressions are distributed via [Nix
56−channels](https://nixos.org/nix/manual/#sec-channels).
61+channels](https://nixos.org/manual/nix/stable/package-management/channels.html).
5762
5863# Contributing
5964
@@ -87,7 +92,7 @@ Most contributions are based on and merged into these branches:
8792 deemed of sufficiently high quality
8893
8994For more information about contributing to the project, please visit
90−the [contributing page](https://github.com/NixOS/nixpkgs/blob/master/.github/CONTRIBUTING.md).
95+the [contributing page](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md).
9196
9297# Donations
9398
@@ -97,7 +102,8 @@ Foundation](https://nixos.org/nixos/foundation.html). To ensure the
97102continuity and expansion of the NixOS infrastructure, we are looking
98103for donations to our organization.
99104
100−You can donate to the NixOS foundation by using Open Collective:
105+You can donate to the NixOS foundation through [SEPA bank
106+transfers](https://nixos.org/donate.html) or by using Open Collective:
101107
102108<a href="https://opencollective.com/nixos#support"><img src="https://opencollective.com/nixos/tiers/supporter.svg?width=890" /></a>
103109
doc/Makefile+10−4
@@ -3,11 +3,17 @@ MD_TARGETS=$(addsuffix .xml, $(basename $(shell find . -type f -regex '.*\.md$$'
33PANDOC ?= pandoc
44
55pandoc_media_dir = media
6+# NOTE: Keep in sync with NixOS manual (/nixos/doc/manual/md-to-db.sh) and conversion script (/maintainers/scripts/db-to-md.sh).
67# TODO: Remove raw-attribute when we can get rid of DocBook altogether.
78pandoc_commonmark_enabled_extensions = +attributes+fenced_divs+footnotes+bracketed_spans+definition_lists+pipe_tables+raw_attribute
9+# Not needed:
10+# - docbook-reader/citerefentry-to-rst-role.lua (only relevant for DocBook → MarkDown/rST/MyST)
811pandoc_flags = --extract-media=$(pandoc_media_dir) \
912 --lua-filter=$(PANDOC_LUA_FILTERS_DIR)/diagram-generator.lua \
10− --lua-filter=labelless-link-is-xref.lua \
13+ --lua-filter=build-aux/pandoc-filters/myst-reader/roles.lua \
14+ --lua-filter=build-aux/pandoc-filters/link-unix-man-references.lua \
15+ --lua-filter=build-aux/pandoc-filters/docbook-writer/rst-roles.lua \
16+ --lua-filter=build-aux/pandoc-filters/docbook-writer/labelless-link-is-xref.lua \
1117 -f commonmark$(pandoc_commonmark_enabled_extensions)+smart
1218
1319.PHONY: all
@@ -32,7 +38,7 @@ fix-misc-xml:
3238.PHONY: clean
3339clean:
3440 rm -f ${MD_TARGETS} doc-support/result .version manual-full.xml functions/library/locations.xml functions/library/generated
35− rm -rf ./out/ ./highlightjs
41+ rm -rf ./out/ ./highlightjs ./media
3642
3743.PHONY: validate
3844validate: manual-full.xml doc-support/result
@@ -101,10 +107,10 @@ functions/library/generated: doc-support/result
101107%.section.xml: %.section.md
102108 $(PANDOC) $^ -t docbook \
103109 $(pandoc_flags) \
104− | cat > $@
110+ -o $@
105111
106112%.chapter.xml: %.chapter.md
107113 $(PANDOC) $^ -t docbook \
108114 --top-level-division=chapter \
109115 $(pandoc_flags) \
110− | cat > $@
116+ -o $@
doc/build-aux/pandoc-filters/docbook-reader/citerefentry-to-rst-role.luanew file+23
@@ -0,0 +1,23 @@
1+--[[
2+Converts Code AST nodes produced by pandoc’s DocBook reader
3+from citerefentry elements into AST for corresponding role
4+for reStructuredText.
5+
6+We use subset of MyST syntax (CommonMark with features from rST)
7+so let’s use the rST AST for rST features.
8+
9+Reference: https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-manpage
10+]]
11+
12+function Code(elem)
13+ elem.classes = elem.classes:map(function (x)
14+ if x == 'citerefentry' then
15+ elem.attributes['role'] = 'manpage'
16+ return 'interpreted-text'
17+ else
18+ return x
19+ end
20+ end)
21+
22+ return elem
23+end
doc/build-aux/pandoc-filters/docbook-writer/labelless-link-is-xref.luanew file+34
@@ -0,0 +1,34 @@
1+--[[
2+Converts Link AST nodes with empty label to DocBook xref elements.
3+
4+This is a temporary script to be able use cross-references conveniently
5+using syntax taken from MyST, while we still use docbook-xsl
6+for generating the documentation.
7+
8+Reference: https://myst-parser.readthedocs.io/en/latest/using/syntax.html#targets-and-cross-referencing
9+]]
10+
11+local function starts_with(start, str)
12+ return str:sub(1, #start) == start
13+end
14+
15+local function escape_xml_arg(arg)
16+ amps = arg:gsub('&', '&amp;')
17+ amps_quotes = amps:gsub('"', '&quot;')
18+ amps_quotes_lt = amps_quotes:gsub('<', '&lt;')
19+
20+ return amps_quotes_lt
21+end
22+
23+function Link(elem)
24+ has_no_content = #elem.content == 0
25+ targets_anchor = starts_with('#', elem.target)
26+ has_no_attributes = elem.title == '' and elem.identifier == '' and #elem.classes == 0 and #elem.attributes == 0
27+
28+ if has_no_content and targets_anchor and has_no_attributes then
29+ -- xref expects idref without the pound-sign
30+ target_without_hash = elem.target:sub(2, #elem.target)
31+
32+ return pandoc.RawInline('docbook', '<xref linkend="' .. escape_xml_arg(target_without_hash) .. '" />')
33+ end
34+end
doc/build-aux/pandoc-filters/docbook-writer/rst-roles.luanew file+36
@@ -0,0 +1,36 @@
1+--[[
2+Converts AST for reStructuredText roles into corresponding
3+DocBook elements.
4+
5+Currently, only a subset of roles is supported.
6+
7+Reference:
8+ List of roles:
9+ https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html
10+ manpage:
11+ https://tdg.docbook.org/tdg/5.1/citerefentry.html
12+ file:
13+ https://tdg.docbook.org/tdg/5.1/filename.html
14+]]
15+
16+function Code(elem)
17+ if elem.classes:includes('interpreted-text') then
18+ local tag = nil
19+ local content = elem.text
20+ if elem.attributes['role'] == 'manpage' then
21+ tag = 'citerefentry'
22+ local title, volnum = content:match('^(.+)%((%w+)%)$')
23+ if title == nil then
24+ -- No volnum in parentheses.
25+ title = content
26+ end
27+ content = '<refentrytitle>' .. title .. '</refentrytitle>' .. (volnum ~= nil and ('<manvolnum>' .. volnum .. '</manvolnum>') or '')
28+ elseif elem.attributes['role'] == 'file' then
29+ tag = 'filename'
30+ end
31+
32+ if tag ~= nil then
33+ return pandoc.RawInline('docbook', '<' .. tag .. '>' .. content .. '</' .. tag .. '>')
34+ end
35+ end
36+end
doc/build-aux/pandoc-filters/link-unix-man-references.luanew file+17
@@ -0,0 +1,17 @@
1+--[[
2+Turns a manpage reference into a link, when a mapping is defined below.
3+]]
4+
5+local man_urls = {
6+ ["tmpfiles.d(5)"] = "https://www.freedesktop.org/software/systemd/man/tmpfiles.d.html",
7+ ["nix.conf(5)"] = "https://nixos.org/manual/nix/stable/#sec-conf-file",
8+ ["systemd.time(7)"] = "https://www.freedesktop.org/software/systemd/man/systemd.time.html",
9+ ["systemd.timer(5)"] = "https://www.freedesktop.org/software/systemd/man/systemd.timer.html",
10+}
11+
12+function Code(elem)
13+ local is_man_role = elem.classes:includes('interpreted-text') and elem.attributes['role'] == 'manpage'
14+ if is_man_role and man_urls[elem.text] ~= nil then
15+ return pandoc.Link(elem, man_urls[elem.text])
16+ end
17+end
doc/build-aux/pandoc-filters/myst-reader/roles.luanew file+29
@@ -0,0 +1,29 @@
1+--[[
2+Replaces Str AST nodes containing {role}, followed by a Code node
3+by a Code node with attrs that would be produced by rST reader
4+from the role syntax.
5+
6+This is to emulate MyST syntax in Pandoc.
7+(MyST is a CommonMark flavour with rST features mixed in.)
8+
9+Reference: https://myst-parser.readthedocs.io/en/latest/syntax/syntax.html#roles-an-in-line-extension-point
10+]]
11+
12+function Inlines(inlines)
13+ for i = #inlines-1,1,-1 do
14+ local first = inlines[i]
15+ local second = inlines[i+1]
16+ local correct_tags = first.tag == 'Str' and second.tag == 'Code'
17+ if correct_tags then
18+ -- docutils supports alphanumeric strings separated by [-._:]
19+ -- We are slightly more liberal for simplicity.
20+ local role = first.text:match('^{([-._+:%w]+)}$')
21+ if role ~= nil then
22+ inlines:remove(i)
23+ second.attributes['role'] = role
24+ second.classes:insert('interpreted-text')
25+ end
26+ end
27+ end
28+ return inlines
29+end
doc/build-aux/pandoc-filters/myst-writer/roles.luanew file+25
@@ -0,0 +1,25 @@
1+--[[
2+Replaces Code nodes with attrs that would be produced by rST reader
3+from the role syntax by a Str AST node containing {role}, followed by a Code node.
4+
5+This is to emulate MyST syntax in Pandoc.
6+(MyST is a CommonMark flavour with rST features mixed in.)
7+
8+Reference: https://myst-parser.readthedocs.io/en/latest/syntax/syntax.html#roles-an-in-line-extension-point
9+]]
10+
11+function Code(elem)
12+ local role = elem.attributes['role']
13+
14+ if elem.classes:includes('interpreted-text') and role ~= nil then
15+ elem.classes = elem.classes:filter(function (c)
16+ return c ~= 'interpreted-text'
17+ end)
18+ elem.attributes['role'] = nil
19+
20+ return {
21+ pandoc.Str('{' .. role .. '}'),
22+ elem,
23+ }
24+ end
25+end
doc/builders/fetchers.chapter.md+49−12
@@ -1,8 +1,16 @@
11# Fetchers {#chap-pkgs-fetchers}
22
3−When using Nix, you will frequently need to download source code and other files from the internet. Nixpkgs comes with a few helper functions that allow you to fetch fixed-output derivations in a structured way.
3+When using Nix, you will frequently need to download source code and other files from the internet. For this purpose, Nix provides the [_fixed output derivation_](https://nixos.org/manual/nix/stable/#fixed-output-drvs) feature and Nixpkgs provides various functions that implement the actual fetching from various protocols and services.
44
5−The two fetcher primitives are `fetchurl` and `fetchzip`. Both of these have two required arguments, a URL and a hash. The hash is typically `sha256`, although many more hash algorithms are supported. Nixpkgs contributors are currently recommended to use `sha256`. This hash will be used by Nix to identify your source. A typical usage of fetchurl is provided below.
5+## Caveats
6+
7+Because fixed output derivations are _identified_ by their hash, a common mistake is to update a fetcher's URL or a version parameter, without updating the hash. **This will cause the old contents to be used.** So remember to always invalidate the hash argument.
8+
9+For those who develop and maintain fetchers, a similar problem arises with changes to the implementation of a fetcher. These may cause a fixed output derivation to fail, but won't normally be caught by tests because the supposed output is already in the store or cache. For the purpose of testing, you can use a trick that is embodied by the [`invalidateFetcherByDrvHash`](#tester-invalidateFetcherByDrvHash) function. It uses the derivation `name` to create a unique output path per fetcher implementation, defeating the caching precisely where it would be harmful.
10+
11+## `fetchurl` and `fetchzip` {#fetchurl}
12+
13+Two basic fetchers are `fetchurl` and `fetchzip`. Both of these have two required arguments, a URL and a hash. The hash is typically `sha256`, although many more hash algorithms are supported. Nixpkgs contributors are currently recommended to use `sha256`. This hash will be used by Nix to identify your source. A typical usage of `fetchurl` is provided below.
614
715```nix
816{ stdenv, fetchurl }:
@@ -16,11 +24,11 @@ stdenv.mkDerivation {
1624}
1725```
1826
19−The main difference between `fetchurl` and `fetchzip` is in how they store the contents. `fetchurl` will store the unaltered contents of the URL within the Nix store. `fetchzip` on the other hand will decompress the archive for you, making files and directories directly accessible in the future. `fetchzip` can only be used with archives. Despite the name, `fetchzip` is not limited to .zip files and can also be used with any tarball.
27+The main difference between `fetchurl` and `fetchzip` is in how they store the contents. `fetchurl` will store the unaltered contents of the URL within the Nix store. `fetchzip` on the other hand, will decompress the archive for you, making files and directories directly accessible in the future. `fetchzip` can only be used with archives. Despite the name, `fetchzip` is not limited to .zip files and can also be used with any tarball.
2028
21−`fetchpatch` works very similarly to `fetchurl` with the same arguments expected. It expects patch files as a source and performs normalization on them before computing the checksum. For example it will remove comments or other unstable parts that are sometimes added by version control systems and can change over time.
29+`fetchpatch` works very similarly to `fetchurl` with the same arguments expected. It expects patch files as a source and performs normalization on them before computing the checksum. For example, it will remove comments or other unstable parts that are sometimes added by version control systems and can change over time.
2230
23−Other fetcher functions allow you to add source code directly from a VCS such as subversion or git. These are mostly straightforward nambes based on the name of the command used with the VCS system. Because they give you a working repository, they act most like `fetchzip`.
31+Most other fetchers return a directory rather than a single file.
2432
2533## `fetchsvn` {#fetchsvn}
2634
@@ -30,7 +38,25 @@ Used with Subversion. Expects `url` to a Subversion directory, `rev`, and `sha25
3038
3139Used with Git. Expects `url` to a Git repo, `rev`, and `sha256`. `rev` in this case can be full the git commit id (SHA1 hash) or a tag name like `refs/tags/v1.0`.
3240
33−Additionally the following optional arguments can be given: `fetchSubmodules = true` makes `fetchgit` also fetch the submodules of a repository. If `deepClone` is set to true, the entire repository is cloned as opposing to just creating a shallow clone. `deepClone = true` also implies `leaveDotGit = true` which means that the `.git` directory of the clone won't be removed after checkout.
41+Additionally, the following optional arguments can be given: `fetchSubmodules = true` makes `fetchgit` also fetch the submodules of a repository. If `deepClone` is set to true, the entire repository is cloned as opposing to just creating a shallow clone. `deepClone = true` also implies `leaveDotGit = true` which means that the `.git` directory of the clone won't be removed after checkout.
42+
43+If only parts of the repository are needed, `sparseCheckout` can be used. This will prevent git from fetching unnecessary blobs from server, see [git sparse-checkout](https://git-scm.com/docs/git-sparse-checkout) and [git clone --filter](https://git-scm.com/docs/git-clone#Documentation/git-clone.txt---filterltfilter-specgt) for more information:
44+
45+```nix
46+{ stdenv, fetchgit }:
47+
48+stdenv.mkDerivation {
49+ name = "hello";
50+ src = fetchgit {
51+ url = "https://...";
52+ sparseCheckout = ''
53+ path/to/be/included
54+ another/path
55+ '';
56+ sha256 = "0000000000000000000000000000000000000000000000000000";
57+ };
58+}
59+```
3460
3561## `fetchfossil` {#fetchfossil}
3662
@@ -46,19 +72,23 @@ Used with Mercurial. Expects `url`, `rev`, and `sha256`.
4672
4773A number of fetcher functions wrap part of `fetchurl` and `fetchzip`. They are mainly convenience functions intended for commonly used destinations of source code in Nixpkgs. These wrapper fetchers are listed below.
4874
75+## `fetchFromGitea` {#fetchfromgitea}
76+
77+`fetchFromGitea` expects five arguments. `domain` is the gitea server name. `owner` is a string corresponding to the Gitea user or organization that controls this repository. `repo` corresponds to the name of the software repository. These are located at the top of every Gitea HTML page as `owner`/`repo`. `rev` corresponds to the Git commit hash or tag (e.g `v1.0`) that will be downloaded from Git. Finally, `sha256` corresponds to the hash of the extracted directory. Again, other hash algorithms are also available but `sha256` is currently preferred.
78+
4979## `fetchFromGitHub` {#fetchfromgithub}
5080
51−`fetchFromGitHub` expects four arguments. `owner` is a string corresponding to the GitHub user or organization that controls this repository. `repo` corresponds to the name of the software repository. These are located at the top of every GitHub HTML page as `owner`/`repo`. `rev` corresponds to the Git commit hash or tag (e.g `v1.0`) that will be downloaded from Git. Finally, `sha256` corresponds to the hash of the extracted directory. Again, other hash algorithms are also available but `sha256` is currently preferred.
81+`fetchFromGitHub` expects four arguments. `owner` is a string corresponding to the GitHub user or organization that controls this repository. `repo` corresponds to the name of the software repository. These are located at the top of every GitHub HTML page as `owner`/`repo`. `rev` corresponds to the Git commit hash or tag (e.g `v1.0`) that will be downloaded from Git. Finally, `sha256` corresponds to the hash of the extracted directory. Again, other hash algorithms are also available, but `sha256` is currently preferred.
5282
5383`fetchFromGitHub` uses `fetchzip` to download the source archive generated by GitHub for the specified revision. If `leaveDotGit`, `deepClone` or `fetchSubmodules` are set to `true`, `fetchFromGitHub` will use `fetchgit` instead. Refer to its section for documentation of these options.
5484
5585## `fetchFromGitLab` {#fetchfromgitlab}
5686
57−This is used with GitLab repositories. The arguments expected are very similar to fetchFromGitHub above.
87+This is used with GitLab repositories. The arguments expected are very similar to `fetchFromGitHub` above.
5888
5989## `fetchFromGitiles` {#fetchfromgitiles}
6090
61−This is used with Gitiles repositories. The arguments expected are similar to fetchgit.
91+This is used with Gitiles repositories. The arguments expected are similar to `fetchgit`.
6292
6393## `fetchFromBitbucket` {#fetchfrombitbucket}
6494
@@ -66,12 +96,19 @@ This is used with BitBucket repositories. The arguments expected are very simila
6696
6797## `fetchFromSavannah` {#fetchfromsavannah}
6898
69−This is used with Savannah repositories. The arguments expected are very similar to fetchFromGitHub above.
99+This is used with Savannah repositories. The arguments expected are very similar to `fetchFromGitHub` above.
70100
71101## `fetchFromRepoOrCz` {#fetchfromrepoorcz}
72102
73−This is used with repo.or.cz repositories. The arguments expected are very similar to fetchFromGitHub above.
103+This is used with repo.or.cz repositories. The arguments expected are very similar to `fetchFromGitHub` above.
74104
75105## `fetchFromSourcehut` {#fetchfromsourcehut}
76106
77−This is used with sourcehut repositories. The arguments expected are very similar to fetchFromGitHub above. Don't forget the tilde (~) in front of the user name!
107+This is used with sourcehut repositories. Similar to `fetchFromGitHub` above,
108+it expects `owner`, `repo`, `rev` and `sha256`, but don't forget the tilde (~)
109+in front of the username! Expected arguments also include `vc` ("git" (default)
110+or "hg"), `domain` and `fetchSubmodules`.
111+
112+If `fetchSubmodules` is `true`, `fetchFromSourcehut` uses `fetchgit`
113+or `fetchhg` with `fetchSubmodules` or `fetchSubrepos` set to `true`,
114+respectively. Otherwise, the fetcher uses `fetchzip`.
doc/builders/images/dockertools.section.md+14−8
@@ -58,7 +58,7 @@ After the new layer has been created, its closure (to which `contents`, `config`
5858
5959At the end of the process, only one new single layer will be produced and added to the resulting image.
6060
61−The resulting repository will only list the single image `image/tag`. In the case of [the `buildImage` example](#ex-dockerTools-buildImage) it would be `redis/latest`.
61+The resulting repository will only list the single image `image/tag`. In the case of [the `buildImage` example](#ex-dockerTools-buildImage), it would be `redis/latest`.
6262
6363It is possible to inspect the arguments with which an image was built using its `buildArgs` attribute.
6464
@@ -87,7 +87,7 @@ pkgs.dockerTools.buildImage {
8787}
8888```
8989
90−and now the Docker CLI will display a reasonable date and sort the images as expected:
90+Now the Docker CLI will display a reasonable date and sort the images as expected:
9191
9292```ShellSession
9393$ docker images
@@ -95,7 +95,7 @@ REPOSITORY TAG IMAGE ID CREATED SIZE
9595hello latest de2bf4786de6 About a minute ago 25.2MB
9696```
9797
98−however, the produced images will not be binary reproducible.
98+However, the produced images will not be binary reproducible.
9999
100100## buildLayeredImage {#ssec-pkgs-dockerTools-buildLayeredImage}
101101
@@ -119,13 +119,13 @@ Create a Docker image with many of the store paths being on their own layer to i
119119
120120`contents` _optional_
121121
122−: Top level paths in the container. Either a single derivation, or a list of derivations.
122+: Top-level paths in the container. Either a single derivation, or a list of derivations.
123123
124124 *Default:* `[]`
125125
126126`config` _optional_
127127
128−: Run-time configuration of the container. A full list of the options are available at in the [ Docker Image Specification v1.2.0 ](https://github.com/moby/moby/blob/master/image/spec/v1.2.md#image-json-field-descriptions).
128+: Run-time configuration of the container. A full list of the options are available at in the [Docker Image Specification v1.2.0](https://github.com/moby/moby/blob/master/image/spec/v1.2.md#image-json-field-descriptions).
129129
130130 *Default:* `{}`
131131
@@ -151,6 +151,12 @@ Create a Docker image with many of the store paths being on their own layer to i
151151
152152: Shell commands to run while creating the archive for the final layer in a fakeroot environment. Unlike `extraCommands`, you can run `chown` to change the owners of the files in the archive, changing fakeroot's state instead of the real filesystem. The latter would require privileges that the build user does not have. Static binaries do not interact with the fakeroot environment. By default all files in the archive will be owned by root.
153153
154+`enableFakechroot` _optional_
155+
156+: Whether to run in `fakeRootCommands` in `fakechroot`, making programs behave as though `/` is the root of the image being created, while files in the Nix store are available as usual. This allows scripts that perform installation in `/` to work as expected. Considering that `fakechroot` is implemented via the same mechanism as `fakeroot`, the same caveats apply.
157+
158+ *Default:* `false`
159+
154160### Behavior of `contents` in the final image {#dockerTools-buildLayeredImage-arg-contents}
155161
156162Each path directly listed in `contents` will have a symlink in the root of the image.
@@ -189,9 +195,9 @@ pkgs.dockerTools.buildLayeredImage {
189195
190196Increasing the `maxLayers` increases the number of layers which have a chance to be shared between different images.
191197
192−Modern Docker installations support up to 128 layers, however older versions support as few as 42.
198+Modern Docker installations support up to 128 layers, but older versions support as few as 42.
193199
194−If the produced image will not be extended by other Docker builds, it is safe to set `maxLayers` to `128`. However it will be impossible to extend the image further.
200+If the produced image will not be extended by other Docker builds, it is safe to set `maxLayers` to `128`. However, it will be impossible to extend the image further.
195201
196202The first (`maxLayers-2`) most "popular" paths will have their own individual layers, then layer \#`maxLayers-1` will contain all the remaining "unpopular" paths, and finally layer \#`maxLayers` will contain the Image configuration.
197203
@@ -207,7 +213,7 @@ The image produced by running the output script can be piped directly into `dock
207213$(nix-build) | docker load
208214```
209215
210−Alternatively, the image be piped via `gzip` into `skopeo`, e.g. to copy it into a registry:
216+Alternatively, the image be piped via `gzip` into `skopeo`, e.g., to copy it into a registry:
211217
212218```ShellSession
213219$(nix-build) | gzip --fast | skopeo copy docker-archive:/dev/stdin docker://some_docker_registry/myimage:tag
doc/builders/images/ocitools.section.md+3−3
@@ -1,10 +1,10 @@
11# pkgs.ociTools {#sec-pkgs-ociTools}
22
3−`pkgs.ociTools` is a set of functions for creating containers according to the [OCI container specification v1.0.0](https://github.com/opencontainers/runtime-spec). Beyond that it makes no assumptions about the container runner you choose to use to run the created container.
3+`pkgs.ociTools` is a set of functions for creating containers according to the [OCI container specification v1.0.0](https://github.com/opencontainers/runtime-spec). Beyond that, it makes no assumptions about the container runner you choose to use to run the created container.
44
55## buildContainer {#ssec-pkgs-ociTools-buildContainer}
66
7−This function creates a simple OCI container that runs a single command inside of it. An OCI container consists of a `config.json` and a rootfs directory.The nix store of the container will contain all referenced dependencies of the given command.
7+This function creates a simple OCI container that runs a single command inside of it. An OCI container consists of a `config.json` and a rootfs directory. The nix store of the container will contain all referenced dependencies of the given command.
88
99The parameters of `buildContainer` with an example value are described below:
1010
@@ -30,7 +30,7 @@ buildContainer {
3030}
3131```
3232
33−- `args` specifies a set of arguments to run inside the container. This is the only required argument for `buildContainer`. All referenced packages inside the derivation will be made available inside the container
33+- `args` specifies a set of arguments to run inside the container. This is the only required argument for `buildContainer`. All referenced packages inside the derivation will be made available inside the container.
3434
3535- `mounts` specifies additional mount points chosen by the user. By default only a minimal set of necessary filesystems are mounted into the container (e.g procfs, cgroupfs)
3636
doc/builders/images/snaptools.section.md+1−1
@@ -33,7 +33,7 @@ in snapTools.makeSnap {
3333
3434## Build a Graphical Snap {#ssec-pkgs-snapTools-build-a-snap-firefox}
3535
36−Graphical programs require many more integrations with the host. This example uses Firefox as an example, because it is one of the most complicated programs we could package.
36+Graphical programs require many more integrations with the host. This example uses Firefox as an example because it is one of the most complicated programs we could package.
3737
3838``` {#ex-snapTools-buildSnap-firefox .nix}
3939let
doc/builders/packages/citrix.section.md+5−5
@@ -4,13 +4,13 @@ The [Citrix Workspace App](https://www.citrix.com/products/workspace-app/) is a
44
55## Basic usage {#sec-citrix-base}
66
7−The tarball archive needs to be downloaded manually as the license agreements of the vendor for [Citrix Workspace](https://www.citrix.de/downloads/workspace-app/linux/workspace-app-for-linux-latest.html) needs to be accepted first. Then run `nix-prefetch-url file://$PWD/linuxx64-$version.tar.gz`. With the archive available in the store the package can be built and installed with Nix.
7+The tarball archive needs to be downloaded manually, as the license agreements of the vendor for [Citrix Workspace](https://www.citrix.de/downloads/workspace-app/linux/workspace-app-for-linux-latest.html) needs to be accepted first. Then run `nix-prefetch-url file://$PWD/linuxx64-$version.tar.gz`. With the archive available in the store, the package can be built and installed with Nix.
88
9−## Citrix Selfservice {#sec-citrix-selfservice}
9+## Citrix Self-service {#sec-citrix-selfservice}
1010
11−The [selfservice](https://support.citrix.com/article/CTX200337) is an application managing Citrix desktops and applications. Please note that this feature only works with at least citrix_workspace_20_06_0 and later versions.
11+The [self-service](https://support.citrix.com/article/CTX200337) is an application managing Citrix desktops and applications. Please note that this feature only works with at least citrix_workspace_20_06_0 and later versions.
1212
13−In order to set this up, you first have to [download the `.cr` file from the Netscaler Gateway](https://its.uiowa.edu/support/article/102186). After that you can configure the `selfservice` like this:
13+In order to set this up, you first have to [download the `.cr` file from the Netscaler Gateway](https://its.uiowa.edu/support/article/102186). After that, you can configure the `selfservice` like this:
1414
1515```ShellSession
1616$ storebrowse -C ~/Downloads/receiverconfig.cr
@@ -19,7 +19,7 @@ $ selfservice
1919
2020## Custom certificates {#sec-citrix-custom-certs}
2121
22−The `Citrix Workspace App` in `nixpkgs` trusts several certificates [from the Mozilla database](https://curl.haxx.se/docs/caextract.html) by default. However several companies using Citrix might require their own corporate certificate. On distros with imperative packaging these certs can be stored easily in [`$ICAROOT`](https://developer-docs.citrix.com/projects/receiver-for-linux-command-reference/en/13.7/), however this directory is a store path in `nixpkgs`. In order to work around this issue the package provides a simple mechanism to add custom certificates without rebuilding the entire package using `symlinkJoin`:
22+The `Citrix Workspace App` in `nixpkgs` trusts several certificates [from the Mozilla database](https://curl.haxx.se/docs/caextract.html) by default. However, several companies using Citrix might require their own corporate certificate. On distros with imperative packaging, these certs can be stored easily in [`$ICAROOT`](https://developer-docs.citrix.com/projects/receiver-for-linux-command-reference/en/13.7/), however this directory is a store path in `nixpkgs`. In order to work around this issue, the package provides a simple mechanism to add custom certificates without rebuilding the entire package using `symlinkJoin`:
2323
2424```nix
2525with import <nixpkgs> { config.allowUnfree = true; };
doc/builders/packages/eclipse.section.md+5−5
@@ -8,9 +8,9 @@ Nixpkgs provides a number of packages that will install Eclipse in its various f
88$ nix-env -f '<nixpkgs>' -qaP -A eclipses --description
99```
1010
11−Once an Eclipse variant is installed it can be run using the `eclipse` command, as expected. From within Eclipse it is then possible to install plugins in the usual manner by either manually specifying an Eclipse update site or by installing the Marketplace Client plugin and using it to discover and install other plugins. This installation method provides an Eclipse installation that closely resemble a manually installed Eclipse.
11+Once an Eclipse variant is installed, it can be run using the `eclipse` command, as expected. From within Eclipse, it is then possible to install plugins in the usual manner by either manually specifying an Eclipse update site or by installing the Marketplace Client plugin and using it to discover and install other plugins. This installation method provides an Eclipse installation that closely resemble a manually installed Eclipse.
1212
13−If you prefer to install plugins in a more declarative manner then Nixpkgs also offer a number of Eclipse plugins that can be installed in an _Eclipse environment_. This type of environment is created using the function `eclipseWithPlugins` found inside the `nixpkgs.eclipses` attribute set. This function takes as argument `{ eclipse, plugins ? [], jvmArgs ? [] }` where `eclipse` is a one of the Eclipse packages described above, `plugins` is a list of plugin derivations, and `jvmArgs` is a list of arguments given to the JVM running the Eclipse. For example, say you wish to install the latest Eclipse Platform with the popular Eclipse Color Theme plugin and also allow Eclipse to use more RAM. You could then add
13+If you prefer to install plugins in a more declarative manner, then Nixpkgs also offer a number of Eclipse plugins that can be installed in an _Eclipse environment_. This type of environment is created using the function `eclipseWithPlugins` found inside the `nixpkgs.eclipses` attribute set. This function takes as argument `{ eclipse, plugins ? [], jvmArgs ? [] }` where `eclipse` is a one of the Eclipse packages described above, `plugins` is a list of plugin derivations, and `jvmArgs` is a list of arguments given to the JVM running the Eclipse. For example, say you wish to install the latest Eclipse Platform with the popular Eclipse Color Theme plugin and also allow Eclipse to use more RAM. You could then add:
1414
1515```nix
1616packageOverrides = pkgs: {
@@ -22,15 +22,15 @@ packageOverrides = pkgs: {
2222}
2323```
2424
25−to your Nixpkgs configuration (`~/.config/nixpkgs/config.nix`) and install it by running `nix-env -f '<nixpkgs>' -iA myEclipse` and afterward run Eclipse as usual. It is possible to find out which plugins are available for installation using `eclipseWithPlugins` by running
25+to your Nixpkgs configuration (`~/.config/nixpkgs/config.nix`) and install it by running `nix-env -f '<nixpkgs>' -iA myEclipse` and afterward run Eclipse as usual. It is possible to find out which plugins are available for installation using `eclipseWithPlugins` by running:
2626
2727```ShellSession
2828$ nix-env -f '<nixpkgs>' -qaP -A eclipses.plugins --description
2929```
3030
31−If there is a need to install plugins that are not available in Nixpkgs then it may be possible to define these plugins outside Nixpkgs using the `buildEclipseUpdateSite` and `buildEclipsePlugin` functions found in the `nixpkgs.eclipses.plugins` attribute set. Use the `buildEclipseUpdateSite` function to install a plugin distributed as an Eclipse update site. This function takes `{ name, src }` as argument where `src` indicates the Eclipse update site archive. All Eclipse features and plugins within the downloaded update site will be installed. When an update site archive is not available then the `buildEclipsePlugin` function can be used to install a plugin that consists of a pair of feature and plugin JARs. This function takes an argument `{ name, srcFeature, srcPlugin }` where `srcFeature` and `srcPlugin` are the feature and plugin JARs, respectively.
31+If there is a need to install plugins that are not available in Nixpkgs then it may be possible to define these plugins outside Nixpkgs using the `buildEclipseUpdateSite` and `buildEclipsePlugin` functions found in the `nixpkgs.eclipses.plugins` attribute set. Use the `buildEclipseUpdateSite` function to install a plugin distributed as an Eclipse update site. This function takes `{ name, src }` as argument, where `src` indicates the Eclipse update site archive. All Eclipse features and plugins within the downloaded update site will be installed. When an update site archive is not available, then the `buildEclipsePlugin` function can be used to install a plugin that consists of a pair of feature and plugin JARs. This function takes an argument `{ name, srcFeature, srcPlugin }` where `srcFeature` and `srcPlugin` are the feature and plugin JARs, respectively.
3232
33−Expanding the previous example with two plugins using the above functions we have
33+Expanding the previous example with two plugins using the above functions, we have:
3434
3535```nix
3636packageOverrides = pkgs: {
doc/builders/packages/elm.section.md+1−1
@@ -1,6 +1,6 @@
11# Elm {#sec-elm}
22
3−To start a development environment do
3+To start a development environment, run:
44
55```ShellSession
66nix-shell -p elmPackages.elm elmPackages.elm-format
doc/builders/packages/emacs.section.md+4−4
@@ -20,7 +20,7 @@ The Emacs package comes with some extra helpers to make it easier to configure.
2020}
2121```
2222
23−You can install it like any other packages via `nix-env -iA myEmacs`. However, this will only install those packages. It will not `configure` them for us. To do this, we need to provide a configuration file. Luckily, it is possible to do this from within Nix! By modifying the above example, we can make Emacs load a custom config file. The key is to create a package that provide a `default.el` file in `/share/emacs/site-start/`. Emacs knows to load this file automatically when it starts.
23+You can install it like any other packages via `nix-env -iA myEmacs`. However, this will only install those packages. It will not `configure` them for us. To do this, we need to provide a configuration file. Luckily, it is possible to do this from within Nix! By modifying the above example, we can make Emacs load a custom config file. The key is to create a package that provides a `default.el` file in `/share/emacs/site-start/`. Emacs knows to load this file automatically when it starts.
2424
2525```nix
2626{
@@ -101,16 +101,16 @@ You can install it like any other packages via `nix-env -iA myEmacs`. However, t
101101}
102102```
103103
104−This provides a fairly full Emacs start file. It will load in addition to the user's presonal config. You can always disable it by passing `-q` to the Emacs command.
104+This provides a fairly full Emacs start file. It will load in addition to the user's personal config. You can always disable it by passing `-q` to the Emacs command.
105105
106−Sometimes `emacs.pkgs.withPackages` is not enough, as this package set has some priorities imposed on packages (with the lowest priority assigned to Melpa Unstable, and the highest for packages manually defined in `pkgs/top-level/emacs-packages.nix`). But you can't control this priorities when some package is installed as a dependency. You can override it on per-package-basis, providing all the required dependencies manually - but it's tedious and there is always a possibility that an unwanted dependency will sneak in through some other package. To completely override such a package you can use `overrideScope'`.
106+Sometimes `emacs.pkgs.withPackages` is not enough, as this package set has some priorities imposed on packages (with the lowest priority assigned to Melpa Unstable, and the highest for packages manually defined in `pkgs/top-level/emacs-packages.nix`). But you can't control these priorities when some package is installed as a dependency. You can override it on a per-package-basis, providing all the required dependencies manually, but it's tedious and there is always a possibility that an unwanted dependency will sneak in through some other package. To completely override such a package, you can use `overrideScope'`.
107107
108108```nix
109109overrides = self: super: rec {
110110 haskell-mode = self.melpaPackages.haskell-mode;
111111 ...
112112};
113−((emacsPackagesFor emacs).overrideScope' overrides).emacs.pkgs.withPackages
113+((emacsPackagesFor emacs).overrideScope' overrides).withPackages
114114 (p: with p; [
115115 # here both these package will use haskell-mode of our own choice
116116 ghc-mod
doc/builders/packages/etc-files.section.mdnew file+18
@@ -0,0 +1,18 @@
1+# /etc files {#etc}
2+
3+Certain calls in glibc require access to runtime files found in `/etc` such as `/etc/protocols` or `/etc/services` -- [getprotobyname](https://linux.die.net/man/3/getprotobyname) is one such function.
4+
5+On non-NixOS distributions these files are typically provided by packages (i.e., [netbase](https://packages.debian.org/sid/netbase)) if not already pre-installed in your distribution. This can cause non-reproducibility for code if they rely on these files being present.
6+
7+If [iana-etc](https://hydra.nixos.org/job/nixos/trunk-combined/nixpkgs.iana-etc.x86_64-linux) is part of your `buildInputs`, then it will set the environment variables `NIX_ETC_PROTOCOLS` and `NIX_ETC_SERVICES` to the corresponding files in the package through a setup hook.
8+
9+
10+```bash
11+> nix-shell -p iana-etc
12+
13+[nix-shell:~]$ env | grep NIX_ETC
14+NIX_ETC_SERVICES=/nix/store/aj866hr8fad8flnggwdhrldm0g799ccz-iana-etc-20210225/etc/services
15+NIX_ETC_PROTOCOLS=/nix/store/aj866hr8fad8flnggwdhrldm0g799ccz-iana-etc-20210225/etc/protocols
16+```
17+
18+Nixpkg's version of [glibc](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/libraries/glibc/default.nix) has been patched to check for the existence of these environment variables. If the environment variables are *not* set, then it will attempt to find the files at the default location within `/etc`.
doc/builders/packages/firefox.section.md+9−7
@@ -2,11 +2,12 @@
22
33## Build wrapped Firefox with extensions and policies {#build-wrapped-firefox-with-extensions-and-policies}
44
5−The `wrapFirefox` function allows to pass policies, preferences and extension that are available to firefox. With the help of `fetchFirefoxAddon` this allows build a firefox version that already comes with addons pre-installed:
5+The `wrapFirefox` function allows to pass policies, preferences and extensions that are available to Firefox. With the help of `fetchFirefoxAddon` this allows to build a Firefox version that already comes with add-ons pre-installed:
66
77```nix
88{
9− myFirefox = wrapFirefox firefox-unwrapped {
9+ # Nix firefox addons only work with the firefox-esr package.
10+ myFirefox = wrapFirefox firefox-esr-unwrapped {
1011 nixExtensions = [
1112 (fetchFirefoxAddon {
1213 name = "ublock"; # Has to be unique!
@@ -39,11 +40,12 @@ The `wrapFirefox` function allows to pass policies, preferences and extension th
3940}
4041```
4142
42−If `nixExtensions != null` then all manually installed addons will be uninstalled from your browser profile.
43−To view available enterprise policies visit [enterprise policies](https://github.com/mozilla/policy-templates#enterprisepoliciesenabled)
44−or type into the Firefox url bar: `about:policies#documentation`.
45−Nix installed addons do not have a valid signature, which is why signature verification is disabled. This does not compromise security because downloaded addons are checksumed and manual addons can't be installed. Also make sure that the `name` field of fetchFirefoxAddon is unique. If you remove an addon from the nixExtensions array, rebuild and start Firefox the removed addon will be completly removed with all of its settings.
43+If `nixExtensions != null`, then all manually installed add-ons will be uninstalled from your browser profile.
44+To view available enterprise policies, visit [enterprise policies](https://github.com/mozilla/policy-templates#enterprisepoliciesenabled)
45+or type into the Firefox URL bar: `about:policies#documentation`.
46+Nix installed add-ons do not have a valid signature, which is why signature verification is disabled. This does not compromise security because downloaded add-ons are checksummed and manual add-ons can't be installed. Also, make sure that the `name` field of `fetchFirefoxAddon` is unique. If you remove an add-on from the `nixExtensions` array, rebuild and start Firefox: the removed add-on will be completely removed with all of its settings.
4647
4748## Troubleshooting {#sec-firefox-troubleshooting}
48−If addons do not appear installed although they have been defined in your nix configuration file reset the local addon state of your Firefox profile by clicking `help -> restart with addons disabled -> restart -> refresh firefox`. This can happen if you switch from manual addon mode to nix addon mode and then back to manual mode and then again to nix addon mode.
49+If add-ons are marked as broken or the signature is invalid, make sure you have Firefox ESR installed. Normal Firefox does not provide the ability anymore to disable signature verification for add-ons thus nix add-ons get disabled by the normal Firefox binary.
4950
51+If add-ons do not appear installed despite being defined in your nix configuration file, reset the local add-on state of your Firefox profile by clicking `Help -> More Troubleshooting Information -> Refresh Firefox`. This can happen if you switch from manual add-on mode to nix add-on mode and then back to manual mode and then again to nix add-on mode.
doc/builders/packages/fish.section.md+1−1
@@ -36,7 +36,7 @@ using `buildFishPlugin` and running unit tests with the `fishtape` test runner.
3636## Fish wrapper {#sec-fish-wrapper}
3737
3838The `wrapFish` package is a wrapper around Fish which can be used to create
39−Fish shells initialised with some plugins as well as completions, configuration
39+Fish shells initialized with some plugins as well as completions, configuration
4040snippets and functions sourced from the given paths. This provides a convenient
4141way to test Fish plugins and scripts without having to alter the environment.
4242
doc/builders/packages/fuse.section.md+2−2
@@ -24,10 +24,10 @@ packages on macOS:
2424 checking for fuse.h... no
2525 configure: error: No fuse.h found.
2626
27−This happens on autoconf based projects that uses `AC_CHECK_HEADERS` or
27+This happens on autoconf based projects that use `AC_CHECK_HEADERS` or
2828`AC_CHECK_LIBS` to detect libfuse, and will occur even when the `fuse` package
2929is included in `buildInputs`. It happens because libfuse headers throw an error
30−on macOS if the `FUSE_USE_VERSION` macro is undefined. Many proejcts do define
30+on macOS if the `FUSE_USE_VERSION` macro is undefined. Many projects do define
3131`FUSE_USE_VERSION`, but only inside C source files. This results in the above
3232error at configure time because the configure script would attempt to compile
3333sample FUSE programs without defining `FUSE_USE_VERSION`.
doc/builders/packages/ibus.section.md+3−3
@@ -6,7 +6,7 @@ This package is an ibus-based completion method to speed up typing.
66
77IBus needs to be configured accordingly to activate `typing-booster`. The configuration depends on the desktop manager in use. For detailed instructions, please refer to the [upstream docs](https://mike-fabian.github.io/ibus-typing-booster/documentation.html).
88
9−On NixOS you need to explicitly enable `ibus` with given engines before customizing your desktop to use `typing-booster`. This can be achieved using the `ibus` module:
9+On NixOS, you need to explicitly enable `ibus` with given engines before customizing your desktop to use `typing-booster`. This can be achieved using the `ibus` module:
1010
1111```nix
1212{ pkgs, ... }: {
@@ -19,7 +19,7 @@ On NixOS you need to explicitly enable `ibus` with given engines before customiz
1919
2020## Using custom hunspell dictionaries {#sec-ibus-typing-booster-customize-hunspell}
2121
22−The IBus engine is based on `hunspell` to support completion in many languages. By default the dictionaries `de-de`, `en-us`, `fr-moderne` `es-es`, `it-it`, `sv-se` and `sv-fi` are in use. To add another dictionary, the package can be overridden like this:
22+The IBus engine is based on `hunspell` to support completion in many languages. By default, the dictionaries `de-de`, `en-us`, `fr-moderne` `es-es`, `it-it`, `sv-se` and `sv-fi` are in use. To add another dictionary, the package can be overridden like this:
2323
2424```nix
2525ibus-engines.typing-booster.override { langs = [ "de-at" "en-gb" ]; }
@@ -31,7 +31,7 @@ _Note: each language passed to `langs` must be an attribute name in `pkgs.hunspe
3131
3232The `ibus-engines.typing-booster` package contains a program named `emoji-picker`. To display all emojis correctly, a special font such as `noto-fonts-emoji` is needed:
3333
34−On NixOS it can be installed using the following expression:
34+On NixOS, it can be installed using the following expression:
3535
3636```nix
3737{ pkgs, ... }: { fonts.fonts = with pkgs; [ noto-fonts-emoji ]; }
doc/builders/packages/index.xml+1
@@ -17,6 +17,7 @@
1717 <xi:include href="kakoune.section.xml" />
1818 <xi:include href="linux.section.xml" />
1919 <xi:include href="locales.section.xml" />
20+ <xi:include href="etc-files.section.xml" />
2021 <xi:include href="nginx.section.xml" />
2122 <xi:include href="opengl.section.xml" />
2223 <xi:include href="shell-helpers.section.xml" />
doc/builders/packages/linux.section.md+11−11
@@ -4,7 +4,7 @@ The Nix expressions to build the Linux kernel are in [`pkgs/os-specific/linux/ke
44
55The function that builds the kernel has an argument `kernelPatches` which should be a list of `{name, patch, extraConfig}` attribute sets, where `name` is the name of the patch (which is included in the kernel’s `meta.description` attribute), `patch` is the patch itself (possibly compressed), and `extraConfig` (optional) is a string specifying extra options to be concatenated to the kernel configuration file (`.config`).
66
7−The kernel derivation exports an attribute `features` specifying whether optional functionality is or isn’t enabled. This is used in NixOS to implement kernel-specific behaviour. For instance, if the kernel has the `iwlwifi` feature (i.e. has built-in support for Intel wireless chipsets), then NixOS doesn’t have to build the external `iwlwifi` package:
7+The kernel derivation exports an attribute `features` specifying whether optional functionality is or isn’t enabled. This is used in NixOS to implement kernel-specific behaviour. For instance, if the kernel has the `iwlwifi` feature (i.e., has built-in support for Intel wireless chipsets), then NixOS doesn’t have to build the external `iwlwifi` package:
88
99```nix
1010modulesTree = [kernel]
@@ -14,28 +14,28 @@ modulesTree = [kernel]
1414
1515How to add a new (major) version of the Linux kernel to Nixpkgs:
1616
17−1. Copy the old Nix expression (e.g. `linux-2.6.21.nix`) to the new one (e.g. `linux-2.6.22.nix`) and update it.
17+1. Copy the old Nix expression (e.g., `linux-2.6.21.nix`) to the new one (e.g., `linux-2.6.22.nix`) and update it.
1818
19−2. Add the new kernel to `all-packages.nix` (e.g., create an attribute `kernel_2_6_22`).
19+2. Add the new kernel to the `kernels` attribute set in `linux-kernels.nix` (e.g., create an attribute `kernel_2_6_22`).
2020
21213. Now we’re going to update the kernel configuration. First unpack the kernel. Then for each supported platform (`i686`, `x86_64`, `uml`) do the following:
2222
23− 1. Make an copy from the old config (e.g. `config-2.6.21-i686-smp`) to the new one (e.g. `config-2.6.22-i686-smp`).
23+ 1. Make a copy from the old config (e.g., `config-2.6.21-i686-smp`) to the new one (e.g., `config-2.6.22-i686-smp`).
2424
25− 2. Copy the config file for this platform (e.g. `config-2.6.22-i686-smp`) to `.config` in the kernel source tree.
25+ 2. Copy the config file for this platform (e.g., `config-2.6.22-i686-smp`) to `.config` in the kernel source tree.
2626
27− 3. Run `make oldconfig ARCH={i386,x86_64,um}` and answer all questions. (For the uml configuration, also add `SHELL=bash`.) Make sure to keep the configuration consistent between platforms (i.e. don’t enable some feature on `i686` and disable it on `x86_64`).
27+ 3. Run `make oldconfig ARCH={i386,x86_64,um}` and answer all questions. (For the uml configuration, also add `SHELL=bash`.) Make sure to keep the configuration consistent between platforms (i.e., don’t enable some feature on `i686` and disable it on `x86_64`).
2828
29− 4. If needed you can also run `make menuconfig`:
29+ 4. If needed, you can also run `make menuconfig`:
3030
3131 ```ShellSession
32− $ nix-env -i ncurses
32+ $ nix-env -f "<nixpkgs>" -iA ncurses
3333 $ export NIX_CFLAGS_LINK=-lncurses
3434 $ make menuconfig ARCH=arch
3535 ```
3636
37− 5. Copy `.config` over the new config file (e.g. `config-2.6.22-i686-smp`).
37+ 5. Copy `.config` over the new config file (e.g., `config-2.6.22-i686-smp`).
3838
39−4. Test building the kernel: `nix-build -A kernel_2_6_22`. If it compiles, ship it! For extra credit, try booting NixOS with it.
39+4. Test building the kernel: `nix-build -A linuxKernel.kernels.kernel_2_6_22`. If it compiles, ship it! For extra credit, try booting NixOS with it.
4040
41−5. It may be that the new kernel requires updating the external kernel modules and kernel-dependent packages listed in the `linuxPackagesFor` function in `all-packages.nix` (such as the NVIDIA drivers, AUFS, etc.). If the updated packages aren’t backwards compatible with older kernels, you may need to keep the older versions around.
41+5. It may be that the new kernel requires updating the external kernel modules and kernel-dependent packages listed in the `linuxPackagesFor` function in `linux-kernels.nix` (such as the NVIDIA drivers, AUFS, etc.). If the updated packages aren’t backwards compatible with older kernels, you may need to keep the older versions around.
doc/builders/packages/locales.section.md+2−2
@@ -1,5 +1,5 @@
11# Locales {#locales}
22
3−To allow simultaneous use of packages linked against different versions of `glibc` with different locale archive formats Nixpkgs patches `glibc` to rely on `LOCALE_ARCHIVE` environment variable.
3+To allow simultaneous use of packages linked against different versions of `glibc` with different locale archive formats, Nixpkgs patches `glibc` to rely on `LOCALE_ARCHIVE` environment variable.
44
5−On non-NixOS distributions this variable is obviously not set. This can cause regressions in language support or even crashes in some Nixpkgs-provided programs. The simplest way to mitigate this problem is exporting the `LOCALE_ARCHIVE` variable pointing to `${glibcLocales}/lib/locale/locale-archive`. The drawback (and the reason this is not the default) is the relatively large (a hundred MiB) size of the full set of locales. It is possible to build a custom set of locales by overriding parameters `allLocales` and `locales` of the package.
5+On non-NixOS distributions, this variable is obviously not set. This can cause regressions in language support or even crashes in some Nixpkgs-provided programs. The simplest way to mitigate this problem is exporting the `LOCALE_ARCHIVE` variable pointing to `${glibcLocales}/lib/locale/locale-archive`. The drawback (and the reason this is not the default) is the relatively large (a hundred MiB) size of the full set of locales. It is possible to build a custom set of locales by overriding parameters `allLocales` and `locales` of the package.
doc/builders/packages/nginx.section.md+2−2
@@ -4,8 +4,8 @@
44
55## ETags on static files served from the Nix store {#sec-nginx-etag}
66
7−HTTP has a couple different mechanisms for caching to prevent clients from having to download the same content repeatedly if a resource has not changed since the last time it was requested. When nginx is used as a server for static files, it implements the caching mechanism based on the [`Last-Modified`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified) response header automatically; unfortunately, it works by using filesystem timestamps to determine the value of the `Last-Modified` header. This doesn't give the desired behavior when the file is in the Nix store, because all file timestamps are set to 0 (for reasons related to build reproducibility).
7+HTTP has a couple of different mechanisms for caching to prevent clients from having to download the same content repeatedly if a resource has not changed since the last time it was requested. When nginx is used as a server for static files, it implements the caching mechanism based on the [`Last-Modified`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Last-Modified) response header automatically; unfortunately, it works by using filesystem timestamps to determine the value of the `Last-Modified` header. This doesn't give the desired behavior when the file is in the Nix store because all file timestamps are set to 0 (for reasons related to build reproducibility).
88
9−Fortunately, HTTP supports an alternative (and more effective) caching mechanism: the [`ETag`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) response header. The value of the `ETag` header specifies some identifier for the particular content that the server is sending (e.g. a hash). When a client makes a second request for the same resource, it sends that value back in an `If-None-Match` header. If the ETag value is unchanged, then the server does not need to resend the content.
9+Fortunately, HTTP supports an alternative (and more effective) caching mechanism: the [`ETag`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag) response header. The value of the `ETag` header specifies some identifier for the particular content that the server is sending (e.g., a hash). When a client makes a second request for the same resource, it sends that value back in an `If-None-Match` header. If the ETag value is unchanged, then the server does not need to resend the content.
1010
1111As of NixOS 19.09, the nginx package in Nixpkgs is patched such that when nginx serves a file out of `/nix/store`, the hash in the store path is used as the `ETag` header in the HTTP response, thus providing proper caching functionality. This happens automatically; you do not need to do modify any configuration to get this behavior.
doc/builders/packages/opengl.section.md+1−1
@@ -12,4 +12,4 @@ The NixOS desktop or other non-headless configurations are the primary target fo
1212
1313If you are using a non-NixOS GNU/Linux/X11 desktop with free software video drivers, consider launching OpenGL-dependent programs from Nixpkgs with Nixpkgs versions of `libglvnd` and `mesa.drivers` in `LD_LIBRARY_PATH`. For Mesa drivers, the Linux kernel version doesn't have to match nixpkgs.
1414
15−For proprietary video drivers you might have luck with also adding the corresponding video driver package.
15+For proprietary video drivers, you might have luck with also adding the corresponding video driver package.
doc/builders/packages/shell-helpers.section.md+1−1
@@ -4,7 +4,7 @@ Some packages provide the shell integration to be more useful. But unlike other
44
55- `fzf` : `fzf-share`
66
7−E.g. `fzf` can then used in the `.bashrc` like this:
7+E.g. `fzf` can then be used in the `.bashrc` like this:
88
99```bash
1010source "$(fzf-share)/completion.bash"
doc/builders/packages/steam.section.md+8−17
@@ -2,20 +2,20 @@
22
33## Steam in Nix {#sec-steam-nix}
44
5−Steam is distributed as a `.deb` file, for now only as an i686 package (the amd64 package only has documentation). When unpacked, it has a script called `steam` that in Ubuntu (their target distro) would go to `/usr/bin`. When run for the first time, this script copies some files to the user's home, which include another script that is the ultimate responsible for launching the steam binary, which is also in \$HOME.
5+Steam is distributed as a `.deb` file, for now only as an i686 package (the amd64 package only has documentation). When unpacked, it has a script called `steam` that in Ubuntu (their target distro) would go to `/usr/bin`. When run for the first time, this script copies some files to the user's home, which include another script that is the ultimate responsible for launching the steam binary, which is also in `$HOME`.
66
77Nix problems and constraints:
88
9−- We don't have `/bin/bash` and many scripts point there. Similarly for `/usr/bin/python`.
9+- We don't have `/bin/bash` and many scripts point there. Same thing for `/usr/bin/python`.
1010- We don't have the dynamic loader in `/lib`.
11−- The `steam.sh` script in \$HOME can not be patched, as it is checked and rewritten by steam.
11+- The `steam.sh` script in `$HOME` cannot be patched, as it is checked and rewritten by steam.
1212- The steam binary cannot be patched, it's also checked.
1313
1414The current approach to deploy Steam in NixOS is composing a FHS-compatible chroot environment, as documented [here](http://sandervanderburg.blogspot.nl/2013/09/composing-fhs-compatible-chroot.html). This allows us to have binaries in the expected paths without disrupting the system, and to avoid patching them to work in a non FHS environment.
1515
1616## How to play {#sec-steam-play}
1717
18−Use `programs.steam.enable = true;` if you want to add steam to systemPackages and also enable a few workarrounds aswell as Steam controller support or other Steam supported controllers such as the DualShock 4 or Nintendo Switch Pr.
18+Use `programs.steam.enable = true;` if you want to add steam to `systemPackages` and also enable a few workarounds as well as Steam controller support or other Steam supported controllers such as the DualShock 4 or Nintendo Switch Pro Controller.
1919
2020## Troubleshooting {#sec-steam-troub}
2121
@@ -32,7 +32,7 @@ Use `programs.steam.enable = true;` if you want to add steam to systemPackages a
3232- **Using the FOSS Radeon or nouveau (nvidia) drivers**
3333
3434 - The `newStdcpp` parameter was removed since NixOS 17.09 and should not be needed anymore.
35− - Steam ships statically linked with a version of libcrypto that conflics with the one dynamically loaded by radeonsi_dri.so. If you get the error
35+ - Steam ships statically linked with a version of `libcrypto` that conflicts with the one dynamically loaded by radeonsi_dri.so. If you get the error:
3636
3737 ```
3838 steam.sh: line 713: 7842 Segmentation fault (core dumped)
@@ -42,13 +42,13 @@ Use `programs.steam.enable = true;` if you want to add steam to systemPackages a
4242
4343- **Java**
4444
45− 1. There is no java in steam chrootenv by default. If you get a message like
45+ 1. There is no java in steam chrootenv by default. If you get a message like:
4646
4747 ```
4848 /home/foo/.local/share/Steam/SteamApps/common/towns/towns.sh: line 1: java: command not found
4949 ```
5050
51− you need to add
51+ you need to add:
5252
5353 ```nix
5454 steam.override { withJava = true; };
@@ -56,16 +56,7 @@ Use `programs.steam.enable = true;` if you want to add steam to systemPackages a
5656
5757## steam-run {#sec-steam-run}
5858
59−The FHS-compatible chroot used for steam can also be used to run other linux games that expect a FHS environment. To do it, add
60−
61−```nix
62−pkgs.steam.override ({
63− nativeOnly = true;
64− newStdcpp = true;
65−}).run
66−```
67−
68−to your configuration, rebuild, and run the game with
59+The FHS-compatible chroot used for Steam can also be used to run other Linux games that expect a FHS environment. To use it, install the `steam-run` package and run the game with:
6960
7061```
7162steam-run ./foo
doc/builders/packages/urxvt.section.md+4−4
@@ -4,7 +4,7 @@ Urxvt, also known as rxvt-unicode, is a highly customizable terminal emulator.
44
55## Configuring urxvt {#sec-urxvt-conf}
66
7−In `nixpkgs`, urxvt is provided by the package `rxvt-unicode`. It can be configured to include your choice of plugins, reducing its closure size from the default configuration which includes all available plugins. To make use of this functionality, use an overlay or directly install an expression that overrides its configuration, such as
7+In `nixpkgs`, urxvt is provided by the package `rxvt-unicode`. It can be configured to include your choice of plugins, reducing its closure size from the default configuration which includes all available plugins. To make use of this functionality, use an overlay or directly install an expression that overrides its configuration, such as:
88
99```nix
1010rxvt-unicode.override {
@@ -58,14 +58,14 @@ rxvt-unicode.override {
5858
5959## Packaging urxvt plugins {#sec-urxvt-pkg}
6060
61−Urxvt plugins resides in `pkgs/applications/misc/rxvt-unicode-plugins`. To add a new plugin create an expression in a subdirectory and add the package to the set in `pkgs/applications/misc/rxvt-unicode-plugins/default.nix`.
61+Urxvt plugins resides in `pkgs/applications/misc/rxvt-unicode-plugins`. To add a new plugin, create an expression in a subdirectory and add the package to the set in `pkgs/applications/misc/rxvt-unicode-plugins/default.nix`.
6262
6363A plugin can be any kind of derivation, the only requirement is that it should always install perl scripts in `$out/lib/urxvt/perl`. Look for existing plugins for examples.
6464
65−If the plugin is itself a perl package that needs to be imported from other plugins or scripts, add the following passthrough:
65+If the plugin is itself a Perl package that needs to be imported from other plugins or scripts, add the following passthrough:
6666
6767```nix
6868passthru.perlPackages = [ "self" ];
6969```
7070
71−This will make the urxvt wrapper pick up the dependency and set up the perl path accordingly.
71+This will make the urxvt wrapper pick up the dependency and set up the Perl path accordingly.
doc/builders/packages/weechat.section.md+6−6
@@ -1,6 +1,6 @@
1−# Weechat {#sec-weechat}
1+# WeeChat {#sec-weechat}
22
3−Weechat can be configured to include your choice of plugins, reducing its closure size from the default configuration which includes all available plugins. To make use of this functionality, install an expression that overrides its configuration such as
3+WeeChat can be configured to include your choice of plugins, reducing its closure size from the default configuration which includes all available plugins. To make use of this functionality, install an expression that overrides its configuration, such as:
44
55```nix
66weechat.override {configure = {availablePlugins, ...}: {
@@ -13,7 +13,7 @@ If the `configure` function returns an attrset without the `plugins` attribute,
1313
1414The plugins currently available are `python`, `perl`, `ruby`, `guile`, `tcl` and `lua`.
1515
16−The python and perl plugins allows the addition of extra libraries. For instance, the `inotify.py` script in `weechat-scripts` requires D-Bus or libnotify, and the `fish.py` script requires `pycrypto`. To use these scripts, use the plugin's `withPackages` attribute:
16+The Python and Perl plugins allows the addition of extra libraries. For instance, the `inotify.py` script in `weechat-scripts` requires D-Bus or libnotify, and the `fish.py` script requires `pycrypto`. To use these scripts, use the plugin's `withPackages` attribute:
1717
1818```nix
1919weechat.override { configure = {availablePlugins, ...}: {
@@ -41,7 +41,7 @@ weechat.override {
4141 configure = { availablePlugins, ... }: {
4242 init = ''
4343 /set foo bar
44− /server add freenode chat.freenode.org
44+ /server add libera irc.libera.chat
4545 '';
4646 };
4747}
@@ -49,7 +49,7 @@ weechat.override {
4949
5050Further values can be added to the list of commands when running `weechat --run-command "your-commands"`.
5151
52−Additionally it's possible to specify scripts to be loaded when starting `weechat`. These will be loaded before the commands from `init`:
52+Additionally, it's possible to specify scripts to be loaded when starting `weechat`. These will be loaded before the commands from `init`:
5353
5454```nix
5555weechat.override {
@@ -64,7 +64,7 @@ weechat.override {
6464}
6565```
6666
67−In `nixpkgs` there's a subpackage which contains derivations for WeeChat scripts. Such derivations expect a `passthru.scripts` attribute which contains a list of all scripts inside the store path. Furthermore all scripts have to live in `$out/share`. An exemplary derivation looks like this:
67+In `nixpkgs` there's a subpackage which contains derivations for WeeChat scripts. Such derivations expect a `passthru.scripts` attribute, which contains a list of all scripts inside the store path. Furthermore, all scripts have to live in `$out/share`. An exemplary derivation looks like this:
6868
6969```nix
7070{ stdenv, fetchurl }:
doc/builders/special/fhs-environments.section.md+6−2
@@ -18,6 +18,8 @@
1818 Additional commands to be executed for finalizing the derivation with runner script.
1919- `runScript`
2020 A command that would be executed inside the sandbox and passed all the command line arguments. It defaults to `bash`.
21+- `profile`
22+ Optional script for `/etc/profile` within the sandbox.
2123
2224One can create a simple environment using a `shell.nix` like that:
2325
@@ -28,7 +30,7 @@ One can create a simple environment using a `shell.nix` like that:
2830 name = "simple-x11-env";
2931 targetPkgs = pkgs: (with pkgs;
3032 [ udev
31− alsaLib
33+ alsa-lib
3234 ]) ++ (with pkgs.xorg;
3335 [ libX11
3436 libXcursor
@@ -36,10 +38,12 @@ One can create a simple environment using a `shell.nix` like that:
3638 ]);
3739 multiPkgs = pkgs: (with pkgs;
3840 [ udev
39− alsaLib
41+ alsa-lib
4042 ]);
4143 runScript = "bash";
4244}).env
4345```
4446
4547Running `nix-shell` would then drop you into a shell with these libraries and binaries available. You can use this to run closed-source applications which expect FHS structure without hassles: simply change `runScript` to the application path, e.g. `./bin/start.sh` -- relative paths are supported.
48+
49+Additionally, the FHS builder links all relocated gsettings-schemas (the glib setup-hook moves them to `share/gsettings-schemas/${name}/glib-2.0/schemas`) to their standard FHS location. This means you don't need to wrap binaries with `wrapGAppsHook`.
doc/builders/special/mkshell.section.md+26−6
@@ -1,17 +1,37 @@
11# pkgs.mkShell {#sec-pkgs-mkShell}
22
3−`pkgs.mkShell` is a special kind of derivation that is only useful when using
4−it combined with `nix-shell`. It will in fact fail to instantiate when invoked
5−with `nix-build`.
3+`pkgs.mkShell` is a specialized `stdenv.mkDerivation` that removes some
4+repetition when using it with `nix-shell` (or `nix develop`).
65
76## Usage {#sec-pkgs-mkShell-usage}
87
8+Here is a common usage example:
9+
910```nix
1011{ pkgs ? import <nixpkgs> {} }:
1112pkgs.mkShell {
12− # specify which packages to add to the shell environment
1313 packages = [ pkgs.gnumake ];
14− # add all the dependencies, of the given packages, to the shell environment
15− inputsFrom = with pkgs; [ hello gnutar ];
14+
15+ inputsFrom = [ pkgs.hello pkgs.gnutar ];
16+
17+ shellHook = ''
18+ export DEBUG=1
19+ '';
1620}
1721```
22+
23+## Attributes
24+
25+* `name` (default: `nix-shell`). Set the name of the derivation.
26+* `packages` (default: `[]`). Add executable packages to the `nix-shell` environment.
27+* `inputsFrom` (default: `[]`). Add build dependencies of the listed derivations to the `nix-shell` environment.
28+* `shellHook` (default: `""`). Bash statements that are executed by `nix-shell`.
29+
30+... all the attributes of `stdenv.mkDerivation`.
31+
32+## Building the shell
33+
34+This derivation output will contain a text file that contains a reference to
35+all the build inputs. This is useful in CI where we want to make sure that
36+every derivation, and its dependencies, build properly. Or when creating a GC
37+root so that the build dependencies don't get garbage-collected.
doc/builders/testers.chapter.mdnew file+82
@@ -0,0 +1,82 @@
1+# Testers {#chap-testers}
2+This chapter describes several testing builders which are available in the <literal>testers</literal> namespace.
3+
4+## `testVersion` {#tester-testVersion}
5+
6+Checks the command output contains the specified version
7+
8+Although simplistic, this test assures that the main program
9+can run. While there's no substitute for a real test case,
10+it does catch dynamic linking errors and such. It also provides
11+some protection against accidentally building the wrong version,
12+for example when using an 'old' hash in a fixed-output derivation.
13+
14+Examples:
15+
16+```nix
17+passthru.tests.version = testVersion { package = hello; };
18+
19+passthru.tests.version = testVersion {
20+ package = seaweedfs;
21+ command = "weed version";
22+};
23+
24+passthru.tests.version = testVersion {
25+ package = key;
26+ command = "KeY --help";
27+ # Wrong '2.5' version in the code. Drop on next version.
28+ version = "2.5";
29+};
30+```
31+
32+## `testEqualDerivation` {#tester-testEqualDerivation}
33+
34+Checks that two packages produce the exact same build instructions.
35+
36+This can be used to make sure that a certain difference of configuration,
37+such as the presence of an overlay does not cause a cache miss.
38+
39+When the derivations are equal, the return value is an empty file.
40+Otherwise, the build log explains the difference via `nix-diff`.
41+
42+Example:
43+
44+```nix
45+testEqualDerivation
46+ "The hello package must stay the same when enabling checks."
47+ hello
48+ (hello.overrideAttrs(o: { doCheck = true; }))
49+```
50+
51+## `invalidateFetcherByDrvHash` {#tester-invalidateFetcherByDrvHash}
52+
53+Use the derivation hash to invalidate the output via name, for testing.
54+
55+Type: `(a@{ name, ... } -> Derivation) -> a -> Derivation`
56+
57+Normally, fixed output derivations can and should be cached by their output
58+hash only, but for testing we want to re-fetch everytime the fetcher changes.
59+
60+Changes to the fetcher become apparent in the drvPath, which is a hash of
61+how to fetch, rather than a fixed store path.
62+By inserting this hash into the name, we can make sure to re-run the fetcher
63+every time the fetcher changes.
64+
65+This relies on the assumption that Nix isn't clever enough to reuse its
66+database of local store contents to optimize fetching.
67+
68+You might notice that the "salted" name derives from the normal invocation,
69+not the final derivation. `invalidateFetcherByDrvHash` has to invoke the fetcher
70+function twice: once to get a derivation hash, and again to produce the final
71+fixed output derivation.
72+
73+Example:
74+
75+```nix
76+tests.fetchgit = invalidateFetcherByDrvHash fetchgit {
77+ name = "nix-source";
78+ url = "https://github.com/NixOS/nix";
79+ rev = "9d9dbe6ed05854e03811c361a3380e09183f4f4a";
80+ sha256 = "sha256-7DszvbCNTjpzGRmpIVAWXk20P0/XTrWZ79KSOGLrUWY=";
81+};
82+```
doc/builders/trivial-builders.chapter.md+127−3
@@ -35,10 +35,10 @@ This works just like `runCommand`. The only difference is that it also provides
3535
3636## `runCommandLocal` {#trivial-builder-runCommandLocal}
3737
38−Variant of `runCommand` that forces the derivation to be built locally, it is not substituted. This is intended for very cheap commands (<1s execution time). It saves on the network roundrip and can speed up a build.
38+Variant of `runCommand` that forces the derivation to be built locally, it is not substituted. This is intended for very cheap commands (<1s execution time). It saves on the network round-trip and can speed up a build.
3939
4040::: {.note}
41−This sets [`allowSubstitutes` to `false`](https://nixos.org/nix/manual/#adv-attr-allowSubstitutes), so only use `runCommandLocal` if you are certain the user will always have a builder for the `system` of the derivation. This should be true for most trivial use cases (e.g. just copying some files to a different location or adding symlinks), because there the `system` is usually the same as `builtins.currentSystem`.
41+This sets [`allowSubstitutes` to `false`](https://nixos.org/nix/manual/#adv-attr-allowSubstitutes), so only use `runCommandLocal` if you are certain the user will always have a builder for the `system` of the derivation. This should be true for most trivial use cases (e.g., just copying some files to a different location or adding symlinks) because there the `system` is usually the same as `builtins.currentSystem`.
4242:::
4343
4444## `writeTextFile`, `writeText`, `writeTextDir`, `writeScript`, `writeScriptBin` {#trivial-builder-writeText}
@@ -47,9 +47,133 @@ These functions write `text` to the Nix store. This is useful for creating scrip
4747
4848Many more commands wrap `writeTextFile` including `writeText`, `writeTextDir`, `writeScript`, and `writeScriptBin`. These are convenience functions over `writeTextFile`.
4949
50+Here are a few examples:
51+```nix
52+# Writes my-file to /nix/store/<store path>
53+writeTextFile {
54+ name = "my-file";
55+ text = ''
56+ Contents of File
57+ '';
58+}
59+# See also the `writeText` helper function below.
60+
61+# Writes executable my-file to /nix/store/<store path>/bin/my-file
62+writeTextFile {
63+ name = "my-file";
64+ text = ''
65+ Contents of File
66+ '';
67+ executable = true;
68+ destination = "/bin/my-file";
69+}
70+# Writes contents of file to /nix/store/<store path>
71+writeText "my-file"
72+ ''
73+ Contents of File
74+ '';
75+# Writes contents of file to /nix/store/<store path>/share/my-file
76+writeTextDir "share/my-file"
77+ ''
78+ Contents of File
79+ '';
80+# Writes my-file to /nix/store/<store path> and makes executable
81+writeScript "my-file"
82+ ''
83+ Contents of File
84+ '';
85+# Writes my-file to /nix/store/<store path>/bin/my-file and makes executable.
86+writeScriptBin "my-file"
87+ ''
88+ Contents of File
89+ '';
90+# Writes my-file to /nix/store/<store path> and makes executable.
91+writeShellScript "my-file"
92+ ''
93+ Contents of File
94+ '';
95+# Writes my-file to /nix/store/<store path>/bin/my-file and makes executable.
96+writeShellScriptBin "my-file"
97+ ''
98+ Contents of File
99+ '';
100+
101+```
102+
103+## `concatTextFile`, `concatText`, `concatScript` {#trivial-builder-concatText}
104+
105+These functions concatenate `files` to the Nix store in a single file. This is useful for configuration files structured in lines of text. `concatTextFile` takes an attribute set and expects two arguments, `name` and `files`. `name` corresponds to the name used in the Nix store path. `files` will be the files to be concatenated. You can also set `executable` to true to make this file have the executable bit set.
106+`concatText` and`concatScript` are simple wrappers over `concatTextFile`.
107+
108+Here are a few examples:
109+```nix
110+
111+# Writes my-file to /nix/store/<store path>
112+concatTextFile {
113+ name = "my-file";
114+ files = [ drv1 "${drv2}/path/to/file" ];
115+}
116+# See also the `concatText` helper function below.
117+
118+# Writes executable my-file to /nix/store/<store path>/bin/my-file
119+concatTextFile {
120+ name = "my-file";
121+ files = [ drv1 "${drv2}/path/to/file" ];
122+ executable = true;
123+ destination = "/bin/my-file";
124+}
125+# Writes contents of files to /nix/store/<store path>
126+concatText "my-file" [ file1 file2 ]
127+
128+# Writes contents of files to /nix/store/<store path>
129+concatScript "my-file" [ file1 file2 ]
130+```
131+
132+## `writeShellApplication` {#trivial-builder-writeShellApplication}
133+
134+This can be used to easily produce a shell script that has some dependencies (`runtimeInputs`). It automatically sets the `PATH` of the script to contain all of the listed inputs, sets some sanity shellopts (`errexit`, `nounset`, `pipefail`), and checks the resulting script with [`shellcheck`](https://github.com/koalaman/shellcheck).
135+
136+For example, look at the following code:
137+
138+```nix
139+writeShellApplication {
140+ name = "show-nixos-org";
141+
142+ runtimeInputs = [ curl w3m ];
143+
144+ text = ''
145+ curl -s 'https://nixos.org' | w3m -dump -T text/html
146+ '';
147+}
148+```
149+
150+Unlike with normal `writeShellScriptBin`, there is no need to manually write out `${curl}/bin/curl`, setting the PATH
151+was handled by `writeShellApplication`. Moreover, the script is being checked with `shellcheck` for more strict
152+validation.
153+
50154## `symlinkJoin` {#trivial-builder-symlinkJoin}
51155
52156This can be used to put many derivations into the same directory structure. It works by creating a new derivation and adding symlinks to each of the paths listed. It expects two arguments, `name`, and `paths`. `name` is the name used in the Nix store path for the created derivation. `paths` is a list of paths that will be symlinked. These paths can be to Nix store derivations or any other subdirectory contained within.
157+Here is an example:
158+```nix
159+# adds symlinks of hello and stack to current build and prints "links added"
160+symlinkJoin { name = "myexample"; paths = [ pkgs.hello pkgs.stack ]; postBuild = "echo links added"; }
161+```
162+This creates a derivation with a directory structure like the following:
163+```
164+/nix/store/sglsr5g079a5235hy29da3mq3hv8sjmm-myexample
165+|-- bin
166+| |-- hello -> /nix/store/qy93dp4a3rqyn2mz63fbxjg228hffwyw-hello-2.10/bin/hello
167+| `-- stack -> /nix/store/6lzdpxshx78281vy056lbk553ijsdr44-stack-2.1.3.1/bin/stack
168+`-- share
169+ |-- bash-completion
170+ | `-- completions
171+ | `-- stack -> /nix/store/6lzdpxshx78281vy056lbk553ijsdr44-stack-2.1.3.1/share/bash-completion/completions/stack
172+ |-- fish
173+ | `-- vendor_completions.d
174+ | `-- stack.fish -> /nix/store/6lzdpxshx78281vy056lbk553ijsdr44-stack-2.1.3.1/share/fish/vendor_completions.d/stack.fish
175+...
176+```
53177
54178## `writeReferencesToFile` {#trivial-builder-writeReferencesToFile}
55179
@@ -95,5 +219,5 @@ produces an output path `/nix/store/<hash>-runtime-references` containing
95219/nix/store/<hash>-hello-2.10
96220```
97221
98−but none of `hello`'s dependencies, because those are not referenced directly
222+but none of `hello`'s dependencies because those are not referenced directly
99223by `hi`'s output.
doc/contributing/coding-conventions.chapter.md+73−12
@@ -181,6 +181,21 @@
181181 rev = "${version}";
182182 ```
183183
184+- Building lists conditionally _should_ be done with `lib.optional(s)` instead of using `if cond then [ ... ] else null` or `if cond then [ ... ] else [ ]`.
185+
186+ ```nix
187+ buildInputs = lib.optional stdenv.isDarwin iconv;
188+ ```
189+
190+ instead of
191+
192+ ```nix
193+ buildInputs = if stdenv.isDarwin then [ iconv ] else null;
194+ ```
195+
196+ As an exception, an explicit conditional expression with null can be used when fixing a important bug without triggering a mass rebuild.
197+ If this is done a follow up pull request _should_ be created to change the code to `lib.optional(s)`.
198+
184199- Arguments should be listed in the order they are used, with the exception of `lib`, which always goes first.
185200
186201## Package naming {#sec-package-naming}
@@ -199,17 +214,17 @@ Most of the time, these are the same. For instance, the package `e2fsprogs` has
199214
200215There are a few naming guidelines:
201216
202−- The `name` attribute _should_ be identical to the upstream package name.
217+- The `pname` attribute _should_ be identical to the upstream package name.
203218
204−- The `name` attribute _must not_ contain uppercase letters — e.g., `"mplayer-1.0rc2"` instead of `"MPlayer-1.0rc2"`.
219+- The `pname` and the `version` attribute _must not_ contain uppercase letters — e.g., `"mplayer" instead of `"MPlayer"`.
205220
206−- The version part of the `name` attribute _must_ start with a digit (following a dash) — e.g., `"hello-0.3.1rc2"`.
221+- The `version` attribute _must_ start with a digit e.g`"0.3.1rc2".
207222
208−- If a package is not a release but a commit from a repository, then the version part of the name _must_ be the date of that (fetched) commit. The date _must_ be in `"YYYY-MM-DD"` format. Also append `"unstable"` to the name - e.g., `"pkgname-unstable-2014-09-23"`.
223+- If a package is not a release but a commit from a repository, then the `version` attribute _must_ be the date of that (fetched) commit. The date _must_ be in `"unstable-YYYY-MM-DD"` format.
209224
210−- Dashes in the package name _should_ be preserved in new variable names, rather than converted to underscores or camel cased — e.g., `http-parser` instead of `http_parser` or `httpParser`. The hyphenated style is preferred in all three package names.
225+- Dashes in the package `pname` _should_ be preserved in new variable names, rather than converted to underscores or camel cased — e.g., `http-parser` instead of `http_parser` or `httpParser`. The hyphenated style is preferred in all three package names.
211226
212−- If there are multiple versions of a package, this _should_ be reflected in the variable names in `all-packages.nix`, e.g. `json-c-0-9` and `json-c-0-11`. If there is an obvious “default” version, make an attribute like `json-c = json-c-0-9;`. See also [](#sec-versioning)
227+- If there are multiple versions of a package, this _should_ be reflected in the variable names in `all-packages.nix`, e.g. `json-c_0_9` and `json-c_0_11`. If there is an obvious “default” version, make an attribute like `json-c = json-c_0_9;`. See also [](#sec-versioning)
213228
214229## File naming and organisation {#sec-organisation}
215230
@@ -520,15 +535,16 @@ If you do need to do create this sort of patch file, one way to do so is with gi
5205354. Use git to create a diff, and pipe the output to a patch file:
521536
522537 ```ShellSession
523− $ git diff > nixpkgs/pkgs/the/package/0001-changes.patch
538+ $ git diff -a > nixpkgs/pkgs/the/package/0001-changes.patch
524539 ```
525540
526541If a patch is available online but does not cleanly apply, it can be modified in some fixed ways by using additional optional arguments for `fetchpatch`:
527542
543+- `relative`: Similar to using `git-diff`'s `--relative` flag, only keep changes inside the specified directory, making paths relative to it.
528544- `stripLen`: Remove the first `stripLen` components of pathnames in the patch.
529545- `extraPrefix`: Prefix pathnames by this string.
530−- `excludes`: Exclude files matching this pattern.
531−- `includes`: Include only files matching this pattern.
546+- `excludes`: Exclude files matching these patterns (applies after the above arguments).
547+- `includes`: Include only files matching these patterns (applies after the above arguments).
532548- `revert`: Revert the patch.
533549
534550Note that because the checksum is computed after applying these effects, using or modifying these arguments will have no effect unless the `sha256` argument is changed as well.
@@ -537,9 +553,34 @@ Note that because the checksum is computed after applying these effects, using o
537553
538554Tests are important to ensure quality and make reviews and automatic updates easy.
539555
540−Nix package tests are a lightweight alternative to [NixOS module tests](https://nixos.org/manual/nixos/stable/#sec-nixos-tests). They can be used to create simple integration tests for packages while the module tests are used to test services or programs with a graphical user interface on a NixOS VM. Unittests that are included in the source code of a package should be executed in the `checkPhase`.
556+The following types of tests exists:
557+
558+* [NixOS **module tests**](https://nixos.org/manual/nixos/stable/#sec-nixos-tests), which spawn one or more NixOS VMs. They exercise both NixOS modules and the packaged programs used within them. For example, a NixOS module test can start a web server VM running the `nginx` module, and a client VM running `curl` or a graphical `firefox`, and test that they can talk to each other and display the correct content.
559+* Nix **package tests** are a lightweight alternative to NixOS module tests. They should be used to create simple integration tests for packages, but cannot test NixOS services, and some programs with graphical user interfaces may also be difficult to test with them.
560+* The **`checkPhase` of a package**, which should execute the unit tests that are included in the source code of a package.
561+
562+Here in the nixpkgs manual we describe mostly _package tests_; for _module tests_ head over to the corresponding [section in the NixOS manual](https://nixos.org/manual/nixos/stable/#sec-nixos-tests).
563+
564+### Writing inline package tests {#ssec-inline-package-tests-writing}
565+
566+For very simple tests, they can be written inline:
567+
568+```nix
569+{ …, yq-go }:
570+
571+buildGoModule rec {
572+ …
573+
574+ passthru.tests = {
575+ simple = runCommand "${pname}-test" {} ''
576+ echo "test: 1" | ${yq-go}/bin/yq eval -j > $out
577+ [ "$(cat $out | tr -d $'\n ')" = '{"test":1}' ]
578+ '';
579+ };
580+}
581+```
541582
542−### Writing package tests {#ssec-package-tests-writing}
583+### Writing larger package tests {#ssec-package-tests-writing}
543584
544585This is an example using the `phoronix-test-suite` package with the current best practices.
545586
@@ -568,7 +609,7 @@ let
568609 inherit (phoronix-test-suite) pname version;
569610in
570611
571−runCommand "${pname}-tests" { meta.timeout = 3; }
612+runCommand "${pname}-tests" { meta.timeout = 60; }
572613 ''
573614 # automatic initial setup to prevent interactive questions
574615 ${phoronix-test-suite}/bin/phoronix-test-suite enterprise-setup >/dev/null
@@ -602,3 +643,23 @@ Here are examples of package tests:
602643- [Spacy annotation test](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/python-modules/spacy/annotation-test/default.nix)
603644- [Libtorch test](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/libraries/science/math/libtorch/test/default.nix)
604645- [Multiple tests for nanopb](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/libraries/nanopb/default.nix)
646+
647+### Linking NixOS module tests to a package {#ssec-nixos-tests-linking}
648+
649+Like [package tests](#ssec-package-tests-writing) as shown above, [NixOS module tests](https://nixos.org/manual/nixos/stable/#sec-nixos-tests) can also be linked to a package, so that the tests can be easily run when changing the related package.
650+
651+For example, assuming we're packaging `nginx`, we can link its module test via `passthru.tests`:
652+
653+```nix
654+{ stdenv, lib, nixosTests }:
655+
656+stdenv.mkDerivation {
657+ ...
658+
659+ passthru.tests = {
660+ nginx = nixosTests.nginx;
661+ };
662+
663+ ...
664+}
665+```
doc/contributing/contributing-to-documentation.chapter.md+7
@@ -52,6 +52,13 @@ Additionally, the following syntax extensions are currently used:
5252
5353 This syntax is taken from [MyST](https://myst-parser.readthedocs.io/en/latest/using/syntax.html#targets-and-cross-referencing).
5454
55+- []{#ssec-contributing-markup-inline-roles}
56+ If you want to link to a man page, you can use `` {manpage}`nix.conf(5)` ``, which will turn into {manpage}`nix.conf(5)`.
57+
58+ The references will turn into links when a mapping exists in {file}`doc/build-aux/pandoc-filters/link-unix-man-references.lua`.
59+
60+ This syntax is taken from [MyST](https://myst-parser.readthedocs.io/en/latest/syntax/syntax.html#roles-an-in-line-extension-point). Though, the feature originates from [reStructuredText](https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html#role-manpage) with slightly different syntax.
61+
5562- []{#ssec-contributing-markup-admonitions}
5663 **Admonitions**, set off from the text to bring attention to something.
5764
doc/contributing/reviewing-contributions.chapter.md+5−4
@@ -103,7 +103,8 @@ Sample template for a new package review is provided below.
103103- [ ] `meta.maintainers` is set
104104- [ ] build time only dependencies are declared in `nativeBuildInputs`
105105- [ ] source is fetched using the appropriate function
106−- [ ] phases are respected
106+- [ ] the list of `phases` is not overridden
107+- [ ] when a phase (like `installPhase`) is overridden it starts with `runHook preInstall` and ends with `runHook postInstall`.
107108- [ ] patches that are remotely available are fetched with `fetchpatch`
108109
109110##### Possible improvements
@@ -121,10 +122,10 @@ Reviewing process:
121122 - [CODEOWNERS](https://help.github.com/articles/about-codeowners/) will make GitHub notify users based on the submitted changes, but it can happen that it misses some of the package maintainers.
122123- Ensure that the module tests, if any, are succeeding.
123124- Ensure that the introduced options are correct.
124− - Type should be appropriate (string related types differs in their merging capabilities, `optionSet` and `string` types are deprecated).
125+ - Type should be appropriate (string related types differs in their merging capabilities, `loaOf` and `string` types are deprecated).
125126 - Description, default and example should be provided.
126127- Ensure that option changes are backward compatible.
127− - `mkRenamedOptionModule` and `mkAliasOptionModule` functions provide way to make option changes backward compatible.
128+ - `mkRenamedOptionModuleWith` provides a way to make option changes backward compatible.
128129- Ensure that removed options are declared with `mkRemovedOptionModule`
129130- Ensure that changes that are not backward compatible are mentioned in release notes.
130131- Ensure that documentations affected by the change is updated.
@@ -156,7 +157,7 @@ Reviewing process:
156157
157158- Ensure that the module tests, if any, are succeeding.
158159- Ensure that the introduced options are correct.
159− - Type should be appropriate (string related types differs in their merging capabilities, `optionSet` and `string` types are deprecated).
160+ - Type should be appropriate (string related types differs in their merging capabilities, `loaOf` and `string` types are deprecated).
160161 - Description, default and example should be provided.
161162- Ensure that module `meta` field is present
162163 - Maintainers should be declared in `meta.maintainers`.
doc/contributing/submitting-changes.chapter.md+33−12
@@ -43,13 +43,13 @@
4343 - nixpkgs:
4444
4545 - update pkg
46− - `nix-env -i pkg-name -f <path to your local nixpkgs folder>`
46+ - `nix-env -iA pkg-attribute-name -f <path to your local nixpkgs folder>`
4747 - add pkg
4848 - Make sure it’s in `pkgs/top-level/all-packages.nix`
49− - `nix-env -i pkg-name -f <path to your local nixpkgs folder>`
49+ - `nix-env -iA pkg-attribute-name -f <path to your local nixpkgs folder>`
5050 - _If you don’t want to install pkg in you profile_.
51− - `nix-build -A pkg-attribute-name <path to your local nixpkgs folder>/default.nix` and check results in the folder `result`. It will appear in the same directory where you did `nix-build`.
52− - If you did `nix-env -i pkg-name` you can do `nix-env -e pkg-name` to uninstall it from your system.
51+ - `nix-build -A pkg-attribute-name <path to your local nixpkgs folder>` and check results in the folder `result`. It will appear in the same directory where you did `nix-build`.
52+ - If you installed your package with `nix-env`, you can run `nix-env -e pkg-name` where `pkg-name` is as reported by `nix-env -q` to uninstall it from your system.
5353
5454 - NixOS and its modules:
5555 - You can add new module to your NixOS configuration file (usually it’s `/etc/nixos/configuration.nix`). And do `sudo nixos-rebuild test -I nixpkgs=<path to your local nixpkgs folder> --fast`.
@@ -62,7 +62,7 @@
6262
6363- Push your changes to your fork of nixpkgs.
6464- Create the pull request
65−- Follow [the contribution guidelines](https://github.com/NixOS/nixpkgs/blob/master/.github/CONTRIBUTING.md#submitting-changes).
65+- Follow [the contribution guidelines](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md#submitting-changes).
6666
6767## Submitting security fixes {#submitting-changes-submitting-security-fixes}
6868
@@ -96,9 +96,9 @@ We use jbidwatcher as an example for a discontinued project here.
9696
97971. Have Nixpkgs checked out locally and up to date.
98981. Create a new branch for your change, e.g. `git checkout -b jbidwatcher`
99−1. Remove the actual package including its directory, e.g. `rm -rf pkgs/applications/misc/jbidwatcher`
99+1. Remove the actual package including its directory, e.g. `git rm -rf pkgs/applications/misc/jbidwatcher`
1001001. Remove the package from the list of all packages (`pkgs/top-level/all-packages.nix`).
101−1. Add an alias for the package name in `pkgs/top-level/aliases.nix` (There is also `pkgs/misc/vim-plugins/aliases.nix`. Package sets typically do not have aliases, so we can't add them there.)
101+1. Add an alias for the package name in `pkgs/top-level/aliases.nix` (There is also `pkgs/applications/editors/vim/plugins/aliases.nix`. Package sets typically do not have aliases, so we can't add them there.)
102102
103103 For example in this case:
104104
@@ -193,7 +193,7 @@ It’s important to test any executables generated by a build when you change or
193193
194194### Meets Nixpkgs contribution standards {#submitting-changes-contribution-standards}
195195
196−The last checkbox is fits [CONTRIBUTING.md](https://github.com/NixOS/nixpkgs/blob/master/.github/CONTRIBUTING.md). The contributing document has detailed information on standards the Nix community has for commit messages, reviews, licensing of contributions you make to the project, etc\... Everyone should read and understand the standards the community has for contributing before submitting a pull request.
196+The last checkbox is fits [CONTRIBUTING.md](https://github.com/NixOS/nixpkgs/blob/master/CONTRIBUTING.md). The contributing document has detailed information on standards the Nix community has for commit messages, reviews, licensing of contributions you make to the project, etc\... Everyone should read and understand the standards the community has for contributing before submitting a pull request.
197197
198198## Hotfixing pull requests {#submitting-changes-hotfixing-pull-requests}
199199
@@ -227,7 +227,7 @@ digraph {
227227}
228228```
229229
230−[This GitHub Action](https://github.com/NixOS/nixpkgs/blob/master/.github/workflows/merge-staging.yml) brings changes from `master` to `staging-next` and from `staging-next` to `staging` every 6 hours.
230+[This GitHub Action](https://github.com/NixOS/nixpkgs/blob/master/.github/workflows/periodic-merge-6h.yml) brings changes from `master` to `staging-next` and from `staging-next` to `staging` every 6 hours.
231231
232232
233233### Master branch {#submitting-changes-master-branch}
@@ -246,11 +246,21 @@ If the branch is already in a broken state, please refrain from adding extra new
246246
247247### Stable release branches {#submitting-changes-stable-release-branches}
248248
249−For cherry-picking a commit to a stable release branch (“backporting”), use `git cherry-pick -x <original commit>` so that the original commit id is included in the commit.
249+The same staging workflow applies to stable release branches, but the main branch is called `release-*` instead of `master`.
250250
251−Add a reason for the backport by using `git cherry-pick -xe <original commit>` instead when it is not obvious from the original commit message. It is not needed when it's a minor version update that includes security and bug fixes but don't add new features or when the commit fixes an otherwise broken package.
251+Example branch names: `release-21.11`, `staging-21.11`, `staging-next-21.11`.
252252
253−For backporting Pull Requests to stable branches, assign label `backport <branch>` to the original Pull Requests and automation should take care of the rest once the Pull Requests is merged.
253+Most changes added to the stable release branches are cherry-picked (“backported”) from the `master` and staging branches.
254+
255+#### Automatically backporting a Pull Request {#submitting-changes-stable-release-branches-automatic-backports}
256+
257+Assign label `backport <branch>` (e.g. `backport release-21.11`) to the PR and a backport PR is automatically created after the PR is merged.
258+
259+#### Manually backporting changes {#submitting-changes-stable-release-branches-manual-backports}
260+
261+Cherry-pick changes via `git cherry-pick -x <original commit>` so that the original commit id is included in the commit message.
262+
263+Add a reason for the backport when it is not obvious from the original commit message. You can do this by cherry picking with `git cherry-pick -xe <original commit>`, which allows editing the commit message. This is not needed for minor version updates that include security and bug fixes but don't add new features or when the commit fixes an otherwise broken package.
254264
255265Here is an example of a cherry-picked commit message with good reason description:
256266
@@ -269,3 +279,14 @@ Other examples of reasons are:
269279- Previously the build would fail due to, e.g., `getaddrinfo` not being defined
270280- The previous download links were all broken
271281- Crash when starting on some X11 systems
282+
283+#### Acceptable backport criteria
284+
285+The stable branch does have some changes which cannot be backported. Most notable are breaking changes. The desire is to have stable users be uninterrupted when updating packages.
286+
287+However, many changes are able to be backported, including:
288+- New Packages / Modules
289+- Security / Patch updates
290+- Version updates which include new functionality (but no breaking changes)
291+- Services which require a client to be up-to-date regardless. (E.g. `spotify`, `steam`, or `discord`)
292+- Security critical applications (E.g. `firefox`)
doc/doc-support/lib-function-docs.nix+1
@@ -22,5 +22,6 @@ with pkgs; stdenv.mkDerivation {
2222 docgen lists 'List manipulation functions'
2323 docgen debug 'Debugging functions'
2424 docgen options 'NixOS / nixpkgs option handling'
25+ docgen sources 'Source filtering functions'
2526 '';
2627}
doc/functions.xml+1−1
@@ -7,7 +7,7 @@
77 The nixpkgs repository has several utility functions to manipulate Nix expressions.
88 </para>
99 <xi:include href="functions/library.xml" />
10− <xi:include href="functions/generators.xml" />
10+ <xi:include href="functions/generators.section.xml" />
1111 <xi:include href="functions/debug.section.xml" />
1212 <xi:include href="functions/prefer-remote-fetch.section.xml" />
1313 <xi:include href="functions/nix-gitignore.section.xml" />
doc/functions/generators.section.mdnew file+56
@@ -0,0 +1,56 @@
1+# Generators {#sec-generators}
2+Generators are functions that create file formats from nix data structures, e. g. for configuration files. There are generators available for: `INI`, `JSON` and `YAML`
3+
4+All generators follow a similar call interface: `generatorName configFunctions data`, where `configFunctions` is an attrset of user-defined functions that format nested parts of the content. They each have common defaults, so often they do not need to be set manually. An example is `mkSectionName ? (name: libStr.escape [ "[" "]" ] name)` from the `INI` generator. It receives the name of a section and sanitizes it. The default `mkSectionName` escapes `[` and `]` with a backslash.
5+
6+Generators can be fine-tuned to produce exactly the file format required by your application/service. One example is an INI-file format which uses `: ` as separator, the strings `"yes"`/`"no"` as boolean values and requires all string values to be quoted:
7+
8+```nix
9+with lib;
10+let
11+ customToINI = generators.toINI {
12+ # specifies how to format a key/value pair
13+ mkKeyValue = generators.mkKeyValueDefault {
14+ # specifies the generated string for a subset of nix values
15+ mkValueString = v:
16+ if v == true then ''"yes"''
17+ else if v == false then ''"no"''
18+ else if isString v then ''"${v}"''
19+ # and delegats all other values to the default generator
20+ else generators.mkValueStringDefault {} v;
21+ } ":";
22+ };
23+
24+# the INI file can now be given as plain old nix values
25+in customToINI {
26+ main = {
27+ pushinfo = true;
28+ autopush = false;
29+ host = "localhost";
30+ port = 42;
31+ };
32+ mergetool = {
33+ merge = "diff3";
34+ };
35+}
36+```
37+
38+This will produce the following INI file as nix string:
39+
40+```INI
41+[main]
42+autopush:"no"
43+host:"localhost"
44+port:42
45+pushinfo:"yes"
46+str\:ange:"very::strange"
47+
48+[mergetool]
49+merge:"diff3"
50+```
51+
52+::: {.note}
53+Nix store paths can be converted to strings by enclosing a derivation attribute like so: `"${drv}"`.
54+:::
55+
56+Detailed documentation for each generator can be found in `lib/generators.nix`.
doc/functions/generators.xmldeleted−74
@@ -1,74 +0,0 @@
1−<section xmlns="http://docbook.org/ns/docbook"
2− xmlns:xlink="http://www.w3.org/1999/xlink"
3− xmlns:xi="http://www.w3.org/2001/XInclude"
4− xml:id="sec-generators">
5− <title>Generators</title>
6−
7− <para>
8− Generators are functions that create file formats from nix data structures, e. g. for configuration files. There are generators available for: <literal>INI</literal>, <literal>JSON</literal> and <literal>YAML</literal>
9− </para>
10−
11− <para>
12− All generators follow a similar call interface: <code>generatorName configFunctions data</code>, where <literal>configFunctions</literal> is an attrset of user-defined functions that format nested parts of the content. They each have common defaults, so often they do not need to be set manually. An example is <code>mkSectionName ? (name: libStr.escape [ "[" "]" ] name)</code> from the <literal>INI</literal> generator. It receives the name of a section and sanitizes it. The default <literal>mkSectionName</literal> escapes <literal>[</literal> and <literal>]</literal> with a backslash.
13− </para>
14−
15− <para>
16− Generators can be fine-tuned to produce exactly the file format required by your application/service. One example is an INI-file format which uses <literal>: </literal> as separator, the strings <literal>"yes"</literal>/<literal>"no"</literal> as boolean values and requires all string values to be quoted:
17− </para>
18−
19−<programlisting>
20−with lib;
21−let
22− customToINI = generators.toINI {
23− # specifies how to format a key/value pair
24− mkKeyValue = generators.mkKeyValueDefault {
25− # specifies the generated string for a subset of nix values
26− mkValueString = v:
27− if v == true then ''"yes"''
28− else if v == false then ''"no"''
29− else if isString v then ''"${v}"''
30− # and delegats all other values to the default generator
31− else generators.mkValueStringDefault {} v;
32− } ":";
33− };
34−
35−# the INI file can now be given as plain old nix values
36−in customToINI {
37− main = {
38− pushinfo = true;
39− autopush = false;
40− host = "localhost";
41− port = 42;
42− };
43− mergetool = {
44− merge = "diff3";
45− };
46−}
47−</programlisting>
48−
49− <para>
50− This will produce the following INI file as nix string:
51− </para>
52−
53−<programlisting>
54−[main]
55−autopush:"no"
56−host:"localhost"
57−port:42
58−pushinfo:"yes"
59−str\:ange:"very::strange"
60−
61−[mergetool]
62−merge:"diff3"
63−</programlisting>
64−
65− <note>
66− <para>
67− Nix store paths can be converted to strings by enclosing a derivation attribute like so: <code>"${drv}"</code>.
68− </para>
69− </note>
70−
71− <para>
72− Detailed documentation for each generator can be found in <literal>lib/generators.nix</literal>.
73− </para>
74−</section>
doc/functions/library.xml+2
@@ -25,4 +25,6 @@
2525 <xi:include href="./library/generated/debug.xml" />
2626
2727 <xi:include href="./library/generated/options.xml" />
28+
29+ <xi:include href="./library/generated/sources.xml" />
2830</section>
doc/functions/library/attrsets.xml+4−4
@@ -166,7 +166,7 @@ lib.attrsets.setAttrByPath [ "a" "b" ] 3
166166 <xi:include href="./locations.xml" xpointer="lib.attrsets.getAttrFromPath" />
167167
168168 <para>
169− Like [](#function-library-lib.attrsets.attrByPath) except without a default, and it will throw if the value doesn't exist.
169+ Like <xref linkend="function-library-lib.attrsets.attrByPath" /> except without a default, and it will throw if the value doesn't exist.
170170 </para>
171171
172172 <variablelist>
@@ -772,7 +772,7 @@ nameValuePair "some" 6
772772 <title>Modifying each value of an attribute set</title>
773773<programlisting><![CDATA[
774774lib.attrsets.mapAttrs
775− (name: value: name + "-" value)
775+ (name: value: name + "-" + value)
776776 { x = "foo"; y = "bar"; }
777777=> { x = "x-foo"; y = "y-bar"; }
778778]]></programlisting>
@@ -1474,13 +1474,13 @@ lib.attrsets.zipAttrsWith
14741474 <section xml:id="function-library-lib.attrsets.zipAttrs">
14751475 <title><function>lib.attrsets.zipAttrs</function></title>
14761476
1477− <subtitle><literal>zipAttrsWith :: [ AttrSet ] -> AttrSet</literal>
1477+ <subtitle><literal>zipAttrs :: [ AttrSet ] -> AttrSet</literal>
14781478 </subtitle>
14791479
14801480 <xi:include href="./locations.xml" xpointer="lib.attrsets.zipAttrs" />
14811481
14821482 <para>
1483− Merge sets of attributes and combine each attribute value in to a list. Similar to [](#function-library-lib.attrsets.zipAttrsWith) where the merge function returns a list of all values.
1483+ Merge sets of attributes and combine each attribute value in to a list. Similar to <xref linkend="function-library-lib.attrsets.zipAttrsWith" /> where the merge function returns a list of all values.
14841484 </para>
14851485
14861486 <variablelist>
doc/hooks/index.xmlnew file+10
@@ -0,0 +1,10 @@
1+<chapter xmlns="http://docbook.org/ns/docbook"
2+ xmlns:xlink="http://www.w3.org/1999/xlink"
3+ xmlns:xi="http://www.w3.org/2001/XInclude"
4+ xml:id="chap-hooks">
5+ <title>Hooks reference</title>
6+ <para>
7+ Nixpkgs has several hook packages that augment the stdenv phases.
8+ </para>
9+ <xi:include href="./postgresql-test-hook.section.xml" />
10+</chapter>
doc/hooks/postgresql-test-hook.section.mdnew file+59
@@ -0,0 +1,59 @@
1+
2+# `postgresqlTestHook` {#sec-postgresqlTestHook}
3+
4+This hook starts a PostgreSQL server during the `checkPhase`. Example:
5+
6+```nix
7+{ stdenv, postgresql, postgresqlTestHook }:
8+stdenv.mkDerivation {
9+
10+ # ...
11+
12+ checkInputs = [
13+ postgresql
14+ postgresqlTestHook
15+ ];
16+}
17+```
18+
19+If you use a custom `checkPhase`, remember to add the `runHook` calls:
20+```nix
21+ checkPhase ''
22+ runHook preCheck
23+
24+ # ... your tests
25+
26+ runHook postCheck
27+ ''
28+```
29+
30+## Variables {#sec-postgresqlTestHook-variables}
31+
32+The hook logic will read a number of variables and set them to a default value if unset or empty.
33+
34+Exported variables:
35+
36+ - `PGDATA`: location of server files.
37+ - `PGHOST`: location of UNIX domain socket directory; the default `host` in a connection string.
38+ - `PGUSER`: user to create / log in with, default: `test_user`.
39+ - `PGDATABASE`: database name, default: `test_db`.
40+
41+Bash-only variables:
42+
43+ - `postgresqlTestUserOptions`: SQL options to use when creating the `$PGUSER` role, default: `LOGIN`.
44+ - `postgresqlTestSetupSQL`: SQL commands to run as database administrator after startup, default: statements that create `$PGUSER` and `$PGDATABASE`.
45+ - `postgresqlTestSetupCommands`: bash commands to run after database start, defaults to running `$postgresqlTestSetupSQL` as database administrator.
46+ - `postgresqlEnableTCP`: set to `1` to enable TCP listening. Flaky; not recommended.
47+ - `postgresqlStartCommands`: defaults to `pg_ctl start`.
48+
49+## TCP and the Nix sandbox {#sec-postgresqlTestHook-tcp}
50+
51+`postgresqlEnableTCP` relies on network sandboxing, which is not available on macOS and some custom Nix installations, resulting in flaky tests.
52+For this reason, it is disabled by default.
53+
54+The preferred solution is to make the test suite use a UNIX domain socket connection. This is the default behavior when no `host` connection parameter is provided.
55+Some test suites hardcode a value for `host` though, so a patch may be required. If you can upstream the patch, you can make `host` default to the `PGHOST` environment variable when set. Otherwise, you can patch it locally to omit the `host` connection string parameter altogether.
56+
57+::: {.note}
58+The error `libpq: failed (could not receive data from server: Connection refused` is generally an indication that the test suite is trying to connect through TCP.
59+:::
doc/labelless-link-is-xref.luadeleted−24
@@ -1,24 +0,0 @@
1−local function starts_with(start, str)
2− return str:sub(1, #start) == start
3−end
4−
5−local function escape_xml_arg(arg)
6− amps = arg:gsub('&', '&amp;')
7− amps_quotes = amps:gsub('"', '&quot;')
8− amps_quotes_lt = amps_quotes:gsub('<', '&lt;')
9−
10− return amps_quotes_lt
11−end
12−
13−function Link(elem)
14− has_no_content = #elem.content == 0
15− targets_anchor = starts_with('#', elem.target)
16− has_no_attributes = elem.title == '' and elem.identifier == '' and #elem.classes == 0 and #elem.attributes == 0
17−
18− if has_no_content and targets_anchor and has_no_attributes then
19− -- xref expects idref without the pound-sign
20− target_without_hash = elem.target:sub(2, #elem.target)
21−
22− return pandoc.RawInline('docbook', '<xref linkend="' .. escape_xml_arg(target_without_hash) .. '" />')
23− end
24−end
doc/languages-frameworks/agda.section.md+63−1
@@ -158,7 +158,23 @@ This can be overridden.
158158
159159By default, Agda sources are files ending on `.agda`, or literate Agda files ending on `.lagda`, `.lagda.tex`, `.lagda.org`, `.lagda.md`, `.lagda.rst`. The list of recognised Agda source extensions can be extended by setting the `extraExtensions` config variable.
160160
161−## Adding Agda packages to Nixpkgs {#adding-agda-packages-to-nixpkgs}
161+## Maintaining the Agda package set on Nixpkgs {#maintaining-the-agda-package-set-on-nixpkgs}
162+
163+We are aiming at providing all common Agda libraries as packages on `nixpkgs`,
164+and keeping them up to date.
165+Contributions and maintenance help is always appreciated,
166+but the maintenance effort is typically low since the Agda ecosystem is quite small.
167+
168+The `nixpkgs` Agda package set tries to take up a role similar to that of [Stackage](https://www.stackage.org/) in the Haskell world.
169+It is a curated set of libraries that:
170+
171+1. Always work together.
172+2. Are as up-to-date as possible.
173+
174+While the Haskell ecosystem is huge, and Stackage is highly automatised,
175+the Agda package set is small and can (still) be maintained by hand.
176+
177+### Adding Agda packages to Nixpkgs {#adding-agda-packages-to-nixpkgs}
162178
163179To add an Agda package to `nixpkgs`, the derivation should be written to `pkgs/development/libraries/agda/${library-name}/` and an entry should be added to `pkgs/top-level/agda-packages.nix`. Here it is called in a scope with access to all other Agda libraries, so the top line of the `default.nix` can look like:
164180
@@ -192,3 +208,49 @@ mkDerivation {
192208This library has a file called `.agda-lib`, and so we give an empty string to `libraryFile` as nothing precedes `.agda-lib` in the filename. This file contains `name: IAL-1.3`, and so we let `libraryName = "IAL-1.3"`. This library does not use an `Everything.agda` file and instead has a Makefile, so there is no need to set `everythingFile` and we set a custom `buildPhase`.
193209
194210When writing an Agda package it is essential to make sure that no `.agda-lib` file gets added to the store as a single file (for example by using `writeText`). This causes Agda to think that the nix store is a Agda library and it will attempt to write to it whenever it typechecks something. See [https://github.com/agda/agda/issues/4613](https://github.com/agda/agda/issues/4613).
211+
212+In the pull request adding this library,
213+you can test whether it builds correctly by writing in a comment:
214+
215+```
216+@ofborg build agdaPackages.iowa-stdlib
217+```
218+
219+### Maintaining Agda packages
220+
221+As mentioned before, the aim is to have a compatible, and up-to-date package set.
222+These two conditions sometimes exclude each other:
223+For example, if we update `agdaPackages.standard-library` because there was an upstream release,
224+this will typically break many reverse dependencies,
225+i.e. downstream Agda libraries that depend on the standard library.
226+In `nixpkgs` we are typically among the first to notice this,
227+since we have build tests in place to check this.
228+
229+In a pull request updating e.g. the standard library, you should write the following comment:
230+
231+```
232+@ofborg build agdaPackages.standard-library.passthru.tests
233+```
234+
235+This will build all reverse dependencies of the standard library,
236+for example `agdaPackages.agda-categories`, or `agdaPackages.generic`.
237+
238+In some cases it is useful to build _all_ Agda packages.
239+This can be done with the following Github comment:
240+
241+```
242+@ofborg build agda.passthru.tests.allPackages
243+```
244+
245+Sometimes, the builds of the reverse dependencies fail because they have not yet been updated and released.
246+You should drop the maintainers a quick issue notifying them of the breakage,
247+citing the build error (which you can get from the ofborg logs).
248+If you are motivated, you might even send a pull request that fixes it.
249+Usually, the maintainers will answer within a week or two with a new release.
250+Bumping the version of that reverse dependency should be a further commit on your PR.
251+
252+In the rare case that a new release is not to be expected within an acceptable time,
253+simply mark the broken package as broken by setting `meta.broken = true;`.
254+This will exclude it from the build test.
255+It can be added later when it is fixed,
256+and does not hinder the advancement of the whole package set in the meantime.
doc/languages-frameworks/beam.section.md+133−55
@@ -68,74 +68,128 @@ Erlang.mk functions similarly to Rebar3, except we use `buildErlangMk` instead o
6868
6969`mixRelease` is used to make a release in the mix sense. Dependencies will need to be fetched with `fetchMixDeps` and passed to it.
7070
71−#### mixRelease - Elixir Phoenix example {#mixrelease---elixir-phoenix-example}
71+#### mixRelease - Elixir Phoenix example {#mix-release-elixir-phoenix-example}
7272
73−Here is how your `default.nix` file would look.
73+there are 3 steps, frontend dependencies (javascript), backend dependencies (elixir) and the final derivation that puts both of those together
74+
75+##### mixRelease - Frontend dependencies (javascript) {#mix-release-javascript-deps}
76+
77+For phoenix projects, inside of nixpkgs you can either use yarn2nix (mkYarnModule) or node2nix. An example with yarn2nix can be found [here](https://github.com/NixOS/nixpkgs/blob/master/pkgs/servers/web-apps/plausible/default.nix#L39). An example with node2nix will follow. To package something outside of nixpkgs, you have alternatives like [npmlock2nix](https://github.com/nix-community/npmlock2nix) or [nix-npm-buildpackage](https://github.com/serokell/nix-npm-buildpackage)
78+
79+##### mixRelease - backend dependencies (mix) {#mix-release-mix-deps}
80+
81+There are 2 ways to package backend dependencies. With mix2nix and with a fixed-output-derivation (FOD).
82+
83+###### mix2nix {#mix2nix}
84+
85+`mix2nix` is a cli tool available in nixpkgs. it will generate a nix expression from a mix.lock file. It is quite standard in the 2nix tool series.
86+
87+Note that currently mix2nix can't handle git dependencies inside the mix.lock file. If you have git dependencies, you can either add them manually (see [example](https://github.com/NixOS/nixpkgs/blob/master/pkgs/servers/pleroma/default.nix#L20)) or use the FOD method.
88+
89+The advantage of using mix2nix is that nix will know your whole dependency graph. On a dependency update, this won't trigger a full rebuild and download of all the dependencies, where FOD will do so.
90+
91+Practical steps:
92+
93+- run `mix2nix > mix_deps.nix` in the upstream repo.
94+- pass `mixNixDeps = with pkgs; import ./mix_deps.nix { inherit lib beamPackages; };` as an argument to mixRelease.
95+
96+If there are git depencencies.
97+
98+- You'll need to fix the version artificially in mix.exs and regenerate the mix.lock with fixed version (on upstream). This will enable you to run `mix2nix > mix_deps.nix`.
99+- From the mix_deps.nix file, remove the dependencies that had git versions and pass them as an override to the import function.
74100
75101```nix
76−with import <nixpkgs> { };
102+ mixNixDeps = import ./mix.nix {
103+ inherit beamPackages lib;
104+ overrides = (final: prev: {
105+ # mix2nix does not support git dependencies yet,
106+ # so we need to add them manually
107+ prometheus_ex = beamPackages.buildMix rec {
108+ name = "prometheus_ex";
109+ version = "3.0.5";
110+
111+ # Change the argument src with the git src that you actually need
112+ src = fetchFromGitLab {
113+ domain = "git.pleroma.social";
114+ group = "pleroma";
115+ owner = "elixir-libraries";
116+ repo = "prometheus.ex";
117+ rev = "a4e9beb3c1c479d14b352fd9d6dd7b1f6d7deee5";
118+ sha256 = "1v0q4bi7sb253i8q016l7gwlv5562wk5zy3l2sa446csvsacnpjk";
119+ };
120+ # you can re-use the same beamDeps argument as generated
121+ beamDeps = with final; [ prometheus ];
122+ };
123+ });
124+};
125+```
77126
78−let
79− packages = beam.packagesWith beam.interpreters.erlang;
80− src = builtins.fetchgit {
81− url = "ssh://git@github.com/your_id/your_repo";
82− rev = "replace_with_your_commit";
83− };
127+You will need to run the build process once to fix the sha256 to correspond to your new git src.
84128
85− pname = "your_project";
86− version = "0.0.1";
87− mixEnv = "prod";
129+###### FOD {#fixed-output-derivation}
88130
89− mixFodDeps = packages.fetchMixDeps {
131+A fixed output derivation will download mix dependencies from the internet. To ensure reproducibility, a hash will be supplied. Note that mix is relatively reproducible. An FOD generating a different hash on each run hasn't been observed (as opposed to npm where the chances are relatively high). See [elixir_ls](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/beam-modules/elixir_ls.nix) for a usage example of FOD.
132+
133+Practical steps
134+
135+- start with the following argument to mixRelease
136+
137+```nix
138+ mixFodDeps = fetchMixDeps {
90139 pname = "mix-deps-${pname}";
91− inherit src mixEnv version;
92− # nix will complain and tell you the right value to replace this with
140+ inherit src version;
93141 sha256 = lib.fakeSha256;
94− # if you have build time environment variables add them here
95− MY_ENV_VAR="my_value";
96142 };
143+```
97144
98− nodeDependencies = (pkgs.callPackage ./assets/default.nix { }).shell.nodeDependencies;
145+The first build will complain about the sha256 value, you can replace with the suggested value after that.
99146
100− frontEndFiles = stdenvNoCC.mkDerivation {
101− pname = "frontend-${pname}";
147+Note that if after you've replaced the value, nix suggests another sha256, then mix is not fetching the dependencies reproducibly. An FOD will not work in that case and you will have to use mix2nix.
102148
103− nativeBuildInputs = [ nodejs ];
149+##### mixRelease - example {#mix-release-example}
104150
105− inherit version src;
151+Here is how your `default.nix` file would look for a phoenix project.
106152
107− buildPhase = ''
108− cp -r ./assets $TEMPDIR
153+```nix
154+with import <nixpkgs> { };
109155
110− mkdir -p $TEMPDIR/assets/node_modules/.cache
111− cp -r ${nodeDependencies}/lib/node_modules $TEMPDIR/assets
112− export PATH="${nodeDependencies}/bin:$PATH"
156+let
157+ # beam.interpreters.erlangR23 is available if you need a particular version
158+ packages = beam.packagesWith beam.interpreters.erlang;
113159
114− cd $TEMPDIR/assets
115− webpack --config ./webpack.config.js
116− cd ..
117− '';
160+ pname = "your_project";
161+ version = "0.0.1";
118162
119− installPhase = ''
120− cp -r ./priv/static $out/
121− '';
163+ src = builtins.fetchgit {
164+ url = "ssh://git@github.com/your_id/your_repo";
165+ rev = "replace_with_your_commit";
166+ };
122167
123− outputHashAlgo = "sha256";
124− outputHashMode = "recursive";
168+ # if using mix2nix you can use the mixNixDeps attribute
169+ mixFodDeps = packages.fetchMixDeps {
170+ pname = "mix-deps-${pname}";
171+ inherit src version;
125172 # nix will complain and tell you the right value to replace this with
126− outputHash = lib.fakeSha256;
127−
128− impureEnvVars = lib.fetchers.proxyImpureEnvVars;
173+ sha256 = lib.fakeSha256;
174+ # if you have build time environment variables add them here
175+ MY_ENV_VAR="my_value";
129176 };
130177
178+ nodeDependencies = (pkgs.callPackage ./assets/default.nix { }).shell.nodeDependencies;
131179
132180in packages.mixRelease {
133− inherit src pname version mixEnv mixFodDeps;
181+ inherit src pname version mixFodDeps;
134182 # if you have build time environment variables add them here
135183 MY_ENV_VAR="my_value";
136− preInstall = ''
137− mkdir -p ./priv/static
138− cp -r ${frontEndFiles} ./priv/static
184+
185+ postBuild = ''
186+ ln -sf ${nodeDependencies}/lib/node_modules assets/node_modules
187+ npm run deploy --prefix ./assets
188+
189+ # for external task you need a workaround for the no deps check flag
190+ # https://github.com/phoenixframework/phoenix/issues/2690
191+ mix do deps.loadpaths --no-deps-check, phx.digest
192+ mix phx.digest --no-deps-check
139193 '';
140194}
141195```
@@ -165,6 +219,8 @@ in
165219 systemd.services.${release_name} = {
166220 wantedBy = [ "multi-user.target" ];
167221 after = [ "network.target" "postgresql.service" ];
222+ # note that if you are connecting to a postgres instance on a different host
223+ # postgresql.service should not be included in the requires.
168224 requires = [ "network-online.target" "postgresql.service" ];
169225 description = "my app";
170226 environment = {
@@ -201,6 +257,7 @@ in
201257 path = [ pkgs.bash ];
202258 };
203259
260+ # in case you have migration scripts or you want to use a remote shell
204261 environment.systemPackages = [ release ];
205262}
206263```
@@ -212,19 +269,38 @@ in
212269Usually, we need to create a `shell.nix` file and do our development inside of the environment specified therein. Just install your version of Erlang and any other interpreters, and then use your normal build tools. As an example with Elixir:
213270
214271```nix
215−{ pkgs ? import "<nixpkgs"> {} }:
272+{ pkgs ? import <nixpkgs> {} }:
216273
217274with pkgs;
218−
219275let
220−
221− elixir = beam.packages.erlangR22.elixir_1_9;
222−
276+ elixir = beam.packages.erlangR24.elixir_1_12;
223277in
224278mkShell {
225279 buildInputs = [ elixir ];
280+}
281+```
282+
283+### Using an overlay
226284
227− ERL_INCLUDE_PATH="${erlang}/lib/erlang/usr/include";
285+If you need to use an overlay to change some attributes of a derivation, e.g. if you need a bugfix from a version that is not yet available in nixpkgs, you can override attributes such as `version` (and the corresponding `sha256`) and then use this overlay in your development environment:
286+
287+#### `shell.nix`
288+
289+```nix
290+let
291+ elixir_1_13_1_overlay = (self: super: {
292+ elixir_1_13 = super.elixir_1_13.override {
293+ version = "1.13.1";
294+ sha256 = "0z0b1w2vvw4vsnb99779c2jgn9bgslg7b1pmd9vlbv02nza9qj5p";
295+ };
296+ });
297+ pkgs = import <nixpkgs> { overlays = [ elixir_1_13_1_overlay ]; };
298+in
299+with pkgs;
300+mkShell {
301+ buildInputs = [
302+ elixir_1_13
303+ ];
228304}
229305```
230306
@@ -239,10 +315,10 @@ let
239315 # define packages to install
240316 basePackages = [
241317 git
242− # replace with beam.packages.erlang.elixir_1_11 if you need
318+ # replace with beam.packages.erlang.elixir_1_13 if you need
243319 beam.packages.erlang.elixir
244− nodejs-15_x
245− postgresql_13
320+ nodejs
321+ postgresql_14
246322 # only used for frontend dependencies
247323 # you are free to use yarn2nix as well
248324 nodePackages.node2nix
@@ -260,10 +336,12 @@ let
260336 mkdir -p .nix-mix .nix-hex
261337 export MIX_HOME=$PWD/.nix-mix
262338 export HEX_HOME=$PWD/.nix-mix
339+ # make hex from Nixpkgs available
340+ # `mix local.hex` will install hex into MIX_HOME and should take precedence
341+ export MIX_PATH="${beam.packages.erlang.hex}/lib/erlang/lib/hex/ebin"
263342 export PATH=$MIX_HOME/bin:$HEX_HOME/bin:$PATH
264− # TODO: not sure how to make hex available without installing it afterwards.
265− mix local.hex --if-missing
266− export LANG=en_US.UTF-8
343+ export LANG=C.UTF-8
344+ # keep your shell history in iex
267345 export ERL_AFLAGS="-kernel shell_history enabled"
268346
269347 # postges related
doc/languages-frameworks/chicken.section.mdnew file+49
@@ -0,0 +1,49 @@
1+# CHICKEN {#sec-chicken}
2+
3+[CHICKEN](https://call-cc.org/) is a
4+[R⁵RS](https://schemers.org/Documents/Standards/R5RS/HTML/)-compliant Scheme
5+compiler. It includes an interactive mode and a custom package format, "eggs".
6+
7+## Using Eggs
8+
9+Eggs described in nixpkgs are available inside the
10+`chickenPackages.chickenEggs` attrset. Including an egg as a build input is
11+done in the typical Nix fashion. For example, to include support for [SRFI
12+189](https://srfi.schemers.org/srfi-189/srfi-189.html) in a derivation, one
13+might write:
14+
15+```nix
16+ buildInputs = [
17+ chicken
18+ chickenPackages.chickenEggs.srfi-189
19+ ];
20+```
21+
22+Both `chicken` and its eggs have a setup hook which configures the environment
23+variables `CHICKEN_INCLUDE_PATH` and `CHICKEN_REPOSITORY_PATH`.
24+
25+## Updating Eggs
26+
27+nixpkgs only knows about a subset of all published eggs. It uses
28+[egg2nix](https://github.com/the-kenny/egg2nix) to generate a
29+package set from a list of eggs to include.
30+
31+The package set is regenerated by running the following shell commands:
32+
33+```
34+$ nix-shell -p chickenPackages.egg2nix
35+$ cd pkgs/development/compilers/chicken/5/
36+$ egg2nix eggs.scm > eggs.nix
37+```
38+
39+## Adding Eggs
40+
41+When we run `egg2nix`, we obtain one collection of eggs with
42+mutually-compatible versions. This means that when we add new eggs, we may
43+need to update existing eggs. To keep those separate, follow the procedure for
44+updating eggs before including more eggs.
45+
46+To include more eggs, edit `pkgs/development/compilers/chicken/5/eggs.scm`.
47+The first section of this file lists eggs which are required by `egg2nix`
48+itself; all other eggs go into the second section. After editing, follow the
49+procedure for updating eggs.
doc/languages-frameworks/coq.section.md+4−2
@@ -28,11 +28,13 @@ The recommended way of defining a derivation for a Coq library, is to use the `c
2828* `domain` (optional, defaults to `"github.com"`), domains including the strings `"github"` or `"gitlab"` in their names are automatically supported, otherwise, one must change the `fetcher` argument to support them (cf `pkgs/development/coq-modules/heq/default.nix` for an example),
2929* `releaseRev` (optional, defaults to `(v: v)`), provides a default mapping from release names to revision hashes/branch names/tags,
3030* `displayVersion` (optional), provides a way to alter the computation of `name` from `pname`, by explaining how to display version numbers,
31−* `namePrefix` (optional), provides a way to alter the computation of `name` from `pname`, by explaining which dependencies must occur in `name`,
32−* `extraBuildInputs` (optional), by default `buildInputs` just contains `coq`, this allows to add more build inputs,
31+* `namePrefix` (optional, defaults to `[ "coq" ]`), provides a way to alter the computation of `name` from `pname`, by explaining which dependencies must occur in `name`,
32+* `extraNativeBuildInputs` (optional), by default `nativeBuildInputs` just contains `coq`, this allows to add more native build inputs, `nativeBuildInputs` are executables and `buildInputs` are libraries and dependencies,
33+* `extraBuildInputs` (optional), this allows to add more build inputs,
3334* `mlPlugin` (optional, defaults to `false`). Some extensions (plugins) might require OCaml and sometimes other OCaml packages. Standard dependencies can be added by setting the current option to `true`. For a finer grain control, the `coq.ocamlPackages` attribute can be used in `extraBuildInputs` to depend on the same package set Coq was built against.
3435* `useDune2ifVersion` (optional, default to `(x: false)` uses Dune2 to build the package if the provided predicate evaluates to true on the version, e.g. `useDune2if = versions.isGe "1.1"` will use dune if the version of the package is greater or equal to `"1.1"`,
3536* `useDune2` (optional, defaults to `false`) uses Dune2 to build the package if set to true, the presence of this attribute overrides the behavior of the previous one.
37+* `opam-name` (optional, defaults to concatenating with a dash separator the components of `namePrefix` and `pname`), name of the Dune package to build.
3638* `enableParallelBuilding` (optional, defaults to `true`), since it is activated by default, we provide a way to disable it.
3739* `extraInstallFlags` (optional), allows to extend `installFlags` which initializes the variable `COQMF_COQLIB` so as to install in the proper subdirectory. Indeed Coq libraries should be installed in `$(out)/lib/coq/${coq.coq-version}/user-contrib/`. Such directories are automatically added to the `$COQPATH` environment variable by the hook defined in the Coq derivation.
3840* `setCOQBIN` (optional, defaults to `true`), by default, the environment variable `$COQBIN` is set to the current Coq's binary, but one can disable this behavior by setting it to `false`,
doc/languages-frameworks/crystal.section.md+2−2
@@ -4,12 +4,12 @@
44
55This section uses [Mint](https://github.com/mint-lang/mint) as an example for how to build a Crystal package.
66
7−If the Crystal project has any dependencies, the first step is to get a `shards.nix` file encoding those. Get a copy of the project and go to its root directory such that its `shard.lock` file is in the current directory, then run `crystal2nix` in it
8−
7+If the Crystal project has any dependencies, the first step is to get a `shards.nix` file encoding those. Get a copy of the project and go to its root directory such that its `shard.lock` file is in the current directory. Executable projects should usually commit the `shard.lock` file, but sometimes that's not the case, which means you need to generate it yourself. With an existing `shard.lock` file, `crystal2nix` can be run.
98```bash
109$ git clone https://github.com/mint-lang/mint
1110$ cd mint
1211$ git checkout 0.5.0
12+$ if [ ! -f shard.lock ]; then nix-shell -p shards --run "shards lock"; fi
1313$ nix-shell -p crystal2nix --run crystal2nix
1414```
1515
doc/languages-frameworks/cuda.section.mdnew file+34
@@ -0,0 +1,34 @@
1+# CUDA {#cuda}
2+
3+CUDA-only packages are stored in the `cudaPackages` packages set. This set
4+includes the `cudatoolkit`, portions of the toolkit in separate derivations,
5+`cudnn`, `cutensor` and `nccl`.
6+
7+A package set is available for each CUDA version, so for example
8+`cudaPackages_11_6`. Within each set is a matching version of the above listed
9+packages. Additionally, other versions of the packages that are packaged and
10+compatible are available as well. For example, there can be a
11+`cudaPackages.cudnn_8_3_2` package.
12+
13+To use one or more CUDA packages in an expression, give the expression a `cudaPackages` parameter, and in case CUDA is optional
14+```nix
15+cudaSupport ? false
16+cudaPackages ? {}
17+```
18+
19+When using `callPackage`, you can choose to pass in a different variant, e.g.
20+when a different version of the toolkit suffices
21+```nix
22+mypkg = callPackage { cudaPackages = cudaPackages_11_5; }
23+```
24+
25+If another version of say `cudnn` or `cutensor` is needed, you can override the
26+package set to make it the default. This guarantees you get a consistent package
27+set.
28+```nix
29+mypkg = let
30+ cudaPackages = cudaPackages_11_5.overrideScope' (final: prev {
31+ cudnn = prev.cudnn_8_3_2;
32+ }});
33+in callPackage { inherit cudaPackages; };
34+```
doc/languages-frameworks/dhall.section.md+46−15
@@ -50,7 +50,7 @@ expression does not protect the Prelude import with a semantic integrity
5050check, so the first step is to freeze the expression using `dhall freeze`,
5151like this:
5252
53−```bash
53+```ShellSession
5454$ dhall freeze --inplace ./true.dhall
5555```
5656
@@ -113,7 +113,7 @@ in
113113
114114… which we can then build using this command:
115115
116−```bash
116+```ShellSession
117117$ nix build --file ./example.nix dhallPackages.true
118118```
119119
@@ -121,7 +121,7 @@ $ nix build --file ./example.nix dhallPackages.true
121121
122122The above package produces the following directory tree:
123123
124−```bash
124+```ShellSession
125125$ tree -a ./result
126126result
127127├── .cache
@@ -135,7 +135,7 @@ result
135135
136136* `source.dhall` contains the result of interpreting our Dhall package:
137137
138− ```bash
138+ ```ShellSession
139139 $ cat ./result/source.dhall
140140 True
141141 ```
@@ -143,7 +143,7 @@ result
143143* The `.cache` subdirectory contains one binary cache product encoding the
144144 same result as `source.dhall`:
145145
146− ```bash
146+ ```ShellSession
147147 $ dhall decode < ./result/.cache/dhall/122027abdeddfe8503496adeb623466caa47da5f63abd2bc6fa19f6cfcb73ecfed70
148148 True
149149 ```
@@ -151,7 +151,7 @@ result
151151* `binary.dhall` contains a Dhall expression which handles fetching and decoding
152152 the same cache product:
153153
154− ```bash
154+ ```ShellSession
155155 $ cat ./result/binary.dhall
156156 missing sha256:27abdeddfe8503496adeb623466caa47da5f63abd2bc6fa19f6cfcb73ecfed70
157157 $ cp -r ./result/.cache .cache
@@ -168,7 +168,7 @@ to conserve disk space when they are used exclusively as dependencies. For
168168example, if we build the Prelude package it will only contain the binary
169169encoding of the expression:
170170
171−```bash
171+```ShellSession
172172$ nix build --file ./example.nix dhallPackages.Prelude
173173
174174$ tree -a result
@@ -199,7 +199,7 @@ Dhall overlay like this:
199199… and now the Prelude will contain the fully decoded result of interpreting
200200the Prelude:
201201
202−```bash
202+```ShellSession
203203$ nix build --file ./example.nix dhallPackages.Prelude
204204
205205$ tree -a result
@@ -302,7 +302,7 @@ Additionally, `buildDhallGitHubPackage` accepts the same arguments as
302302You can use the `dhall-to-nixpkgs` command-line utility to automate
303303packaging Dhall code. For example:
304304
305−```bash
305+```ShellSession
306306$ nix-env --install --attr haskellPackages.dhall-nixpkgs
307307
308308$ nix-env --install --attr nix-prefetch-git # Used by dhall-to-nixpkgs
@@ -329,12 +329,12 @@ The utility takes care of automatically detecting remote imports and converting
329329them to package dependencies. You can also use the utility on local
330330Dhall directories, too:
331331
332−```bash
332+```ShellSession
333333$ dhall-to-nixpkgs directory ~/proj/dhall-semver
334334{ buildDhallDirectoryPackage, Prelude }:
335335 buildDhallDirectoryPackage {
336336 name = "proj";
337− src = /Users/gabriel/proj/dhall-semver;
337+ src = ~/proj/dhall-semver;
338338 file = "package.dhall";
339339 source = false;
340340 document = false;
@@ -342,6 +342,37 @@ $ dhall-to-nixpkgs directory ~/proj/dhall-semver
342342 }
343343```
344344
345+### Remote imports as fixed-output derivations {#ssec-dhall-remote-imports-as-fod}
346+
347+`dhall-to-nixpkgs` has the ability to fetch and build remote imports as
348+fixed-output derivations by using their Dhall integrity check. This is
349+sometimes easier than manually packaging all remote imports.
350+
351+This can be used like the following:
352+
353+```ShellSession
354+$ dhall-to-nixpkgs directory --fixed-output-derivations ~/proj/dhall-semver
355+{ buildDhallDirectoryPackage, buildDhallUrl }:
356+ buildDhallDirectoryPackage {
357+ name = "proj";
358+ src = ~/proj/dhall-semver;
359+ file = "package.dhall";
360+ source = false;
361+ document = false;
362+ dependencies = [
363+ (buildDhallUrl {
364+ url = "https://prelude.dhall-lang.org/v17.0.0/package.dhall";
365+ hash = "sha256-ENs8kZwl6QRoM9+Jeo/+JwHcOQ+giT2VjDQwUkvlpD4=";
366+ dhallHash = "sha256:10db3c919c25e9046833df897a8ffe2701dc390fa0893d958c3430524be5a43e";
367+ })
368+ ];
369+ }
370+```
371+
372+Here, `dhall-semver`'s `Prelude` dependency is fetched and built with the
373+`buildDhallUrl` helper function, instead of being passed in as a function
374+argument.
375+
345376## Overriding dependency versions {#ssec-dhall-overriding-dependency-versions}
346377
347378Suppose that we change our `true.dhall` example expression to depend on an older
@@ -359,7 +390,7 @@ in Prelude.Bool.not False
359390
360391If we try to rebuild that expression the build will fail:
361392
362−```
393+```ShellSession
363394$ nix build --file ./example.nix dhallPackages.true
364395builder for '/nix/store/0f1hla7ff1wiaqyk1r2ky4wnhnw114fi-true.drv' failed with exit code 1; last 10 log lines:
365396
@@ -385,7 +416,7 @@ importing the URL.
385416However, we can override the default Prelude version by using `dhall-to-nixpkgs`
386417to create a Dhall package for our desired Prelude:
387418
388−```bash
419+```ShellSession
389420$ dhall-to-nixpkgs github https://github.com/dhall-lang/dhall-lang.git \
390421 --name Prelude \
391422 --directory Prelude \
@@ -396,7 +427,7 @@ $ dhall-to-nixpkgs github https://github.com/dhall-lang/dhall-lang.git \
396427… and then referencing that package in our Dhall overlay, by either overriding
397428the Prelude globally for all packages, like this:
398429
399−```bash
430+```nix
400431 dhallOverrides = self: super: {
401432 true = self.callPackage ./true.nix { };
402433
@@ -407,7 +438,7 @@ the Prelude globally for all packages, like this:
407438… or selectively overriding the Prelude dependency for just the `true` package,
408439like this:
409440
410−```bash
441+```nix
411442 dhallOverrides = self: super: {
412443 true = self.callPackage ./true.nix {
413444 Prelude = self.callPackage ./Prelude.nix { };
doc/languages-frameworks/dotnet.section.md+63−6
@@ -28,8 +28,7 @@ mkShell {
2828 packages = [
2929 (with dotnetCorePackages; combinePackages [
3030 sdk_3_1
31− sdk_3_0
32− sdk_2_1
31+ sdk_5_0
3332 ])
3433 ];
3534}
@@ -64,12 +63,70 @@ $ dotnet --info
6463
6564The `dotnetCorePackages.sdk_X_Y` is preferred over the old dotnet-sdk as both major and minor version are very important for a dotnet environment. If a given minor version isn't present (or was changed), then this will likely break your ability to build a project.
6665
67−## dotnetCorePackages.sdk vs dotnetCorePackages.net vs dotnetCorePackages.netcore vs dotnetCorePackages.aspnetcore {#dotnetcorepackages.sdk-vs-dotnetcorepackages.net-vs-dotnetcorepackages.netcore-vs-dotnetcorepackages.aspnetcore}
66+## dotnetCorePackages.sdk vs dotnetCorePackages.runtime vs dotnetCorePackages.aspnetcore {#dotnetcorepackages.sdk-vs-dotnetcorepackages.runtime-vs-dotnetcorepackages.aspnetcore}
6867
69−The `dotnetCorePackages.sdk` contains both a runtime and the full sdk of a given version. The `net`, `netcore` and `aspnetcore` packages are meant to serve as minimal runtimes to deploy alongside already built applications. For runtime versions >= .NET 5 `net` is used while `netcore` is used for older .NET Core runtime version.
68+The `dotnetCorePackages.sdk` contains both a runtime and the full sdk of a given version. The `runtime` and `aspnetcore` packages are meant to serve as minimal runtimes to deploy alongside already built applications.
7069
7170## Packaging a Dotnet Application {#packaging-a-dotnet-application}
7271
73−Ideally, we would like to build against the sdk, then only have the dotnet runtime available in the runtime closure.
72+To package Dotnet applications, you can use `buildDotnetModule`. This has similar arguments to `stdenv.mkDerivation`, with the following additions:
73+
74+* `projectFile` has to be used for specifying the dotnet project file relative to the source root. These usually have `.sln` or `.csproj` file extensions. This can be an array of multiple projects as well.
75+* `nugetDeps` has to be used to specify the NuGet dependency file. Unfortunately, these cannot be deterministically fetched without a lockfile. A script to fetch these is available as `passthru.fetch-deps`. This file can also be generated manually using `nuget-to-nix` tool, which is available in nixpkgs.
76+* `packNupkg` is used to pack project as a `nupkg`, and installs it to `$out/share`. If set to `true`, the derivation can be used as a dependency for another dotnet project by adding it to `projectReferences`.
77+* `projectReferences` can be used to resolve `ProjectReference` project items. Referenced projects can be packed with `buildDotnetModule` by setting the `packNupkg = true` attribute and passing a list of derivations to `projectReferences`. Since we are sharing referenced projects as NuGets they must be added to csproj/fsproj files as `PackageReference` as well.
78+ For example, your project has a local dependency:
79+ ```xml
80+ <ProjectReference Include="../foo/bar.fsproj" />
81+ ```
82+ To enable discovery through `projectReferences` you would need to add:
83+ ```xml
84+ <ProjectReference Include="../foo/bar.fsproj" />
85+ <PackageReference Include="bar" Version="*" Condition=" '$(ContinuousIntegrationBuild)'=='true' "/>
86+ ```
87+* `executables` is used to specify which executables get wrapped to `$out/bin`, relative to `$out/lib/$pname`. If this is unset, all executables generated will get installed. If you do not want to install any, set this to `[]`. This gets done in the `preFixup` phase.
88+* `runtimeDeps` is used to wrap libraries into `LD_LIBRARY_PATH`. This is how dotnet usually handles runtime dependencies.
89+* `buildType` is used to change the type of build. Possible values are `Release`, `Debug`, etc. By default, this is set to `Release`.
90+* `dotnet-sdk` is useful in cases where you need to change what dotnet SDK is being used.
91+* `dotnet-runtime` is useful in cases where you need to change what dotnet runtime is being used. This can be either a regular dotnet runtime, or an aspnetcore.
92+* `dotnet-test-sdk` is useful in cases where unit tests expect a different dotnet SDK. By default, this is set to the `dotnet-sdk` attribute.
93+* `testProjectFile` is useful in cases where the regular project file does not contain the unit tests. It gets restored and build, but not installed. You may need to regenerate your nuget lockfile after setting this.
94+* `disabledTests` is used to disable running specific unit tests. This gets passed as: `dotnet test --filter "FullyQualifiedName!={}"`, to ensure compatibility with all unit test frameworks.
95+* `dotnetRestoreFlags` can be used to pass flags to `dotnet restore`.
96+* `dotnetBuildFlags` can be used to pass flags to `dotnet build`.
97+* `dotnetTestFlags` can be used to pass flags to `dotnet test`. Used only if `doCheck` is set to `true`.
98+* `dotnetInstallFlags` can be used to pass flags to `dotnet install`.
99+* `dotnetPackFlags` can be used to pass flags to `dotnet pack`. Used only if `packNupkg` is set to `true`.
100+* `dotnetFlags` can be used to pass flags to all of the above phases.
101+
102+When packaging a new application, you need to fetch it's dependencies. You can set `nugetDeps` to an empty string to make the derivation temporarily evaluate, and then run `nix-build -A package.passthru.fetch-deps` to generate it's dependency fetching script. After running the script, you should have the location of the generated lockfile printed to the console. This can be copied to a stable directory. Note that if either `projectFile` or `nugetDeps` are unset, this script cannot be generated!
103+
104+Here is an example `default.nix`, using some of the previously discussed arguments:
105+```nix
106+{ lib, buildDotnetModule, dotnetCorePackages, ffmpeg }:
107+
108+let
109+ referencedProject = import ../../bar { ... };
110+in buildDotnetModule rec {
111+ pname = "someDotnetApplication";
112+ version = "0.1";
113+
114+ src = ./.;
115+
116+ projectFile = "src/project.sln";
117+ nugetDeps = ./deps.nix; # File generated with `nix-build -A package.passthru.fetch-deps`.
118+
119+ projectReferences = [ referencedProject ]; # `referencedProject` must contain `nupkg` in the folder structure.
74120
75−TODO: Create closure-friendly way to package dotnet applications
121+ dotnet-sdk = dotnetCorePackages.sdk_3_1;
122+ dotnet-runtime = dotnetCorePackages.net_5_0;
123+ dotnetFlags = [ "--runtime linux-x64" ];
124+
125+ executables = [ "foo" ]; # This wraps "$out/lib/$pname/foo" to `$out/bin/foo`.
126+ executables = []; # Don't install any executables.
127+
128+ packNupkg = true; # This packs the project as "foo-0.1.nupkg" at `$out/share`.
129+
130+ runtimeDeps = [ ffmpeg ]; # This will wrap ffmpeg's library path into `LD_LIBRARY_PATH`.
131+}
132+```
doc/languages-frameworks/emscripten.section.md+2−2
@@ -15,12 +15,12 @@ Modes of use of `emscripten`:
1515
1616 If you want to work with `emcc`, `emconfigure` and `emmake` as you are used to from Ubuntu and similar distributions you can use these commands:
1717
18− * `nix-env -i emscripten`
18+ * `nix-env -f "<nixpkgs>" -iA emscripten`
1919 * `nix-shell -p emscripten`
2020
2121* **Declarative usage**:
2222
23− This mode is far more power full since this makes use of `nix` for dependency management of emscripten libraries and targets by using the `mkDerivation` which is implemented by `pkgs.emscriptenStdenv` and `pkgs.buildEmscriptenPackage`. The source for the packages is in `pkgs/top-level/emscripten-packages.nix` and the abstraction behind it in `pkgs/development/em-modules/generic/default.nix`.
23+ This mode is far more power full since this makes use of `nix` for dependency management of emscripten libraries and targets by using the `mkDerivation` which is implemented by `pkgs.emscriptenStdenv` and `pkgs.buildEmscriptenPackage`. The source for the packages is in `pkgs/top-level/emscripten-packages.nix` and the abstraction behind it in `pkgs/development/em-modules/generic/default.nix`. From the root of the nixpkgs repository:
2424 * build and install all packages:
2525 * `nix-env -iA emscriptenPackages`
2626
doc/languages-frameworks/gnome.section.md+36−4
@@ -8,12 +8,30 @@ Programs in the GNOME universe are written in various languages but they all use
88
99[GSettings](https://developer.gnome.org/gio/stable/GSettings.html) API is often used for storing settings. GSettings schemas are required, to know the type and other metadata of the stored values. GLib looks for `glib-2.0/schemas/gschemas.compiled` files inside the directories of `XDG_DATA_DIRS`.
1010
11−On Linux, GSettings API is implemented using [dconf](https://wiki.gnome.org/Projects/dconf) backend. You will need to add `dconf` GIO module to `GIO_EXTRA_MODULES` variable, otherwise the `memory` backend will be used and the saved settings will not be persistent.
11+On Linux, GSettings API is implemented using [dconf](https://wiki.gnome.org/Projects/dconf) backend. You will need to add `dconf` [GIO module](#ssec-gnome-gio-modules) to `GIO_EXTRA_MODULES` variable, otherwise the `memory` backend will be used and the saved settings will not be persistent.
1212
1313Last you will need the dconf database D-Bus service itself. You can enable it using `programs.dconf.enable`.
1414
1515Some applications will also require `gsettings-desktop-schemas` for things like reading proxy configuration or user interface customization. This dependency is often not mentioned by upstream, you should grep for `org.gnome.desktop` and `org.gnome.system` to see if the schemas are needed.
1616
17+### GIO modules {#ssec-gnome-gio-modules}
18+
19+GLib’s [GIO](https://developer.gnome.org/gio/stable/ch01.html) library supports several [extension points](https://developer.gnome.org/gio/stable/extending-gio.html). Notably, they allow:
20+
21+* implementing settings backends (already [mentioned](#ssec-gnome-settings))
22+* adding TLS support
23+* proxy settings
24+* virtual file systems
25+
26+The modules are typically installed to `lib/gio/modules/` directory of a package and you need to add them to `GIO_EXTRA_MODULES` if you need any of those features.
27+
28+In particular, we recommend:
29+
30+* adding `dconf.lib` for any software on Linux that reads [GSettings](#ssec-gnome-settings) (even transitivily through e.g. GTK’s file manager)
31+* adding `glib-networking` for any software that accesses network using GIO or libsoup – glib-networking contains a module that implements TLS support and loads system-wide proxy settings
32+
33+To allow software to use various virtual file systems, `gvfs` package can be also added. But that is usually an optional feature so we typically use `gvfs` from the system (e.g. installed globally using NixOS module).
34+
1735### GdkPixbuf loaders {#ssec-gnome-gdk-pixbuf-loaders}
1836
1937GTK applications typically use [GdkPixbuf](https://developer.gnome.org/gdk-pixbuf/stable/) to load images. But `gdk-pixbuf` package only supports basic bitmap formats like JPEG, PNG or TIFF, requiring to use third-party loader modules for other formats. This is especially painful since GTK itself includes SVG icons, which cannot be rendered without a loader provided by `librsvg`.
@@ -24,7 +42,21 @@ Unlike other libraries mentioned in this section, GdkPixbuf only supports a sing
2442
2543### Icons {#ssec-gnome-icons}
2644
27−When an application uses icons, an icon theme should be available in `XDG_DATA_DIRS` during runtime. The package for the default, icon-less [hicolor-icon-theme](https://www.freedesktop.org/wiki/Software/icon-theme/) (should be propagated by every icon theme) contains [a setup hook](#ssec-gnome-hooks-hicolor-icon-theme) that will pick up icon themes from `buildInputs` and pass it to our wrapper. Unfortunately, relying on that would mean every user has to download the theme included in the package expression no matter their preference. For that reason, we leave the installation of icon theme on the user. If you use one of the desktop environments, you probably already have an icon theme installed.
45+When an application uses icons, an icon theme should be available in `XDG_DATA_DIRS` during runtime. The package for the default, icon-less [hicolor-icon-theme](https://www.freedesktop.org/wiki/Software/icon-theme/) (should be propagated by every icon theme) contains [a setup hook](#ssec-gnome-hooks-hicolor-icon-theme) that will pick up icon themes from `buildInputs` and add their datadirs to `XDG_ICON_DIRS` environment variable (this is Nixpkgs specific, not actually a XDG standard variable). Unfortunately, relying on that would mean every user has to download the theme included in the package expression no matter their preference. For that reason, we leave the installation of icon theme on the user. If you use one of the desktop environments, you probably already have an icon theme installed.
46+
47+In the rare case you need to use icons from dependencies (e.g. when an app forces an icon theme), you can use the following to pick them up:
48+
49+```nix
50+ buildInputs = [
51+ pantheon.elementary-icon-theme
52+ ];
53+ preFixup = ''
54+ gappsWrapperArgs+=(
55+ # The icon theme is hardcoded.
56+ --prefix XDG_DATA_DIRS : "$XDG_ICON_DIRS"
57+ )
58+ '';
59+```
2860
2961To avoid costly file system access when locating icons, GTK, [as well as Qt](https://woboq.com/blog/qicon-reads-gtk-icon-cache-in-qt57.html), can rely on `icon-theme.cache` files from the themes' top-level directories. These files are generated using `gtk-update-icon-cache`, which is expected to be run whenever an icon is added or removed to an icon theme (typically an application icon into `hicolor` theme) and some programs do indeed run this after icon installation. However, since packages are installed into their own prefix by Nix, this would lead to conflicts. For that reason, `gtk3` provides a [setup hook](#ssec-gnome-hooks-gtk-drop-icon-theme-cache) that will clean the file from installation. Since most applications only ship their own icon that will be loaded on start-up, it should not affect them too much. On the other hand, icon themes are much larger and more widely used so we need to cache them. Because we recommend installing icon themes globally, we will generate the cache files from all packages in a profile using a NixOS module. You can enable the cache generation using `gtk.iconCache.enable` option if your desktop environment does not already do that.
3062
@@ -74,13 +106,13 @@ For convenience, it also adds `dconf.lib` for a GIO module implementing a GSetti
74106
75107- []{#ssec-gnome-hooks-glib} `glib` setup hook will populate `GSETTINGS_SCHEMAS_PATH` and then `wrapGAppsHook` will prepend it to `XDG_DATA_DIRS`.
76108
77−- []{#ssec-gnome-hooks-gdk-pixbuf} `gdk-pixbuf` setup hook will populate `GDK_PIXBUF_MODULE_FILE` with the path to biggest `loaders.cache` file from the dependencies containing [GdkPixbuf loaders](ssec-gnome-gdk-pixbuf-loaders). This works fine when there are only two packages containing loaders (`gdk-pixbuf` and e.g. `librsvg`) – it will choose the second one, reasonably expecting that it will be bigger since it describes extra loader in addition to the default ones. But when there are more than two loader packages, this logic will break. One possible solution would be constructing a custom cache file for each package containing a program like `services/x11/gdk-pixbuf.nix` NixOS module does. `wrapGAppsHook` copies the `GDK_PIXBUF_MODULE_FILE` environment variable into the produced wrapper.
109+- []{#ssec-gnome-hooks-gdk-pixbuf} `gdk-pixbuf` setup hook will populate `GDK_PIXBUF_MODULE_FILE` with the path to biggest `loaders.cache` file from the dependencies containing [GdkPixbuf loaders](#ssec-gnome-gdk-pixbuf-loaders). This works fine when there are only two packages containing loaders (`gdk-pixbuf` and e.g. `librsvg`) – it will choose the second one, reasonably expecting that it will be bigger since it describes extra loader in addition to the default ones. But when there are more than two loader packages, this logic will break. One possible solution would be constructing a custom cache file for each package containing a program like `services/x11/gdk-pixbuf.nix` NixOS module does. `wrapGAppsHook` copies the `GDK_PIXBUF_MODULE_FILE` environment variable into the produced wrapper.
78110
79111- []{#ssec-gnome-hooks-gtk-drop-icon-theme-cache} One of `gtk3`’s setup hooks will remove `icon-theme.cache` files from package’s icon theme directories to avoid conflicts. Icon theme packages should prevent this with `dontDropIconThemeCache = true;`.
80112
81113- []{#ssec-gnome-hooks-dconf} `dconf.lib` is a dependency of `wrapGAppsHook`, which then also adds it to the `GIO_EXTRA_MODULES` variable.
82114
83−- []{#ssec-gnome-hooks-hicolor-icon-theme} `hicolor-icon-theme`’s setup hook will add icon themes to `XDG_ICON_DIRS` which is prepended to `XDG_DATA_DIRS` by `wrapGAppsHook`.
115+- []{#ssec-gnome-hooks-hicolor-icon-theme} `hicolor-icon-theme`’s setup hook will add icon themes to `XDG_ICON_DIRS`.
84116
85117- []{#ssec-gnome-hooks-gobject-introspection} `gobject-introspection` setup hook populates `GI_TYPELIB_PATH` variable with `lib/girepository-1.0` directories of dependencies, which is then added to wrapper by `wrapGAppsHook`. It also adds `share` directories of dependencies to `XDG_DATA_DIRS`, which is intended to promote GIR files but it also [pollutes the closures](https://github.com/NixOS/nixpkgs/issues/32790) of packages using `wrapGAppsHook`.
86118
doc/languages-frameworks/go.section.md+21−15
@@ -12,7 +12,7 @@ The function `buildGoModule` builds Go programs managed with Go modules. It buil
1212In the following is an example expression using `buildGoModule`, the following arguments are of special significance to the function:
1313
1414- `vendorSha256`: is the hash of the output of the intermediate fetcher derivation. `vendorSha256` can also take `null` as an input. When `null` is used as a value, rather than fetching the dependencies and vendoring them, we use the vendoring included within the source repo. If you'd like to not have to update this field on dependency changes, run `go mod vendor` in your source repo and set `vendorSha256 = null;`
15−- `runVend`: runs the vend command to generate the vendor directory. This is useful if your code depends on c code and go mod tidy does not include the needed sources to build.
15+- `proxyVendor`: Fetches (go mod download) and proxies the vendor directory. This is useful if your code depends on c code and go mod tidy does not include the needed sources to build or if any dependency has case-insensitive conflicts which will produce platform dependant `vendorSha256` checksums.
1616
1717```nix
1818pet = buildGoModule rec {
@@ -28,14 +28,11 @@ pet = buildGoModule rec {
2828
2929 vendorSha256 = "1879j77k96684wi554rkjxydrj8g3hpp0kvxz03sd8dmwr3lh83j";
3030
31− runVend = true;
32−
3331 meta = with lib; {
3432 description = "Simple command-line snippet manager, written in Go";
3533 homepage = "https://github.com/knqyf263/pet";
3634 license = licenses.mit;
3735 maintainers = with maintainers; [ kalbasit ];
38− platforms = platforms.linux ++ platforms.darwin;
3936 };
4037}
4138```
@@ -112,16 +109,6 @@ done
112109
113110Both `buildGoModule` and `buildGoPackage` can be tweaked to behave slightly differently, if the following attributes are used:
114111
115−### `buildFlagsArray` and `buildFlags`: {#ex-goBuildFlags-noarray}
116−
117−These attributes set build flags supported by `go build`. We recommend using `buildFlagsArray`.
118−
119−```nix
120− buildFlagsArray = [
121− "-tags=release"
122− ];
123−```
124−
125112### `ldflags` {#var-go-ldflags}
126113
127114Arguments to pass to the Go linker tool via the `-ldflags` argument of `go build`. The most common use case for this argument is to make the resulting executable aware of its own version. For example:
@@ -134,10 +121,29 @@ Arguments to pass to the Go linker tool via the `-ldflags` argument of `go build
134121 ];
135122```
136123
124+### `tags` {#var-go-tags}
125+
126+Arguments to pass to the Go via the `-tags` argument of `go build`. For example:
127+
128+```nix
129+ tags = [
130+ "production"
131+ "sqlite"
132+ ];
133+```
134+
135+```nix
136+ tags = [ "production" ] ++ lib.optionals withSqlite [ "sqlite" ];
137+```
138+
137139### `deleteVendor` {#var-go-deleteVendor}
138140
139141Removes the pre-existing vendor directory. This should only be used if the dependencies included in the vendor folder are broken or incomplete.
140142
141143### `subPackages` {#var-go-subPackages}
142144
143−Limits the builder from building child packages that have not been listed. If `subPackages` is not specified, all child packages will be built.
145+Specified as a string or list of strings. Limits the builder from building child packages that have not been listed. If `subPackages` is not specified, all child packages will be built.
146+
147+### `excludedPackages` {#var-go-excludedPackages}
148+
149+Specified as a string or list of strings. Causes the builder to skip building child packages that match any of the provided values. If `excludedPackages` is not specified, all child packages will be built.
doc/languages-frameworks/hy.section.mdnew file+31
@@ -0,0 +1,31 @@
1+# Hy {#sec-language-hy}
2+
3+## Installation {#ssec-hy-installation}
4+
5+### Installation without packages {#installation-without-packages}
6+
7+You can install `hy` via nix-env or by adding it to `configuration.nix` by reffering to it as a `hy` attribute. This kind of installation adds `hy` to your environment and it succesfully works with `python3`.
8+
9+::: {.caution}
10+Packages that are installed with your python derivation, are not accesible by `hy` this way.
11+:::
12+
13+### Installation with packages {#installation-with-packages}
14+
15+Creating `hy` derivation with custom `python` packages is really simple and similar to the way that python does it. Attribute `hy` provides function `withPackages` that creates custom `hy` derivation with specified packages.
16+
17+For example if you want to create shell with `matplotlib` and `numpy`, you can do it like so:
18+
19+```ShellSession
20+$ nix-shell -p "hy.withPackages (ps: with ps; [ numpy matplotlib ])"
21+```
22+
23+Or if you want to extend your `configuration.nix`:
24+```nix
25+{ # ...
26+
27+ environment.systemPackages = with pkgs; [
28+ (hy.withPackages (py-packages: with py-packages; [ numpy matplotlib ]))
29+ ];
30+}
31+```
doc/languages-frameworks/idris.section.md+1−4
@@ -5,10 +5,7 @@
55The easiest way to get a working idris version is to install the `idris` attribute:
66
77```ShellSession
8−$ # On NixOS
9−$ nix-env -i nixos.idris
10−$ # On non-NixOS
11−$ nix-env -i nixpkgs.idris
8+$ nix-env -f "<nixpkgs>" -iA idris
129```
1310
1411This however only provides the `prelude` and `base` libraries. To install idris with additional libraries, you can use the `idrisPackages.with-packages` function, e.g. in an overlay in `~/.config/nixpkgs/overlays/my-idris.nix`:
doc/languages-frameworks/index.xml+7−1
@@ -9,20 +9,26 @@
99 <xi:include href="android.section.xml" />
1010 <xi:include href="beam.section.xml" />
1111 <xi:include href="bower.section.xml" />
12+ <xi:include href="chicken.section.xml" />
1213 <xi:include href="coq.section.xml" />
1314 <xi:include href="crystal.section.xml" />
15+ <xi:include href="cuda.section.xml" />
1416 <xi:include href="dhall.section.xml" />
17+ <xi:include href="dotnet.section.xml" />
1518 <xi:include href="emscripten.section.xml" />
1619 <xi:include href="gnome.section.xml" />
1720 <xi:include href="go.section.xml" />
1821 <xi:include href="haskell.section.xml" />
22+ <xi:include href="hy.section.xml" />
1923 <xi:include href="idris.section.xml" />
2024 <xi:include href="ios.section.xml" />
2125 <xi:include href="java.section.xml" />
26+ <xi:include href="javascript.section.xml" />
2227 <xi:include href="lua.section.xml" />
2328 <xi:include href="maven.section.xml" />
24− <xi:include href="node.section.xml" />
29+ <xi:include href="nim.section.xml" />
2530 <xi:include href="ocaml.section.xml" />
31+ <xi:include href="octave.section.xml" />
2632 <xi:include href="perl.section.xml" />
2733 <xi:include href="php.section.xml" />
2834 <xi:include href="python.section.xml" />
doc/languages-frameworks/java.section.md+9
@@ -72,6 +72,15 @@ in
7272 ...
7373```
7474
75+You can also specify what JDK your JRE should be based on, for example
76+selecting a 'headless' build to avoid including a link to GTK+:
77+
78+```nix
79+my_jre = pkgs.jre_minimal.override {
80+ jdk = jdk11_headless;
81+};
82+```
83+
7584Note all JDKs passthru `home`, so if your application requires
7685environment variables like `JAVA_HOME` being set, that can be done in a
7786generic fashion with the `--set` argument of `makeWrapper`:
doc/languages-frameworks/javascript.section.mdnew file+278
@@ -0,0 +1,278 @@
1+# Javascript {#language-javascript}
2+
3+## Introduction {#javascript-introduction}
4+
5+This contains instructions on how to package javascript applications.
6+
7+The various tools available will be listed in the [tools-overview](#javascript-tools-overview). Some general principles for packaging will follow. Finally some tool specific instructions will be given.
8+
9+## Getting unstuck / finding code examples
10+
11+If you find you are lacking inspiration for packing javascript applications, the links below might prove useful.
12+Searching online for prior art can be helpful if you are running into solved problems.
13+
14+### Github
15+
16+- Searching Nix files for `mkYarnPackage`: <https://github.com/search?q=mkYarnPackage+language%3ANix&type=code>
17+
18+- Searching just `flake.nix` files for `mkYarnPackage`: <https://github.com/search?q=mkYarnPackage+filename%3Aflake.nix&type=code>
19+
20+### Gitlab
21+
22+- Searching Nix files for `mkYarnPackage`: <https://gitlab.com/search?scope=blobs&search=mkYarnPackage+extension%3Anix>
23+
24+- Searching just `flake.nix` files for `mkYarnPackage`: <https://gitlab.com/search?scope=blobs&search=mkYarnPackage+filename%3Aflake.nix>
25+
26+## Tools overview {#javascript-tools-overview}
27+
28+## General principles {#javascript-general-principles}
29+
30+The following principles are given in order of importance with potential exceptions.
31+
32+### Try to use the same node version used upstream {#javascript-upstream-node-version}
33+
34+It is often not documented which node version is used upstream, but if it is, try to use the same version when packaging.
35+
36+This can be a problem if upstream is using the latest and greatest and you are trying to use an earlier version of node. Some cryptic errors regarding V8 may appear.
37+
38+An exception to this:
39+
40+### Try to respect the package manager originally used by upstream (and use the upstream lock file) {#javascript-upstream-package-manager}
41+
42+A lock file (package-lock.json, yarn.lock...) is supposed to make reproducible installations of node_modules for each tool.
43+
44+Guidelines of package managers, recommend to commit those lock files to the repos. If a particular lock file is present, it is a strong indication of which package manager is used upstream.
45+
46+It's better to try to use a nix tool that understand the lock file. Using a different tool might give you hard to understand error because different packages have been installed. An example of problems that could arise can be found [here](https://github.com/NixOS/nixpkgs/pull/126629). Upstream uses npm, but this is an attempt to package it with yarn2nix (that uses yarn.lock)
47+
48+Using a different tool forces to commit a lock file to the repository. Those files are fairly large, so when packaging for nixpkgs, this approach does not scale well.
49+
50+Exceptions to this rule are:
51+
52+- when you encounter one of the bugs from a nix tool. In each of the tool specific instructions, known problems will be detailed. If you have a problem with a particular tool, then it's best to try another tool, even if this means you will have to recreate a lock file and commit it to nixpkgs. In general yarn2nix has less known problems and so a simple search in nixpkgs will reveal many yarn.lock files committed
53+- Some lock files contain particular version of a package that has been pulled off npm for some reason. In that case, you can recreate upstream lock (by removing the original and `npm install`, `yarn`, ...) and commit this to nixpkgs.
54+- The only tool that supports workspaces (a feature of npm that helps manage sub-directories with different package.json from a single top level package.json) is yarn2nix. If upstream has workspaces you should try yarn2nix.
55+
56+### Try to use upstream package.json {#javascript-upstream-package-json}
57+
58+Exceptions to this rule are
59+
60+- Sometimes the upstream repo assumes some dependencies be installed globally. In that case you can add them manually to the upstream package.json (`yarn add xxx` or `npm install xxx`, ...). Dependencies that are installed locally can be executed with `npx` for cli tools. (e.g. `npx postcss ...`, this is how you can call those dependencies in the phases).
61+- Sometimes there is a version conflict between some dependency requirements. In that case you can fix a version (by removing the `^`).
62+- Sometimes the script defined in the package.json does not work as is. Some scripts for example use cli tools that might not be available, or cd in directory with a different package.json (for workspaces notably). In that case, it's perfectly fine to look at what the particular script is doing and break this down in the phases. In the build script you can see `build:*` calling in turns several other build scripts like `build:ui` or `build:server`. If one of those fails, you can try to separate those into:
63+
64+```Shell
65+yarn build:ui
66+yarn build:server
67+# OR
68+npm run build:ui
69+npm run build:server
70+```
71+
72+when you need to override a package.json. It's nice to use the one from the upstream src and do some explicit override. Here is an example.
73+
74+```nix
75+patchedPackageJSON = final.runCommand "package.json" { } ''
76+ ${jq}/bin/jq '.version = "0.4.0" |
77+ .devDependencies."@jsdoc/cli" = "^0.2.5"
78+ ${sonar-src}/package.json > $out
79+'';
80+```
81+
82+you will still need to commit the modified version of the lock files, but at least the overrides are explicit for everyone to see.
83+
84+### Using node_modules directly {#javascript-using-node_modules}
85+
86+each tool has an abstraction to just build the node_modules (dependencies) directory. you can always use the stdenv.mkDerivation with the node_modules to build the package (symlink the node_modules directory and then use the package build command). the node_modules abstraction can be also used to build some web framework frontends. For an example of this see how [plausible](https://github.com/NixOS/nixpkgs/blob/master/pkgs/servers/web-apps/plausible/default.nix) is built. mkYarnModules to make the derivation containing node_modules. Then when building the frontend you can just symlink the node_modules directory
87+
88+## Javascript packages inside nixpkgs {#javascript-packages-nixpkgs}
89+
90+The `pkgs/development/node-packages` folder contains a generated collection of
91+[NPM packages](https://npmjs.com/) that can be installed with the Nix package
92+manager.
93+
94+As a rule of thumb, the package set should only provide _end user_ software
95+packages, such as command-line utilities. Libraries should only be added to the
96+package set if there is a non-NPM package that requires it.
97+
98+When it is desired to use NPM libraries in a development project, use the
99+`node2nix` generator directly on the `package.json` configuration file of the
100+project.
101+
102+The package set provides support for the official stable Node.js versions.
103+The latest stable LTS release in `nodePackages`, as well as the latest stable
104+Current release in `nodePackages_latest`.
105+
106+If your package uses native addons, you need to examine what kind of native
107+build system it uses. Here are some examples:
108+
109+- `node-gyp`
110+- `node-gyp-builder`
111+- `node-pre-gyp`
112+
113+After you have identified the correct system, you need to override your package
114+expression while adding in build system as a build input. For example, `dat`
115+requires `node-gyp-build`, so [we override](https://github.com/NixOS/nixpkgs/blob/32f5e5da4a1b3f0595527f5195ac3a91451e9b56/pkgs/development/node-packages/default.nix#L37-L40) its expression in [`default.nix`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/node-packages/default.nix):
116+
117+```nix
118+ dat = super.dat.override {
119+ buildInputs = [ self.node-gyp-build pkgs.libtool pkgs.autoconf pkgs.automake ];
120+ meta.broken = since "12";
121+ };
122+```
123+
124+### Adding and Updating Javascript packages in nixpkgs
125+
126+To add a package from NPM to nixpkgs:
127+
128+1. Modify `pkgs/development/node-packages/node-packages.json` to add, update
129+ or remove package entries to have it included in `nodePackages` and
130+ `nodePackages_latest`.
131+2. Run the script: `./pkgs/development/node-packages/generate.sh`.
132+3. Build your new package to test your changes:
133+ `cd /path/to/nixpkgs && nix-build -A nodePackages.<new-or-updated-package>`.
134+ To build against the latest stable Current Node.js version (e.g. 14.x):
135+ `nix-build -A nodePackages_latest.<new-or-updated-package>`
136+4. Add and commit all modified and generated files.
137+
138+For more information about the generation process, consult the
139+[README.md](https://github.com/svanderburg/node2nix) file of the `node2nix`
140+tool.
141+
142+To update NPM packages in nixpkgs, run the same `generate.sh` script:
143+
144+```sh
145+./pkgs/development/node-packages/generate.sh
146+```
147+
148+#### Git protocol error
149+
150+Some packages may have Git dependencies from GitHub specified with `git://`.
151+GitHub has
152+[disabled unecrypted Git connections](https://github.blog/2021-09-01-improving-git-protocol-security-github/#no-more-unauthenticated-git),
153+so you may see the following error when running the generate script:
154+`The unauthenticated git protocol on port 9418 is no longer supported`.
155+
156+Use the following Git configuration to resolve the issue:
157+
158+```sh
159+git config --global url."https://github.com/".insteadOf git://github.com/
160+```
161+
162+## Tool specific instructions {#javascript-tool-specific}
163+
164+### node2nix {#javascript-node2nix}
165+
166+#### Preparation {#javascript-node2nix-preparation}
167+
168+you will need to generate a nix expression for the dependencies
169+
170+- don't forget the `-l package-lock.json` if there is a lock file
171+- Most probably you will need the `--development` to include the `devDependencies`
172+
173+so the command will most likely be
174+`node2nix --development -l package-lock.json`
175+
176+[link to the doc in the repo](https://github.com/svanderburg/node2nix)
177+
178+#### Pitfalls {#javascript-node2nix-pitfalls}
179+
180+- if upstream package.json does not have a "version" attribute, node2nix will crash. You will need to add it like shown in [the package.json section](#javascript-upstream-package-json)
181+- node2nix has some [bugs](https://github.com/svanderburg/node2nix/issues/238). related to working with lock files from npm distributed with nodejs-16_x
182+- node2nix does not like missing packages from npm. If you see something like `Cannot resolve version: vue-loader-v16@undefined` then you might want to try another tool. The package might have been pulled off of npm.
183+
184+### yarn2nix {#javascript-yarn2nix}
185+
186+#### Preparation {#javascript-yarn2nix-preparation}
187+
188+you will need at least a yarn.lock and yarn.nix file
189+
190+- generate a yarn.lock in upstream if it is not already there
191+- `yarn2nix > yarn.nix` will generate the dependencies in a nix format
192+
193+#### mkYarnPackage {#javascript-yarn2nix-mkYarnPackage}
194+
195+this will by default try to generate a binary. For package only generating static assets (Svelte, Vue, React...), you will need to explicitly override the build step with your instructions. It's important to use the `--offline` flag. For example if you script is `"build": "something"` in package.json use
196+
197+```nix
198+buildPhase = ''
199+ yarn build --offline
200+'';
201+```
202+
203+The dist phase is also trying to build a binary, the only way to override it is with
204+
205+```nix
206+distPhase = "true";
207+```
208+
209+the configure phase can sometimes fail because it tries to be too clever.
210+One common override is
211+
212+```nix
213+configurePhase = "ln -s $node_modules node_modules";
214+```
215+
216+#### mkYarnModules {#javascript-yarn2nix-mkYarnModules}
217+
218+this will generate a derivation including the node_modules. If you have to build a derivation for an integrated web framework (rails, phoenix..), this is probably the easiest way. [Plausible](https://github.com/NixOS/nixpkgs/blob/master/pkgs/servers/web-apps/plausible/default.nix#L39) offers a good example of how to do this.
219+
220+#### Overriding dependency behavior
221+
222+In the `mkYarnPackage` record the property `pkgConfig` can be used to override packages when you encounter problems building.
223+
224+For instance, say your package is throwing errors when trying to invoke node-sass: `ENOENT: no such file or directory, scandir '/build/source/node_modules/node-sass/vendor'`
225+
226+To fix this we will specify different versions of build inputs to use, as well as some post install steps to get the software built the way we want:
227+
228+```nix
229+mkYarnPackage rec {
230+ pkgConfig = {
231+ node-sass = {
232+ buildInputs = with final;[ python libsass pkg-config ];
233+ postInstall = ''
234+ LIBSASS_EXT=auto yarn --offline run build
235+ rm build/config.gypi
236+ '';
237+ };
238+ };
239+}
240+```
241+
242+#### Pitfalls {#javascript-yarn2nix-pitfalls}
243+
244+- if version is missing from upstream package.json, yarn will silently install nothing. In that case, you will need to override package.json as shown in the [package.json section](#javascript-upstream-package-json)
245+
246+- having trouble with node-gyp? Try adding these lines to the `yarnPreBuild` steps:
247+
248+ ```nix
249+ yarnPreBuild = ''
250+ mkdir -p $HOME/.node-gyp/${nodejs.version}
251+ echo 9 > $HOME/.node-gyp/${nodejs.version}/installVersion
252+ ln -sfv ${nodejs}/include $HOME/.node-gyp/${nodejs.version}
253+ export npm_config_nodedir=${nodejs}
254+ '';
255+ ```
256+
257+ - The `echo 9` steps comes from this answer: <https://stackoverflow.com/a/49139496>
258+ - Exporting the headers in `npm_config_nodedir` comes from this issue: <https://github.com/nodejs/node-gyp/issues/1191#issuecomment-301243919>
259+
260+## Outside of nixpkgs {#javascript-outside-nixpkgs}
261+
262+There are some other options available that can't be used inside nixpkgs. Those other options are written in nix. Importing them in nixpkgs will require moving the source code into nixpkgs. Using [Import From Derivation](https://nixos.wiki/wiki/Import_From_Derivation) is not allowed in hydra at present. If you are packaging something outside nixpkgs, those can be considered
263+
264+### npmlock2nix {#javascript-npmlock2nix}
265+
266+[npmlock2nix](https://github.com/nix-community/npmlock2nix) aims at building node_modules without code generation. It hasn't reached v1 yet, the api might be subject to change.
267+
268+#### Pitfalls {#javascript-npmlock2nix-pitfalls}
269+
270+- there are some [problems with npm v7](https://github.com/tweag/npmlock2nix/issues/45).
271+
272+### nix-npm-buildpackage {#javascript-nix-npm-buildpackage}
273+
274+[nix-npm-buildpackage](https://github.com/serokell/nix-npm-buildpackage) aims at building node_modules without code generation. It hasn't reached v1 yet, the api might change. It supports both package-lock.json and yarn.lock.
275+
276+#### Pitfalls {#javascript-nix-npm-buildpackage-pitfalls}
277+
278+- there are some [problems with npm v7](https://github.com/serokell/nix-npm-buildpackage/issues/33).
doc/languages-frameworks/lua.section.md+4−6
@@ -128,7 +128,7 @@ Let's present the luarocks way first and the manual one in a second time.
128128
129129### Packaging a library on luarocks {#packaging-a-library-on-luarocks}
130130
131−[Luarocks.org](www.luarocks.org) is the main repository of lua packages.
131+[Luarocks.org](https://luarocks.org/) is the main repository of lua packages.
132132The site proposes two types of packages, the rockspec and the src.rock
133133(equivalent of a [rockspec](https://github.com/luarocks/luarocks/wiki/Rockspec-format) but with the source).
134134These packages can have different build types such as `cmake`, `builtin` etc .
@@ -139,11 +139,9 @@ the whitelist maintainers/scripts/luarocks-packages.csv and updated by running m
139139[luarocks2nix](https://github.com/nix-community/luarocks) is a tool capable of generating nix derivations from both rockspec and src.rock (and favors the src.rock).
140140The automation only goes so far though and some packages need to be customized.
141141These customizations go in `pkgs/development/lua-modules/overrides.nix`.
142−For instance if the rockspec defines `external_dependencies`, these need to be manually added in its rockspec file then it won't work.
142+For instance if the rockspec defines `external_dependencies`, these need to be manually added to the overrides.nix.
143143
144144You can try converting luarocks packages to nix packages with the command `nix-shell -p luarocks-nix` and then `luarocks nix PKG_NAME`.
145−Nix rely on luarocks to install lua packages, basically it runs:
146−`luarocks make --deps-mode=none --tree $out`
147145
148146#### Packaging a library manually {#packaging-a-library-manually}
149147
@@ -161,8 +159,8 @@ are not packaged for luarocks. You can see a few examples at `pkgs/top-level/lua
161159
162160### Lua interpreters {#lua-interpreters}
163161
164−Versions 5.1, 5.2 and 5.3 of the lua interpreter are available as
165−respectively `lua5_1`, `lua5_2` and `lua5_3`. Luajit is available too.
162+Versions 5.1, 5.2, 5.3 and 5.4 of the lua interpreter are available as
163+respectively `lua5_1`, `lua5_2`, `lua5_3` and `lua5_4`. Luajit is available too.
166164The Nix expressions for the interpreters can be found in `pkgs/development/interpreters/lua-5`.
167165
168166#### Attributes on lua interpreters packages {#attributes-on-lua-interpreters-packages}
doc/languages-frameworks/nim.section.mdnew file+91
@@ -0,0 +1,91 @@
1+# Nim {#nim}
2+
3+## Overview {#nim-overview}
4+
5+The Nim compiler, a builder function, and some packaged libraries are available
6+in Nixpkgs. Until now each compiler release has been effectively backwards
7+compatible so only the latest version is available.
8+
9+## Nim program packages in Nixpkgs {#nim-program-packages-in-nixpkgs}
10+
11+Nim programs can be built using `nimPackages.buildNimPackage`. In the
12+case of packages not containing exported library code the attribute
13+`nimBinOnly` should be set to `true`.
14+
15+The following example shows a Nim program that depends only on Nim libraries:
16+
17+```nix
18+{ lib, nimPackages, fetchurl }:
19+
20+nimPackages.buildNimPackage rec {
21+ pname = "hottext";
22+ version = "1.4";
23+
24+ nimBinOnly = true;
25+
26+ src = fetchurl {
27+ url = "https://git.sr.ht/~ehmry/hottext/archive/v${version}.tar.gz";
28+ sha256 = "sha256-hIUofi81zowSMbt1lUsxCnVzfJGN3FEiTtN8CEFpwzY=";
29+ };
30+
31+ buildInputs = with nimPackages; [
32+ bumpy
33+ chroma
34+ flatty
35+ nimsimd
36+ pixie
37+ sdl2
38+ typography
39+ vmath
40+ zippy
41+ ];
42+}
43+
44+```
45+
46+## Nim library packages in Nixpkgs {#nim-library-packages-in-nixpkgs}
47+
48+
49+Nim libraries can also be built using `nimPackages.buildNimPackage`, but
50+often the product of a fetcher is sufficient to satisfy a dependency.
51+The `fetchgit`, `fetchFromGitHub`, and `fetchNimble` functions yield an
52+output that can be discovered during the `configurePhase` of `buildNimPackage`.
53+
54+Nim library packages are listed in
55+[pkgs/top-level/nim-packages.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/top-level/nim-packages.nix) and implemented at
56+[pkgs/development/nim-packages](https://github.com/NixOS/nixpkgs/tree/master/pkgs/development/nim-packages).
57+
58+The following example shows a Nim library that propagates a dependency on a
59+non-Nim package:
60+```nix
61+{ lib, buildNimPackage, fetchNimble, SDL2 }:
62+
63+buildNimPackage rec {
64+ pname = "sdl2";
65+ version = "2.0.4";
66+ src = fetchNimble {
67+ inherit pname version;
68+ hash = "sha256-Vtcj8goI4zZPQs2TbFoBFlcR5UqDtOldaXSH/+/xULk=";
69+ };
70+ propagatedBuildInputs = [ SDL2 ];
71+}
72+```
73+
74+## `buildNimPackage` parameters {#buildnimpackage-parameters}
75+
76+All parameters from `stdenv.mkDerivation` function are still supported. The
77+following are specific to `buildNimPackage`:
78+
79+* `nimBinOnly ? false`: If `true` then build only the programs listed in
80+ the Nimble file in the packages sources.
81+* `nimbleFile`: Specify the Nimble file location of the package being built
82+ rather than discover the file at build-time.
83+* `nimRelease ? true`: Build the package in *release* mode.
84+* `nimDefines ? []`: A list of Nim defines. Key-value tuples are not supported.
85+* `nimFlags ? []`: A list of command line arguments to pass to the Nim compiler.
86+ Use this to specify defines with arguments in the form of `-d:${name}=${value}`.
87+* `nimDoc` ? false`: Build and install HTML documentation.
88+
89+* `buildInputs` ? []: The packages listed here will be searched for `*.nimble`
90+ files which are used to populate the Nim library path. Otherwise the standard
91+ behavior is in effect.
doc/languages-frameworks/node.section.mddeleted−51
@@ -1,51 +0,0 @@
1−# Node.js {#node.js}
2−
3−The `pkgs/development/node-packages` folder contains a generated collection of
4−[NPM packages](https://npmjs.com/) that can be installed with the Nix package
5−manager.
6−
7−As a rule of thumb, the package set should only provide *end user* software
8−packages, such as command-line utilities. Libraries should only be added to the
9−package set if there is a non-NPM package that requires it.
10−
11−When it is desired to use NPM libraries in a development project, use the
12−`node2nix` generator directly on the `package.json` configuration file of the
13−project.
14−
15−The package set provides support for the official stable Node.js versions.
16−The latest stable LTS release in `nodePackages`, as well as the latest stable
17−Current release in `nodePackages_latest`.
18−
19−If your package uses native addons, you need to examine what kind of native
20−build system it uses. Here are some examples:
21−
22−* `node-gyp`
23−* `node-gyp-builder`
24−* `node-pre-gyp`
25−
26−After you have identified the correct system, you need to override your package
27−expression while adding in build system as a build input. For example, `dat`
28−requires `node-gyp-build`, so [we override](https://github.com/NixOS/nixpkgs/blob/32f5e5da4a1b3f0595527f5195ac3a91451e9b56/pkgs/development/node-packages/default.nix#L37-L40) its expression in [`default.nix`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/node-packages/default.nix):
29−
30−```nix
31− dat = super.dat.override {
32− buildInputs = [ self.node-gyp-build pkgs.libtool pkgs.autoconf pkgs.automake ];
33− meta.broken = since "12";
34− };
35−```
36−
37−To add a package from NPM to nixpkgs:
38−
39− 1. Modify `pkgs/development/node-packages/node-packages.json` to add, update
40− or remove package entries to have it included in `nodePackages` and
41− `nodePackages_latest`.
42− 2. Run the script: `(cd pkgs/development/node-packages && ./generate.sh)`.
43− 3. Build your new package to test your changes:
44− `cd /path/to/nixpkgs && nix-build -A nodePackages.<new-or-updated-package>`.
45− To build against the latest stable Current Node.js version (e.g. 14.x):
46− `nix-build -A nodePackages_latest.<new-or-updated-package>`
47− 4. Add and commit all modified and generated files.
48−
49−For more information about the generation process, consult the
50−[README.md](https://github.com/svanderburg/node2nix) file of the `node2nix`
51−tool.
doc/languages-frameworks/ocaml.section.md+86−25
@@ -1,63 +1,116 @@
11# OCaml {#sec-language-ocaml}
22
3+## User guide {#sec-language-ocaml-user-guide}
4+
5+OCaml libraries are available in attribute sets of the form `ocaml-ng.ocamlPackages_X_XX` where X is to be replaced with the desired compiler version. For example, ocamlgraph compiled with OCaml 4.12 can be found in `ocaml-ng.ocamlPackages_4_12.ocamlgraph`. The compiler itself is also located in this set, under the name `ocaml`.
6+
7+If you don't care about the exact compiler version, `ocamlPackages` is a top-level alias pointing to a recent version of OCaml.
8+
9+OCaml applications are usually available top-level, and not inside `ocamlPackages`. Notable exceptions are build tools that must be built with the same compiler version as the compiler you intend to use like `dune` or `ocaml-lsp`.
10+
11+To open a shell able to build a typical OCaml project, put the dependencies in `buildInputs` and add `ocamlPackages.ocaml` and `ocamlPackages.findlib` to `nativeBuildInputs` at least.
12+For example:
13+```nix
14+let
15+ pkgs = import <nixpkgs> {};
16+ # choose the ocaml version you want to use
17+ ocamlPackages = pkgs.ocaml-ng.ocamlPackages_4_12;
18+in
19+pkgs.mkShell {
20+ # build tools
21+ nativeBuildInputs = with ocamlPackages; [ ocaml findlib dune_2 ocaml-lsp ];
22+ # dependencies
23+ buildInputs = with ocamlPackages; [ ocamlgraph ];
24+}
25+```
26+
27+## Packaging guide {#sec-language-ocaml-packaging}
28+
329OCaml libraries should be installed in `$(out)/lib/ocaml/${ocaml.version}/site-lib/`. Such directories are automatically added to the `$OCAMLPATH` environment variable when building another package that depends on them or when opening a `nix-shell`.
430
531Given that most of the OCaml ecosystem is now built with dune, nixpkgs includes a convenience build support function called `buildDunePackage` that will build an OCaml package using dune, OCaml and findlib and any additional dependencies provided as `buildInputs` or `propagatedBuildInputs`.
632
7−Here is a simple package example. It defines an (optional) attribute `minimumOCamlVersion` that will be used to throw a descriptive evaluation error if building with an older OCaml is attempted. It uses the `fetchFromGitHub` fetcher to get its source. It sets the `doCheck` (optional) attribute to `true` which means that tests will be run with `dune runtest -p angstrom` after the build (`dune build -p angstrom`) is complete. It uses `alcotest` as a build input (because it is needed to run the tests) and `bigstringaf` and `result` as propagated build inputs (thus they will also be available to libraries depending on this library). The library will be installed using the `angstrom.install` file that dune generates.
33+Here is a simple package example.
34+
35+- It defines an (optional) attribute `minimalOCamlVersion` (see note below)
36+ that will be used to throw a descriptive evaluation error if building with
37+ an older OCaml is attempted.
38+
39+- It uses the `fetchFromGitHub` fetcher to get its source.
40+
41+- `duneVersion = "2"` ensures that Dune version 2 is used for the
42+ build (this is the default; valid values are `"1"`, `"2"`, and `"3"`);
43+ note that there is also a legacy `useDune2` boolean attribute:
44+ set to `false` it corresponds to `duneVersion = "1"`; set to `true` it
45+ corresponds to `duneVersion = "2"`. If both arguments (`duneVersion` and
46+ `useDune2`) are given, the second one (`useDune2`) is silently ignored.
47+
48+- It sets the optional `doCheck` attribute such that tests will be run with
49+ `dune runtest -p angstrom` after the build (`dune build -p angstrom`) is
50+ complete, but only if the Ocaml version is at at least `"4.05"`.
51+
52+- It uses the package `ocaml-syntax-shims` as a build input, `alcotest` and
53+ `ppx_let` as check inputs (because they are needed to run the tests), and
54+ `bigstringaf` and `result` as propagated build inputs (thus they will also be
55+ available to libraries depending on this library).
56+
57+- The library will be installed using the `angstrom.install` file that dune
58+ generates.
859
960```nix
10−{ lib
11−, fetchFromGitHub
12−, buildDunePackage
13−, alcotest
14−, result
15−, bigstringaf
16−}:
61+{ lib,
62+ fetchFromGitHub,
63+ buildDunePackage,
64+ ocaml,
65+ ocaml-syntax-shims,
66+ alcotest,
67+ result,
68+ bigstringaf,
69+ ppx_let }:
1770
1871buildDunePackage rec {
1972 pname = "angstrom";
20− version = "0.10.0";
73+ version = "0.15.0";
74+ duneVersion = "2";
2175
22− minimumOCamlVersion = "4.03";
76+ minimalOCamlVersion = "4.04";
2377
2478 src = fetchFromGitHub {
2579 owner = "inhabitedtype";
2680 repo = pname;
2781 rev = version;
28− sha256 = "0lh6024yf9ds0nh9i93r9m6p5psi8nvrqxl5x7jwl13zb0r9xfpw";
82+ sha256 = "1hmrkdcdlkwy7rxhngf3cv3sa61cznnd9p5lmqhx20664gx2ibrh";
2983 };
3084
31− buildInputs = [ alcotest ];
85+ checkInputs = [ alcotest ppx_let ];
86+ buildInputs = [ ocaml-syntax-shims ];
3287 propagatedBuildInputs = [ bigstringaf result ];
33− doCheck = true;
88+ doCheck = lib.versionAtLeast ocaml.version "4.05";
3489
35− meta = with lib; {
90+ meta = {
3691 homepage = "https://github.com/inhabitedtype/angstrom";
3792 description = "OCaml parser combinators built for speed and memory efficiency";
38− license = licenses.bsd3;
39− maintainers = with maintainers; [ sternenseemann ];
93+ license = lib.licenses.bsd3;
94+ maintainers = with lib.maintainers; [ sternenseemann ];
4095 };
41−}
4296```
4397
4498Here is a second example, this time using a source archive generated with `dune-release`. It is a good idea to use this archive when it is available as it will usually contain substituted variables such as a `%%VERSION%%` field. This library does not depend on any other OCaml library and no tests are run after building it.
4599
46100```nix
47−{ lib
48−, fetchurl
49−, buildDunePackage
50−}:
101+{ lib, fetchurl, buildDunePackage }:
51102
52103buildDunePackage rec {
53104 pname = "wtf8";
54− version = "1.0.1";
105+ version = "1.0.2";
55106
56− minimumOCamlVersion = "4.01";
107+ useDune2 = true;
108+
109+ minimalOCamlVersion = "4.02";
57110
58111 src = fetchurl {
59− url = "https://github.com/flowtype/ocaml-${pname}/releases/download/v${version}/${pname}-${version}.tbz";
60− sha256 = "1msg3vycd3k8qqj61sc23qks541cxpb97vrnrvrhjnqxsqnh6ygq";
112+ url = "https://github.com/flowtype/ocaml-${pname}/releases/download/v${version}/${pname}-v${version}.tbz";
113+ sha256 = "09ygcxxd5warkdzz17rgpidrd0pg14cy2svvnvy1hna080lzg7vp";
61114 };
62115
63116 meta = with lib; {
@@ -68,3 +121,11 @@ buildDunePackage rec {
68121 };
69122}
70123```
124+
125+Note about `minimalOCamlVersion`. A deprecated version of this argument was
126+spelled `minimumOCamlVersion`; setting the old attribute wrongly modifies the
127+derivation hash and is therefore inappropriate. As a technical dept, currently
128+packaged libraries may still use the old spelling: maintainers are invited to
129+fix this when updating packages. Massive renaming is strongly discouraged as it
130+would be challenging to review, difficult to test, and will cause unnecessary
131+rebuild.
doc/languages-frameworks/octave.section.mdnew file+92
@@ -0,0 +1,92 @@
1+# Octave {#sec-octave}
2+
3+## Introduction {#ssec-octave-introduction}
4+
5+Octave is a modular scientific programming language and environment.
6+A majority of the packages supported by Octave from their [website](https://octave.sourceforge.io/packages.php) are packaged in nixpkgs.
7+
8+## Structure {#ssec-octave-structure}
9+
10+All Octave add-on packages are available in two ways:
11+1. Under the top-level `Octave` attribute, `octave.pkgs`.
12+2. As a top-level attribute, `octavePackages`.
13+
14+## Packaging Octave Packages {#ssec-octave-packaging}
15+
16+Nixpkgs provides a function `buildOctavePackage`, a generic package builder function for any Octave package that complies with the Octave's current packaging format.
17+
18+All Octave packages are defined in [pkgs/top-level/octave-packages.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/top-level/octave-packages.nix) rather than `pkgs/all-packages.nix`.
19+Each package is defined in their own file in the [pkgs/development/octave-modules](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/octave-modules) directory.
20+Octave packages are made available through `all-packages.nix` through both the attribute `octavePackages` and `octave.pkgs`.
21+You can test building an Octave package as follows:
22+
23+```ShellSession
24+$ nix-build -A octavePackages.symbolic
25+```
26+
27+To install it into your user profile, run this command from the root of the repository:
28+
29+```ShellSession
30+$ nix-env -f. -iA octavePackages.symbolic
31+```
32+
33+You can build Octave with packages by using the `withPackages` passed-through function.
34+
35+```ShellSession
36+$ nix-shell -p 'octave.withPackages (ps: with ps; [ symbolic ])'
37+```
38+
39+This will also work in a `shell.nix` file.
40+
41+```nix
42+{ pkgs ? import <nixpkgs> { }}:
43+
44+pkgs.mkShell {
45+ nativeBuildInputs = with pkgs; [
46+ (octave.withPackages (opkgs: with opkgs; [ symbolic ]))
47+ ];
48+}
49+```
50+
51+### `buildOctavePackage` Steps {#sssec-buildOctavePackage-steps}
52+
53+The `buildOctavePackage` does several things to make sure things work properly.
54+
55+1. Sets the environment variable `OCTAVE_HISTFILE` to `/dev/null` during package compilation so that the commands run through the Octave interpreter directly are not logged.
56+2. Skips the configuration step, because the packages are stored as gzipped tarballs, which Octave itself handles directly.
57+3. Change the hierarchy of the tarball so that only a single directory is at the top-most level of the tarball.
58+4. Use Octave itself to run the `pkg build` command, which unzips the tarball, extracts the necessary files written in Octave, and compiles any code written in C++ or Fortran, and places the fully compiled artifact in `$out`.
59+
60+`buildOctavePackage` is built on top of `stdenv` in a standard way, allowing most things to be customized.
61+
62+### Handling Dependencies {#sssec-octave-handling-dependencies}
63+
64+In Octave packages, there are four sets of dependencies that can be specified:
65+
66+`nativeBuildInputs`
67+: Just like other packages, `nativeBuildInputs` is intended for architecture-dependent build-time-only dependencies.
68+
69+`buildInputs`
70+: Like other packages, `buildInputs` is intended for architecture-independent build-time-only dependencies.
71+
72+`propagatedBuildInputs`
73+: Similar to other packages, `propagatedBuildInputs` is intended for packages that are required for both building and running of the package.
74+See [Symbolic](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/octave-modules/symbolic/default.nix) for how this works and why it is needed.
75+
76+`requiredOctavePackages`
77+: This is a special dependency that ensures the specified Octave packages are dependent on others, and are made available simultaneously when loading them in Octave.
78+
79+### Installing Octave Packages {#sssec-installing-octave-packages}
80+
81+By default, the `buildOctavePackage` function does _not_ install the requested package into Octave for use.
82+The function will only build the requested package.
83+This is due to Octave maintaining an text-based database about which packages are installed where.
84+To this end, when all the requested packages have been built, the Octave package and all its add-on packages are put together into an environment, similar to Python.
85+
86+1. First, all the Octave binaries are wrapped with the environment variable `OCTAVE_SITE_INITFILE` set to a file in `$out`, which is required for Octave to be able to find the non-standard package database location.
87+2. Because of the way `buildEnv` works, all tarballs that are present (which should be all Octave packages to install) should be removed.
88+3. The path down to the default install location of Octave packages is recreated so that Nix-operated Octave can install the packages.
89+4. Install the packages into the `$out` environment while writing package entries to the database file.
90+This database file is unique for each different (according to Nix) environment invocation.
91+5. Rewrite the Octave-wide startup file to read from the list of packages installed in that particular environment.
92+6. Wrap any programs that are required by the Octave packages so that they work with all the paths defined within the environment.
doc/languages-frameworks/perl.section.md+5−9
@@ -58,13 +58,7 @@ in `all-packages.nix`. You can test building a Perl package as follows:
5858$ nix-build -A perlPackages.ClassC3
5959```
6060
61−`buildPerlPackage` adds `perl-` to the start of the name attribute, so the package above is actually called `perl-Class-C3-0.21`. So to install it, you can say:
62−
63−```ShellSession
64−$ nix-env -i perl-Class-C3
65−```
66−
67−(Of course you can also install using the attribute name: `nix-env -i -A perlPackages.ClassC3`.)
61+To install it with `nix-env` instead: `nix-env -f. -iA perlPackages.ClassC3`.
6862
6963So what does `buildPerlPackage` do? It does the following:
7064
@@ -122,7 +116,7 @@ ImageExifTool = buildPerlPackage {
122116 };
123117
124118 buildInputs = lib.optional stdenv.isDarwin shortenPerlShebang;
125− postInstall = lib.optional stdenv.isDarwin ''
119+ postInstall = lib.optionalString stdenv.isDarwin ''
126120 shortenPerlShebang $out/bin/exiftool
127121 '';
128122};
@@ -135,9 +129,11 @@ This will remove the `-I` flags from the shebang line, rewrite them in the `use
135129Nix expressions for Perl packages can be generated (almost) automatically from CPAN. This is done by the program `nix-generate-from-cpan`, which can be installed as follows:
136130
137131```ShellSession
138−$ nix-env -i nix-generate-from-cpan
132+$ nix-env -f "<nixpkgs>" -iA nix-generate-from-cpan
139133```
140134
135+Substitute `<nixpkgs>` by the path of a nixpkgs clone to use the latest version.
136+
141137This program takes a Perl module name, looks it up on CPAN, fetches and unpacks the corresponding package, and prints a Nix expression on standard output. For example:
142138
143139```ShellSession
doc/languages-frameworks/python.section.md+91−13
@@ -8,7 +8,7 @@
88
99Several versions of the Python interpreter are available on Nix, as well as a
1010high amount of packages. The attribute `python3` refers to the default
11−interpreter, which is currently CPython 3.8. The attribute `python` refers to
11+interpreter, which is currently CPython 3.9. The attribute `python` refers to
1212CPython 2.7 for backwards-compatibility. It is also possible to refer to
1313specific versions, e.g. `python38` refers to CPython 3.8, and `pypy` refers to
1414the default PyPy interpreter.
@@ -439,7 +439,7 @@ The following example shows which arguments are given to `buildPythonPackage` in
439439order to build [`datashape`](https://github.com/blaze/datashape).
440440
441441```nix
442−{ lib, buildPythonPackage, fetchPypi, numpy, multipledispatch, dateutil, pytest }:
442+{ lib, buildPythonPackage, fetchPypi, numpy, multipledispatch, python-dateutil, pytest }:
443443
444444buildPythonPackage rec {
445445 pname = "datashape";
@@ -451,7 +451,7 @@ buildPythonPackage rec {
451451 };
452452
453453 checkInputs = [ pytest ];
454− propagatedBuildInputs = [ numpy multipledispatch dateutil ];
454+ propagatedBuildInputs = [ numpy multipledispatch python-dateutil ];
455455
456456 meta = with lib; {
457457 homepage = "https://github.com/ContinuumIO/datashape";
@@ -463,7 +463,7 @@ buildPythonPackage rec {
463463```
464464
465465We can see several runtime dependencies, `numpy`, `multipledispatch`, and
466−`dateutil`. Furthermore, we have one `checkInputs`, i.e. `pytest`. `pytest` is a
466+`python-dateutil`. Furthermore, we have one `checkInputs`, i.e. `pytest`. `pytest` is a
467467test runner and is only used during the `checkPhase` and is therefore not added
468468to `propagatedBuildInputs`.
469469
@@ -764,8 +764,8 @@ and in this case the `python38` interpreter is automatically used.
764764
765765### Interpreters {#interpreters}
766766
767−Versions 2.7, 3.6, 3.7, 3.8 and 3.9 of the CPython interpreter are available as
768−respectively `python27`, `python36`, `python37`, `python38` and `python39`. The
767+Versions 2.7, 3.7, 3.8 and 3.9 of the CPython interpreter are available as
768+respectively `python27`, `python37`, `python38` and `python39`. The
769769aliases `python2` and `python3` correspond to respectively `python27` and
770770`python39`. The attribute `python` maps to `python2`. The PyPy interpreters
771771compatible with Python 2.7 and 3 are available as `pypy27` and `pypy3`, with
@@ -830,16 +830,17 @@ attribute set is created for each available Python interpreter. The available
830830sets are
831831
832832* `pkgs.python27Packages`
833−* `pkgs.python36Packages`
834833* `pkgs.python37Packages`
835834* `pkgs.python38Packages`
836835* `pkgs.python39Packages`
836+* `pkgs.python310Packages`
837+* `pkgs.python311Packages`
837838* `pkgs.pypyPackages`
838839
839840and the aliases
840841
841842* `pkgs.python2Packages` pointing to `pkgs.python27Packages`
842−* `pkgs.python3Packages` pointing to `pkgs.python38Packages`
843+* `pkgs.python3Packages` pointing to `pkgs.python39Packages`
843844* `pkgs.pythonPackages` pointing to `pkgs.python2Packages`
844845
845846#### `buildPythonPackage` function {#buildpythonpackage-function}
@@ -978,6 +979,31 @@ with import <nixpkgs> {};
978979in python.withPackages(ps: [ps.blaze])).env
979980```
980981
982+#### Optional extra dependencies
983+
984+Some packages define optional dependencies for additional features. With
985+`setuptools` this is called `extras_require` and `flit` calls it `extras-require`. A
986+method for supporting this is by declaring the extras of a package in its
987+`passthru`, e.g. in case of the package `dask`
988+
989+```nix
990+passthru.extras-require = {
991+ complete = [ distributed ];
992+};
993+```
994+
995+and letting the package requiring the extra add the list to its dependencies
996+
997+```nix
998+propagatedBuildInputs = [
999+ ...
1000+] ++ dask.extras-require.complete;
1001+```
1002+
1003+Note this method is preferred over adding parameters to builders, as that can
1004+result in packages depending on different variants and thereby causing
1005+collisions.
1006+
9811007#### `buildPythonApplication` function {#buildpythonapplication-function}
9821008
9831009The `buildPythonApplication` function is practically the same as
@@ -995,18 +1021,18 @@ called with `callPackage` and passed `python` or `pythonPackages` (possibly
9951021specifying an interpreter version), like this:
9961022
9971023```nix
998−{ lib, python3Packages }:
1024+{ lib, python3 }:
9991025
1000−python3Packages.buildPythonApplication rec {
1026+python3.pkgs.buildPythonApplication rec {
10011027 pname = "luigi";
10021028 version = "2.7.9";
10031029
1004− src = python3Packages.fetchPypi {
1030+ src = python3.pkgs.fetchPypi {
10051031 inherit pname version;
10061032 sha256 = "035w8gqql36zlan0xjrzz9j4lh9hs0qrsgnbyw07qs7lnkvbdv9x";
10071033 };
10081034
1009− propagatedBuildInputs = with python3Packages; [ tornado_4 python-daemon ];
1035+ propagatedBuildInputs = with python3.pkgs; [ tornado python-daemon ];
10101036
10111037 meta = with lib; {
10121038 ...
@@ -1513,7 +1539,7 @@ If you need to change a package's attribute(s) from `configuration.nix` you coul
15131539 python = super.python.override {
15141540 packageOverrides = python-self: python-super: {
15151541 twisted = python-super.twisted.overrideAttrs (oldAttrs: {
1516− src = super.fetchPipy {
1542+ src = super.fetchPypi {
15171543 pname = "twisted";
15181544 version = "19.10.0";
15191545 sha256 = "7394ba7f272ae722a74f3d969dcf599bc4ef093bc392038748a490f1724a515d";
@@ -1602,3 +1628,55 @@ The following rules are desired to be respected:
16021628 If necessary, `pname` has to be given a different value within `fetchPypi`.
16031629* Attribute names in `python-packages.nix` should be sorted alphanumerically to
16041630 avoid merge conflicts and ease locating attributes.
1631+
1632+## Package set maintenance
1633+
1634+The whole Python package set has a lot of packages that do not see regular
1635+updates, because they either are a very fragile component in the Python
1636+ecosystem, like for example the `hypothesis` package, or packages that have
1637+no maintainer, so maintenance falls back to the package set maintainers.
1638+
1639+### Updating packages in bulk
1640+
1641+There is a tool to update alot of python libraries in bulk, it exists at
1642+`maintainers/scripts/update-python-libraries` with this repository.
1643+
1644+It can quickly update minor or major versions for all packages selected
1645+and create update commits, and supports the `fetchPypi`, `fetchurl` and
1646+`fetchFromGitHub` fetchers. When updating lots of packages that are
1647+hosted on GitHub, exporting a `GITHUB_API_TOKEN` is highly recommended.
1648+
1649+Updating packages in bulk leads to lots of breakages, which is why a
1650+stabilization period on the `python-unstable` branch is required.
1651+
1652+Once the branch is sufficiently stable it should normally be merged
1653+into the `staging` branch.
1654+
1655+An exemplary call to update all python libraries between minor versions
1656+would be:
1657+
1658+```ShellSession
1659+$ maintainers/scripts/update-python-libraries --target minor --commit --use-pkgs-prefix pkgs/development/python-modules/**/default.nix
1660+```
1661+
1662+## CPython Update Schedule
1663+
1664+With [PEP 602](https://www.python.org/dev/peps/pep-0602/), CPython now
1665+follows a yearly release cadence. In nixpkgs, all supported interpreters
1666+are made available, but only the most recent two
1667+interpreters package sets are built; this is a compromise between being
1668+the latest interpreter, and what the majority of the Python packages support.
1669+
1670+New CPython interpreters are released in October. Generally, it takes some
1671+time for the majority of active Python projects to support the latest stable
1672+interpreter. To help ease the migration for Nixpkgs users
1673+between Python interpreters the schedule below will be used:
1674+
1675+| When | Event |
1676+| --- | --- |
1677+| After YY.11 Release | Bump CPython package set window. The latest and previous latest stable should now be built. |
1678+| After YY.05 Release | Bump default CPython interpreter to latest stable. |
1679+
1680+In practice, this means that the Python community will have had a stable interpreter
1681+for ~2 months before attempting to update the package set. And this will
1682+allow for ~7 months for Python applications to support the latest interpreter.
doc/languages-frameworks/r.section.md+12−8
@@ -96,6 +96,11 @@ re-enter the shell.
9696
9797## Updating the package set {#updating-the-package-set}
9898
99+There is a script and associated environment for regenerating the package
100+sets and synchronising the rPackages tree to the current CRAN and matching
101+BIOC release. These scripts are found in the `pkgs/development/r-modules`
102+directory and executed as follows:
103+
99104```bash
100105nix-shell generate-shell.nix
101106
@@ -112,12 +117,11 @@ Rscript generate-r-packages.R bioc-experiment > bioc-experiment-packages.nix.new
112117mv bioc-experiment-packages.nix.new bioc-experiment-packages.nix
113118```
114119
115−`generate-r-packages.R <repo>` reads `<repo>-packages.nix`, therefor the renaming.
116−
117−## Testing if the Nix-expression could be evaluated {#testing-if-the-nix-expression-could-be-evaluated}
118−
119−```bash
120−nix-build test-evaluation.nix --dry-run
121−```
120+`generate-r-packages.R <repo>` reads `<repo>-packages.nix`, therefore
121+the renaming.
122122
123−If this exits fine, the expression is ok. If not, you have to edit `default.nix`
123+Some packages require overrides to specify external dependencies or other
124+patches and special requirements. These overrides are specified in the
125+`pkgs/development/r-modules/default.nix` file. As the `*-packages.nix`
126+contents are automatically generated it should not be edited and broken
127+builds should be addressed using overrides.
doc/languages-frameworks/ruby.section.md+14−1
@@ -8,7 +8,7 @@ In the Nixpkgs tree, Ruby packages can be found throughout, depending on what th
88
99There are two main approaches for using Ruby with gems. One is to use a specifically locked `Gemfile` for an application that has very strict dependencies. The other is to depend on the common gems, which we'll explain further down, and rely on them being updated regularly.
1010
11−The interpreters have common attributes, namely `gems`, and `withPackages`. So you can refer to `ruby.gems.nokogiri`, or `ruby_2_6.gems.nokogiri` to get the Nokogiri gem already compiled and ready to use.
11+The interpreters have common attributes, namely `gems`, and `withPackages`. So you can refer to `ruby.gems.nokogiri`, or `ruby_2_7.gems.nokogiri` to get the Nokogiri gem already compiled and ready to use.
1212
1313Since not all gems have executables like `nokogiri`, it's usually more convenient to use the `withPackages` function like this: `ruby.withPackages (p: with p; [ nokogiri ])`. This will also make sure that the Ruby in your environment will be able to find the gem and it can be used in your Ruby code (for example via `ruby` or `irb` executables) via `require "nokogiri"` as usual.
1414
@@ -201,6 +201,19 @@ $ nix-shell --run 'ruby -rpg -e "puts PG.library_version"'
201201
202202Of course for this use-case one could also use overlays since the configuration for `pg` depends on the `postgresql` alias, but for demonstration purposes this has to suffice.
203203
204+### Platform-specific gems
205+
206+Right now, bundix has some issues with pre-built, platform-specific gems: [bundix PR #68](https://github.com/nix-community/bundix/pull/68).
207+Until this is solved, you can tell bundler to not use platform-specific gems and instead build them from source each time:
208+- globally (will be set in `~/.config/.bundle/config`):
209+```shell
210+$ bundle config set force_ruby_platform true
211+```
212+- locally (will be set in `<project-root>/.bundle/config`):
213+```shell
214+$ bundle config set --local force_ruby_platform true
215+```
216+
204217### Adding a gem to the default gemset {#adding-a-gem-to-the-default-gemset}
205218
206219Now that you know how to get a working Ruby environment with Nix, it's time to go forward and start actually developing with Ruby. We will first have a look at how Ruby gems are packaged on Nix. Then, we will look at how you can use development mode with your code.
doc/languages-frameworks/rust.section.md+161−85
@@ -13,14 +13,14 @@ into your `configuration.nix` or bring them into scope with `nix-shell -p rustc
1313
1414For other versions such as daily builds (beta and nightly),
1515use either `rustup` from nixpkgs (which will manage the rust installation in your home directory),
16−or use Mozilla's [Rust nightlies overlay](#using-the-rust-nightlies-overlay).
16+or use a community maintained [Rust overlay](#using-community-rust-overlays).
1717
1818## Compiling Rust applications with Cargo {#compiling-rust-applications-with-cargo}
1919
2020Rust applications are packaged by using the `buildRustPackage` helper from `rustPlatform`:
2121
2222```nix
23−{ lib, rustPlatform }:
23+{ lib, fetchFromGitHub, rustPlatform }:
2424
2525rustPlatform.buildRustPackage rec {
2626 pname = "ripgrep";
@@ -116,13 +116,13 @@ is updated after every change to `Cargo.lock`. Therefore,
116116a `Cargo.lock` file using the `cargoLock` argument. For example:
117117
118118```nix
119−rustPlatform.buildRustPackage rec {
119+rustPlatform.buildRustPackage {
120120 pname = "myproject";
121121 version = "1.0.0";
122122
123123 cargoLock = {
124124 lockFile = ./Cargo.lock;
125− }
125+ };
126126
127127 # ...
128128}
@@ -131,6 +131,36 @@ rustPlatform.buildRustPackage rec {
131131This will retrieve the dependencies using fixed-output derivations from
132132the specified lockfile.
133133
134+One caveat is that `Cargo.lock` cannot be patched in the `patchPhase`
135+because it runs after the dependencies have already been fetched. If
136+you need to patch or generate the lockfile you can alternatively set
137+`cargoLock.lockFileContents` to a string of its contents:
138+
139+```nix
140+rustPlatform.buildRustPackage {
141+ pname = "myproject";
142+ version = "1.0.0";
143+
144+ cargoLock = let
145+ fixupLockFile = path: f (builtins.readFile path);
146+ in {
147+ lockFileContents = fixupLockFile ./Cargo.lock;
148+ };
149+
150+ # ...
151+}
152+```
153+
154+Note that setting `cargoLock.lockFile` or `cargoLock.lockFileContents`
155+doesn't add a `Cargo.lock` to your `src`, and a `Cargo.lock` is still
156+required to build a rust package. A simple fix is to use:
157+
158+```nix
159+postPatch = ''
160+ cp ${./Cargo.lock} Cargo.lock
161+'';
162+```
163+
134164The output hash of each dependency that uses a git source must be
135165specified in the `outputHashes` attribute. For example:
136166
@@ -144,7 +174,7 @@ rustPlatform.buildRustPackage rec {
144174 outputHashes = {
145175 "finalfusion-0.14.0" = "17f4bsdzpcshwh74w5z119xjy2if6l2wgyjy56v621skr2r8y904";
146176 };
147− }
177+ };
148178
149179 # ...
150180}
@@ -156,6 +186,33 @@ added. To find the correct hash, you can first use `lib.fakeSha256` or
156186`lib.fakeHash` as a stub hash. Building the package (and thus the
157187vendored dependencies) will then inform you of the correct hash.
158188
189+### Cargo features {#cargo-features}
190+
191+You can disable default features using `buildNoDefaultFeatures`, and
192+extra features can be added with `buildFeatures`.
193+
194+If you want to use different features for check phase, you can use
195+`checkNoDefaultFeatures` and `checkFeatures`. They are only passed to
196+`cargo test` and not `cargo build`. If left unset, they default to
197+`buildNoDefaultFeatures` and `buildFeatures`.
198+
199+For example:
200+
201+```nix
202+rustPlatform.buildRustPackage rec {
203+ pname = "myproject";
204+ version = "1.0.0";
205+
206+ buildNoDefaultFeatures = true;
207+ buildFeatures = [ "color" "net" ];
208+
209+ # disable network features in tests
210+ checkFeatures = [ "color" ];
211+
212+ # ...
213+}
214+```
215+
159216### Cross compilation {#cross-compilation}
160217
161218By default, Rust packages are compiled for the host platform, just like any
@@ -207,22 +264,6 @@ where they are known to differ. But there are ways to customize the argument:
207264 --target /nix/store/asdfasdfsadf-thumb-crazy.json # contains {"foo":"","bar":""}
208265 ```
209266
210−Finally, as an ad-hoc escape hatch, a computed target (string or JSON file
211−path) can be passed directly to `buildRustPackage`:
212−
213−```nix
214−pkgs.rustPlatform.buildRustPackage {
215− /* ... */
216− target = "x86_64-fortanix-unknown-sgx";
217−}
218−```
219−
220−This is useful to avoid rebuilding Rust tools, since they are actually target
221−agnostic and don't need to be rebuilt. But in the future, we should always
222−build the Rust tools and standard library crates separately so there is no
223−reason not to take the `stdenv.hostPlatform.rustc`-modifying approach, and the
224−ad-hoc escape hatch to `buildRustPackage` can be removed.
225−
226267Note that currently custom targets aren't compiled with `std`, so `cargo test`
227268will fail. This can be ignored by adding `doCheck = false;` to your derivation.
228269
@@ -247,12 +288,12 @@ rustPlatform.buildRustPackage {
247288Please note that the code will be compiled twice here: once in `release` mode
248289for the `buildPhase`, and again in `debug` mode for the `checkPhase`.
249290
250−Test flags, e.g., `--features xxx/yyy`, can be passed to `cargo test` via the
291+Test flags, e.g., `--package foo`, can be passed to `cargo test` via the
251292`cargoTestFlags` attribute.
252293
253294Another attribute, called `checkFlags`, is used to pass arguments to the test
254295binary itself, as stated
255−(here)[https://doc.rust-lang.org/cargo/commands/cargo-test.html].
296+[here](https://doc.rust-lang.org/cargo/commands/cargo-test.html).
256297
257298#### Tests relying on the structure of the `target/` directory {#tests-relying-on-the-structure-of-the-target-directory}
258299
@@ -397,7 +438,7 @@ you of the correct hash.
397438
398439`rustPlatform` provides the following hooks to automate Cargo builds:
399440
400−* `cargoSetupHook`: configure Cargo to use depenencies vendored
441+* `cargoSetupHook`: configure Cargo to use dependencies vendored
401442 through `fetchCargoTarball`. This hook uses the `cargoDeps`
402443 environment variable to find the vendored dependencies. If a project
403444 already vendors its dependencies, the variable `cargoVendorDir` can
@@ -407,20 +448,24 @@ you of the correct hash.
407448* `cargoBuildHook`: use Cargo to build a crate. If the crate to be
408449 built is a crate in e.g. a Cargo workspace, the relative path to the
409450 crate to build can be set through the optional `buildAndTestSubdir`
410− environment variable. Additional Cargo build flags can be passed
411− through `cargoBuildFlags`.
451+ environment variable. Features can be specified with
452+ `cargoBuildNoDefaultFeatures` and `cargoBuildFeatures`. Additional
453+ Cargo build flags can be passed through `cargoBuildFlags`.
412454* `maturinBuildHook`: use [Maturin](https://github.com/PyO3/maturin)
413455 to build a Python wheel. Similar to `cargoBuildHook`, the optional
414456 variable `buildAndTestSubdir` can be used to build a crate in a
415− Cargo workspace. Additional maturin flags can be passed through
457+ Cargo workspace. Additional Maturin flags can be passed through
416458 `maturinBuildFlags`.
417459* `cargoCheckHook`: run tests using Cargo. The build type for checks
418− can be set using `cargoCheckType`. Additional flags can be passed to
419− the tests using `checkFlags` and `checkFlagsArray`. By default,
420− tests are run in parallel. This can be disabled by setting
421− `dontUseCargoParallelTests`.
460+ can be set using `cargoCheckType`. Features can be specified with
461+ `cargoCheckNoDefaultFeaatures` and `cargoCheckFeatures`. Additional
462+ flags can be passed to the tests using `checkFlags` and
463+ `checkFlagsArray`. By default, tests are run in parallel. This can
464+ be disabled by setting `dontUseCargoParallelTests`.
422465* `cargoInstallHook`: install binaries and static/shared libraries
423466 that were built using `cargoBuildHook`.
467+* `bindgenHook`: for crates which use `bindgen` as a build dependency, lets
468+ `bindgen` find `libclang` and `libclang` find the libraries in `buildInputs`.
424469
425470### Examples {#examples}
426471
@@ -433,7 +478,7 @@ dependencies. The build itself is then performed by
433478
434479The following example outlines how the `tokenizers` Python package is
435480built. Since the Python package is in the `source/bindings/python`
436−directory of the *tokenizers* project's source archive, we use
481+directory of the `tokenizers` project's source archive, we use
437482`sourceRoot` to point the tooling to this directory:
438483
439484```nix
@@ -658,7 +703,7 @@ Some crates require external libraries. For crates from
658703`defaultCrateOverrides` package in nixpkgs itself.
659704
660705Starting from that file, one can add more overrides, to add features
661−or build inputs by overriding the hello crate in a seperate file.
706+or build inputs by overriding the hello crate in a separate file.
662707
663708```nix
664709with import <nixpkgs> {};
@@ -715,7 +760,7 @@ with import <nixpkgs> {};
715760Actually, the overrides introduced in the previous section are more
716761general. A number of other parameters can be overridden:
717762
718−- The version of rustc used to compile the crate:
763+- The version of `rustc` used to compile the crate:
719764
720765 ```nix
721766 (hello {}).override { rust = pkgs.rust; };
@@ -728,7 +773,7 @@ general. A number of other parameters can be overridden:
728773 (hello {}).override { release = false; };
729774 ```
730775
731−- Whether to print the commands sent to rustc when building
776+- Whether to print the commands sent to `rustc` when building
732777 (equivalent to `--verbose` in cargo:
733778
734779 ```nix
@@ -857,76 +902,107 @@ rustc 1.26.0-nightly (188e693b3 2018-03-26)
857902
858903To see that you are using nightly.
859904
860−## Using the Rust nightlies overlay {#using-the-rust-nightlies-overlay}
905+## Using community Rust overlays {#using-community-rust-overlays}
861906
862−Mozilla provides an overlay for nixpkgs to bring a nightly version of Rust into scope.
863−This overlay can _also_ be used to install recent unstable or stable versions
864−of Rust, if desired.
907+There are two community maintained approaches to Rust toolchain management:
908+- [oxalica's Rust overlay](https://github.com/oxalica/rust-overlay)
909+- [fenix](https://github.com/nix-community/fenix)
865910
866−### Rust overlay installation {#rust-overlay-installation}
911+Oxalica's overlay allows you to select a particular Rust version and components.
912+See [their documentation](https://github.com/oxalica/rust-overlay#rust-overlay) for more
913+detailed usage.
867914
868−You can use this overlay by either changing your local nixpkgs configuration,
869−or by adding the overlay declaratively in a nix expression, e.g. in `configuration.nix`.
870−For more information see [the manual on installing overlays](#sec-overlays-install).
871−
872−#### Imperative rust overlay installation {#imperative-rust-overlay-installation}
873−
874−Clone [nixpkgs-mozilla](https://github.com/mozilla/nixpkgs-mozilla),
875−and create a symbolic link to the file
876−[rust-overlay.nix](https://github.com/mozilla/nixpkgs-mozilla/blob/master/rust-overlay.nix)
877−in the `~/.config/nixpkgs/overlays` directory.
915+Fenix is an alternative to `rustup` and can also be used as an overlay.
878916
879−```ShellSession
880−$ git clone https://github.com/mozilla/nixpkgs-mozilla.git
881−$ mkdir -p ~/.config/nixpkgs/overlays
882−$ ln -s $(pwd)/nixpkgs-mozilla/rust-overlay.nix ~/.config/nixpkgs/overlays/rust-overlay.nix
883−```
917+Both oxalica's overlay and fenix better integrate with nix and cache optimizations.
918+Because of this and ergonomics, either of those community projects
919+should be preferred to the Mozilla's Rust overlay (`nixpkgs-mozilla`).
884920
885−### Declarative rust overlay installation {#declarative-rust-overlay-installation}
886−
887−Add the following to your `configuration.nix`, `home-configuration.nix`, `shell.nix`, or similar:
921+### How to select a specific `rustc` and toolchain version {#how-to-select-a-specific-rustc-and-toolchain-version}
888922
923+You can consume the oxalica overlay and use it to grab a specific Rust toolchain version.
924+Here is an example `shell.nix` showing how to grab the current stable toolchain:
889925```nix
890926{ pkgs ? import <nixpkgs> {
891927 overlays = [
892− (import (builtins.fetchTarball https://github.com/mozilla/nixpkgs-mozilla/archive/master.tar.gz))
893− # Further overlays go here
928+ (import (fetchTarball "https://github.com/oxalica/rust-overlay/archive/master.tar.gz"))
894929 ];
895− };
896−};
930+ }
931+}:
932+pkgs.mkShell {
933+ nativeBuildInputs = with pkgs; [
934+ pkg-config
935+ rust-bin.stable.latest.minimal
936+ ];
937+}
897938```
898939
899−Note that this will fetch the latest overlay version when rebuilding your system.
940+You can try this out by:
941+1. Saving that to `shell.nix`
942+2. Executing `nix-shell --pure --command 'rustc --version'`
900943
901−### Rust overlay usage {#rust-overlay-usage}
944+As of writing, this prints out `rustc 1.56.0 (09c42c458 2021-10-18)`.
902945
903−The overlay contains attribute sets corresponding to different versions of the rust toolchain, such as:
946+### How to use an overlay toolchain in a derivation {#how-to-use-an-overlay-toolchain-in-a-derivation}
947+
948+You can also use an overlay's Rust toolchain with `buildRustPackage`.
949+The below snippet demonstrates invoking `buildRustPackage` with an oxalica overlay selected Rust toolchain:
950+```nix
951+with import <nixpkgs> {
952+ overlays = [
953+ (import (fetchTarball "https://github.com/oxalica/rust-overlay/archive/master.tar.gz"))
954+ ];
955+};
904956
905−* `latest.rustChannels.stable`
906−* `latest.rustChannels.nightly`
907−* a function `rustChannelOf`, called as `(rustChannelOf { date = "2018-04-11"; channel = "nightly"; })`, or...
908−* `(nixpkgs.rustChannelOf { rustToolchain = ./rust-toolchain; })` if you have a local `rust-toolchain` file (see https://github.com/mozilla/nixpkgs-mozilla#using-in-nix-expressions for an example)
957+rustPlatform.buildRustPackage rec {
958+ pname = "ripgrep";
959+ version = "12.1.1";
960+ nativeBuildInputs = [
961+ rust-bin.stable.latest.minimal
962+ ];
909963
910−Each of these contain packages such as `rust`, which contains your usual rust development tools with the respective toolchain chosen.
911−For example, you might want to add `latest.rustChannels.stable.rust` to the list of packages in your configuration.
964+ src = fetchFromGitHub {
965+ owner = "BurntSushi";
966+ repo = "ripgrep";
967+ rev = version;
968+ sha256 = "1hqps7l5qrjh9f914r5i6kmcz6f1yb951nv4lby0cjnp5l253kps";
969+ };
912970
913−Imperatively, the latest stable version can be installed with the following command:
971+ cargoSha256 = "03wf9r2csi6jpa7v5sw5lpxkrk4wfzwmzx7k3991q3bdjzcwnnwp";
914972
915−```ShellSession
916−$ nix-env -Ai nixpkgs.latest.rustChannels.stable.rust
973+ meta = with lib; {
974+ description = "A fast line-oriented regex search tool, similar to ag and ack";
975+ homepage = "https://github.com/BurntSushi/ripgrep";
976+ license = licenses.unlicense;
977+ maintainers = [ maintainers.tailhook ];
978+ };
979+}
917980```
918981
919−Or using the attribute with nix-shell:
982+Follow the below steps to try that snippet.
983+1. create a new directory
984+1. save the above snippet as `default.nix` in that directory
985+1. cd into that directory and run `nix-build`
920986
921−```ShellSession
922−$ nix-shell -p nixpkgs.latest.rustChannels.stable.rust
923−```
987+### Rust overlay installation {#rust-overlay-installation}
988+
989+You can use this overlay by either changing your local nixpkgs configuration,
990+or by adding the overlay declaratively in a nix expression, e.g. in `configuration.nix`.
991+For more information see [the manual on installing overlays](#sec-overlays-install).
992+
993+### Declarative Rust overlay installation {#declarative-rust-overlay-installation}
924994
925−Substitute the `nixpkgs` prefix with `nixos` on NixOS.
926−To install the beta or nightly channel, "stable" should be substituted by
927−"nightly" or "beta", or
928−use the function provided by this overlay to pull a version based on a
929−build date.
995+This snippet shows how to use oxalica's Rust overlay.
996+Add the following to your `configuration.nix`, `home-configuration.nix`, `shell.nix`, or similar:
930997
931−The overlay automatically updates itself as it uses the same source as
932−[rustup](https://www.rustup.rs/).
998+```nix
999+{ pkgs ? import <nixpkgs> {
1000+ overlays = [
1001+ (import (builtins.fetchTarball "https://github.com/oxalica/rust-overlay/archive/master.tar.gz"))
1002+ # Further overlays go here
1003+ ];
1004+ };
1005+};
1006+```
1007+
1008+Note that this will fetch the latest overlay version when rebuilding your system.
doc/languages-frameworks/texlive.section.md+1−1
@@ -6,7 +6,7 @@ Since release 15.09 there is a new TeX Live packaging that lives entirely under
66
77- For basic usage just pull `texlive.combined.scheme-basic` for an environment with basic LaTeX support.
88
9−- It typically won't work to use separately installed packages together. Instead, you can build a custom set of packages like this:
9+- It typically won't work to use separately installed packages together. Instead, you can build a custom set of packages like this. Most CTAN packages should be available:
1010
1111 ```nix
1212 texlive.combine {
doc/languages-frameworks/vim.section.md+37−7
@@ -18,7 +18,7 @@ Adding custom .vimrc lines can be done using the following code:
1818
1919```nix
2020vim_configurable.customize {
21− # `name` specifies the name of the executable and package
21+ # `name` optionally specifies the name of the executable and package
2222 name = "vim-with-plugins";
2323
2424 vimrcConfig.customRC = ''
@@ -28,6 +28,9 @@ vim_configurable.customize {
2828```
2929
3030This configuration is used when Vim is invoked with the command specified as name, in this case `vim-with-plugins`.
31+You can also omit `name` to customize Vim itself. See the
32+[definition of `vimUtils.makeCustomizable`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/vim-utils.nix#L408)
33+for all supported options.
3134
3235For Neovim the `configure` argument can be overridden to achieve the same:
3336
@@ -120,7 +123,7 @@ After that you can install your special grafted `myVim` or `myNeovim` packages.
120123
121124If one of your favourite plugins isn't packaged, you can package it yourself:
122125
123−```
126+```nix
124127{ config, pkgs, ... }:
125128
126129let
@@ -154,6 +157,33 @@ in
154157}
155158```
156159
160+### Specificities for some plugins
161+#### Tree sitter
162+
163+By default `nvim-treesitter` encourages you to download, compile and install
164+the required tree-sitter grammars at run time with `:TSInstall`. This works
165+poorly on NixOS. Instead, to install the `nvim-treesitter` plugins with a set
166+of precompiled grammars, you can use `nvim-treesitter.withPlugins` function:
167+
168+```nix
169+(pkgs.neovim.override {
170+ configure = {
171+ packages.myPlugins = with pkgs.vimPlugins; {
172+ start = [
173+ (nvim-treesitter.withPlugins (
174+ plugins: with plugins; [
175+ tree-sitter-nix
176+ tree-sitter-python
177+ ]
178+ ))
179+ ];
180+ };
181+ };
182+})
183+```
184+
185+To enable all grammars packaged in nixpkgs, use `(pkgs.vimPlugins.nvim-treesitter.withPlugins (plugins: pkgs.tree-sitter.allGrammars))`.
186+
157187## Managing plugins with vim-plug {#managing-plugins-with-vim-plug}
158188
159189To use [vim-plug](https://github.com/junegunn/vim-plug) to manage your Vim
@@ -259,7 +289,7 @@ Sample output1:
259289"reload" = buildVimPluginFrom2Nix { # created by nix#NixDerivation
260290 name = "reload";
261291 src = fetchgit {
262− url = "git://github.com/xolox/vim-reload";
292+ url = "https://github.com/xolox/vim-reload";
263293 rev = "0a601a668727f5b675cb1ddc19f6861f3f7ab9e1";
264294 sha256 = "0vb832l9yxj919f5hfg6qj6bn9ni57gnjd3bj7zpq7d4iv2s4wdh";
265295 };
@@ -282,9 +312,9 @@ Sample output2:
282312
283313## Adding new plugins to nixpkgs {#adding-new-plugins-to-nixpkgs}
284314
285−Nix expressions for Vim plugins are stored in [pkgs/misc/vim-plugins](/pkgs/misc/vim-plugins). For the vast majority of plugins, Nix expressions are automatically generated by running [`./update.py`](/pkgs/misc/vim-plugins/update.py). This creates a [generated.nix](/pkgs/misc/vim-plugins/generated.nix) file based on the plugins listed in [vim-plugin-names](/pkgs/misc/vim-plugins/vim-plugin-names). Plugins are listed in alphabetical order in `vim-plugin-names` using the format `[github username]/[repository]`. For example https://github.com/scrooloose/nerdtree becomes `scrooloose/nerdtree`.
315+Nix expressions for Vim plugins are stored in [pkgs/applications/editors/vim/plugins](https://github.com/NixOS/nixpkgs/tree/master/pkgs/applications/editors/vim/plugins). For the vast majority of plugins, Nix expressions are automatically generated by running [`./update.py`](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/update.py). This creates a [generated.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/generated.nix) file based on the plugins listed in [vim-plugin-names](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/vim-plugin-names). Plugins are listed in alphabetical order in `vim-plugin-names` using the format `[github username]/[repository]@[gitref]`. For example https://github.com/scrooloose/nerdtree becomes `scrooloose/nerdtree`.
286316
287−Some plugins require overrides in order to function properly. Overrides are placed in [overrides.nix](/pkgs/misc/vim-plugins/overrides.nix). Overrides are most often required when a plugin requires some dependencies, or extra steps are required during the build process. For example `deoplete-fish` requires both `deoplete-nvim` and `vim-fish`, and so the following override was added:
317+Some plugins require overrides in order to function properly. Overrides are placed in [overrides.nix](https://github.com/NixOS/nixpkgs/blob/master/pkgs/applications/editors/vim/plugins/overrides.nix). Overrides are most often required when a plugin requires some dependencies, or extra steps are required during the build process. For example `deoplete-fish` requires both `deoplete-nvim` and `vim-fish`, and so the following override was added:
288318
289319```nix
290320deoplete-fish = super.deoplete-fish.overrideAttrs(old: {
@@ -303,13 +333,13 @@ Finally, there are some plugins that are also packaged in nodePackages because t
303333Run the update script with a GitHub API token that has at least `public_repo` access. Running the script without the token is likely to result in rate-limiting (429 errors). For steps on creating an API token, please refer to [GitHub's token documentation](https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token).
304334
305335```sh
306−GITHUB_API_TOKEN=my_token ./pkgs/misc/vim-plugins/update.py
336+GITHUB_API_TOKEN=my_token ./pkgs/applications/editors/vim/plugins/update.py
307337```
308338
309339Alternatively, set the number of processes to a lower count to avoid rate-limiting.
310340
311341```sh
312−./pkgs/misc/vim-plugins/update.py --proc 1
342+./pkgs/applications/editors/vim/plugins/update.py --proc 1
313343```
314344
315345## Important repositories {#important-repositories}
doc/manual.xml+2
@@ -25,8 +25,10 @@
2525 <title>Builders</title>
2626 <xi:include href="builders/fetchers.chapter.xml" />
2727 <xi:include href="builders/trivial-builders.chapter.xml" />
28+ <xi:include href="builders/testers.chapter.xml" />
2829 <xi:include href="builders/special.xml" />
2930 <xi:include href="builders/images.xml" />
31+ <xi:include href="hooks/index.xml" />
3032 <xi:include href="languages-frameworks/index.xml" />
3133 <xi:include href="builders/packages/index.xml" />
3234 </part>
doc/stdenv/cross-compilation.chapter.md+37−12
@@ -78,21 +78,46 @@ If both the dependency and depending packages aren't compilers or other machine-
7878
7979Finally, if the depending package is a compiler or other machine-code-producing tool, it might need dependencies that run at "emit time". This is for compilers that (regrettably) insist on being built together with their source languages' standard libraries. Assuming build != host != target, a run-time dependency of the standard library cannot be run at the compiler's build time or run time, but only at the run time of code emitted by the compiler.
8080
81−Putting this all together, that means we have dependencies in the form "host → target", in at most the following six combinations:
81+Putting this all together, that means that we have dependency types of the form "X→ E", which means that the dependency executes on X and emits code for E; each of X and E can be `build`, `host`, or `target`, and E can be `*` to indicate that the dependency is not a compiler-like package.
82+
83+Dependency types describe the relationships that a package has with each of its transitive dependencies. You could think of attaching one or more dependency types to each of the formal parameters at the top of a package's `.nix` file, as well as to all of *their* formal parameters, and so on. Triples like `(foo, bar, baz)`, on the other hand, are a property of an instantiated derivation -- you could would attach a triple `(mips-linux, mips-linux, sparc-solaris)` to a `.drv` file in `/nix/store`.
84+
85+Only nine dependency types matter in practice:
8286
8387#### Possible dependency types {#possible-dependency-types}
8488
85−| Dependency’s host platform | Dependency’s target platform |
86−|----------------------------|------------------------------|
87−| build | build |
88−| build | host |
89−| build | target |
90−| host | host |
91−| host | target |
92−| target | target |
89+| Dependency type | Dependency’s host platform | Dependency’s target platform |
90+|-----------------|----------------------------|------------------------------|
91+| build → * | build | (none) |
92+| build → build | build | build |
93+| build → host | build | host |
94+| build → target | build | target |
95+| host → * | host | (none) |
96+| host → host | host | host |
97+| host → target | host | target |
98+| target → * | target | (none) |
99+| target → target | target | target |
100+
101+Let's use `g++` as an example to make this table clearer. `g++` is a C++ compiler written in C. Suppose we are building `g++` with a `(build, host, target)` platform triple of `(foo, bar, baz)`. This means we are using a `foo`-machine to build a copy of `g++` which will run on a `bar`-machine and emit binaries for the `baz`-machine.
102+
103+* `g++` links against the host platform's `glibc` C library, which is a "host→ *" dependency with a triple of `(bar, bar, *)`. Since it is a library, not a compiler, it has no "target".
104+
105+* Since `g++` is written in C, the `gcc` compiler used to compile it is a "build→ host" dependency of `g++` with a triple of `(foo, foo, bar)`. This compiler runs on the build platform and emits code for the host platform.
106+
107+* `gcc` links against the build platform's `glibc` C library, which is a "build→ *" dependency with a triple of `(foo, foo, *)`. Since it is a library, not a compiler, it has no "target".
108+
109+* This `gcc` is itself compiled by an *earlier* copy of `gcc`. This earlier copy of `gcc` is a "build→ build" dependency of `g++` with a triple of `(foo, foo, foo)`. This "early `gcc`" runs on the build platform and emits code for the build platform.
110+
111+* `g++` is bundled with `libgcc`, which includes a collection of target-machine routines for exception handling and
112+software floating point emulation. `libgcc` would be a "target→ *" dependency with triple `(foo, baz, *)`, because it consists of machine code which gets linked against the output of the compiler that we are building. It is a library, not a compiler, so it has no target of its own.
113+
114+* `libgcc` is written in C and compiled with `gcc`. The `gcc` that compiles it will be a "build→ target" dependency with triple `(foo, foo, baz)`. It gets compiled *and run* at `g++`-build-time (on platform `foo`), but must emit code for the `baz`-platform.
115+
116+* `g++` allows inline assembler code, so it depends on access to a copy of the `gas` assembler. This would be a "host→ target" dependency with triple `(foo, bar, baz)`.
93117
118+* `g++` (and `gcc`) include a library `libgccjit.so`, which wrap the compiler in a library to create a just-in-time compiler. In nixpkgs, this library is in the `libgccjit` package; if C++ required that programs have access to a JIT, `g++` would need to add a "target→ target" dependency for `libgccjit` with triple `(foo, baz, baz)`. This would ensure that the compiler ships with a copy of `libgccjit` which both executes on and generates code for the `baz`-platform.
94119
95−Some examples will make this table clearer. Suppose there's some package that is being built with a `(build, host, target)` platform triple of `(foo, bar, baz)`. If it has a build-time library dependency, that would be a "host → build" dependency with a triple of `(foo, foo, *)` (the target platform is irrelevant). If it needs a compiler to be built, that would be a "build → host" dependency with a triple of `(foo, foo, *)` (the target platform is irrelevant). That compiler, would be built with another compiler, also "build → host" dependency, with a triple of `(foo, foo, foo)`.
120+* If `g++` itself linked against `libgccjit.so` (for example, to allow compile-time-evaluated C++ expressions), then the `libgccjit` package used to provide this functionality would be a "host→ host" dependency of `g++`: it is code which runs on the `host` and emits code for execution on the `host`.
96121
97122### Cross packaging cookbook {#ssec-cross-cookbook}
98123
@@ -158,9 +183,9 @@ One would think that `localSystem` and `crossSystem` overlap horribly with the t
158183
159184### Implementation of dependencies {#ssec-cross-dependency-implementation}
160185
161−The categories of dependencies developed in [](#ssec-cross-dependency-categorization) are specified as lists of derivations given to `mkDerivation`, as documented in [](#ssec-stdenv-dependencies). In short, each list of dependencies for "host → target" of "foo → bar" is called `depsFooBar`, with exceptions for backwards compatibility that `depsBuildHost` is instead called `nativeBuildInputs` and `depsHostTarget` is instead called `buildInputs`. Nixpkgs is now structured so that each `depsFooBar` is automatically taken from `pkgsFooBar`. (These `pkgsFooBar`s are quite new, so there is no special case for `nativeBuildInputs` and `buildInputs`.) For example, `pkgsBuildHost.gcc` should be used at build-time, while `pkgsHostTarget.gcc` should be used at run-time.
186+The categories of dependencies developed in [](#ssec-cross-dependency-categorization) are specified as lists of derivations given to `mkDerivation`, as documented in [](#ssec-stdenv-dependencies). In short, each list of dependencies for "host → target" is called `deps<host><target>` (where `host`, and `target` values are either `build`, `host`, or `target`), with exceptions for backwards compatibility that `depsBuildHost` is instead called `nativeBuildInputs` and `depsHostTarget` is instead called `buildInputs`. Nixpkgs is now structured so that each `deps<host><target>` is automatically taken from `pkgs<host><target>`. (These `pkgs<host><target>`s are quite new, so there is no special case for `nativeBuildInputs` and `buildInputs`.) For example, `pkgsBuildHost.gcc` should be used at build-time, while `pkgsHostTarget.gcc` should be used at run-time.
162187
163−Now, for most of Nixpkgs's history, there were no `pkgsFooBar` attributes, and most packages have not been refactored to use it explicitly. Prior to those, there were just `buildPackages`, `pkgs`, and `targetPackages`. Those are now redefined as aliases to `pkgsBuildHost`, `pkgsHostTarget`, and `pkgsTargetTarget`. It is acceptable, even recommended, to use them for libraries to show that the host platform is irrelevant.
188+Now, for most of Nixpkgs's history, there were no `pkgs<host><target>` attributes, and most packages have not been refactored to use it explicitly. Prior to those, there were just `buildPackages`, `pkgs`, and `targetPackages`. Those are now redefined as aliases to `pkgsBuildHost`, `pkgsHostTarget`, and `pkgsTargetTarget`. It is acceptable, even recommended, to use them for libraries to show that the host platform is irrelevant.
164189
165190But before that, there was just `pkgs`, even though both `buildInputs` and `nativeBuildInputs` existed. \[Cross barely worked, and those were implemented with some hacks on `mkDerivation` to override dependencies.\] What this means is the vast majority of packages do not use any explicit package set to populate their dependencies, just using whatever `callPackage` gives them even if they do correctly sort their dependencies into the multiple lists described above. And indeed, asking that users both sort their dependencies, _and_ take them from the right attribute set, is both too onerous and redundant, so the recommended approach (for now) is to continue just categorizing by list and not using an explicit package set.
166191
doc/stdenv/meta.chapter.md+62−5
@@ -114,6 +114,10 @@ For details, see [Licenses](#sec-meta-license).
114114
115115A list of the maintainers of this Nix expression. Maintainers are defined in [`nixpkgs/maintainers/maintainer-list.nix`](https://github.com/NixOS/nixpkgs/blob/master/maintainers/maintainer-list.nix). There is no restriction to becoming a maintainer, just add yourself to that list in a separate commit titled “maintainers: add alice”, and reference maintainers with `maintainers = with lib.maintainers; [ alice bob ]`.
116116
117+### `mainProgram` {#var-meta-mainProgram}
118+
119+The name of the main binary for the package. This effects the binary `nix run` executes and falls back to the name of the package. Example: `"rg"`
120+
117121### `priority` {#var-meta-priority}
118122
119123The *priority* of the package, used by `nix-env` to resolve file name conflicts between packages. See the Nix manual page for `nix-env` for details. Example: `"10"` (a low-priority package).
@@ -134,7 +138,28 @@ Attribute Set `lib.platforms` defines [various common lists](https://github.com/
134138This attribute is special in that it is not actually under the `meta` attribute set but rather under the `passthru` attribute set. This is due to how `meta` attributes work, and the fact that they are supposed to contain only metadata, not derivations.
135139:::
136140
137−An attribute set with as values tests. A test is a derivation, which builds successfully when the test passes, and fails to build otherwise. A derivation that is a test needs to have `meta.timeout` defined.
141+An attribute set with tests as values. A test is a derivation that builds when the test passes and fails to build otherwise.
142+
143+You can run these tests with:
144+
145+```ShellSession
146+$ cd path/to/nixpkgs
147+$ nix-build -A your-package.tests
148+```
149+
150+#### Package tests
151+
152+Tests that are part of the source package are often executed in the `installCheckPhase`.
153+
154+Prefer `passthru.tests` for tests that are introduced in nixpkgs because:
155+
156+* `passthru.tests` tests the 'real' package, independently from the environment in which it was built
157+* we can run `passthru.tests` independently
158+* `installCheckPhase` adds overhead to each build
159+
160+For more on how to write and run package tests, see <xref linkend="sec-package-tests"/>.
161+
162+#### NixOS tests
138163
139164The NixOS tests are available as `nixosTests` in parameters of derivations. For instance, the OpenSMTPD derivation includes lines similar to:
140165
@@ -148,6 +173,42 @@ The NixOS tests are available as `nixosTests` in parameters of derivations. For
148173}
149174```
150175
176+NixOS tests run in a VM, so they are slower than regular package tests. For more information see [NixOS module tests](https://nixos.org/manual/nixos/stable/#sec-nixos-tests).
177+
178+Alternatively, you can specify other derivations as tests. You can make use of
179+the optional parameter to inject the correct package without
180+relying on non-local definitions, even in the presence of `overrideAttrs`.
181+Here that's `finalAttrs.finalPackage`, but you could choose a different name if
182+`finalAttrs` already exists in your scope.
183+
184+`(mypkg.overrideAttrs f).passthru.tests` will be as expected, as long as the
185+definition of `tests` does not rely on the original `mypkg` or overrides it in
186+all places.
187+
188+```nix
189+# my-package/default.nix
190+{ stdenv, callPackage }:
191+stdenv.mkDerivation (finalAttrs: {
192+ # ...
193+ passthru.tests.example = callPackage ./example.nix { my-package = finalAttrs.finalPackage; };
194+})
195+```
196+
197+```nix
198+# my-package/example.nix
199+{ runCommand, lib, my-package, ... }:
200+runCommand "my-package-test" {
201+ nativeBuildInputs = [ my-package ];
202+ src = lib.sources.sourcesByRegex ./. [ ".*.in" ".*.expected" ];
203+} ''
204+ my-package --help
205+ my-package <example.in >example.actual
206+ diff -U3 --color=auto example.expected example.actual
207+ mkdir $out
208+''
209+```
210+
211+
151212### `timeout` {#var-meta-timeout}
152213
153214A timeout (in seconds) for building the derivation. If the derivation takes longer than this time to build, it can fail due to breaking the timeout. However, all computers do not have the same computing power, hence some builders may decide to apply a multiplicative factor to this value. When filling this value in, try to keep it approximately consistent with other values already present in `nixpkgs`.
@@ -165,10 +226,6 @@ meta.hydraPlatforms = [];
165226
166227If set to `true`, the package is marked as "broken", meaning that it won’t show up in `nix-env -qa`, and cannot be built or installed. Such packages should be removed from Nixpkgs eventually unless they are fixed.
167228
168−### `updateWalker` {#var-meta-updateWalker}
169−
170−If set to `true`, the package is tested to be updated correctly by the `update-walker.sh` script without additional settings. Such packages have `meta.version` set and their homepage (or the page specified by `meta.downloadPage`) contains a direct link to the package tarball.
171−
172229## Licenses {#sec-meta-license}
173230
174231The `meta.license` attribute should preferably contain a value from `lib.licenses` defined in [`nixpkgs/lib/licenses.nix`](https://github.com/NixOS/nixpkgs/blob/master/lib/licenses.nix), or in-place license description of the same format if the license is unlikely to be useful in another expression.
doc/stdenv/multiple-output.chapter.md+1−1
@@ -79,7 +79,7 @@ A commonly adopted convention in `nixpkgs` is that executables provided by the p
7979
8080The `glibc` package is a deliberate single exception to the “binaries first” convention. The `glibc` has `libs` as its first output allowing the libraries provided by `glibc` to be referenced directly (e.g. `${stdenv.glibc}/lib/ld-linux-x86-64.so.2`). The executables provided by `glibc` can be accessed via its `bin` attribute (e.g. `${stdenv.glibc.bin}/bin/ldd`).
8181
82−The reason for why `glibc` deviates from the convention is because referencing a library provided by `glibc` is a very common operation among Nix packages. For instance, third-party executables packaged by Nix are typically patched and relinked with the relevant version of `glibc` libraries from Nix packages (please see the documentation on [patchelf](https://github.com/NixOS/patchelf/blob/master/README) for more details).
82+The reason for why `glibc` deviates from the convention is because referencing a library provided by `glibc` is a very common operation among Nix packages. For instance, third-party executables packaged by Nix are typically patched and relinked with the relevant version of `glibc` libraries from Nix packages (please see the documentation on [patchelf](https://github.com/NixOS/patchelf) for more details).
8383
8484### File type groups {#multiple-output-file-type-groups}
8585
doc/stdenv/stdenv.chapter.md+137−31
@@ -116,15 +116,27 @@ On Linux, `stdenv` also includes the `patchelf` utility.
116116
117117## Specifying dependencies {#ssec-stdenv-dependencies}
118118
119−As described in the Nix manual, almost any `*.drv` store path in a derivation’s attribute set will induce a dependency on that derivation. `mkDerivation`, however, takes a few attributes intended to, between them, include all the dependencies of a package. This is done both for structure and consistency, but also so that certain other setup can take place. For example, certain dependencies need their bin directories added to the `PATH`. That is built-in, but other setup is done via a pluggable mechanism that works in conjunction with these dependency attributes. See [](#ssec-setup-hooks) for details.
119+As described in the Nix manual, almost any `*.drv` store path in a derivation’s attribute set will induce a dependency on that derivation. `mkDerivation`, however, takes a few attributes intended to include all the dependencies of a package. This is done both for structure and consistency, but also so that certain other setup can take place. For example, certain dependencies need their bin directories added to the `PATH`. That is built-in, but other setup is done via a pluggable mechanism that works in conjunction with these dependency attributes. See [](#ssec-setup-hooks) for details.
120120
121121Dependencies can be broken down along three axes: their host and target platforms relative to the new derivation’s, and whether they are propagated. The platform distinctions are motivated by cross compilation; see [](#chap-cross) for exactly what each platform means. [^footnote-stdenv-ignored-build-platform] But even if one is not cross compiling, the platforms imply whether or not the dependency is needed at run-time or build-time, a concept that makes perfect sense outside of cross compilation. By default, the run-time/build-time distinction is just a hint for mental clarity, but with `strictDeps` set it is mostly enforced even in the native case.
122122
123123The extension of `PATH` with dependencies, alluded to above, proceeds according to the relative platforms alone. The process is carried out only for dependencies whose host platform matches the new derivation’s build platform i.e. dependencies which run on the platform where the new derivation will be built. [^footnote-stdenv-native-dependencies-in-path] For each dependency \<dep\> of those dependencies, `dep/bin`, if present, is added to the `PATH` environment variable.
124124
125−The dependency is propagated when it forces some of its other-transitive (non-immediate) downstream dependencies to also take it on as an immediate dependency. Nix itself already takes a package’s transitive dependencies into account, but this propagation ensures nixpkgs-specific infrastructure like setup hooks (mentioned above) also are run as if the propagated dependency.
125+A dependency is said to be **propagated** when some of its other-transitive (non-immediate) downstream dependencies also need it as an immediate dependency.
126+[^footnote-stdenv-propagated-dependencies]
126127
127−It is important to note that dependencies are not necessarily propagated as the same sort of dependency that they were before, but rather as the corresponding sort so that the platform rules still line up. The exact rules for dependency propagation can be given by assigning to each dependency two integers based one how its host and target platforms are offset from the depending derivation’s platforms. Those offsets are given below in the descriptions of each dependency list attribute. Algorithmically, we traverse propagated inputs, accumulating every propagated dependency’s propagated dependencies and adjusting them to account for the “shift in perspective” described by the current dependency’s platform offsets. This results in sort a transitive closure of the dependency relation, with the offsets being approximately summed when two dependency links are combined. We also prune transitive dependencies whose combined offsets go out-of-bounds, which can be viewed as a filter over that transitive closure removing dependencies that are blatantly absurd.
128+It is important to note that dependencies are not necessarily propagated as the same sort of dependency that they were before, but rather as the corresponding sort so that the platform rules still line up. To determine the exact rules for dependency propagation, we start by assigning to each dependency a couple of ternary numbers (`-1` for `build`, `0` for `host`, and `1` for `target`) representing its [dependency type](#possible-dependency-types), which captures how its host and target platforms are each "offset" from the depending derivation’s host and target platforms. The following table summarize the different combinations that can be obtained:
129+
130+| `host → target` | attribute name | offset |
131+| ------------------- | ------------------- | -------- |
132+| `build --> build` | `depsBuildBuild` | `-1, -1` |
133+| `build --> host` | `nativeBuildInputs` | `-1, 0` |
134+| `build --> target` | `depsBuildTarget` | `-1, 1` |
135+| `host --> host` | `depsHostHost` | `0, 0` |
136+| `host --> target` | `buildInputs` | `0, 1` |
137+| `target --> target` | `depsTargetTarget` | `1, 1` |
138+
139+Algorithmically, we traverse propagated inputs, accumulating every propagated dependency’s propagated dependencies and adjusting them to account for the “shift in perspective” described by the current dependency’s platform offsets. This results is sort of a transitive closure of the dependency relation, with the offsets being approximately summed when two dependency links are combined. We also prune transitive dependencies whose combined offsets go out-of-bounds, which can be viewed as a filter over that transitive closure removing dependencies that are blatantly absurd.
128140
129141We can define the process precisely with [Natural Deduction](https://en.wikipedia.org/wiki/Natural_deduction) using the inference rules. This probably seems a bit obtuse, but so is the bash code that actually implements it! [^footnote-stdenv-find-inputs-location] They’re confusing in very different ways so… hopefully if something doesn’t make sense in one presentation, it will in the other!
130142
@@ -179,37 +191,37 @@ Overall, the unifying theme here is that propagation shouldn’t be introducing
179191
180192#### `depsBuildBuild` {#var-stdenv-depsBuildBuild}
181193
182−A list of dependencies whose host and target platforms are the new derivation’s build platform. This means a `-1` host and `-1` target offset from the new derivation’s platforms. These are programs and libraries used at build time that produce programs and libraries also used at build time. If the dependency doesn’t care about the target platform (i.e. isn’t a compiler or similar tool), put it in `nativeBuildInputs` instead. The most common use of this `buildPackages.stdenv.cc`, the default C compiler for this role. That example crops up more than one might think in old commonly used C libraries.
194+A list of dependencies whose host and target platforms are the new derivation’s build platform. These are programs and libraries used at build time that produce programs and libraries also used at build time. If the dependency doesn’t care about the target platform (i.e. isn’t a compiler or similar tool), put it in `nativeBuildInputs` instead. The most common use of this `buildPackages.stdenv.cc`, the default C compiler for this role. That example crops up more than one might think in old commonly used C libraries.
183195
184196Since these packages are able to be run at build-time, they are always added to the `PATH`, as described above. But since these packages are only guaranteed to be able to run then, they shouldn’t persist as run-time dependencies. This isn’t currently enforced, but could be in the future.
185197
186198#### `nativeBuildInputs` {#var-stdenv-nativeBuildInputs}
187199
188−A list of dependencies whose host platform is the new derivation’s build platform, and target platform is the new derivation’s host platform. This means a `-1` host offset and `0` target offset from the new derivation’s platforms. These are programs and libraries used at build-time that, if they are a compiler or similar tool, produce code to run at run-time—i.e. tools used to build the new derivation. If the dependency doesn’t care about the target platform (i.e. isn’t a compiler or similar tool), put it here, rather than in `depsBuildBuild` or `depsBuildTarget`. This could be called `depsBuildHost` but `nativeBuildInputs` is used for historical continuity.
200+A list of dependencies whose host platform is the new derivation’s build platform, and target platform is the new derivation’s host platform. These are programs and libraries used at build-time that, if they are a compiler or similar tool, produce code to run at run-time—i.e. tools used to build the new derivation. If the dependency doesn’t care about the target platform (i.e. isn’t a compiler or similar tool), put it here, rather than in `depsBuildBuild` or `depsBuildTarget`. This could be called `depsBuildHost` but `nativeBuildInputs` is used for historical continuity.
189201
190202Since these packages are able to be run at build-time, they are added to the `PATH`, as described above. But since these packages are only guaranteed to be able to run then, they shouldn’t persist as run-time dependencies. This isn’t currently enforced, but could be in the future.
191203
192204#### `depsBuildTarget` {#var-stdenv-depsBuildTarget}
193205
194−A list of dependencies whose host platform is the new derivation’s build platform, and target platform is the new derivation’s target platform. This means a `-1` host offset and `1` target offset from the new derivation’s platforms. These are programs used at build time that produce code to run with code produced by the depending package. Most commonly, these are tools used to build the runtime or standard library that the currently-being-built compiler will inject into any code it compiles. In many cases, the currently-being-built-compiler is itself employed for that task, but when that compiler won’t run (i.e. its build and host platform differ) this is not possible. Other times, the compiler relies on some other tool, like binutils, that is always built separately so that the dependency is unconditional.
206+A list of dependencies whose host platform is the new derivation’s build platform, and target platform is the new derivation’s target platform. These are programs used at build time that produce code to run with code produced by the depending package. Most commonly, these are tools used to build the runtime or standard library that the currently-being-built compiler will inject into any code it compiles. In many cases, the currently-being-built-compiler is itself employed for that task, but when that compiler won’t run (i.e. its build and host platform differ) this is not possible. Other times, the compiler relies on some other tool, like binutils, that is always built separately so that the dependency is unconditional.
195207
196−This is a somewhat confusing concept to wrap one’s head around, and for good reason. As the only dependency type where the platform offsets are not adjacent integers, it requires thinking of a bootstrapping stage *two* away from the current one. It and its use-case go hand in hand and are both considered poor form: try to not need this sort of dependency, and try to avoid building standard libraries and runtimes in the same derivation as the compiler produces code using them. Instead strive to build those like a normal library, using the newly-built compiler just as a normal library would. In short, do not use this attribute unless you are packaging a compiler and are sure it is needed.
208+This is a somewhat confusing concept to wrap one’s head around, and for good reason. As the only dependency type where the platform offsets, `-1` and `1`, are not adjacent integers, it requires thinking of a bootstrapping stage *two* away from the current one. It and its use-case go hand in hand and are both considered poor form: try to not need this sort of dependency, and try to avoid building standard libraries and runtimes in the same derivation as the compiler produces code using them. Instead strive to build those like a normal library, using the newly-built compiler just as a normal library would. In short, do not use this attribute unless you are packaging a compiler and are sure it is needed.
197209
198210Since these packages are able to run at build time, they are added to the `PATH`, as described above. But since these packages are only guaranteed to be able to run then, they shouldn’t persist as run-time dependencies. This isn’t currently enforced, but could be in the future.
199211
200212#### `depsHostHost` {#var-stdenv-depsHostHost}
201213
202−A list of dependencies whose host and target platforms match the new derivation’s host platform. This means a `0` host offset and `0` target offset from the new derivation’s host platform. These are packages used at run-time to generate code also used at run-time. In practice, this would usually be tools used by compilers for macros or a metaprogramming system, or libraries used by the macros or metaprogramming code itself. It’s always preferable to use a `depsBuildBuild` dependency in the derivation being built over a `depsHostHost` on the tool doing the building for this purpose.
214+A list of dependencies whose host and target platforms match the new derivation’s host platform. In practice, this would usually be tools used by compilers for macros or a metaprogramming system, or libraries used by the macros or metaprogramming code itself. It’s always preferable to use a `depsBuildBuild` dependency in the derivation being built over a `depsHostHost` on the tool doing the building for this purpose.
203215
204216#### `buildInputs` {#var-stdenv-buildInputs}
205217
206−A list of dependencies whose host platform and target platform match the new derivation’s. This means a `0` host offset and a `1` target offset from the new derivation’s host platform. This would be called `depsHostTarget` but for historical continuity. If the dependency doesn’t care about the target platform (i.e. isn’t a compiler or similar tool), put it here, rather than in `depsBuildBuild`.
218+A list of dependencies whose host platform and target platform match the new derivation’s. This would be called `depsHostTarget` but for historical continuity. If the dependency doesn’t care about the target platform (i.e. isn’t a compiler or similar tool), put it here, rather than in `depsBuildBuild`.
207219
208220These are often programs and libraries used by the new derivation at *run*-time, but that isn’t always the case. For example, the machine code in a statically-linked library is only used at run-time, but the derivation containing the library is only needed at build-time. Even in the dynamic case, the library may also be needed at build-time to appease the linker.
209221
210222#### `depsTargetTarget` {#var-stdenv-depsTargetTarget}
211223
212−A list of dependencies whose host platform matches the new derivation’s target platform. This means a `1` offset from the new derivation’s platforms. These are packages that run on the target platform, e.g. the standard library or run-time deps of standard library that a compiler insists on knowing about. It’s poor form in almost all cases for a package to depend on another from a future stage \[future stage corresponding to positive offset\]. Do not use this attribute unless you are packaging a compiler and are sure it is needed.
224+A list of dependencies whose host platform matches the new derivation’s target platform. These are packages that run on the target platform, e.g. the standard library or run-time deps of standard library that a compiler insists on knowing about. It’s poor form in almost all cases for a package to depend on another from a future stage \[future stage corresponding to positive offset\]. Do not use this attribute unless you are packaging a compiler and are sure it is needed.
213225
214226#### `depsBuildBuildPropagated` {#var-stdenv-depsBuildBuildPropagated}
215227
@@ -305,12 +317,72 @@ The script will be usually run from the root of the Nixpkgs repository but you s
305317
306318For information about how to run the updates, execute `nix-shell maintainers/scripts/update.nix`.
307319
320+### Recursive attributes in `mkDerivation`
321+
322+If you pass a function to `mkDerivation`, it will receive as its argument the final arguments, including the overrides when reinvoked via `overrideAttrs`. For example:
323+
324+```nix
325+mkDerivation (finalAttrs: {
326+ pname = "hello";
327+ withFeature = true;
328+ configureFlags =
329+ lib.optionals finalAttrs.withFeature ["--with-feature"];
330+})
331+```
332+
333+Note that this does not use the `rec` keyword to reuse `withFeature` in `configureFlags`.
334+The `rec` keyword works at the syntax level and is unaware of overriding.
335+
336+Instead, the definition references `finalAttrs`, allowing users to change `withFeature`
337+consistently with `overrideAttrs`.
338+
339+`finalAttrs` also contains the attribute `finalPackage`, which includes the output paths, etc.
340+
341+Let's look at a more elaborate example to understand the differences between
342+various bindings:
343+
344+```nix
345+# `pkg` is the _original_ definition (for illustration purposes)
346+let pkg =
347+ mkDerivation (finalAttrs: {
348+ # ...
349+
350+ # An example attribute
351+ packages = [];
352+
353+ # `passthru.tests` is a commonly defined attribute.
354+ passthru.tests.simple = f finalAttrs.finalPackage;
355+
356+ # An example of an attribute containing a function
357+ passthru.appendPackages = packages':
358+ finalAttrs.finalPackage.overrideAttrs (newSelf: super: {
359+ packages = super.packages ++ packages';
360+ });
361+
362+ # For illustration purposes; referenced as
363+ # `(pkg.overrideAttrs(x)).finalAttrs` etc in the text below.
364+ passthru.finalAttrs = finalAttrs;
365+ passthru.original = pkg;
366+ });
367+in pkg
368+```
369+
370+Unlike the `pkg` binding in the above example, the `finalAttrs` parameter always references the final attributes. For instance `(pkg.overrideAttrs(x)).finalAttrs.finalPackage` is identical to `pkg.overrideAttrs(x)`, whereas `(pkg.overrideAttrs(x)).original` is the same as the original `pkg`.
371+
372+See also the section about [`passthru.tests`](#var-meta-tests).
373+
308374## Phases {#sec-stdenv-phases}
309375
310−The generic builder has a number of *phases*. Package builds are split into phases to make it easier to override specific parts of the build (e.g., unpacking the sources or installing the binaries). Furthermore, it allows a nicer presentation of build logs in the Nix build farm.
376+`stdenv.mkDerivation` sets the Nix [derivation](https://nixos.org/manual/nix/stable/expressions/derivations.html#derivations)'s builder to a script that loads the stdenv `setup.sh` bash library and calls `genericBuild`. Most packaging functions rely on this default builder.
377+
378+This generic command invokes a number of *phases*. Package builds are split into phases to make it easier to override specific parts of the build (e.g., unpacking the sources or installing the binaries).
311379
312380Each phase can be overridden in its entirety either by setting the environment variable `namePhase` to a string containing some shell commands to be executed, or by redefining the shell function `namePhase`. The former is convenient to override a phase from the derivation, while the latter is convenient from a build script. However, typically one only wants to *add* some commands to a phase, e.g. by defining `postInstall` or `preFixup`, as skipping some of the default actions may have unexpected consequences. The default script for each phase is defined in the file `pkgs/stdenv/generic/setup.sh`.
313381
382+When overriding a phase, for example `installPhase`, it is important to start with `runHook preInstall` and end it with `runHook postInstall`, otherwise `preInstall` and `postInstall` will not be run. Even if you don't use them directly, it is good practice to do so anyways for downstream users who would want to add a `postInstall` by overriding your derivation.
383+
384+While inside an interactive `nix-shell`, if you wanted to run all phases in the order they would be run in an actual build, you can invoke `genericBuild` yourself.
385+
314386### Controlling phases {#ssec-controlling-phases}
315387
316388There are a number of variables that control what phases are executed and in what order:
@@ -321,7 +393,8 @@ There are a number of variables that control what phases are executed and in wha
321393
322394Specifies the phases. You can change the order in which phases are executed, or add new phases, by setting this variable. If it’s not set, the default value is used, which is `$prePhases unpackPhase patchPhase $preConfigurePhases configurePhase $preBuildPhases buildPhase checkPhase $preInstallPhases installPhase fixupPhase installCheckPhase $preDistPhases distPhase $postPhases`.
323395
324−Usually, if you just want to add a few phases, it’s more convenient to set one of the variables below (such as `preInstallPhases`), as you then don’t specify all the normal phases.
396+It is discouraged to set this variable, as it is easy to miss some important functionality hidden in some of the less obviously needed phases (like `fixupPhase` which patches the shebang of scripts).
397+Usually, if you just want to add a few phases, it’s more convenient to set one of the variables below (such as `preInstallPhases`).
325398
326399##### `prePhases` {#var-stdenv-prePhases}
327400
@@ -373,11 +446,11 @@ Additional file types can be supported by setting the `unpackCmd` variable (see
373446
374447##### `srcs` / `src` {#var-stdenv-src}
375448
376−The list of source files or directories to be unpacked or copied. One of these must be set.
449+The list of source files or directories to be unpacked or copied. One of these must be set. Note that if you use `srcs`, you should also set `sourceRoot` or `setSourceRoot`.
377450
378451##### `sourceRoot` {#var-stdenv-sourceRoot}
379452
380−After running `unpackPhase`, the generic builder changes the current directory to the directory created by unpacking the sources. If there are multiple source directories, you should set `sourceRoot` to the name of the intended directory.
453+After running `unpackPhase`, the generic builder changes the current directory to the directory created by unpacking the sources. If there are multiple source directories, you should set `sourceRoot` to the name of the intended directory. Set `sourceRoot = ".";` if you use `srcs` and control the unpack phase yourself.
381454
382455##### `setSourceRoot` {#var-stdenv-setSourceRoot}
383456
@@ -463,6 +536,12 @@ The prefix under which the package must be installed, passed via the `--prefix`
463536
464537The key to use when specifying the prefix. By default, this is set to `--prefix=` as that is used by the majority of packages.
465538
539+##### `dontAddStaticConfigureFlags`
540+
541+By default, when building statically, stdenv will try to add build system appropriate configure flags to try to enable static builds.
542+
543+If this is undesirable, set this variable to true.
544+
466545##### `dontAddDisableDepTrack` {#var-stdenv-dontAddDisableDepTrack}
467546
468547By default, the flag `--disable-dependency-tracking` is added to the configure flags to speed up Automake-based builds. If this is undesirable, set this variable to true.
@@ -475,7 +554,7 @@ By default, the configure phase applies some special hackery to all files called
475554
476555By default, when the configure script has `--enable-static`, the option `--disable-static` is added to the configure flags.
477556
478−If this is undesirable, set this variable to true.
557+If this is undesirable, set this variable to true. It is automatically set to true when building statically, for example through `pkgsStatic`.
479558
480559##### `configurePlatforms` {#var-stdenv-configurePlatforms}
481560
@@ -708,6 +787,8 @@ to `~/.gdbinit`. GDB will then be able to find debug information installed via `
708787
709788The installCheck phase checks whether the package was installed correctly by running its test suite against the installed directories. The default `installCheck` calls `make installcheck`.
710789
790+It is often better to add tests that are not part of the source distribution to `passthru.tests` (see <xref linkend="var-meta-tests"/>). This avoids adding overhead to every build and enables us to run them independently.
791+
711792#### Variables controlling the installCheck phase {#variables-controlling-the-installcheck-phase}
712793
713794##### `doInstallCheck` {#var-stdenv-doInstallCheck}
@@ -770,13 +851,13 @@ Hook executed at the start of the distribution phase.
770851
771852Hook executed at the end of the distribution phase.
772853
773−## Shell functions {#ssec-stdenv-functions}
854+## Shell functions and utilities {#ssec-stdenv-functions}
774855
775856The standard environment provides a number of useful functions.
776857
777858### `makeWrapper` \<executable\> \<wrapperfile\> \<args\> {#fun-makeWrapper}
778859
779−Constructs a wrapper for a program with various possible arguments. For example:
860+Constructs a wrapper for a program with various possible arguments. It is defined as part of 2 setup-hooks named `makeWrapper` and `makeBinaryWrapper` that implement the same bash functions. Hence, to use it you have to add `makeWrapper` to your `nativeBuildInputs`. Here's an example usage:
780861
781862```bash
782863# adds `FOOBAR=baz` to `$out/bin/foo`’s environment
@@ -788,9 +869,24 @@ makeWrapper $out/bin/foo $wrapperfile --set FOOBAR baz
788869makeWrapper $out/bin/foo $wrapperfile --prefix PATH : ${lib.makeBinPath [ hello git ]}
789870```
790871
791−There’s many more kinds of arguments, they are documented in `nixpkgs/pkgs/build-support/setup-hooks/make-wrapper.sh`.
872+There’s many more kinds of arguments, they are documented in `nixpkgs/pkgs/build-support/setup-hooks/make-wrapper.sh` for the `makeWrapper` implementation and in `nixpkgs/pkgs/build-support/setup-hooks/make-binary-wrapper.sh` for the `makeBinaryWrapper` implementation.
873+
874+`wrapProgram` is a convenience function you probably want to use most of the time, implemented by both `makeWrapper` and `makeBinaryWrapper`.
875+
876+Using the `makeBinaryWrapper` implementation is usually preferred, as it creates a tiny _compiled_ wrapper executable, that can be used as a shebang interpreter. This is needed mostly on Darwin, where shebangs cannot point to scripts, [due to a limitation with the `execve`-syscall](https://stackoverflow.com/questions/67100831/macos-shebang-with-absolute-path-not-working). Compiled wrappers generated by `makeBinaryWrapper` can be inspected with `less <path-to-wrapper>` - by scrolling past the binary data you should be able to see the shell command that generated the executable and there see the environment variables that were injected into the wrapper.
877+
878+### `remove-references-to -t` \<storepath\> [ `-t` \<storepath\> ... ] \<file\> ... {#fun-remove-references-to}
792879
793−`wrapProgram` is a convenience function you probably want to use most of the time.
880+Removes the references of the specified files to the specified store files. This is done without changing the size of the file by replacing the hash by `eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`, and should work on compiled executables. This is meant to be used to remove the dependency of the output on inputs that are known to be unnecessary at runtime. Of course, reckless usage will break the patched programs.
881+To use this, add `removeReferencesTo` to `nativeBuildInputs`.
882+
883+As `remove-references-to` is an actual executable and not a shell function, it can be used with `find`.
884+Example removing all references to the compiler in the output:
885+```nix
886+postInstall = ''
887+ find "$out" -type f -exec remove-references-to -t ${stdenv.cc} '{}' +
888+'';
889+```
794890
795891### `substitute` \<infile\> \<outfile\> \<subs\> {#fun-substitute}
796892
@@ -865,9 +961,9 @@ someVar=$(stripHash $name)
865961
866962### `wrapProgram` \<executable\> \<makeWrapperArgs\> {#fun-wrapProgram}
867963
868−Convenience function for `makeWrapper` that automatically creates a sane wrapper file. It takes all the same arguments as `makeWrapper`, except for `--argv0`.
964+Convenience function for `makeWrapper` that replaces `<\executable\>` with a wrapper that executes the original program. It takes all the same arguments as `makeWrapper`, except for `--inherit-argv0` (used by the `makeBinaryWrapper` implementation) and `--argv0` (used by both `makeWrapper` and `makeBinaryWrapper` wrapper implementations).
869965
870−It cannot be applied multiple times, since it will overwrite the wrapper file.
966+If you will apply it multiple times, it will overwrite the wrapper file and you will end up with double wrapping, which should be avoided.
871967
872968## Package setup hooks {#ssec-setup-hooks}
873969
@@ -1001,7 +1097,7 @@ You can also specify a `runtimeDependencies` variable which lists dependencies t
10011097
10021098In certain situations you may want to run the main command (`autoPatchelf`) of the setup hook on a file or a set of directories instead of unconditionally patching all outputs. This can be done by setting the `dontAutoPatchelf` environment variable to a non-empty value.
10031099
1004−By default `autoPatchelf` will fail as soon as any ELF file requires a dependency which cannot be resolved via the given build inputs. In some situations you might prefer to just leave missing dependencies unpatched and continue to patch the rest. This can be achieved by setting the `autoPatchelfIgnoreMissingDeps` environment variable to a non-empty value.
1100+By default `autoPatchelf` will fail as soon as any ELF file requires a dependency which cannot be resolved via the given build inputs. In some situations you might prefer to just leave missing dependencies unpatched and continue to patch the rest. This can be achieved by setting the `autoPatchelfIgnoreMissingDeps` environment variable to a non-empty value. `autoPatchelfIgnoreMissingDeps` can be set to a list like `autoPatchelfIgnoreMissingDeps = [ "libcuda.so.1" "libcudart.so.1" ];` or to simply `[ "*" ]` to ignore all missing dependencies.
10051101
10061102The `autoPatchelf` command also recognizes a `--no-recurse` command line flag, which prevents it from recursing into subdirectories.
10071103
@@ -1119,9 +1215,13 @@ There are flags available to harden packages at compile or link-time. These can
11191215
11201216Both parameters take a list of flags as strings. The special `"all"` flag can be passed to `hardeningDisable` to turn off all hardening. These flags can also be used as environment variables for testing or development purposes.
11211217
1218+For more in-depth information on these hardening flags and hardening in general, refer to the [Debian Wiki](https://wiki.debian.org/Hardening), [Ubuntu Wiki](https://wiki.ubuntu.com/Security/Features), [Gentoo Wiki](https://wiki.gentoo.org/wiki/Project:Hardened), and the [Arch Wiki](https://wiki.archlinux.org/title/Security).
1219+
1220+### Hardening flags enabled by default {#sec-hardening-flags-enabled-by-default}
1221+
11221222The following flags are enabled by default and might require disabling with `hardeningDisable` if the program to package is incompatible.
11231223
1124−### `format` {#format}
1224+#### `format` {#format}
11251225
11261226Adds the `-Wformat -Wformat-security -Werror=format-security` compiler options. At present, this warns about calls to `printf` and `scanf` functions where the format string is not a string literal and there are no format arguments, as in `printf(foo);`. This may be a security hole if the format string came from untrusted input and contains `%n`.
11271227
@@ -1134,7 +1234,7 @@ This needs to be turned off or fixed for errors similar to:
11341234cc1plus: some warnings being treated as errors
11351235```
11361236
1137−### `stackprotector` {#stackprotector}
1237+#### `stackprotector` {#stackprotector}
11381238
11391239Adds the `-fstack-protector-strong --param ssp-buffer-size=4` compiler options. This adds safety checks against stack overwrites rendering many potential code injection attacks into aborting situations. In the best case this turns code injection vulnerabilities into denial of service or into non-issues (depending on the application).
11401240
@@ -1145,7 +1245,7 @@ bin/blib.a(bios_console.o): In function `bios_handle_cup':
11451245/tmp/nix-build-ipxe-20141124-5cbdc41.drv-0/ipxe-5cbdc41/src/arch/i386/firmware/pcbios/bios_console.c:86: undefined reference to `__stack_chk_fail'
11461246```
11471247
1148−### `fortify` {#fortify}
1248+#### `fortify` {#fortify}
11491249
11501250Adds the `-O2 -D_FORTIFY_SOURCE=2` compiler options. During code generation the compiler knows a great deal of information about buffer sizes (where possible), and attempts to replace insecure unlimited length buffer function calls with length-limited ones. This is especially useful for old, crufty code. Additionally, format strings in writable memory that contain `%n` are blocked. If an application depends on such a format string, it will need to be worked around.
11511251
@@ -1166,7 +1266,7 @@ installwatch.c:3751:5: error: conflicting types for '__open_2'
11661266fcntl2.h:50:4: error: call to '__open_missing_mode' declared with attribute error: open with O_CREAT or O_TMPFILE in second argument needs 3 arguments
11671267```
11681268
1169−### `pic` {#pic}
1269+#### `pic` {#pic}
11701270
11711271Adds the `-fPIC` compiler options. This options adds support for position independent code in shared libraries and thus making ASLR possible.
11721272
@@ -1179,19 +1279,19 @@ ccbLfRgg.s: Assembler messages:
11791279ccbLfRgg.s:33: Error: missing or invalid displacement expression `private_key_len@GOTOFF'
11801280```
11811281
1182−### `strictoverflow` {#strictoverflow}
1282+#### `strictoverflow` {#strictoverflow}
11831283
11841284Signed integer overflow is undefined behaviour according to the C standard. If it happens, it is an error in the program as it should check for overflow before it can happen, not afterwards. GCC provides built-in functions to perform arithmetic with overflow checking, which are correct and faster than any custom implementation. As a workaround, the option `-fno-strict-overflow` makes gcc behave as if signed integer overflows were defined.
11851285
11861286This flag should not trigger any build or runtime errors.
11871287
1188−### `relro` {#relro}
1288+#### `relro` {#relro}
11891289
11901290Adds the `-z relro` linker option. During program load, several ELF memory sections need to be written to by the linker, but can be turned read-only before turning over control to the program. This prevents some GOT (and .dtors) overwrite attacks, but at least the part of the GOT used by the dynamic linker (.got.plt) is still vulnerable.
11911291
11921292This flag can break dynamic shared object loading. For instance, the module systems of Xorg and OpenCV are incompatible with this flag. In almost all cases the `bindnow` flag must also be disabled and incompatible programs typically fail with similar errors at runtime.
11931293
1194−### `bindnow` {#bindnow}
1294+#### `bindnow` {#bindnow}
11951295
11961296Adds the `-z bindnow` linker option. During program load, all dynamic symbols are resolved, allowing for the complete GOT to be marked read-only (due to `relro`). This prevents GOT overwrite attacks. For very large applications, this can incur some performance loss during initial load while symbols are resolved, but this shouldn’t be an issue for daemons.
11971297
@@ -1201,16 +1301,22 @@ This flag can break dynamic shared object loading. For instance, the module syst
12011301intel_drv.so: undefined symbol: vgaHWFreeHWRec
12021302```
12031303
1304+### Hardening flags disabled by default {#sec-hardening-flags-disabled-by-default}
1305+
12041306The following flags are disabled by default and should be enabled with `hardeningEnable` for packages that take untrusted input like network services.
12051307
1206−### `pie` {#pie}
1308+#### `pie` {#pie}
1309+
1310+This flag is disabled by default for normal `glibc` based NixOS package builds, but enabled by default for `musl` based package builds.
12071311
12081312Adds the `-fPIE` compiler and `-pie` linker options. Position Independent Executables are needed to take advantage of Address Space Layout Randomization, supported by modern kernel versions. While ASLR can already be enforced for data areas in the stack and heap (brk and mmap), the code areas must be compiled as position-independent. Shared libraries already do this with the `pic` flag, so they gain ASLR automatically, but binary .text regions need to be build with `pie` to gain ASLR. When this happens, ROP attacks are much harder since there are no static locations to bounce off of during a memory corruption attack.
12091313
1210−For more in-depth information on these hardening flags and hardening in general, refer to the [Debian Wiki](https://wiki.debian.org/Hardening), [Ubuntu Wiki](https://wiki.ubuntu.com/Security/Features), [Gentoo Wiki](https://wiki.gentoo.org/wiki/Project:Hardened), and the [Arch Wiki](https://wiki.archlinux.org/index.php/DeveloperWiki:Security).
1314+Static libraries need to be compiled with `-fPIE` so that executables can link them in with the `-pie` linker option.
1315+If the libraries lack `-fPIE`, you will get the error `recompile with -fPIE`.
12111316
12121317[^footnote-stdenv-ignored-build-platform]: The build platform is ignored because it is a mere implementation detail of the package satisfying the dependency: As a general programming principle, dependencies are always *specified* as interfaces, not concrete implementation.
12131318[^footnote-stdenv-native-dependencies-in-path]: Currently, this means for native builds all dependencies are put on the `PATH`. But in the future that may not be the case for sake of matching cross: the platforms would be assumed to be unique for native and cross builds alike, so only the `depsBuild*` and `nativeBuildInputs` would be added to the `PATH`.
1319+[^footnote-stdenv-propagated-dependencies]: Nix itself already takes a package’s transitive dependencies into account, but this propagation ensures nixpkgs-specific infrastructure like setup hooks (mentioned above) also are run as if the propagated dependency.
12141320[^footnote-stdenv-find-inputs-location]: The `findInputs` function, currently residing in `pkgs/stdenv/generic/setup.sh`, implements the propagation logic.
12151321[^footnote-stdenv-sys-lib-search-path]: It clears the `sys_lib_*search_path` variables in the Libtool script to prevent Libtool from using libraries in `/usr/lib` and such.
12161322[^footnote-stdenv-build-time-guessing-impurity]: Eventually these will be passed building natively as well, to improve determinism: build-time guessing, as is done today, is a risk of impurity.
doc/using/overlays.chapter.md+21−3
@@ -77,7 +77,7 @@ In Nixpkgs, we have multiple implementations of the BLAS/LAPACK numerical linear
7777
7878 The Nixpkgs attribute is `openblas` for ILP64 (integer width = 64 bits) and `openblasCompat` for LP64 (integer width = 32 bits). `openblasCompat` is the default.
7979
80−- [LAPACK reference](http://www.netlib.org/lapack/) (also provides BLAS)
80+- [LAPACK reference](http://www.netlib.org/lapack/) (also provides BLAS and CBLAS)
8181
8282 The Nixpkgs attribute is `lapack-reference`.
8383
@@ -112,12 +112,28 @@ self: super:
112112This overlay uses Intel's MKL library for both BLAS and LAPACK interfaces. Note that the same can be accomplished at runtime using `LD_LIBRARY_PATH` of `libblas.so.3` and `liblapack.so.3`. For instance:
113113
114114```ShellSession
115−$ LD_LIBRARY_PATH=$(nix-build -A mkl)/lib:$LD_LIBRARY_PATH nix-shell -p octave --run octave
115+$ LD_LIBRARY_PATH=$(nix-build -A mkl)/lib${LD_LIBRARY_PATH:+:}$LD_LIBRARY_PATH nix-shell -p octave --run octave
116116```
117117
118118Intel MKL requires an `openmp` implementation when running with multiple processors. By default, `mkl` will use Intel's `iomp` implementation if no other is specified, but this is a runtime-only dependency and binary compatible with the LLVM implementation. To use that one instead, Intel recommends users set it with `LD_PRELOAD`. Note that `mkl` is only available on `x86_64-linux` and `x86_64-darwin`. Moreover, Hydra is not building and distributing pre-compiled binaries using it.
119119
120−For BLAS/LAPACK switching to work correctly, all packages must depend on `blas` or `lapack`. This ensures that only one BLAS/LAPACK library is used at one time. There are two versions of BLAS/LAPACK currently in the wild, `LP64` (integer size = 32 bits) and `ILP64` (integer size = 64 bits). Some software needs special flags or patches to work with `ILP64`. You can check if `ILP64` is used in Nixpkgs with `blas.isILP64` and `lapack.isILP64`. Some software does NOT work with `ILP64`, and derivations need to specify an assertion to prevent this. You can prevent `ILP64` from being used with the following:
120+To override `blas` and `lapack` with its reference implementations (i.e. for development purposes), one can use the following overlay:
121+
122+```nix
123+self: super:
124+
125+{
126+ blas = super.blas.override {
127+ blasProvider = self.lapack-reference;
128+ };
129+
130+ lapack = super.lapack.override {
131+ lapackProvider = self.lapack-reference;
132+ };
133+}
134+```
135+
136+For BLAS/LAPACK switching to work correctly, all packages must depend on `blas` or `lapack`. This ensures that only one BLAS/LAPACK library is used at one time. There are two versions of BLAS/LAPACK currently in the wild, `LP64` (integer size = 32 bits) and `ILP64` (integer size = 64 bits). The attributes `blas` and `lapack` are `LP64` by default. Their `ILP64` version are provided through the attributes `blas-ilp64` and `lapack-ilp64`. Some software needs special flags or patches to work with `ILP64`. You can check if `ILP64` is used in Nixpkgs with `blas.isILP64` and `lapack.isILP64`. Some software does NOT work with `ILP64`, and derivations need to specify an assertion to prevent this. You can prevent `ILP64` from being used with the following:
121137
122138```nix
123139{ stdenv, blas, lapack, ... }:
@@ -138,6 +154,8 @@ All programs that are built with [MPI](https://en.wikipedia.org/wiki/Message_Pas
138154
139155- [MPICH](https://www.mpich.org/), attribute name `mpich`
140156
157+- [MVAPICH](https://mvapich.cse.ohio-state.edu/), attribute name `mvapich`
158+
141159To provide MPI enabled applications that use `MPICH`, instead of the default `Open MPI`, simply use the following overlay:
142160
143161```nix
doc/using/overrides.chapter.md+6−2
@@ -39,14 +39,18 @@ The function `overrideAttrs` allows overriding the attribute set passed to a `st
3939Example usage:
4040
4141```nix
42−helloWithDebug = pkgs.hello.overrideAttrs (oldAttrs: rec {
42+helloWithDebug = pkgs.hello.overrideAttrs (finalAttrs: previousAttrs: {
4343 separateDebugInfo = true;
4444});
4545```
4646
4747In the above example, the `separateDebugInfo` attribute is overridden to be true, thus building debug info for `helloWithDebug`, while all other attributes will be retained from the original `hello` package.
4848
49−The argument `oldAttrs` is conventionally used to refer to the attr set originally passed to `stdenv.mkDerivation`.
49+The argument `previousAttrs` is conventionally used to refer to the attr set originally passed to `stdenv.mkDerivation`.
50+
51+The argument `finalAttrs` refers to the final attributes passed to `mkDerivation`, plus the `finalPackage` attribute which is equal to the result of `mkDerivation` or subsequent `overrideAttrs` calls.
52+
53+If only a one-argument function is written, the argument has the meaning of `previousAttrs`.
5054
5155::: {.note}
5256Note that `separateDebugInfo` is processed only by the `stdenv.mkDerivation` function, not the generated, raw Nix derivation. Thus, using `overrideDerivation` will not work in this case, as it overrides only the attributes of the final derivation. It is for this reason that `overrideAttrs` should be preferred in (almost) all cases to `overrideDerivation`, i.e. to allow using `stdenv.mkDerivation` to process input arguments, as well as the fact that it is easier to use (you can use the same attribute names you see in your Nix code, instead of the ones generated (e.g. `buildInputs` vs `nativeBuildInputs`), and it involves less typing).
flake.nix+9−41
@@ -11,55 +11,23 @@
1111
1212 lib = import ./lib;
1313
14− systems = [
15− "x86_64-linux"
16− "i686-linux"
17− "x86_64-darwin"
18− "aarch64-linux"
19− "armv6l-linux"
20− "armv7l-linux"
21− "aarch64-darwin"
22− ];
14+ systems = lib.systems.supported.hydra;
2315
2416 forAllSystems = f: lib.genAttrs systems (system: f system);
2517
2618 in
2719 {
2820 lib = lib.extend (final: prev: {
29− nixosSystem = { modules, ... } @ args:
30− import ./nixos/lib/eval-config.nix (args // {
31− modules =
32− let
33− vmConfig = (import ./nixos/lib/eval-config.nix
34− (args // {
35− modules = modules ++ [ ./nixos/modules/virtualisation/qemu-vm.nix ];
36− })).config;
3721
38− vmWithBootLoaderConfig = (import ./nixos/lib/eval-config.nix
39− (args // {
40− modules = modules ++ [
41− ./nixos/modules/virtualisation/qemu-vm.nix
42− { virtualisation.useBootLoader = true; }
43− ({ config, ... }: {
44− virtualisation.useEFIBoot =
45− config.boot.loader.systemd-boot.enable ||
46− config.boot.loader.efi.canTouchEfiVariables;
47− })
48− ];
49− })).config;
50− in
51− modules ++ [
52− {
53− system.nixos.versionSuffix =
54− ".${final.substring 0 8 (self.lastModifiedDate or self.lastModified or "19700101")}.${self.shortRev or "dirty"}";
55− system.nixos.revision = final.mkIf (self ? rev) self.rev;
22+ nixos = import ./nixos/lib { lib = final; };
5623
57− system.build = {
58− vm = vmConfig.system.build.vm;
59− vmWithBootLoader = vmWithBootLoaderConfig.system.build.vm;
60− };
61− }
62− ];
24+ nixosSystem = args:
25+ import ./nixos/lib/eval-config.nix (args // {
26+ modules = args.modules ++ [ {
27+ system.nixos.versionSuffix =
28+ ".${final.substring 0 8 (self.lastModifiedDate or self.lastModified or "19700101")}.${self.shortRev or "dirty"}";
29+ system.nixos.revision = final.mkIf (self ? rev) self.rev;
30+ } ];
6331 });
6432 });
6533
lib/asserts.nix+10−12
@@ -2,35 +2,33 @@
22
33rec {
44
5− /* Print a trace message if pred is false.
5+ /* Throw if pred is false, else return pred.
66 Intended to be used to augment asserts with helpful error messages.
77
88 Example:
99 assertMsg false "nope"
10− => false
11− stderr> trace: nope
10+ stderr> error: nope
1211
13− assert (assertMsg ("foo" == "bar") "foo is not bar, silly"); ""
14− stderr> trace: foo is not bar, silly
15− stderr> assert failed at …
12+ assert assertMsg ("foo" == "bar") "foo is not bar, silly"; ""
13+ stderr> error: foo is not bar, silly
1614
1715 Type:
1816 assertMsg :: Bool -> String -> Bool
1917 */
2018 # TODO(Profpatsch): add tests that check stderr
2119 assertMsg = pred: msg:
22− if pred
23− then true
24− else builtins.trace msg false;
20+ pred || builtins.throw msg;
2521
2622 /* Specialized `assertMsg` for checking if val is one of the elements
2723 of a list. Useful for checking enums.
2824
2925 Example:
30− let sslLibrary = "libressl"
26+ let sslLibrary = "libressl";
3127 in assertOneOf "sslLibrary" sslLibrary [ "openssl" "bearssl" ]
32− => false
33− stderr> trace: sslLibrary must be one of "openssl", "bearssl", but is: "libressl"
28+ stderr> error: sslLibrary must be one of [
29+ stderr> "openssl"
30+ stderr> "bearssl"
31+ stderr> ], but is: "libressl"
3432
3533 Type:
3634 assertOneOf :: String -> ComparableVal -> List ComparableVal -> Bool
lib/attrsets.nix+141−29
@@ -3,9 +3,9 @@
33
44let
55 inherit (builtins) head tail length;
6− inherit (lib.trivial) and;
7− inherit (lib.strings) concatStringsSep sanitizeDerivationName;
8− inherit (lib.lists) fold concatMap concatLists;
6+ inherit (lib.trivial) id;
7+ inherit (lib.strings) concatStringsSep concatMapStringsSep escapeNixIdentifier sanitizeDerivationName;
8+ inherit (lib.lists) foldr foldl' concatMap concatLists elemAt all partition groupBy take foldl;
99in
1010
1111rec {
@@ -55,10 +55,13 @@ rec {
5555 => { a = { b = 3; }; }
5656 */
5757 setAttrByPath = attrPath: value:
58− if attrPath == [] then value
59− else listToAttrs
60− [ { name = head attrPath; value = setAttrByPath (tail attrPath) value; } ];
61−
58+ let
59+ len = length attrPath;
60+ atDepth = n:
61+ if n == len
62+ then value
63+ else { ${elemAt attrPath n} = atDepth (n + 1); };
64+ in atDepth 0;
6265
6366 /* Like `attrByPath' without a default value. If it doesn't find the
6467 path it will throw.
@@ -70,10 +73,107 @@ rec {
7073 getAttrFromPath ["z" "z"] x
7174 => error: cannot find attribute `z.z'
7275 */
73− getAttrFromPath = attrPath: set:
76+ getAttrFromPath = attrPath:
7477 let errorMsg = "cannot find attribute `" + concatStringsSep "." attrPath + "'";
75− in attrByPath attrPath (abort errorMsg) set;
78+ in attrByPath attrPath (abort errorMsg);
79+
80+
81+ /* Update or set specific paths of an attribute set.
82+
83+ Takes a list of updates to apply and an attribute set to apply them to,
84+ and returns the attribute set with the updates applied. Updates are
85+ represented as { path = ...; update = ...; } values, where `path` is a
86+ list of strings representing the attribute path that should be updated,
87+ and `update` is a function that takes the old value at that attribute path
88+ as an argument and returns the new
89+ value it should be.
90+
91+ Properties:
92+ - Updates to deeper attribute paths are applied before updates to more
93+ shallow attribute paths
94+ - Multiple updates to the same attribute path are applied in the order
95+ they appear in the update list
96+ - If any but the last `path` element leads into a value that is not an
97+ attribute set, an error is thrown
98+ - If there is an update for an attribute path that doesn't exist,
99+ accessing the argument in the update function causes an error, but
100+ intermediate attribute sets are implicitly created as needed
76101
102+ Example:
103+ updateManyAttrsByPath [
104+ {
105+ path = [ "a" "b" ];
106+ update = old: { d = old.c; };
107+ }
108+ {
109+ path = [ "a" "b" "c" ];
110+ update = old: old + 1;
111+ }
112+ {
113+ path = [ "x" "y" ];
114+ update = old: "xy";
115+ }
116+ ] { a.b.c = 0; }
117+ => { a = { b = { d = 1; }; }; x = { y = "xy"; }; }
118+ */
119+ updateManyAttrsByPath = let
120+ # When recursing into attributes, instead of updating the `path` of each
121+ # update using `tail`, which needs to allocate an entirely new list,
122+ # we just pass a prefix length to use and make sure to only look at the
123+ # path without the prefix length, so that we can reuse the original list
124+ # entries.
125+ go = prefixLength: hasValue: value: updates:
126+ let
127+ # Splits updates into ones on this level (split.right)
128+ # And ones on levels further down (split.wrong)
129+ split = partition (el: length el.path == prefixLength) updates;
130+
131+ # Groups updates on further down levels into the attributes they modify
132+ nested = groupBy (el: elemAt el.path prefixLength) split.wrong;
133+
134+ # Applies only nested modification to the input value
135+ withNestedMods =
136+ # Return the value directly if we don't have any nested modifications
137+ if split.wrong == [] then
138+ if hasValue then value
139+ else
140+ # Throw an error if there is no value. This `head` call here is
141+ # safe, but only in this branch since `go` could only be called
142+ # with `hasValue == false` for nested updates, in which case
143+ # it's also always called with at least one update
144+ let updatePath = (head split.right).path; in
145+ throw
146+ ( "updateManyAttrsByPath: Path '${showAttrPath updatePath}' does "
147+ + "not exist in the given value, but the first update to this "
148+ + "path tries to access the existing value.")
149+ else
150+ # If there are nested modifications, try to apply them to the value
151+ if ! hasValue then
152+ # But if we don't have a value, just use an empty attribute set
153+ # as the value, but simplify the code a bit
154+ mapAttrs (name: go (prefixLength + 1) false null) nested
155+ else if isAttrs value then
156+ # If we do have a value and it's an attribute set, override it
157+ # with the nested modifications
158+ value //
159+ mapAttrs (name: go (prefixLength + 1) (value ? ${name}) value.${name}) nested
160+ else
161+ # However if it's not an attribute set, we can't apply the nested
162+ # modifications, throw an error
163+ let updatePath = (head split.wrong).path; in
164+ throw
165+ ( "updateManyAttrsByPath: Path '${showAttrPath updatePath}' needs to "
166+ + "be updated, but path '${showAttrPath (take prefixLength updatePath)}' "
167+ + "of the given value is not an attribute set, so we can't "
168+ + "update an attribute inside of it.");
169+
170+ # We get the final result by applying all the updates on this level
171+ # after having applied all the nested updates
172+ # We use foldl instead of foldl' so that in case of multiple updates,
173+ # intermediate values aren't evaluated if not needed
174+ in foldl (acc: el: el.update acc) withNestedMods split.right;
175+
176+ in updates: value: go 0 true value updates;
77177
78178 /* Return the specified attributes from a set.
79179
@@ -151,12 +251,12 @@ rec {
151251 foldAttrs (n: a: [n] ++ a) [] [{ a = 2; } { a = 3; }]
152252 => { a = [ 2 3 ]; }
153253 */
154− foldAttrs = op: nul: list_of_attrs:
155− fold (n: a:
156− fold (name: o:
254+ foldAttrs = op: nul:
255+ foldr (n: a:
256+ foldr (name: o:
157257 o // { ${name} = op n.${name} (a.${name} or nul); }
158258 ) a (attrNames n)
159− ) {} list_of_attrs;
259+ ) {};
160260
161261
162262 /* Recursively collect sets that verify a given predicate named `pred'
@@ -195,7 +295,7 @@ rec {
195295 ]
196296 */
197297 cartesianProductOfSets = attrsOfLists:
198− lib.foldl' (listOfAttrs: attrName:
298+ foldl' (listOfAttrs: attrName:
199299 concatMap (attrs:
200300 map (listValue: attrs // { ${attrName} = listValue; }) attrsOfLists.${attrName}
201301 ) listOfAttrs
@@ -273,7 +373,7 @@ rec {
273373
274374
275375 /* Like `mapAttrsRecursive', but it takes an additional predicate
276− function that tells it whether to recursive into an attribute
376+ function that tells it whether to recurse into an attribute
277377 set. If it returns false, `mapAttrsRecursiveCond' does not
278378 recurse, but does apply the map function. If it returns true, it
279379 does recurse, and does not apply the map function.
@@ -292,14 +392,14 @@ rec {
292392 */
293393 mapAttrsRecursiveCond = cond: f: set:
294394 let
295− recurse = path: set:
395+ recurse = path:
296396 let
297397 g =
298398 name: value:
299399 if isAttrs value && cond value
300400 then recurse (path ++ [name]) value
301401 else f (path ++ [name]) value;
302− in mapAttrs g set;
402+ in mapAttrs g;
303403 in recurse [] set;
304404
305405
@@ -324,7 +424,7 @@ rec {
324424 isDerivation "foobar"
325425 => false
326426 */
327− isDerivation = x: isAttrs x && x ? type && x.type == "derivation";
427+ isDerivation = x: x.type or null == "derivation";
328428
329429 /* Converts a store path to a fake derivation. */
330430 toDerivation = path:
@@ -366,7 +466,7 @@ rec {
366466 value = f name (catAttrs name sets);
367467 }) names);
368468
369− /* Implementation note: Common names appear multiple times in the list of
469+ /* Implementation note: Common names appear multiple times in the list of
370470 names, hopefully this does not affect the system because the maximal
371471 laziness avoid computing twice the same expression and listToAttrs does
372472 not care about duplicated attribute names.
@@ -375,7 +475,8 @@ rec {
375475 zipAttrsWith (name: values: values) [{a = "x";} {a = "y"; b = "z";}]
376476 => { a = ["x" "y"]; b = ["z"] }
377477 */
378− zipAttrsWith = f: sets: zipAttrsWithNames (concatMap attrNames sets) f sets;
478+ zipAttrsWith =
479+ builtins.zipAttrsWith or (f: sets: zipAttrsWithNames (concatMap attrNames sets) f sets);
379480 /* Like `zipAttrsWith' with `(name: values: values)' as the function.
380481
381482 Example:
@@ -416,8 +517,8 @@ rec {
416517 let f = attrPath:
417518 zipAttrsWith (n: values:
418519 let here = attrPath ++ [n]; in
419− if tail values == []
420− || pred here (head (tail values)) (head values) then
520+ if length values == 1
521+ || pred here (elemAt values 1) (head values) then
421522 head values
422523 else
423524 f here values
@@ -443,10 +544,7 @@ rec {
443544 }
444545
445546 */
446− recursiveUpdate = lhs: rhs:
447− recursiveUpdateUntil (path: lhs: rhs:
448− !(isAttrs lhs && isAttrs rhs)
449− ) lhs rhs;
547+ recursiveUpdate = recursiveUpdateUntil (path: lhs: rhs: !(isAttrs lhs && isAttrs rhs));
450548
451549 /* Returns true if the pattern is contained in the set. False otherwise.
452550
@@ -455,8 +553,8 @@ rec {
455553 => true
456554 */
457555 matchAttrs = pattern: attrs: assert isAttrs pattern;
458− fold and true (attrValues (zipAttrsWithNames (attrNames pattern) (n: values:
459− let pat = head values; val = head (tail values); in
556+ all id (attrValues (zipAttrsWithNames (attrNames pattern) (n: values:
557+ let pat = head values; val = elemAt values 1; in
460558 if length values == 1 then false
461559 else if isAttrs pat then isAttrs val && matchAttrs pat val
462560 else pat == val
@@ -476,6 +574,20 @@ rec {
476574 overrideExisting = old: new:
477575 mapAttrs (name: value: new.${name} or value) old;
478576
577+ /* Turns a list of strings into a human-readable description of those
578+ strings represented as an attribute path. The result of this function is
579+ not intended to be machine-readable.
580+
581+ Example:
582+ showAttrPath [ "foo" "10" "bar" ]
583+ => "foo.\"10\".bar"
584+ showAttrPath []
585+ => "<root attribute path>"
586+ */
587+ showAttrPath = path:
588+ if path == [] then "<root attribute path>"
589+ else concatMapStringsSep "." escapeNixIdentifier path;
590+
479591 /* Get a package output.
480592 If no output is found, fallback to `.out` and then to the default.
481593
@@ -484,7 +596,7 @@ rec {
484596 => "/nix/store/9rz8gxhzf8sw4kf2j2f1grr49w8zx5vj-openssl-1.0.1r-dev"
485597 */
486598 getOutput = output: pkg:
487− if pkg.outputUnspecified or false
599+ if ! pkg ? outputSpecified || ! pkg.outputSpecified
488600 then pkg.${output} or pkg.out or pkg
489601 else pkg;
490602
lib/customisation.nix+50−3
@@ -117,8 +117,55 @@ rec {
117117 callPackageWith = autoArgs: fn: args:
118118 let
119119 f = if lib.isFunction fn then fn else import fn;
120− auto = builtins.intersectAttrs (lib.functionArgs f) autoArgs;
121− in makeOverridable f (auto // args);
120+ fargs = lib.functionArgs f;
121+
122+ # All arguments that will be passed to the function
123+ # This includes automatic ones and ones passed explicitly
124+ allArgs = builtins.intersectAttrs fargs autoArgs // args;
125+
126+ # A list of argument names that the function requires, but
127+ # wouldn't be passed to it
128+ missingArgs = lib.attrNames
129+ # Filter out arguments that have a default value
130+ (lib.filterAttrs (name: value: ! value)
131+ # Filter out arguments that would be passed
132+ (removeAttrs fargs (lib.attrNames allArgs)));
133+
134+ # Get a list of suggested argument names for a given missing one
135+ getSuggestions = arg: lib.pipe (autoArgs // args) [
136+ lib.attrNames
137+ # Only use ones that are at most 2 edits away. While mork would work,
138+ # levenshteinAtMost is only fast for 2 or less.
139+ (lib.filter (lib.strings.levenshteinAtMost 2 arg))
140+ # Put strings with shorter distance first
141+ (lib.sort (x: y: lib.strings.levenshtein x arg < lib.strings.levenshtein y arg))
142+ # Only take the first couple results
143+ (lib.take 3)
144+ # Quote all entries
145+ (map (x: "\"" + x + "\""))
146+ ];
147+
148+ prettySuggestions = suggestions:
149+ if suggestions == [] then ""
150+ else if lib.length suggestions == 1 then ", did you mean ${lib.elemAt suggestions 0}?"
151+ else ", did you mean ${lib.concatStringsSep ", " (lib.init suggestions)} or ${lib.last suggestions}?";
152+
153+ errorForArg = arg:
154+ let
155+ loc = builtins.unsafeGetAttrPos arg fargs;
156+ # loc' can be removed once lib/minver.nix is >2.3.4, since that includes
157+ # https://github.com/NixOS/nix/pull/3468 which makes loc be non-null
158+ loc' = if loc != null then loc.file + ":" + toString loc.line
159+ else if ! lib.isFunction fn then
160+ toString fn + lib.optionalString (lib.sources.pathIsDirectory fn) "/default.nix"
161+ else "<unknown location>";
162+ in "Function called without required argument \"${arg}\" at "
163+ + "${loc'}${prettySuggestions (getSuggestions arg)}";
164+
165+ # Only show the error for the first missing argument
166+ error = errorForArg (lib.head missingArgs);
167+
168+ in if missingArgs == [] then makeOverridable f allArgs else throw error;
122169
123170
124171 /* Like callPackage, but for a function that returns an attribute
@@ -152,6 +199,7 @@ rec {
152199 { name = outputName;
153200 value = commonAttrs // {
154201 inherit (drv.${outputName}) type outputName;
202+ outputSpecified = true;
155203 drvPath = assert condition; drv.${outputName}.drvPath;
156204 outPath = assert condition; drv.${outputName}.outPath;
157205 };
@@ -159,7 +207,6 @@ rec {
159207
160208 outputsList = map outputToAttrListElement outputs;
161209 in commonAttrs // {
162− outputUnspecified = true;
163210 drvPath = assert condition; drv.drvPath;
164211 outPath = assert condition; drv.outPath;
165212 };
lib/default.nix+25−15
@@ -11,6 +11,9 @@ let
1111 callLibs = file: import file { lib = self; };
1212 in {
1313
14+ # interacting with flakes
15+ flakes = callLibs ./flakes.nix;
16+
1417 # often used, or depending on very little
1518 trivial = callLibs ./trivial.nix;
1619 fixedPoints = callLibs ./fixed-points.nix;
@@ -59,6 +62,7 @@ let
5962 # linux kernel configuration
6063 kernel = callLibs ./kernel.nix;
6164
65+ inherit (self.flakes) callLocklessFlake;
6266 inherit (builtins) add addErrorContext attrNames concatLists
6367 deepSeq elem elemAt filter genericClosure genList getAttr
6468 hasAttr head isAttrs isBool isInt isList isString length
@@ -66,8 +70,10 @@ let
6670 stringLength sub substring tail trace;
6771 inherit (self.trivial) id const pipe concat or and bitAnd bitOr bitXor
6872 bitNot boolToString mergeAttrs flip mapNullable inNixShell isFloat min max
69− importJSON importTOML warn warnIf info showWarnings nixpkgsVersion version
70− mod compare splitByAndCompare functionArgs setFunctionArgs isFunction
73+ importJSON importTOML warn warnIf warnIfNot throwIf throwIfNot checkListOfEnum
74+ info showWarnings nixpkgsVersion version isInOldestRelease
75+ mod compare splitByAndCompare
76+ functionArgs setFunctionArgs isFunction toFunction
7177 toHexString toBaseDigits;
7278 inherit (self.fixedPoints) fix fix' converge extends composeExtensions
7379 composeManyExtensions makeExtensible makeExtensibleWithCustomName;
@@ -77,9 +83,10 @@ let
7783 mapAttrs' mapAttrsToList mapAttrsRecursive mapAttrsRecursiveCond
7884 genAttrs isDerivation toDerivation optionalAttrs
7985 zipAttrsWithNames zipAttrsWith zipAttrs recursiveUpdateUntil
80− recursiveUpdate matchAttrs overrideExisting getOutput getBin
86+ recursiveUpdate matchAttrs overrideExisting showAttrPath getOutput getBin
8187 getLib getDev getMan chooseDevOutputs zipWithNames zip
82− recurseIntoAttrs dontRecurseIntoAttrs cartesianProductOfSets;
88+ recurseIntoAttrs dontRecurseIntoAttrs cartesianProductOfSets
89+ updateManyAttrsByPath;
8390 inherit (self.lists) singleton forEach foldr fold foldl foldl' imap0 imap1
8491 concatMap flatten remove findSingle findFirst any all count
8592 optional optionals toList range partition zipListsWith zipLists
@@ -91,7 +98,8 @@ let
9198 concatImapStringsSep makeSearchPath makeSearchPathOutput
9299 makeLibraryPath makeBinPath optionalString
93100 hasInfix hasPrefix hasSuffix stringToCharacters stringAsChars escape
94− escapeShellArg escapeShellArgs replaceChars lowerChars
101+ escapeShellArg escapeShellArgs isValidPosixName toShellVar toShellVars
102+ escapeRegex escapeXML replaceChars lowerChars
95103 upperChars toLower toUpper addContextFrom splitString
96104 removePrefix removeSuffix versionOlder versionAtLeast
97105 getName getVersion
@@ -105,26 +113,28 @@ let
105113 makeScope makeScopeWithSplicing;
106114 inherit (self.meta) addMetaAttrs dontDistribute setName updateName
107115 appendToName mapDerivationAttrset setPrio lowPrio lowPrioSet hiPrio
108− hiPrioSet;
116+ hiPrioSet getLicenseFromSpdxId getExe;
109117 inherit (self.sources) pathType pathIsDirectory cleanSourceFilter
110118 cleanSource sourceByRegex sourceFilesBySuffices
111119 commitIdFromGitRepo cleanSourceWith pathHasContext
112120 canCleanSource pathIsRegularFile pathIsGitRepo;
113− inherit (self.modules) evalModules unifyModuleSyntax
114− applyIfFunction mergeModules
121+ inherit (self.modules) evalModules setDefaultModuleLocation
122+ unifyModuleSyntax applyModuleArgsIfFunction mergeModules
115123 mergeModules' mergeOptionDecls evalOptionValue mergeDefinitions
116124 pushDownProperties dischargeProperties filterOverrides
117125 sortProperties fixupOptionType mkIf mkAssert mkMerge mkOverride
118− mkOptionDefault mkDefault mkForce mkVMOverride mkStrict
126+ mkOptionDefault mkDefault mkImageMediaOverride mkForce mkVMOverride
119127 mkFixStrictness mkOrder mkBefore mkAfter mkAliasDefinitions
120128 mkAliasAndWrapDefinitions fixMergeModules mkRemovedOptionModule
121− mkRenamedOptionModule mkMergedOptionModule mkChangedOptionModule
122− mkAliasOptionModule doRename;
129+ mkRenamedOptionModule mkRenamedOptionModuleWith
130+ mkMergedOptionModule mkChangedOptionModule
131+ mkAliasOptionModule mkDerivedConfig doRename;
123132 inherit (self.options) isOption mkEnableOption mkSinkUndeclaredOptions
124− mergeDefaultOption mergeOneOption mergeEqualOption getValues
125− getFiles optionAttrSetToDocList optionAttrSetToDocList'
126− scrubOptionValue literalExample showOption showFiles
127− unknownModule mkOption;
133+ mergeDefaultOption mergeOneOption mergeEqualOption mergeUniqueOption
134+ getValues getFiles
135+ optionAttrSetToDocList optionAttrSetToDocList'
136+ scrubOptionValue literalExpression literalExample literalDocBook
137+ showOption showFiles unknownModule mkOption mkPackageOption;
128138 inherit (self.types) isType setType defaultTypeMerge defaultFunctor
129139 isOptionType mkOptionType;
130140 inherit (self.asserts)
lib/deprecated.nix+5−5
@@ -77,11 +77,11 @@ rec {
7777 # Output : are reqs satisfied? It's asserted.
7878 checkReqs = attrSet: argList: condList:
7979 (
80− fold lib.and true
80+ foldr lib.and true
8181 (map (x: let name = (head x); in
8282
8383 ((checkFlag attrSet name) ->
84− (fold lib.and true
84+ (foldr lib.and true
8585 (map (y: let val=(getValue attrSet argList y); in
8686 (val!=null) && (val!=false))
8787 (tail x))))) condList));
@@ -177,7 +177,7 @@ rec {
177177 # merge attributes with custom function handling the case that the attribute
178178 # exists in both sets
179179 mergeAttrsWithFunc = f: set1: set2:
180− fold (n: set: if set ? ${n}
180+ foldr (n: set: if set ? ${n}
181181 then setAttr set n (f set.${n} set2.${n})
182182 else set )
183183 (set2 // set1) (attrNames set2);
@@ -196,7 +196,7 @@ rec {
196196 mergeAttrsNoOverride = { mergeLists ? ["buildInputs" "propagatedBuildInputs"],
197197 overrideSnd ? [ "buildPhase" ]
198198 }: attrs1: attrs2:
199− fold (n: set:
199+ foldr (n: set:
200200 setAttr set n ( if set ? ${n}
201201 then # merge
202202 if elem n mergeLists # attribute contains list, merge them by concatenating
@@ -224,7 +224,7 @@ rec {
224224 mergeAttrBy2 = { mergeAttrBy = lib.mergeAttrs; }
225225 // (maybeAttr "mergeAttrBy" {} x)
226226 // (maybeAttr "mergeAttrBy" {} y); in
227− fold lib.mergeAttrs {} [
227+ foldr lib.mergeAttrs {} [
228228 x y
229229 (mapAttrs ( a: v: # merge special names using given functions
230230 if x ? ${a}
lib/fixed-points.nix+5−5
@@ -72,10 +72,10 @@ rec {
7272 # into one where changes made in the first are available in the
7373 # 'super' of the second
7474 composeExtensions =
75− f: g: self: super:
76− let fApplied = f self super;
77− super' = super // fApplied;
78− in fApplied // g self super';
75+ f: g: final: prev:
76+ let fApplied = f final prev;
77+ prev' = prev // fApplied;
78+ in fApplied // g final prev';
7979
8080 # Compose several extending functions of the type expected by 'extends' into
8181 # one where changes made in preceding functions are made available to
@@ -84,7 +84,7 @@ rec {
8484 # composeManyExtensions : [packageSet -> packageSet -> packageSet] -> packageSet -> packageSet -> packageSet
8585 # ^final ^prev ^overrides ^final ^prev ^overrides
8686 composeManyExtensions =
87− lib.foldr (x: y: composeExtensions x y) (self: super: {});
87+ lib.foldr (x: y: composeExtensions x y) (final: prev: {});
8888
8989 # Create an overridable, recursive attribute set. For example:
9090 #
lib/flake.nix+1−1
@@ -1,5 +1,5 @@
11{
22 description = "Library of low-level helper functions for nix expressions.";
33
4− outputs = { self }: { lib = import ./lib; };
4+ outputs = { self }: { lib = import ./.; };
55}
lib/flakes.nixnew file+22
@@ -0,0 +1,22 @@
1+{ lib }:
2+
3+rec {
4+
5+ /* imports a flake.nix without acknowledging its lock file, useful for
6+ referencing subflakes from a parent flake. The second argument allows
7+ specifying the inputs of this flake.
8+
9+ Example:
10+ callLocklessFlake {
11+ path = ./directoryContainingFlake;
12+ inputs = { inherit nixpkgs; };
13+ }
14+ */
15+ callLocklessFlake = { path, inputs ? { } }:
16+ let
17+ self = { outPath = path; } //
18+ ((import (path + "/flake.nix")).outputs (inputs // { self = self; }));
19+ in
20+ self;
21+
22+}
lib/generators.nix+77−5
@@ -10,7 +10,7 @@
1010 * are mostly generators themselves, called with
1111 * their respective default values; they can be reused.
1212 *
13− * Tests can be found in ./tests.nix
13+ * Tests can be found in ./tests/misc.nix
1414 * Documentation in the manual, #sec-generators
1515 */
1616{ lib }:
@@ -35,6 +35,8 @@ rec {
3535 ("generators.mkValueStringDefault: " +
3636 "${t} not supported: ${toPretty {} v}");
3737 in if isInt v then toString v
38+ # convert derivations to store paths
39+ else if lib.isDerivation v then toString v
3840 # we default to not quoting strings
3941 else if isString v then v
4042 # isString returns "1", which is not a good default
@@ -106,7 +108,7 @@ rec {
106108 * The mk* configuration attributes can generically change
107109 * the way sections and key-value strings are generated.
108110 *
109− * For more examples see the test cases in ./tests.nix.
111+ * For more examples see the test cases in ./tests/misc.nix.
110112 */
111113 toINI = {
112114 # apply transformations (e.g. escapes) to section names
@@ -128,6 +130,51 @@ rec {
128130 # map input to ini sections
129131 mapAttrsToStringsSep "\n" mkSection attrsOfAttrs;
130132
133+ /* Generate an INI-style config file from an attrset
134+ * specifying the global section (no header), and an
135+ * attrset of sections to an attrset of key-value pairs.
136+ *
137+ * generators.toINIWithGlobalSection {} {
138+ * globalSection = {
139+ * someGlobalKey = "hi";
140+ * };
141+ * sections = {
142+ * foo = { hi = "${pkgs.hello}"; ciao = "bar"; };
143+ * baz = { "also, integers" = 42; };
144+ * }
145+ *
146+ *> someGlobalKey=hi
147+ *>
148+ *> [baz]
149+ *> also, integers=42
150+ *>
151+ *> [foo]
152+ *> ciao=bar
153+ *> hi=/nix/store/y93qql1p5ggfnaqjjqhxcw0vqw95rlz0-hello-2.10
154+ *
155+ * The mk* configuration attributes can generically change
156+ * the way sections and key-value strings are generated.
157+ *
158+ * For more examples see the test cases in ./tests/misc.nix.
159+ *
160+ * If you don’t need a global section, you can also use
161+ * `generators.toINI` directly, which only takes
162+ * the part in `sections`.
163+ */
164+ toINIWithGlobalSection = {
165+ # apply transformations (e.g. escapes) to section names
166+ mkSectionName ? (name: libStr.escape [ "[" "]" ] name),
167+ # format a setting line from key and value
168+ mkKeyValue ? mkKeyValueDefault {} "=",
169+ # allow lists as values for duplicate keys
170+ listsAsDuplicateKeys ? false
171+ }: { globalSection, sections }:
172+ ( if globalSection == {}
173+ then ""
174+ else (toKeyValue { inherit mkKeyValue listsAsDuplicateKeys; } globalSection)
175+ + "\n")
176+ + (toINI { inherit mkSectionName mkKeyValue listsAsDuplicateKeys; } sections);
177+
131178 /* Generate a git-config file from an attrset.
132179 *
133180 * It has two major differences from the regular INI format:
@@ -169,7 +216,7 @@ rec {
169216 # converts { a.b.c = 5; } to { "a.b".c = 5; } for toINI
170217 gitFlattenAttrs = let
171218 recurse = path: value:
172− if isAttrs value then
219+ if isAttrs value && !lib.isDerivation value then
173220 lib.mapAttrsToList (name: value: recurse ([ name ] ++ path) value) value
174221 else if length path > 1 then {
175222 ${concatStringsSep "." (lib.reverseList (tail path))}.${head path} = value;
@@ -195,6 +242,30 @@ rec {
195242 */
196243 toYAML = {}@args: toJSON args;
197244
245+ withRecursion =
246+ args@{
247+ /* If this option is not null, the given value will stop evaluating at a certain depth */
248+ depthLimit
249+ /* If this option is true, an error will be thrown, if a certain given depth is exceeded */
250+ , throwOnDepthLimit ? true
251+ }:
252+ assert builtins.isInt depthLimit;
253+ let
254+ transform = depth:
255+ if depthLimit != null && depth > depthLimit then
256+ if throwOnDepthLimit
257+ then throw "Exceeded maximum eval-depth limit of ${toString depthLimit} while trying to evaluate with `generators.withRecursion'!"
258+ else const "<unevaluated>"
259+ else id;
260+ mapAny = with builtins; depth: v:
261+ let
262+ evalNext = x: mapAny (depth + 1) (transform (depth + 1) x);
263+ in
264+ if isAttrs v then mapAttrs (const evalNext) v
265+ else if isList v then map evalNext v
266+ else transform (depth + 1) v;
267+ in
268+ mapAny 0;
198269
199270 /* Pretty print a value, akin to `builtins.trace`.
200271 * Should probably be a builtin as well.
@@ -206,7 +277,8 @@ rec {
206277 allowPrettyValues ? false,
207278 /* If this option is true, the output is indented with newlines for attribute sets and lists */
208279 multiline ? true
209− }@args: let
280+ }@args:
281+ let
210282 go = indent: v: with builtins;
211283 let isPath = v: typeOf v == "path";
212284 introSpace = if multiline then "\n${indent} " else " ";
@@ -248,7 +320,7 @@ rec {
248320 then v.__pretty v.val
249321 else if v == {} then "{ }"
250322 else if v ? type && v.type == "derivation" then
251− "<derivation ${v.drvPath}>"
323+ "<derivation ${v.drvPath or "???"}>"
252324 else "{" + introSpace
253325 + libStr.concatStringsSep introSpace (libAttr.mapAttrsToList
254326 (name: value:
lib/licenses.nix+201−143
@@ -1,44 +1,56 @@
11{ lib }:
2−let
32
4− spdx = lic: lic // {
5− url = "https://spdx.org/licenses/${lic.spdxId}.html";
6− };
7−
8−in
9−
10−lib.mapAttrs (n: v: v // { shortName = n; }) ({
3+lib.mapAttrs (lname: lset: let
4+ defaultLicense = rec {
5+ shortName = lname;
6+ free = true; # Most of our licenses are Free, explicitly declare unfree additions as such!
7+ deprecated = false;
8+ };
9+
10+ mkLicense = licenseDeclaration: let
11+ applyDefaults = license: defaultLicense // license;
12+ applySpdx = license:
13+ if license ? spdxId
14+ then license // { url = "https://spdx.org/licenses/${license.spdxId}.html"; }
15+ else license;
16+ applyRedistributable = license: { redistributable = license.free; } // license;
17+ in lib.pipe licenseDeclaration [
18+ applyDefaults
19+ applySpdx
20+ applyRedistributable
21+ ];
22+in mkLicense lset) ({
1123 /* License identifiers from spdx.org where possible.
1224 * If you cannot find your license here, then look for a similar license or
1325 * add it to this list. The URL mentioned above is a good source for inspiration.
1426 */
1527
16− abstyles = spdx {
28+ abstyles = {
1729 spdxId = "Abstyles";
1830 fullName = "Abstyles License";
1931 };
2032
21− afl20 = spdx {
33+ afl20 = {
2234 spdxId = "AFL-2.0";
2335 fullName = "Academic Free License v2.0";
2436 };
2537
26− afl21 = spdx {
38+ afl21 = {
2739 spdxId = "AFL-2.1";
2840 fullName = "Academic Free License v2.1";
2941 };
3042
31− afl3 = spdx {
43+ afl3 = {
3244 spdxId = "AFL-3.0";
3345 fullName = "Academic Free License v3.0";
3446 };
3547
36− agpl3Only = spdx {
48+ agpl3Only = {
3749 spdxId = "AGPL-3.0-only";
3850 fullName = "GNU Affero General Public License v3.0 only";
3951 };
4052
41− agpl3Plus = spdx {
53+ agpl3Plus = {
4254 spdxId = "AGPL-3.0-or-later";
4355 fullName = "GNU Affero General Public License v3.0 or later";
4456 };
@@ -55,7 +67,12 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
5567 free = false;
5668 };
5769
58− apsl20 = spdx {
70+ aom = {
71+ fullName = "Alliance for Open Media Patent License 1.0";
72+ url = "https://aomedia.org/license/patent-license/";
73+ };
74+
75+ apsl20 = {
5976 spdxId = "APSL-2.0";
6077 fullName = "Apple Public Source License 2.0";
6178 };
@@ -65,72 +82,72 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
6582 url = "https://www.freedesktop.org/wiki/Arphic_Public_License/";
6683 };
6784
68− artistic1 = spdx {
85+ artistic1 = {
6986 spdxId = "Artistic-1.0";
7087 fullName = "Artistic License 1.0";
7188 };
7289
73− artistic2 = spdx {
90+ artistic2 = {
7491 spdxId = "Artistic-2.0";
7592 fullName = "Artistic License 2.0";
7693 };
7794
78− asl20 = spdx {
95+ asl20 = {
7996 spdxId = "Apache-2.0";
8097 fullName = "Apache License 2.0";
8198 };
8299
83− boost = spdx {
100+ boost = {
84101 spdxId = "BSL-1.0";
85102 fullName = "Boost Software License 1.0";
86103 };
87104
88− beerware = spdx {
105+ beerware = {
89106 spdxId = "Beerware";
90107 fullName = "Beerware License";
91108 };
92109
93− blueOak100 = spdx {
110+ blueOak100 = {
94111 spdxId = "BlueOak-1.0.0";
95112 fullName = "Blue Oak Model License 1.0.0";
96113 };
97114
98− bsd0 = spdx {
115+ bsd0 = {
99116 spdxId = "0BSD";
100117 fullName = "BSD Zero Clause License";
101118 };
102119
103− bsd1 = spdx {
120+ bsd1 = {
104121 spdxId = "BSD-1-Clause";
105122 fullName = "BSD 1-Clause License";
106123 };
107124
108− bsd2 = spdx {
125+ bsd2 = {
109126 spdxId = "BSD-2-Clause";
110127 fullName = ''BSD 2-clause "Simplified" License'';
111128 };
112129
113− bsd2Patent = spdx {
130+ bsd2Patent = {
114131 spdxId = "BSD-2-Clause-Patent";
115132 fullName = "BSD-2-Clause Plus Patent License";
116133 };
117134
118− bsd3 = spdx {
135+ bsd3 = {
119136 spdxId = "BSD-3-Clause";
120137 fullName = ''BSD 3-clause "New" or "Revised" License'';
121138 };
122139
123− bsdOriginal = spdx {
140+ bsdOriginal = {
124141 spdxId = "BSD-4-Clause";
125142 fullName = ''BSD 4-clause "Original" or "Old" License'';
126143 };
127144
128− bsdOriginalUC = spdx {
145+ bsdOriginalUC = {
129146 spdxId = "BSD-4-Clause-UC";
130147 fullName = "BSD 4-Clause University of California-Specific";
131148 };
132149
133− bsdProtection = spdx {
150+ bsdProtection = {
134151 spdxId = "BSD-Protection";
135152 fullName = "BSD Protection License";
136153 };
@@ -141,119 +158,129 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
141158 free = false;
142159 };
143160
144− clArtistic = spdx {
161+ capec = {
162+ fullName = "Common Attack Pattern Enumeration and Classification";
163+ url = "https://capec.mitre.org/about/termsofuse.html";
164+ };
165+
166+ clArtistic = {
145167 spdxId = "ClArtistic";
146168 fullName = "Clarified Artistic License";
147169 };
148170
149− cc0 = spdx {
171+ cc0 = {
150172 spdxId = "CC0-1.0";
151173 fullName = "Creative Commons Zero v1.0 Universal";
152174 };
153175
154− cc-by-nc-sa-20 = spdx {
176+ cc-by-nc-sa-20 = {
155177 spdxId = "CC-BY-NC-SA-2.0";
156178 fullName = "Creative Commons Attribution Non Commercial Share Alike 2.0";
157179 free = false;
158180 };
159181
160− cc-by-nc-sa-25 = spdx {
182+ cc-by-nc-sa-25 = {
161183 spdxId = "CC-BY-NC-SA-2.5";
162184 fullName = "Creative Commons Attribution Non Commercial Share Alike 2.5";
163185 free = false;
164186 };
165187
166− cc-by-nc-sa-30 = spdx {
188+ cc-by-nc-sa-30 = {
167189 spdxId = "CC-BY-NC-SA-3.0";
168190 fullName = "Creative Commons Attribution Non Commercial Share Alike 3.0";
169191 free = false;
170192 };
171193
172− cc-by-nc-sa-40 = spdx {
194+ cc-by-nc-sa-40 = {
173195 spdxId = "CC-BY-NC-SA-4.0";
174196 fullName = "Creative Commons Attribution Non Commercial Share Alike 4.0";
175197 free = false;
176198 };
177199
178− cc-by-nc-30 = spdx {
200+ cc-by-nc-30 = {
179201 spdxId = "CC-BY-NC-3.0";
180202 fullName = "Creative Commons Attribution Non Commercial 3.0 Unported";
181203 free = false;
182204 };
183205
184− cc-by-nc-40 = spdx {
206+ cc-by-nc-40 = {
185207 spdxId = "CC-BY-NC-4.0";
186208 fullName = "Creative Commons Attribution Non Commercial 4.0 International";
187209 free = false;
188210 };
189211
190− cc-by-nd-30 = spdx {
212+ cc-by-nd-30 = {
191213 spdxId = "CC-BY-ND-3.0";
192214 fullName = "Creative Commons Attribution-No Derivative Works v3.00";
193215 free = false;
194216 };
195217
196− cc-by-sa-25 = spdx {
218+ cc-by-sa-25 = {
197219 spdxId = "CC-BY-SA-2.5";
198220 fullName = "Creative Commons Attribution Share Alike 2.5";
199221 };
200222
201− cc-by-30 = spdx {
223+ cc-by-30 = {
202224 spdxId = "CC-BY-3.0";
203225 fullName = "Creative Commons Attribution 3.0";
204226 };
205227
206− cc-by-sa-30 = spdx {
228+ cc-by-sa-30 = {
207229 spdxId = "CC-BY-SA-3.0";
208230 fullName = "Creative Commons Attribution Share Alike 3.0";
209231 };
210232
211− cc-by-40 = spdx {
233+ cc-by-40 = {
212234 spdxId = "CC-BY-4.0";
213235 fullName = "Creative Commons Attribution 4.0";
214236 };
215237
216− cc-by-sa-40 = spdx {
238+ cc-by-sa-40 = {
217239 spdxId = "CC-BY-SA-4.0";
218240 fullName = "Creative Commons Attribution Share Alike 4.0";
219241 };
220242
221− cddl = spdx {
243+ cddl = {
222244 spdxId = "CDDL-1.0";
223245 fullName = "Common Development and Distribution License 1.0";
224246 };
225247
226− cecill20 = spdx {
248+ cecill20 = {
227249 spdxId = "CECILL-2.0";
228250 fullName = "CeCILL Free Software License Agreement v2.0";
229251 };
230252
231− cecill-b = spdx {
253+ cecill21 = {
254+ spdxId = "CECILL-2.1";
255+ fullName = "CeCILL Free Software License Agreement v2.1";
256+ };
257+
258+ cecill-b = {
232259 spdxId = "CECILL-B";
233260 fullName = "CeCILL-B Free Software License Agreement";
234261 };
235262
236− cecill-c = spdx {
263+ cecill-c = {
237264 spdxId = "CECILL-C";
238265 fullName = "CeCILL-C Free Software License Agreement";
239266 };
240267
241− cpal10 = spdx {
268+ cpal10 = {
242269 spdxId = "CPAL-1.0";
243270 fullName = "Common Public Attribution License 1.0";
244271 };
245272
246− cpl10 = spdx {
273+ cpl10 = {
247274 spdxId = "CPL-1.0";
248275 fullName = "Common Public License 1.0";
249276 };
250277
251− curl = spdx {
278+ curl = {
252279 spdxId = "curl";
253280 fullName = "curl License";
254281 };
255282
256− doc = spdx {
283+ doc = {
257284 spdxId = "DOC";
258285 fullName = "DOC License";
259286 };
@@ -264,12 +291,12 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
264291 free = false;
265292 };
266293
267− efl10 = spdx {
294+ efl10 = {
268295 spdxId = "EFL-1.0";
269296 fullName = "Eiffel Forum License v1.0";
270297 };
271298
272− efl20 = spdx {
299+ efl20 = {
273300 spdxId = "EFL-2.0";
274301 fullName = "Eiffel Forum License v2.0";
275302 };
@@ -280,12 +307,12 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
280307 free = false;
281308 };
282309
283− epl10 = spdx {
310+ epl10 = {
284311 spdxId = "EPL-1.0";
285312 fullName = "Eclipse Public License 1.0";
286313 };
287314
288− epl20 = spdx {
315+ epl20 = {
289316 spdxId = "EPL-2.0";
290317 fullName = "Eclipse Public License 2.0";
291318 };
@@ -296,42 +323,42 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
296323 free = false;
297324 };
298325
299− eupl11 = spdx {
326+ eupl11 = {
300327 spdxId = "EUPL-1.1";
301328 fullName = "European Union Public License 1.1";
302329 };
303330
304− eupl12 = spdx {
331+ eupl12 = {
305332 spdxId = "EUPL-1.2";
306333 fullName = "European Union Public License 1.2";
307334 };
308335
309− fdl11Only = spdx {
336+ fdl11Only = {
310337 spdxId = "GFDL-1.1-only";
311338 fullName = "GNU Free Documentation License v1.1 only";
312339 };
313340
314− fdl11Plus = spdx {
341+ fdl11Plus = {
315342 spdxId = "GFDL-1.1-or-later";
316343 fullName = "GNU Free Documentation License v1.1 or later";
317344 };
318345
319− fdl12Only = spdx {
346+ fdl12Only = {
320347 spdxId = "GFDL-1.2-only";
321348 fullName = "GNU Free Documentation License v1.2 only";
322349 };
323350
324− fdl12Plus = spdx {
351+ fdl12Plus = {
325352 spdxId = "GFDL-1.2-or-later";
326353 fullName = "GNU Free Documentation License v1.2 or later";
327354 };
328355
329− fdl13Only = spdx {
356+ fdl13Only = {
330357 spdxId = "GFDL-1.3-only";
331358 fullName = "GNU Free Documentation License v1.3 only";
332359 };
333360
334− fdl13Plus = spdx {
361+ fdl13Plus = {
335362 spdxId = "GFDL-1.3-or-later";
336363 fullName = "GNU Free Documentation License v1.3 or later";
337364 };
@@ -346,7 +373,7 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
346373 fullName = "Unspecified free software license";
347374 };
348375
349− ftl = spdx {
376+ ftl = {
350377 spdxId = "FTL";
351378 fullName = "Freetype Project License";
352379 };
@@ -362,22 +389,27 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
362389 free = false;
363390 };
364391
365− gpl1Only = spdx {
392+ generaluser = {
393+ fullName = "GeneralUser GS License v2.0";
394+ url = "http://www.schristiancollins.com/generaluser.php"; # license included in sources
395+ };
396+
397+ gpl1Only = {
366398 spdxId = "GPL-1.0-only";
367399 fullName = "GNU General Public License v1.0 only";
368400 };
369401
370− gpl1Plus = spdx {
402+ gpl1Plus = {
371403 spdxId = "GPL-1.0-or-later";
372404 fullName = "GNU General Public License v1.0 or later";
373405 };
374406
375− gpl2Only = spdx {
407+ gpl2Only = {
376408 spdxId = "GPL-2.0-only";
377409 fullName = "GNU General Public License v2.0 only";
378410 };
379411
380− gpl2Classpath = spdx {
412+ gpl2Classpath = {
381413 spdxId = "GPL-2.0-with-classpath-exception";
382414 fullName = "GNU General Public License v2.0 only (with Classpath exception)";
383415 };
@@ -392,17 +424,17 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
392424 url = "https://www.mysql.com/about/legal/licensing/foss-exception";
393425 };
394426
395− gpl2Plus = spdx {
427+ gpl2Plus = {
396428 spdxId = "GPL-2.0-or-later";
397429 fullName = "GNU General Public License v2.0 or later";
398430 };
399431
400− gpl3Only = spdx {
432+ gpl3Only = {
401433 spdxId = "GPL-3.0-only";
402434 fullName = "GNU General Public License v3.0 only";
403435 };
404436
405− gpl3Plus = spdx {
437+ gpl3Plus = {
406438 spdxId = "GPL-3.0-or-later";
407439 fullName = "GNU General Public License v3.0 or later";
408440 };
@@ -412,12 +444,12 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
412444 url = "https://fedoraproject.org/wiki/Licensing/GPL_Classpath_Exception";
413445 };
414446
415− hpnd = spdx {
447+ hpnd = {
416448 spdxId = "HPND";
417449 fullName = "Historic Permission Notice and Disclaimer";
418450 };
419451
420− hpndSellVariant = spdx {
452+ hpndSellVariant = {
421453 fullName = "Historical Permission Notice and Disclaimer - sell variant";
422454 spdxId = "HPND-sell-variant";
423455 };
@@ -428,39 +460,44 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
428460 url = "https://old.calculate-linux.org/packages/licenses/iASL";
429461 };
430462
431− ijg = spdx {
463+ ijg = {
432464 spdxId = "IJG";
433465 fullName = "Independent JPEG Group License";
434466 };
435467
436− imagemagick = spdx {
468+ imagemagick = {
437469 fullName = "ImageMagick License";
438470 spdxId = "imagemagick";
439471 };
440472
473+ imlib2 = {
474+ spdxId = "Imlib2";
475+ fullName = "Imlib2 License";
476+ };
477+
441478 inria-compcert = {
442479 fullName = "INRIA Non-Commercial License Agreement for the CompCert verified compiler";
443− url = "http://compcert.inria.fr/doc/LICENSE"; # https is broken
480+ url = "https://compcert.org/doc/LICENSE.txt";
444481 free = false;
445482 };
446483
447484 inria-icesl = {
448485 fullName = "INRIA Non-Commercial License Agreement for IceSL";
449− url = "http://shapeforge.loria.fr/icesl/EULA_IceSL_binary.pdf"; # https is broken
486+ url = "https://icesl.loria.fr/assets/pdf/EULA_IceSL_binary.pdf";
450487 free = false;
451488 };
452489
453− ipa = spdx {
490+ ipa = {
454491 spdxId = "IPA";
455492 fullName = "IPA Font License";
456493 };
457494
458− ipl10 = spdx {
495+ ipl10 = {
459496 spdxId = "IPL-1.0";
460497 fullName = "IBM Public License v1.0";
461498 };
462499
463− isc = spdx {
500+ isc = {
464501 spdxId = "ISC";
465502 fullName = "ISC License";
466503 };
@@ -478,52 +515,52 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
478515 free = false;
479516 };
480517
481− lgpl2Only = spdx {
518+ lgpl2Only = {
482519 spdxId = "LGPL-2.0-only";
483520 fullName = "GNU Library General Public License v2 only";
484521 };
485522
486− lgpl2Plus = spdx {
523+ lgpl2Plus = {
487524 spdxId = "LGPL-2.0-or-later";
488525 fullName = "GNU Library General Public License v2 or later";
489526 };
490527
491− lgpl21Only = spdx {
528+ lgpl21Only = {
492529 spdxId = "LGPL-2.1-only";
493530 fullName = "GNU Lesser General Public License v2.1 only";
494531 };
495532
496− lgpl21Plus = spdx {
533+ lgpl21Plus = {
497534 spdxId = "LGPL-2.1-or-later";
498535 fullName = "GNU Lesser General Public License v2.1 or later";
499536 };
500537
501− lgpl3Only = spdx {
538+ lgpl3Only = {
502539 spdxId = "LGPL-3.0-only";
503540 fullName = "GNU Lesser General Public License v3.0 only";
504541 };
505542
506− lgpl3Plus = spdx {
543+ lgpl3Plus = {
507544 spdxId = "LGPL-3.0-or-later";
508545 fullName = "GNU Lesser General Public License v3.0 or later";
509546 };
510547
511− lgpllr = spdx {
548+ lgpllr = {
512549 spdxId = "LGPLLR";
513550 fullName = "Lesser General Public License For Linguistic Resources";
514551 };
515552
516− libpng = spdx {
553+ libpng = {
517554 spdxId = "Libpng";
518555 fullName = "libpng License";
519556 };
520557
521− libpng2 = spdx {
558+ libpng2 = {
522559 spdxId = "libpng-2.0"; # Used since libpng 1.6.36.
523560 fullName = "PNG Reference Library version 2";
524561 };
525562
526− libtiff = spdx {
563+ libtiff = {
527564 spdxId = "libtiff";
528565 fullName = "libtiff License";
529566 };
@@ -533,22 +570,22 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
533570 url = "https://opensource.franz.com/preamble.html";
534571 };
535572
536− llvm-exception = spdx {
573+ llvm-exception = {
537574 spdxId = "LLVM-exception";
538575 fullName = "LLVM Exception"; # LLVM exceptions to the Apache 2.0 License
539576 };
540577
541− lppl12 = spdx {
578+ lppl12 = {
542579 spdxId = "LPPL-1.2";
543580 fullName = "LaTeX Project Public License v1.2";
544581 };
545582
546− lppl13c = spdx {
583+ lppl13c = {
547584 spdxId = "LPPL-1.3c";
548585 fullName = "LaTeX Project Public License v1.3c";
549586 };
550587
551− lpl-102 = spdx {
588+ lpl-102 = {
552589 spdxId = "LPL-1.02";
553590 fullName = "Lucent Public License v1.02";
554591 };
@@ -560,43 +597,58 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
560597
561598 # spdx.org does not (yet) differentiate between the X11 and Expat versions
562599 # for details see https://en.wikipedia.org/wiki/MIT_License#Various_versions
563− mit = spdx {
600+ mit = {
564601 spdxId = "MIT";
565602 fullName = "MIT License";
566603 };
604+ # https://spdx.org/licenses/MIT-feh.html
605+ mit-feh = {
606+ spdxId = "MIT-feh";
607+ fullName = "feh License";
608+ };
609+
610+ mitAdvertising = {
611+ spdxId = "MIT-advertising";
612+ fullName = "Enlightenment License (e16)";
613+ };
614+
615+ mit0 = {
616+ spdxId = "MIT-0";
617+ fullName = "MIT No Attribution";
618+ };
567619
568− mpl10 = spdx {
620+ mpl10 = {
569621 spdxId = "MPL-1.0";
570622 fullName = "Mozilla Public License 1.0";
571623 };
572624
573− mpl11 = spdx {
625+ mpl11 = {
574626 spdxId = "MPL-1.1";
575627 fullName = "Mozilla Public License 1.1";
576628 };
577629
578− mpl20 = spdx {
630+ mpl20 = {
579631 spdxId = "MPL-2.0";
580632 fullName = "Mozilla Public License 2.0";
581633 };
582634
583− mspl = spdx {
635+ mspl = {
584636 spdxId = "MS-PL";
585637 fullName = "Microsoft Public License";
586638 };
587639
588− nasa13 = spdx {
640+ nasa13 = {
589641 spdxId = "NASA-1.3";
590642 fullName = "NASA Open Source Agreement 1.3";
591643 free = false;
592644 };
593645
594− ncsa = spdx {
646+ ncsa = {
595647 spdxId = "NCSA";
596648 fullName = "University of Illinois/NCSA Open Source License";
597649 };
598650
599− nposl3 = spdx {
651+ nposl3 = {
600652 spdxId = "NPOSL-3.0";
601653 fullName = "Non-Profit Open Software License 3.0";
602654 };
@@ -613,53 +665,53 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
613665 free = false;
614666 };
615667
616− odbl = spdx {
668+ odbl = {
617669 spdxId = "ODbL-1.0";
618670 fullName = "Open Data Commons Open Database License v1.0";
619671 };
620672
621− ofl = spdx {
673+ ofl = {
622674 spdxId = "OFL-1.1";
623675 fullName = "SIL Open Font License 1.1";
624676 };
625677
626− openldap = spdx {
678+ openldap = {
627679 spdxId = "OLDAP-2.8";
628680 fullName = "Open LDAP Public License v2.8";
629681 };
630682
631− openssl = spdx {
683+ openssl = {
632684 spdxId = "OpenSSL";
633685 fullName = "OpenSSL License";
634686 };
635687
636− osl2 = spdx {
688+ osl2 = {
637689 spdxId = "OSL-2.0";
638690 fullName = "Open Software License 2.0";
639691 };
640692
641− osl21 = spdx {
693+ osl21 = {
642694 spdxId = "OSL-2.1";
643695 fullName = "Open Software License 2.1";
644696 };
645697
646− osl3 = spdx {
698+ osl3 = {
647699 spdxId = "OSL-3.0";
648700 fullName = "Open Software License 3.0";
649701 };
650702
651− parity70 = spdx {
703+ parity70 = {
652704 spdxId = "Parity-7.0.0";
653705 fullName = "Parity Public License 7.0.0";
654706 url = "https://paritylicense.com/versions/7.0.0.html";
655707 };
656708
657− php301 = spdx {
709+ php301 = {
658710 spdxId = "PHP-3.01";
659711 fullName = "PHP License v3.01";
660712 };
661713
662− postgresql = spdx {
714+ postgresql = {
663715 spdxId = "PostgreSQL";
664716 fullName = "PostgreSQL License";
665717 };
@@ -670,7 +722,7 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
670722 free = false;
671723 };
672724
673− psfl = spdx {
725+ psfl = {
674726 spdxId = "Python-2.0";
675727 fullName = "Python Software Foundation License version 2";
676728 url = "https://docs.python.org/license.html";
@@ -691,12 +743,12 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
691743 url = "https://prosperitylicense.com/versions/3.0.0.html";
692744 };
693745
694− qhull = spdx {
746+ qhull = {
695747 spdxId = "Qhull";
696748 fullName = "Qhull License";
697749 };
698750
699− qpl = spdx {
751+ qpl = {
700752 spdxId = "QPL-1.0";
701753 fullName = "Q Public License 1.0";
702754 };
@@ -706,22 +758,22 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
706758 url = "https://qwt.sourceforge.io/qwtlicense.html";
707759 };
708760
709− ruby = spdx {
761+ ruby = {
710762 spdxId = "Ruby";
711763 fullName = "Ruby License";
712764 };
713765
714− sendmail = spdx {
766+ sendmail = {
715767 spdxId = "Sendmail";
716768 fullName = "Sendmail License";
717769 };
718770
719− sgi-b-20 = spdx {
771+ sgi-b-20 = {
720772 spdxId = "SGI-B-2.0";
721773 fullName = "SGI Free Software License B v2.0";
722774 };
723775
724− sleepycat = spdx {
776+ sleepycat = {
725777 spdxId = "Sleepycat";
726778 fullName = "Sleepycat License";
727779 };
@@ -737,15 +789,19 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
737789 fullName = "Server Side Public License";
738790 url = "https://www.mongodb.com/licensing/server-side-public-license";
739791 free = false;
792+ # NOTE Debatable.
793+ # The license a slightly modified AGPL but still considered unfree by the
794+ # OSI for what seem like political reasons
795+ redistributable = true; # Definitely redistributable though, it's an AGPL derivative
740796 };
741797
742798 stk = {
743799 shortName = "stk";
744800 fullName = "Synthesis Tool Kit 4.3";
745− url = https://github.com/thestk/stk/blob/master/LICENSE;
801+ url = "https://github.com/thestk/stk/blob/master/LICENSE";
746802 };
747803
748− tcltk = spdx {
804+ tcltk = {
749805 spdxId = "TCL";
750806 fullName = "TCL/TK License";
751807 };
@@ -763,25 +819,27 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
763819 unfreeRedistributable = {
764820 fullName = "Unfree redistributable";
765821 free = false;
822+ redistributable = true;
766823 };
767824
768825 unfreeRedistributableFirmware = {
769826 fullName = "Unfree redistributable firmware";
827+ redistributable = true;
770828 # Note: we currently consider these "free" for inclusion in the
771829 # channel and NixOS images.
772830 };
773831
774− unicode-dfs-2015 = spdx {
832+ unicode-dfs-2015 = {
775833 spdxId = "Unicode-DFS-2015";
776834 fullName = "Unicode License Agreement - Data Files and Software (2015)";
777835 };
778836
779− unicode-dfs-2016 = spdx {
837+ unicode-dfs-2016 = {
780838 spdxId = "Unicode-DFS-2016";
781839 fullName = "Unicode License Agreement - Data Files and Software (2016)";
782840 };
783841
784− unlicense = spdx {
842+ unlicense = {
785843 spdxId = "Unlicense";
786844 fullName = "The Unlicense";
787845 };
@@ -791,7 +849,7 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
791849 url = "https://oss.oracle.com/licenses/upl/";
792850 };
793851
794− vim = spdx {
852+ vim = {
795853 spdxId = "Vim";
796854 fullName = "Vim License";
797855 };
@@ -802,17 +860,17 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
802860 free = false;
803861 };
804862
805− vsl10 = spdx {
863+ vsl10 = {
806864 spdxId = "VSL-1.0";
807865 fullName = "Vovida Software License v1.0";
808866 };
809867
810− watcom = spdx {
868+ watcom = {
811869 spdxId = "Watcom-1.0";
812870 fullName = "Sybase Open Watcom Public License 1.0";
813871 };
814872
815− w3c = spdx {
873+ w3c = {
816874 spdxId = "W3C";
817875 fullName = "W3C Software Notice and License";
818876 };
@@ -822,12 +880,12 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
822880 url = "https://fedoraproject.org/wiki/Licensing:Wadalab?rd=Licensing/Wadalab";
823881 };
824882
825− wtfpl = spdx {
883+ wtfpl = {
826884 spdxId = "WTFPL";
827885 fullName = "Do What The F*ck You Want To Public License";
828886 };
829887
830− wxWindows = spdx {
888+ wxWindows = {
831889 spdxId = "wxWindows";
832890 fullName = "wxWindows Library Licence, Version 3.1";
833891 };
@@ -837,68 +895,68 @@ lib.mapAttrs (n: v: v // { shortName = n; }) ({
837895 url = "http://mcj.sourceforge.net/authors.html#xfig"; # https is broken
838896 };
839897
840− zlib = spdx {
898+ zlib = {
841899 spdxId = "Zlib";
842900 fullName = "zlib License";
843901 };
844902
845− zpl20 = spdx {
903+ zpl20 = {
846904 spdxId = "ZPL-2.0";
847905 fullName = "Zope Public License 2.0";
848906 };
849907
850− zpl21 = spdx {
908+ zpl21 = {
851909 spdxId = "ZPL-2.1";
852910 fullName = "Zope Public License 2.1";
853911 };
854912} // {
855913 # TODO: remove legacy aliases
856− agpl3 = spdx {
914+ agpl3 = {
857915 spdxId = "AGPL-3.0";
858916 fullName = "GNU Affero General Public License v3.0";
859917 deprecated = true;
860918 };
861− fdl11 = spdx {
919+ fdl11 = {
862920 spdxId = "GFDL-1.1";
863921 fullName = "GNU Free Documentation License v1.1";
864922 deprecated = true;
865923 };
866− fdl12 = spdx {
924+ fdl12 = {
867925 spdxId = "GFDL-1.2";
868926 fullName = "GNU Free Documentation License v1.2";
869927 deprecated = true;
870928 };
871− fdl13 = spdx {
929+ fdl13 = {
872930 spdxId = "GFDL-1.3";
873931 fullName = "GNU Free Documentation License v1.3";
874932 deprecated = true;
875933 };
876− gpl1 = spdx {
934+ gpl1 = {
877935 spdxId = "GPL-1.0";
878936 fullName = "GNU General Public License v1.0";
879937 deprecated = true;
880938 };
881− gpl2 = spdx {
939+ gpl2 = {
882940 spdxId = "GPL-2.0";
883941 fullName = "GNU General Public License v2.0";
884942 deprecated = true;
885943 };
886− gpl3 = spdx {
944+ gpl3 = {
887945 spdxId = "GPL-3.0";
888946 fullName = "GNU General Public License v3.0";
889947 deprecated = true;
890948 };
891− lgpl2 = spdx {
949+ lgpl2 = {
892950 spdxId = "LGPL-2.0";
893951 fullName = "GNU Library General Public License v2";
894952 deprecated = true;
895953 };
896− lgpl21 = spdx {
954+ lgpl21 = {
897955 spdxId = "LGPL-2.1";
898956 fullName = "GNU Lesser General Public License v2.1";
899957 deprecated = true;
900958 };
901− lgpl3 = spdx {
959+ lgpl3 = {
902960 spdxId = "LGPL-3.0";
903961 fullName = "GNU Lesser General Public License v3.0";
904962 deprecated = true;
lib/lists.nix+11−13
@@ -4,6 +4,7 @@
44let
55 inherit (lib.strings) toInt;
66 inherit (lib.trivial) compare min;
7+ inherit (lib.attrsets) mapAttrs;
78in
89rec {
910
@@ -340,15 +341,15 @@ rec {
340341 groupBy' builtins.add 0 (x: boolToString (x > 2)) [ 5 1 2 3 4 ]
341342 => { true = 12; false = 3; }
342343 */
343− groupBy' = op: nul: pred: lst:
344− foldl' (r: e:
345− let
346− key = pred e;
347− in
348− r // { ${key} = op (r.${key} or nul) e; }
349− ) {} lst;
344+ groupBy' = op: nul: pred: lst: mapAttrs (name: foldl op nul) (groupBy pred lst);
350345
351− groupBy = groupBy' (sum: e: sum ++ [e]) [];
346+ groupBy = builtins.groupBy or (
347+ pred: foldl' (r: e:
348+ let
349+ key = pred e;
350+ in
351+ r // { ${key} = (r.${key} or []) ++ [e]; }
352+ ) {});
352353
353354 /* Merges two lists of the same size together. If the sizes aren't the same
354355 the merging stops at the shortest. How both lists are merged is defined
@@ -642,7 +643,7 @@ rec {
642643 unique [ 3 2 3 4 ]
643644 => [ 3 2 4 ]
644645 */
645− unique = foldl' (acc: e: if elem e acc then acc else acc ++ [ e ]) [];
646+ unique = foldl' (acc: e: if elem e acc then acc else acc ++ [ e ]) [];
646647
647648 /* Intersects list 'e' and another list. O(nm) complexity.
648649
@@ -663,9 +664,6 @@ rec {
663664 /* Test if two lists have no common element.
664665 It should be slightly more efficient than (intersectLists a b == [])
665666 */
666− mutuallyExclusive = a: b:
667− (builtins.length a) == 0 ||
668− (!(builtins.elem (builtins.head a) b) &&
669− mutuallyExclusive (builtins.tail a) b);
667+ mutuallyExclusive = a: b: length a == 0 || !(any (x: elem x a) b);
670668
671669}
lib/meta.nix+42−1
@@ -78,7 +78,7 @@ rec {
7878
7979 2. (modern) a pattern for the platform `parsed` field.
8080
81− We can inject these into a patten for the whole of a structured platform,
81+ We can inject these into a pattern for the whole of a structured platform,
8282 and then match that.
8383 */
8484 platformMatch = platform: elem: let
@@ -99,4 +99,45 @@ rec {
9999 availableOn = platform: pkg:
100100 lib.any (platformMatch platform) pkg.meta.platforms &&
101101 lib.all (elem: !platformMatch platform elem) (pkg.meta.badPlatforms or []);
102+
103+ /* Get the corresponding attribute in lib.licenses
104+ from the SPDX ID.
105+ For SPDX IDs, see
106+ https://spdx.org/licenses
107+
108+ Type:
109+ getLicenseFromSpdxId :: str -> AttrSet
110+
111+ Example:
112+ lib.getLicenseFromSpdxId "MIT" == lib.licenses.mit
113+ => true
114+ lib.getLicenseFromSpdxId "mIt" == lib.licenses.mit
115+ => true
116+ lib.getLicenseFromSpdxId "MY LICENSE"
117+ => trace: warning: getLicenseFromSpdxId: No license matches the given SPDX ID: MY LICENSE
118+ => { shortName = "MY LICENSE"; }
119+ */
120+ getLicenseFromSpdxId =
121+ let
122+ spdxLicenses = lib.mapAttrs (id: ls: assert lib.length ls == 1; builtins.head ls)
123+ (lib.groupBy (l: lib.toLower l.spdxId) (lib.filter (l: l ? spdxId) (lib.attrValues lib.licenses)));
124+ in licstr:
125+ spdxLicenses.${ lib.toLower licstr } or (
126+ lib.warn "getLicenseFromSpdxId: No license matches the given SPDX ID: ${licstr}"
127+ { shortName = licstr; }
128+ );
129+
130+ /* Get the path to the main program of a derivation with either
131+ meta.mainProgram or pname or name
132+
133+ Type: getExe :: derivation -> string
134+
135+ Example:
136+ getExe pkgs.hello
137+ => "/nix/store/g124820p9hlv4lj8qplzxw1c44dxaw1k-hello-2.12/bin/hello"
138+ getExe pkgs.mustache-go
139+ => "/nix/store/am9ml4f4ywvivxnkiaqwr0hyxka1xjsf-mustache-go-1.3.0/bin/mustache"
140+ */
141+ getExe = x:
142+ "${lib.getBin x}/bin/${x.meta.mainProgram or (lib.getName x)}";
102143}
lib/modules.nix+341−92
@@ -9,12 +9,10 @@ let
99 catAttrs
1010 concatLists
1111 concatMap
12− count
12+ concatStringsSep
1313 elem
1414 filter
1515 findFirst
16− flip
17− foldl
1816 foldl'
1917 getAttrFromPath
2018 head
@@ -39,6 +37,7 @@ let
3937 toList
4038 types
4139 warnIf
40+ zipAttrsWith
4241 ;
4342 inherit (lib.options)
4443 isOption
@@ -47,20 +46,63 @@ let
4746 showFiles
4847 showOption
4948 unknownModule
49+ literalExpression
5050 ;
51+
52+ showDeclPrefix = loc: decl: prefix:
53+ " - option(s) with prefix `${showOption (loc ++ [prefix])}' in module `${decl._file}'";
54+ showRawDecls = loc: decls:
55+ concatStringsSep "\n"
56+ (sort (a: b: a < b)
57+ (concatMap
58+ (decl: map
59+ (showDeclPrefix loc decl)
60+ (attrNames decl.options)
61+ )
62+ decls
63+ ));
64+
5165in
5266
5367rec {
5468
55− /* Evaluate a set of modules. The result is a set of two
56− attributes: ‘options’: the nested set of all option declarations,
57− and ‘config’: the nested set of all option values.
69+ /*
70+ Evaluate a set of modules. The result is a set with the attributes:
71+
72+ ‘options’: The nested set of all option declarations,
73+
74+ ‘config’: The nested set of all option values.
75+
76+ ‘type’: A module system type representing the module set as a submodule,
77+ to be extended by configuration from the containing module set.
78+
79+ This is also available as the module argument ‘moduleType’.
80+
81+ ‘extendModules’: A function similar to ‘evalModules’ but building on top
82+ of the module set. Its arguments, ‘modules’ and ‘specialArgs’ are
83+ added to the existing values.
84+
85+ Using ‘extendModules’ a few times has no performance impact as long
86+ as you only reference the final ‘options’ and ‘config’.
87+ If you do reference multiple ‘config’ (or ‘options’) from before and
88+ after ‘extendModules’, performance is the same as with multiple
89+ ‘evalModules’ invocations, because the new modules' ability to
90+ override existing configuration fundamentally requires a new
91+ fixpoint to be constructed.
92+
93+ This is also available as a module argument.
94+
95+ ‘_module’: A portion of the configuration tree which is elided from
96+ ‘config’. It contains some values that are mostly internal to the
97+ module system implementation.
98+
5899 !!! Please think twice before adding to this argument list! The more
59100 that is specified here instead of in the modules themselves the harder
60101 it is to transparently move a set of modules to be a submodule of another
61102 config (as the proper arguments need to be replicated at each call to
62103 evalModules) and the less declarative the module set is. */
63− evalModules = { modules
104+ evalModules = evalModulesArgs@
105+ { modules
64106 , prefix ? []
65107 , # This should only be used for special arguments that need to be evaluated
66108 # when resolving module structure (like in imports). For everything else,
@@ -71,13 +113,39 @@ rec {
71113 args ? {}
72114 , # This would be remove in the future, Prefer _module.check option instead.
73115 check ? true
116+ # Internal variable to avoid `_key` collisions regardless
117+ # of `extendModules`. Used in `submoduleWith`.
118+ # Test case: lib/tests/modules, "168767"
119+ , extensionOffset ? 0
74120 }:
75121 let
122+ withWarnings = x:
123+ lib.warnIf (evalModulesArgs?args) "The args argument to evalModules is deprecated. Please set config._module.args instead."
124+ lib.warnIf (evalModulesArgs?check) "The check argument to evalModules is deprecated. Please set config._module.check instead."
125+ x;
126+
127+ legacyModules =
128+ optional (evalModulesArgs?args) {
129+ config = {
130+ _module.args = args;
131+ };
132+ }
133+ ++ optional (evalModulesArgs?check) {
134+ config = {
135+ _module.check = mkDefault check;
136+ };
137+ };
138+ regularModules = modules ++ legacyModules;
139+
76140 # This internal module declare internal options under the `_module'
77141 # attribute. These options are fragile, as they are used by the
78142 # module system to change the interpretation of modules.
143+ #
144+ # When extended with extendModules or moduleType, a fresh instance of
145+ # this module is used, to avoid conflicts and allow chaining of
146+ # extendModules.
79147 internalModule = rec {
80− _file = ./modules.nix;
148+ _file = "lib/modules.nix";
81149
82150 key = _file;
83151
@@ -89,21 +157,106 @@ rec {
89157 # support for that, in turn it's lazy in its values. This means e.g.
90158 # a `_module.args.pkgs = import (fetchTarball { ... }) {}` won't
91159 # start a download when `pkgs` wasn't evaluated.
92− type = types.lazyAttrsOf types.unspecified;
93− internal = true;
94− description = "Arguments passed to each module.";
160+ type = types.lazyAttrsOf types.raw;
161+ # Only render documentation once at the root of the option tree,
162+ # not for all individual submodules.
163+ # Allow merging option decls to make this internal regardless.
164+ ${if prefix == []
165+ then null # unset => visible
166+ else "internal"} = true;
167+ # TODO: Change the type of this option to a submodule with a
168+ # freeformType, so that individual arguments can be documented
169+ # separately
170+ description = ''
171+ Additional arguments passed to each module in addition to ones
172+ like <literal>lib</literal>, <literal>config</literal>,
173+ and <literal>pkgs</literal>, <literal>modulesPath</literal>.
174+ </para>
175+ <para>
176+ This option is also available to all submodules. Submodules do not
177+ inherit args from their parent module, nor do they provide args to
178+ their parent module or sibling submodules. The sole exception to
179+ this is the argument <literal>name</literal> which is provided by
180+ parent modules to a submodule and contains the attribute name
181+ the submodule is bound to, or a unique generated name if it is
182+ not bound to an attribute.
183+ </para>
184+ <para>
185+ Some arguments are already passed by default, of which the
186+ following <emphasis>cannot</emphasis> be changed with this option:
187+ <itemizedlist>
188+ <listitem>
189+ <para>
190+ <varname>lib</varname>: The nixpkgs library.
191+ </para>
192+ </listitem>
193+ <listitem>
194+ <para>
195+ <varname>config</varname>: The results of all options after merging the values from all modules together.
196+ </para>
197+ </listitem>
198+ <listitem>
199+ <para>
200+ <varname>options</varname>: The options declared in all modules.
201+ </para>
202+ </listitem>
203+ <listitem>
204+ <para>
205+ <varname>specialArgs</varname>: The <literal>specialArgs</literal> argument passed to <literal>evalModules</literal>.
206+ </para>
207+ </listitem>
208+ <listitem>
209+ <para>
210+ All attributes of <varname>specialArgs</varname>
211+ </para>
212+ <para>
213+ Whereas option values can generally depend on other option values
214+ thanks to laziness, this does not apply to <literal>imports</literal>, which
215+ must be computed statically before anything else.
216+ </para>
217+ <para>
218+ For this reason, callers of the module system can provide <literal>specialArgs</literal>
219+ which are available during import resolution.
220+ </para>
221+ <para>
222+ For NixOS, <literal>specialArgs</literal> includes
223+ <varname>modulesPath</varname>, which allows you to import
224+ extra modules from the nixpkgs package tree without having to
225+ somehow make the module aware of the location of the
226+ <literal>nixpkgs</literal> or NixOS directories.
227+ <programlisting>
228+ { modulesPath, ... }: {
229+ imports = [
230+ (modulesPath + "/profiles/minimal.nix")
231+ ];
232+ }
233+ </programlisting>
234+ </para>
235+ </listitem>
236+ </itemizedlist>
237+ </para>
238+ <para>
239+ For NixOS, the default value for this option includes at least this argument:
240+ <itemizedlist>
241+ <listitem>
242+ <para>
243+ <varname>pkgs</varname>: The nixpkgs package set according to
244+ the <option>nixpkgs.pkgs</option> option.
245+ </para>
246+ </listitem>
247+ </itemizedlist>
248+ '';
95249 };
96250
97251 _module.check = mkOption {
98252 type = types.bool;
99253 internal = true;
100− default = check;
254+ default = true;
101255 description = "Whether to check whether all option definitions have matching declarations.";
102256 };
103257
104258 _module.freeformType = mkOption {
105− # Disallow merging for now, but could be implemented nicely with a `types.optionType`
106− type = types.nullOr (types.uniq types.attrs);
259+ type = types.nullOr types.optionType;
107260 internal = true;
108261 default = null;
109262 description = ''
@@ -120,14 +273,17 @@ rec {
120273 };
121274
122275 config = {
123− _module.args = args;
276+ _module.args = {
277+ inherit extendModules;
278+ moduleType = type;
279+ };
124280 };
125281 };
126282
127283 merged =
128284 let collected = collectModules
129285 (specialArgs.modulesPath or "")
130− (modules ++ [ internalModule ])
286+ (regularModules ++ [ internalModule ])
131287 ({ inherit lib options config specialArgs; } // specialArgs);
132288 in mergeModules prefix (reverseList collected);
133289
@@ -162,20 +318,51 @@ rec {
162318 baseMsg = "The option `${showOption (prefix ++ firstDef.prefix)}' does not exist. Definition values:${showDefs [ firstDef ]}";
163319 in
164320 if attrNames options == [ "_module" ]
165− then throw ''
166− ${baseMsg}
167−
168− However there are no options defined in `${showOption prefix}'. Are you sure you've
169− declared your options properly? This can happen if you e.g. declared your options in `types.submodule'
170− under `config' rather than `options'.
171− ''
321+ then
322+ let
323+ optionName = showOption prefix;
324+ in
325+ if optionName == ""
326+ then throw ''
327+ ${baseMsg}
328+
329+ It seems as if you're trying to declare an option by placing it into `config' rather than `options'!
330+ ''
331+ else
332+ throw ''
333+ ${baseMsg}
334+
335+ However there are no options defined in `${showOption prefix}'. Are you sure you've
336+ declared your options properly? This can happen if you e.g. declared your options in `types.submodule'
337+ under `config' rather than `options'.
338+ ''
172339 else throw baseMsg
173340 else null;
174341
175− result = builtins.seq checkUnmatched {
176− inherit options;
177− config = removeAttrs config [ "_module" ];
178− inherit (config) _module;
342+ checked = builtins.seq checkUnmatched;
343+
344+ extendModules = extendArgs@{
345+ modules ? [],
346+ specialArgs ? {},
347+ prefix ? [],
348+ extensionOffset ? length modules,
349+ }:
350+ evalModules (evalModulesArgs // {
351+ modules = regularModules ++ modules;
352+ specialArgs = evalModulesArgs.specialArgs or {} // specialArgs;
353+ prefix = extendArgs.prefix or evalModulesArgs.prefix;
354+ inherit extensionOffset;
355+ });
356+
357+ type = lib.types.submoduleWith {
358+ inherit modules specialArgs extensionOffset;
359+ };
360+
361+ result = withWarnings {
362+ options = checked options;
363+ config = checked (removeAttrs config [ "_module" ]);
364+ _module = checked (config._module);
365+ inherit extendModules type;
179366 };
180367 in result;
181368
@@ -188,11 +375,11 @@ rec {
188375 # Like unifyModuleSyntax, but also imports paths and calls functions if necessary
189376 loadModule = args: fallbackFile: fallbackKey: m:
190377 if isFunction m || isAttrs m then
191− unifyModuleSyntax fallbackFile fallbackKey (applyIfFunction fallbackKey m args)
378+ unifyModuleSyntax fallbackFile fallbackKey (applyModuleArgsIfFunction fallbackKey m args)
192379 else if isList m then
193380 let defs = [{ file = fallbackFile; value = m; }]; in
194381 throw "Module imports can't be nested lists. Perhaps you meant to remove one level of lists? Definitions: ${showDefs defs}"
195− else unifyModuleSyntax (toString m) (toString m) (applyIfFunction (toString m) (import m) args);
382+ else unifyModuleSyntax (toString m) (toString m) (applyModuleArgsIfFunction (toString m) (import m) args);
196383
197384 /*
198385 Collects all modules recursively into the form
@@ -253,6 +440,10 @@ rec {
253440 in modulesPath: initialModules: args:
254441 filterModules modulesPath (collectStructuredModules unknownModule "" initialModules args);
255442
443+ /* Wrap a module with a default location for reporting errors. */
444+ setDefaultModuleLocation = file: m:
445+ { _file = file; imports = [ m ]; };
446+
256447 /* Massage a module into canonical form, that is, a set consisting
257448 of ‘options’, ‘config’ and ‘imports’ attributes. */
258449 unifyModuleSyntax = file: key: m:
@@ -285,7 +476,7 @@ rec {
285476 config = addFreeformType (addMeta (removeAttrs m ["_file" "key" "disabledModules" "require" "imports" "freeformType"]));
286477 };
287478
288− applyIfFunction = key: f: args@{ config, options, lib, ... }: if isFunction f then
479+ applyModuleArgsIfFunction = key: f: args@{ config, options, lib, ... }: if isFunction f then
289480 let
290481 # Module arguments are resolved in a strict manner when attribute set
291482 # deconstruction is used. As the arguments are now defined with the
@@ -362,10 +553,11 @@ rec {
362553 }
363554 */
364555 byName = attr: f: modules:
365− foldl' (acc: module:
366− if !(builtins.isAttrs module.${attr}) then
556+ zipAttrsWith (n: concatLists)
557+ (map (module: let subtree = module.${attr}; in
558+ if !(builtins.isAttrs subtree) then
367559 throw ''
368− You're trying to declare a value of type `${builtins.typeOf module.${attr}}'
560+ You're trying to declare a value of type `${builtins.typeOf subtree}'
369561 rather than an attribute-set for the option
370562 `${builtins.concatStringsSep "." prefix}'!
371563
@@ -374,11 +566,8 @@ rec {
374566 this option by e.g. referring to `man 5 configuration.nix'!
375567 ''
376568 else
377− acc // (mapAttrs (n: v:
378− (acc.${n} or []) ++ f module v
379− ) module.${attr}
380− )
381− ) {} modules;
569+ mapAttrs (n: f module) subtree
570+ ) modules);
382571 # an attrset 'name' => list of submodules that declare ‘name’.
383572 declsByName = byName "options" (module: option:
384573 [{ inherit (module) _file; options = option; }]
@@ -392,28 +581,63 @@ rec {
392581 [{ inherit (module) file; inherit value; }]
393582 ) configs;
394583
395− resultsByName = flip mapAttrs declsByName (name: decls:
584+ # Convert an option tree decl to a submodule option decl
585+ optionTreeToOption = decl:
586+ if isOption decl.options
587+ then decl
588+ else decl // {
589+ options = mkOption {
590+ type = types.submoduleWith {
591+ modules = [ { options = decl.options; } ];
592+ # `null` is not intended for use by modules. It is an internal
593+ # value that means "whatever the user has declared elsewhere".
594+ # This might become obsolete with https://github.com/NixOS/nixpkgs/issues/162398
595+ shorthandOnlyDefinesConfig = null;
596+ };
597+ };
598+ };
599+
600+ resultsByName = mapAttrs (name: decls:
396601 # We're descending into attribute ‘name’.
397602 let
398603 loc = prefix ++ [name];
399604 defns = defnsByName.${name} or [];
400605 defns' = defnsByName'.${name} or [];
401− nrOptions = count (m: isOption m.options) decls;
606+ optionDecls = filter (m: isOption m.options) decls;
402607 in
403− if nrOptions == length decls then
608+ if length optionDecls == length decls then
404609 let opt = fixupOptionType loc (mergeOptionDecls loc decls);
405610 in {
406611 matchedOptions = evalOptionValue loc opt defns';
407612 unmatchedDefns = [];
408613 }
409− else if nrOptions != 0 then
410− let
411− firstOption = findFirst (m: isOption m.options) "" decls;
412− firstNonOption = findFirst (m: !isOption m.options) "" decls;
413− in
414− throw "The option `${showOption loc}' in `${firstOption._file}' is a prefix of options in `${firstNonOption._file}'."
614+ else if optionDecls != [] then
615+ if all (x: x.options.type.name == "submodule") optionDecls
616+ # Raw options can only be merged into submodules. Merging into
617+ # attrsets might be nice, but ambiguous. Suppose we have
618+ # attrset as a `attrsOf submodule`. User declares option
619+ # attrset.foo.bar, this could mean:
620+ # a. option `bar` is only available in `attrset.foo`
621+ # b. option `foo.bar` is available in all `attrset.*`
622+ # c. reject and require "<name>" as a reminder that it behaves like (b).
623+ # d. magically combine (a) and (c).
624+ # All of the above are merely syntax sugar though.
625+ then
626+ let opt = fixupOptionType loc (mergeOptionDecls loc (map optionTreeToOption decls));
627+ in {
628+ matchedOptions = evalOptionValue loc opt defns';
629+ unmatchedDefns = [];
630+ }
631+ else
632+ let
633+ firstNonOption = findFirst (m: !isOption m.options) "" decls;
634+ nonOptions = filter (m: !isOption m.options) decls;
635+ in
636+ throw "The option `${showOption loc}' in module `${(lib.head optionDecls)._file}' would be a parent of the following options, but its type `${(lib.head optionDecls).options.type.description or "<no description>"}' does not support nested options.\n${
637+ showRawDecls loc nonOptions
638+ }"
415639 else
416− mergeModules' loc decls defns);
640+ mergeModules' loc decls defns) declsByName;
417641
418642 matchedOptions = mapAttrs (n: v: v.matchedOptions) resultsByName;
419643
@@ -427,12 +651,19 @@ rec {
427651 inherit matchedOptions;
428652
429653 # Transforms unmatchedDefnsByName into a list of definitions
430− unmatchedDefns = concatLists (mapAttrsToList (name: defs:
431− map (def: def // {
432− # Set this so we know when the definition first left unmatched territory
433− prefix = [name] ++ (def.prefix or []);
434− }) defs
435− ) unmatchedDefnsByName);
654+ unmatchedDefns =
655+ if configs == []
656+ then
657+ # When no config values exist, there can be no unmatched config, so
658+ # we short circuit and avoid evaluating more _options_ than necessary.
659+ []
660+ else
661+ concatLists (mapAttrsToList (name: defs:
662+ map (def: def // {
663+ # Set this so we know when the definition first left unmatched territory
664+ prefix = [name] ++ (def.prefix or []);
665+ }) defs
666+ ) unmatchedDefnsByName);
436667 };
437668
438669 /* Merge multiple option declarations into a single declaration. In
@@ -448,11 +679,9 @@ rec {
448679 correspond to the definition of 'loc' in 'opt.file'. */
449680 mergeOptionDecls =
450681 let
451− packSubmodule = file: m:
452− { _file = file; imports = [ m ]; };
453682 coerceOption = file: opt:
454− if isFunction opt then packSubmodule file opt
455− else packSubmodule file { options = opt; };
683+ if isFunction opt then setDefaultModuleLocation file opt
684+ else setDefaultModuleLocation file { options = opt; };
456685 in loc: opts:
457686 foldl' (res: opt:
458687 let t = res.type;
@@ -473,17 +702,9 @@ rec {
473702 throw "The option `${showOption loc}' in `${opt._file}' is already declared in ${showFiles res.declarations}."
474703 else
475704 let
476− /* Add the modules of the current option to the list of modules
477− already collected. The options attribute except either a list of
478− submodules or a submodule. For each submodule, we add the file of the
479− current option declaration as the file use for the submodule. If the
480− submodule defines any filename, then we ignore the enclosing option file. */
481− options' = toList opt.options.options;
482−
483705 getSubModules = opt.options.type.getSubModules or null;
484706 submodules =
485− if getSubModules != null then map (packSubmodule opt._file) getSubModules ++ res.options
486− else if opt.options ? options then map (coerceOption opt._file) options' ++ res.options
707+ if getSubModules != null then map (setDefaultModuleLocation opt._file) getSubModules ++ res.options
487708 else res.options;
488709 in opt.options // res //
489710 { declarations = res.declarations ++ [opt._file];
@@ -527,6 +748,8 @@ rec {
527748 definitions = map (def: def.value) res.defsFinal;
528749 files = map (def: def.file) res.defsFinal;
529750 inherit (res) isDefined;
751+ # This allows options to be correctly displayed using `${options.path.to.it}`
752+ __toString = _: showOption loc;
530753 };
531754
532755 # Merge definitions of a value of a given type.
@@ -664,26 +887,13 @@ rec {
664887 compare = a: b: (a.priority or 1000) < (b.priority or 1000);
665888 in sort compare defs';
666889
667− /* Hack for backward compatibility: convert options of type
668− optionSet to options of type submodule. FIXME: remove
669− eventually. */
890+ # This calls substSubModules, whose entire purpose is only to ensure that
891+ # option declarations in submodules have accurate position information.
892+ # TODO: Merge this into mergeOptionDecls
670893 fixupOptionType = loc: opt:
671− let
672− options = opt.options or
673− (throw "Option `${showOption loc}' has type optionSet but has no option attribute, in ${showFiles opt.declarations}.");
674− f = tp:
675− let optionSetIn = type: (tp.name == type) && (tp.functor.wrapped.name == "optionSet");
676− in
677− if tp.name == "option set" || tp.name == "submodule" then
678− throw "The option ${showOption loc} uses submodules without a wrapping type, in ${showFiles opt.declarations}."
679− else if optionSetIn "attrsOf" then types.attrsOf (types.submodule options)
680− else if optionSetIn "listOf" then types.listOf (types.submodule options)
681− else if optionSetIn "nullOr" then types.nullOr (types.submodule options)
682− else tp;
683− in
684− if opt.type.getSubModules or null == null
685− then opt // { type = f (opt.type or types.unspecified); }
686− else opt // { type = opt.type.substSubModules opt.options; options = []; };
894+ if opt.type.getSubModules or null == null
895+ then opt // { type = opt.type or types.unspecified; }
896+ else opt // { type = opt.type.substSubModules opt.options; options = []; };
687897
688898
689899 /* Properties. */
@@ -710,12 +920,11 @@ rec {
710920
711921 mkOptionDefault = mkOverride 1500; # priority of option defaults
712922 mkDefault = mkOverride 1000; # used in config sections of non-user modules to set a default
923+ mkImageMediaOverride = mkOverride 60; # image media profiles can be derived by inclusion into host config, hence needing to override host config, but do allow user to mkForce
713924 mkForce = mkOverride 50;
714925 mkVMOverride = mkOverride 10; # used by ‘nixos-rebuild build-vm’
715926
716− mkStrict = builtins.trace "`mkStrict' is obsolete; use `mkOverride 0' instead." (mkOverride 0);
717−
718− mkFixStrictness = id; # obsolete, no-op
927+ mkFixStrictness = lib.warn "lib.mkFixStrictness has no effect and will be removed. It returns its argument unmodified, so you can just remove any calls." id;
719928
720929 mkOrder = priority: content:
721930 { _type = "order";
@@ -816,6 +1025,26 @@ rec {
8161025 use = builtins.trace "Obsolete option `${showOption from}' is used. It was renamed to `${showOption to}'.";
8171026 };
8181027
1028+ mkRenamedOptionModuleWith = {
1029+ /* Old option path as list of strings. */
1030+ from,
1031+ /* New option path as list of strings. */
1032+ to,
1033+
1034+ /*
1035+ Release number of the first release that contains the rename, ignoring backports.
1036+ Set it to the upcoming release, matching the nixpkgs/.version file.
1037+ */
1038+ sinceRelease,
1039+
1040+ }: doRename {
1041+ inherit from to;
1042+ visible = false;
1043+ warn = lib.isInOldestRelease sinceRelease;
1044+ use = lib.warnIf (lib.isInOldestRelease sinceRelease)
1045+ "Obsolete option `${showOption from}' is used. It was renamed to `${showOption to}'.";
1046+ };
1047+
8191048 /* Return a module that causes a warning to be shown if any of the "from"
8201049 option is defined; the defined values can be used in the "mergeFn" to set
8211050 the "to" value.
@@ -847,7 +1076,7 @@ rec {
8471076 mkMergedOptionModule = from: to: mergeFn:
8481077 { config, options, ... }:
8491078 {
850− options = foldl recursiveUpdate {} (map (path: setAttrByPath path (mkOption {
1079+ options = foldl' recursiveUpdate {} (map (path: setAttrByPath path (mkOption {
8511080 visible = false;
8521081 # To use the value in mergeFn without triggering errors
8531082 default = "_mkMergedOptionModule";
@@ -902,6 +1131,26 @@ rec {
9021131 use = id;
9031132 };
9041133
1134+ /* mkDerivedConfig : Option a -> (a -> Definition b) -> Definition b
1135+
1136+ Create config definitions with the same priority as the definition of another option.
1137+ This should be used for option definitions where one option sets the value of another as a convenience.
1138+ For instance a config file could be set with a `text` or `source` option, where text translates to a `source`
1139+ value using `mkDerivedConfig options.text (pkgs.writeText "filename.conf")`.
1140+
1141+ It takes care of setting the right priority using `mkOverride`.
1142+ */
1143+ # TODO: make the module system error message include information about `opt` in
1144+ # error messages about conflicts. E.g. introduce a variation of `mkOverride` which
1145+ # adds extra location context to the definition object. This will allow context to be added
1146+ # to all messages that report option locations "this value was derived from <full option name>
1147+ # which was defined in <locations>". It can provide a trace of options that contributed
1148+ # to definitions.
1149+ mkDerivedConfig = opt: f:
1150+ mkOverride
1151+ (opt.highestPrio or defaultPriority)
1152+ (f opt.value);
1153+
9051154 doRename = { from, to, visible, warn, use, withPriority ? true }:
9061155 { config, options, ... }:
9071156 let
@@ -931,7 +1180,7 @@ rec {
9311180
9321181 /* Use this function to import a JSON file as NixOS configuration.
9331182
934− importJSON -> path -> attrs
1183+ modules.importJSON :: path -> attrs
9351184 */
9361185 importJSON = file: {
9371186 _file = file;
@@ -940,7 +1189,7 @@ rec {
9401189
9411190 /* Use this function to import a TOML file as NixOS configuration.
9421191
943− importTOML -> path -> attrs
1192+ modules.importTOML :: path -> attrs
9441193 */
9451194 importTOML = file: {
9461195 _file = file;
lib/options.nix+84−19
@@ -11,6 +11,7 @@ let
1111 filter
1212 foldl'
1313 head
14+ tail
1415 isAttrs
1516 isBool
1617 isDerivation
@@ -25,6 +26,7 @@ let
2526 take
2627 ;
2728 inherit (lib.attrsets)
29+ attrByPath
2830 optionalAttrs
2931 ;
3032 inherit (lib.strings)
@@ -53,7 +55,7 @@ rec {
5355
5456 Example:
5557 mkOption { } // => { _type = "option"; }
56− mkOption { defaultText = "foo"; } // => { _type = "option"; defaultText = "foo"; }
58+ mkOption { default = "foo"; } // => { _type = "option"; default = "foo"; }
5759 */
5860 mkOption =
5961 {
@@ -73,12 +75,10 @@ rec {
7375 apply ? null,
7476 # Whether the option is for NixOS developers only.
7577 internal ? null,
76− # Whether the option shows up in the manual.
78+ # Whether the option shows up in the manual. Default: true. Use false to hide the option and any sub-options from submodules. Use "shallow" to hide only sub-options.
7779 visible ? null,
7880 # Whether the option can be set only once
7981 readOnly ? null,
80− # Deprecated, used by types.optionSet.
81− options ? null
8282 } @ attrs:
8383 attrs // { _type = "option"; };
8484
@@ -98,6 +98,49 @@ rec {
9898 type = lib.types.bool;
9999 };
100100
101+ /* Creates an Option attribute set for an option that specifies the
102+ package a module should use for some purpose.
103+
104+ Type: mkPackageOption :: pkgs -> string -> { default :: [string], example :: null | string | [string] } -> option
105+
106+ The package is specified as a list of strings representing its attribute path in nixpkgs.
107+
108+ Because of this, you need to pass nixpkgs itself as the first argument.
109+
110+ The second argument is the name of the option, used in the description "The <name> package to use.".
111+
112+ You can also pass an example value, either a literal string or a package's attribute path.
113+
114+ You can omit the default path if the name of the option is also attribute path in nixpkgs.
115+
116+ Example:
117+ mkPackageOption pkgs "hello" { }
118+ => { _type = "option"; default = «derivation /nix/store/3r2vg51hlxj3cx5vscp0vkv60bqxkaq0-hello-2.10.drv»; defaultText = { ... }; description = "The hello package to use."; type = { ... }; }
119+
120+ Example:
121+ mkPackageOption pkgs "GHC" {
122+ default = [ "ghc" ];
123+ example = "pkgs.haskell.package.ghc922.ghc.withPackages (hkgs: [ hkgs.primes ])";
124+ }
125+ => { _type = "option"; default = «derivation /nix/store/jxx55cxsjrf8kyh3fp2ya17q99w7541r-ghc-8.10.7.drv»; defaultText = { ... }; description = "The GHC package to use."; example = { ... }; type = { ... }; }
126+ */
127+ mkPackageOption =
128+ # Package set (a specific version of nixpkgs)
129+ pkgs:
130+ # Name for the package, shown in option description
131+ name:
132+ { default ? [ name ], example ? null }:
133+ let default' = if !isList default then [ default ] else default;
134+ in mkOption {
135+ type = lib.types.package;
136+ description = "The ${name} package to use.";
137+ default = attrByPath default'
138+ (throw "${concatStringsSep "." default'} cannot be found in pkgs") pkgs;
139+ defaultText = literalExpression ("pkgs." + concatStringsSep "." default');
140+ ${if example != null then "example" else null} = literalExpression
141+ (if isList example then "pkgs." + concatStringsSep "." example else example);
142+ };
143+
101144 /* This option accepts anything, but it does not produce any result.
102145
103146 This is useful for sharing a module across different module sets
@@ -127,11 +170,13 @@ rec {
127170 else if all isInt list && all (x: x == head list) list then head list
128171 else throw "Cannot merge definitions of `${showOption loc}'. Definition values:${showDefs defs}";
129172
130− mergeOneOption = loc: defs:
131− if defs == [] then abort "This case should never happen."
132− else if length defs != 1 then
133− throw "The unique option `${showOption loc}' is defined multiple times. Definition values:${showDefs defs}"
134− else (head defs).value;
173+ mergeOneOption = mergeUniqueOption { message = ""; };
174+
175+ mergeUniqueOption = { message }: loc: defs:
176+ if length defs == 1
177+ then (head defs).value
178+ else assert length defs > 1;
179+ throw "The option `${showOption loc}' is defined multiple times.\n${message}\nDefinition values:${showDefs defs}";
135180
136181 /* "Merge" option definitions by checking that they all have the same value. */
137182 mergeEqualOption = loc: defs:
@@ -144,7 +189,7 @@ rec {
144189 if def.value != first.value then
145190 throw "The option `${showOption loc}' has conflicting definition values:${showDefs [ first def ]}"
146191 else
147− first) (head defs) defs).value;
192+ first) (head defs) (tail defs)).value;
148193
149194 /* Extracts values of all "value" keys of the given list.
150195
@@ -176,12 +221,15 @@ rec {
176221 docOption = rec {
177222 loc = opt.loc;
178223 name = showOption opt.loc;
179− description = opt.description or (lib.warn "Option `${name}' has no description." "This option has no description.");
224+ description = opt.description or null;
180225 declarations = filter (x: x != unknownModule) opt.declarations;
181226 internal = opt.internal or false;
182− visible = opt.visible or true;
227+ visible =
228+ if (opt?visible && opt.visible == "shallow")
229+ then true
230+ else opt.visible or true;
183231 readOnly = opt.readOnly or false;
184− type = opt.type.description or null;
232+ type = opt.type.description or "unspecified";
185233 }
186234 // optionalAttrs (opt ? example) { example = scrubOptionValue opt.example; }
187235 // optionalAttrs (opt ? default) { default = scrubOptionValue opt.default; }
@@ -191,8 +239,9 @@ rec {
191239 subOptions =
192240 let ss = opt.type.getSubOptions opt.loc;
193241 in if ss != {} then optionAttrSetToDocList' opt.loc ss else [];
242+ subOptionsVisible = docOption.visible && opt.visible or null != "shallow";
194243 in
195− [ docOption ] ++ optionals docOption.visible subOptions) (collect isOption options);
244+ [ docOption ] ++ optionals subOptionsVisible subOptions) (collect isOption options);
196245
197246
198247 /* This function recursively removes all derivation attributes from
@@ -211,11 +260,25 @@ rec {
211260 else x;
212261
213262
214− /* For use in the `example` option attribute. It causes the given
215− text to be included verbatim in documentation. This is necessary
216− for example values that are not simple values, e.g., functions.
263+ /* For use in the `defaultText` and `example` option attributes. Causes the
264+ given string to be rendered verbatim in the documentation as Nix code. This
265+ is necessary for complex values, e.g. functions, or values that depend on
266+ other values or packages.
267+ */
268+ literalExpression = text:
269+ if ! isString text then throw "literalExpression expects a string."
270+ else { _type = "literalExpression"; inherit text; };
271+
272+ literalExample = lib.warn "literalExample is deprecated, use literalExpression instead, or use literalDocBook for a non-Nix description." literalExpression;
273+
274+
275+ /* For use in the `defaultText` and `example` option attributes. Causes the
276+ given DocBook text to be inserted verbatim in the documentation, for when
277+ a `literalExpression` would be too hard to read.
217278 */
218− literalExample = text: { _type = "literalExample"; inherit text; };
279+ literalDocBook = text:
280+ if ! isString text then throw "literalDocBook expects a string."
281+ else { _type = "literalDocBook"; inherit text; };
219282
220283 # Helper functions.
221284
@@ -246,7 +309,9 @@ rec {
246309 showDefs = defs: concatMapStrings (def:
247310 let
248311 # Pretty print the value for display, if successful
249− prettyEval = builtins.tryEval (lib.generators.toPretty {} def.value);
312+ prettyEval = builtins.tryEval
313+ (lib.generators.toPretty { }
314+ (lib.generators.withRecursion { depthLimit = 10; throwOnDepthLimit = false; } def.value));
250315 # Split it into its lines
251316 lines = filter (v: ! isList v) (builtins.split "\n" prettyEval.value);
252317 # Only display the first 5 lines, and indent them for better visibility
lib/sources.nix+170−66
@@ -1,6 +1,7 @@
11# Functions for copying sources to the Nix store.
22{ lib }:
33
4+# Tested in lib/tests/sources.sh
45let
56 inherit (builtins)
67 hasContext
@@ -11,26 +12,34 @@ let
1112 tryEval
1213 ;
1314 inherit (lib)
15+ boolToString
1416 filter
1517 getAttr
1618 isString
1719 pathExists
1820 readFile
1921 ;
20−in
21−rec {
2222
23− # Returns the type of a path: regular (for file), symlink, or directory
24− pathType = p: getAttr (baseNameOf p) (readDir (dirOf p));
23+ /*
24+ Returns the type of a path: regular (for file), symlink, or directory.
25+ */
26+ pathType = path: getAttr (baseNameOf path) (readDir (dirOf path));
2527
26− # Returns true if the path exists and is a directory, false otherwise
27− pathIsDirectory = p: if pathExists p then (pathType p) == "directory" else false;
28+ /*
29+ Returns true if the path exists and is a directory, false otherwise.
30+ */
31+ pathIsDirectory = path: if pathExists path then (pathType path) == "directory" else false;
2832
29− # Returns true if the path exists and is a regular file, false otherwise
30− pathIsRegularFile = p: if pathExists p then (pathType p) == "regular" else false;
33+ /*
34+ Returns true if the path exists and is a regular file, false otherwise.
35+ */
36+ pathIsRegularFile = path: if pathExists path then (pathType path) == "regular" else false;
3137
32− # Bring in a path as a source, filtering out all Subversion and CVS
33− # directories, as well as backup files (*~).
38+ /*
39+ A basic filter for `cleanSourceWith` that removes
40+ directories of version control system, backup files (*~)
41+ and some generated files.
42+ */
3443 cleanSourceFilter = name: type: let baseName = baseNameOf (toString name); in ! (
3544 # Filter out version control software files/directories
3645 (baseName == ".git" || type == "directory" && (baseName == ".svn" || baseName == "CVS" || baseName == ".hg")) ||
@@ -43,62 +52,89 @@ rec {
4352 lib.hasSuffix ".o" baseName ||
4453 lib.hasSuffix ".so" baseName ||
4554 # Filter out nix-build result symlinks
46− (type == "symlink" && lib.hasPrefix "result" baseName)
55+ (type == "symlink" && lib.hasPrefix "result" baseName) ||
56+ # Filter out sockets and other types of files we can't have in the store.
57+ (type == "unknown")
4758 );
4859
49− # Filters a source tree removing version control files and directories using cleanSourceWith
50− #
51− # Example:
52− # cleanSource ./.
60+ /*
61+ Filters a source tree removing version control files and directories using cleanSourceFilter.
62+
63+ Example:
64+ cleanSource ./.
65+ */
5366 cleanSource = src: cleanSourceWith { filter = cleanSourceFilter; inherit src; };
5467
55− # Like `builtins.filterSource`, except it will compose with itself,
56− # allowing you to chain multiple calls together without any
57− # intermediate copies being put in the nix store.
58− #
59− # lib.cleanSourceWith {
60− # filter = f;
61− # src = lib.cleanSourceWith {
62− # filter = g;
63− # src = ./.;
64− # };
65− # }
66− # # Succeeds!
67− #
68− # builtins.filterSource f (builtins.filterSource g ./.)
69− # # Fails!
70− #
71− # Parameters:
72− #
73− # src: A path or cleanSourceWith result to filter and/or rename.
74− #
75− # filter: A function (path -> type -> bool)
76− # Optional with default value: constant true (include everything)
77− # The function will be combined with the && operator such
78− # that src.filter is called lazily.
79− # For implementing a filter, see
80− # https://nixos.org/nix/manual/#builtin-filterSource
81− #
82− # name: Optional name to use as part of the store path.
83− # This defaults to `src.name` or otherwise `"source"`.
84− #
85− cleanSourceWith = { filter ? _path: _type: true, src, name ? null }:
68+ /*
69+ Like `builtins.filterSource`, except it will compose with itself,
70+ allowing you to chain multiple calls together without any
71+ intermediate copies being put in the nix store.
72+
73+ Example:
74+ lib.cleanSourceWith {
75+ filter = f;
76+ src = lib.cleanSourceWith {
77+ filter = g;
78+ src = ./.;
79+ };
80+ }
81+ # Succeeds!
82+
83+ builtins.filterSource f (builtins.filterSource g ./.)
84+ # Fails!
85+
86+ */
87+ cleanSourceWith =
88+ {
89+ # A path or cleanSourceWith result to filter and/or rename.
90+ src,
91+ # Optional with default value: constant true (include everything)
92+ # The function will be combined with the && operator such
93+ # that src.filter is called lazily.
94+ # For implementing a filter, see
95+ # https://nixos.org/nix/manual/#builtin-filterSource
96+ # Type: A function (path -> type -> bool)
97+ filter ? _path: _type: true,
98+ # Optional name to use as part of the store path.
99+ # This defaults to `src.name` or otherwise `"source"`.
100+ name ? null
101+ }:
86102 let
87− isFiltered = src ? _isLibCleanSourceWith;
88− origSrc = if isFiltered then src.origSrc else src;
89− filter' = if isFiltered then name: type: filter name type && src.filter name type else filter;
90− name' = if name != null then name else if isFiltered then src.name else "source";
91− in {
92− inherit origSrc;
93− filter = filter';
94− outPath = builtins.path { filter = filter'; path = origSrc; name = name'; };
95− _isLibCleanSourceWith = true;
96− name = name';
103+ orig = toSourceAttributes src;
104+ in fromSourceAttributes {
105+ inherit (orig) origSrc;
106+ filter = path: type: filter path type && orig.filter path type;
107+ name = if name != null then name else orig.name;
97108 };
98109
99− # Filter sources by a list of regular expressions.
100− #
101− # E.g. `src = sourceByRegex ./my-subproject [".*\.py$" "^database.sql$"]`
110+ /*
111+ Add logging to a source, for troubleshooting the filtering behavior.
112+ Type:
113+ sources.trace :: sourceLike -> Source
114+ */
115+ trace =
116+ # Source to debug. The returned source will behave like this source, but also log its filter invocations.
117+ src:
118+ let
119+ attrs = toSourceAttributes src;
120+ in
121+ fromSourceAttributes (
122+ attrs // {
123+ filter = path: type:
124+ let
125+ r = attrs.filter path type;
126+ in
127+ builtins.trace "${attrs.name}.filter ${path} = ${boolToString r}" r;
128+ }
129+ ) // {
130+ satisfiesSubpathInvariant = src ? satisfiesSubpathInvariant && src.satisfiesSubpathInvariant;
131+ };
132+
133+ /*
134+ Filter sources by a list of regular expressions.
135+
136+ Example: src = sourceByRegex ./my-subproject [".*\.py$" "^database.sql$"]
137+ */
102138 sourceByRegex = src: regexes:
103139 let
104140 isFiltered = src ? _isLibCleanSourceWith;
@@ -110,19 +146,34 @@ rec {
110146 inherit src;
111147 };
112148
113− # Get all files ending with the specified suffices from the given
114− # directory or its descendants. E.g. `sourceFilesBySuffices ./dir
115− # [".xml" ".c"]'.
116− sourceFilesBySuffices = path: exts:
149+ /*
150+ Get all files ending with the specified suffices from the given
151+ source directory or its descendants, omitting files that do not match
152+ any suffix. The result of the example below will include files like
153+ `./dir/module.c` and `./dir/subdir/doc.xml` if present.
154+
155+ Type: sourceLike -> [String] -> Source
156+
157+ Example:
158+ sourceFilesBySuffices ./. [ ".xml" ".c" ]
159+ */
160+ sourceFilesBySuffices =
161+ # Path or source containing the files to be returned
162+ src:
163+ # A list of file suffix strings
164+ exts:
117165 let filter = name: type:
118166 let base = baseNameOf (toString name);
119167 in type == "directory" || lib.any (ext: lib.hasSuffix ext base) exts;
120− in cleanSourceWith { inherit filter; src = path; };
168+ in cleanSourceWith { inherit filter src; };
121169
122170 pathIsGitRepo = path: (tryEval (commitIdFromGitRepo path)).success;
123171
124− # Get the commit id of a git repo
125− # Example: commitIdFromGitRepo <nixpkgs/.git>
172+ /*
173+ Get the commit id of a git repo.
174+
175+ Example: commitIdFromGitRepo <nixpkgs/.git>
176+ */
126177 commitIdFromGitRepo =
127178 let readCommitFromFile = file: path:
128179 let fileName = toString path + "/" + file;
@@ -177,4 +228,57 @@ rec {
177228 pathHasContext = builtins.hasContext or (lib.hasPrefix storeDir);
178229
179230 canCleanSource = src: src ? _isLibCleanSourceWith || !(pathHasContext (toString src));
231+
232+ # -------------------------------------------------------------------------- #
233+ # Internal functions
234+ #
235+
236+ # toSourceAttributes : sourceLike -> SourceAttrs
237+ #
238+ # Convert any source-like object into a simple, singular representation.
239+ # We don't expose this representation in order to avoid having a fifth path-
240+ # like class of objects in the wild.
241+ # (Existing ones being: paths, strings, sources and x//{outPath})
242+ # So instead of exposing internals, we build a library of combinator functions.
243+ toSourceAttributes = src:
244+ let
245+ isFiltered = src ? _isLibCleanSourceWith;
246+ in
247+ {
248+ # The original path
249+ origSrc = if isFiltered then src.origSrc else src;
250+ filter = if isFiltered then src.filter else _: _: true;
251+ name = if isFiltered then src.name else "source";
252+ };
253+
254+ # fromSourceAttributes : SourceAttrs -> Source
255+ #
256+ # Inverse of toSourceAttributes for Source objects.
257+ fromSourceAttributes = { origSrc, filter, name }:
258+ {
259+ _isLibCleanSourceWith = true;
260+ inherit origSrc filter name;
261+ outPath = builtins.path { inherit filter name; path = origSrc; };
262+ };
263+
264+in {
265+ inherit
266+ pathType
267+ pathIsDirectory
268+ pathIsRegularFile
269+
270+ pathIsGitRepo
271+ commitIdFromGitRepo
272+
273+ cleanSource
274+ cleanSourceWith
275+ cleanSourceFilter
276+ pathHasContext
277+ canCleanSource
278+
279+ sourceByRegex
280+ sourceFilesBySuffices
281+
282+ trace
283+ ;
180284}
lib/strings.nix+212−8
@@ -17,6 +17,7 @@ rec {
1717 head
1818 isInt
1919 isList
20+ isAttrs
2021 isString
2122 match
2223 parseDrvName
@@ -89,13 +90,13 @@ rec {
8990 => "usr/local/bin"
9091 */
9192 concatStringsSep = builtins.concatStringsSep or (separator: list:
92− concatStrings (intersperse separator list));
93+ lib.foldl' (x: y: x + y) "" (intersperse separator list));
9394
9495 /* Maps a function over a list of strings and then concatenates the
9596 result with the specified separator interspersed between
9697 elements.
9798
98− Type: concatMapStringsSep :: string -> (string -> string) -> [string] -> string
99+ Type: concatMapStringsSep :: string -> (a -> string) -> [a] -> string
99100
100101 Example:
101102 concatMapStringsSep "-" (x: toUpper x) ["foo" "bar" "baz"]
@@ -112,7 +113,7 @@ rec {
112113 /* Same as `concatMapStringsSep`, but the mapping function
113114 additionally receives the position of its argument.
114115
115− Type: concatIMapStringsSep :: string -> (int -> string -> string) -> [string] -> string
116+ Type: concatIMapStringsSep :: string -> (int -> a -> string) -> [a] -> string
116117
117118 Example:
118119 concatImapStringsSep "-" (pos: x: toString (x / pos)) [ 6 6 6 ]
@@ -253,10 +254,7 @@ rec {
253254 => false
254255 */
255256 hasInfix = infix: content:
256− let
257− drop = x: substring 1 (stringLength x) x;
258− in hasPrefix infix content
259− || content != "" && hasInfix infix (drop content);
257+ builtins.match ".*${escapeRegex infix}.*" "${content}" != null;
260258
261259 /* Convert a string to a list of characters (i.e. singleton strings).
262260 This allows you to, e.g., map a function over each character. However,
@@ -327,6 +325,65 @@ rec {
327325 */
328326 escapeShellArgs = concatMapStringsSep " " escapeShellArg;
329327
328+ /* Test whether the given name is a valid POSIX shell variable name.
329+
330+ Type: string -> bool
331+
332+ Example:
333+ isValidPosixName "foo_bar000"
334+ => true
335+ isValidPosixName "0-bad.jpg"
336+ => false
337+ */
338+ isValidPosixName = name: match "[a-zA-Z_][a-zA-Z0-9_]*" name != null;
339+
340+ /* Translate a Nix value into a shell variable declaration, with proper escaping.
341+
342+ Supported value types are strings (mapped to regular variables), lists of strings
343+ (mapped to Bash-style arrays) and attribute sets of strings (mapped to Bash-style
344+ associative arrays). Note that "strings" include string-coercible values like paths.
345+
346+ Strings are translated into POSIX sh-compatible code; lists and attribute sets
347+ assume a shell that understands Bash syntax (e.g. Bash or ZSH).
348+
349+ Type: string -> (string | listOf string | attrsOf string) -> string
350+
351+ Example:
352+ ''
353+ ${toShellVar "foo" "some string"}
354+ [[ "$foo" == "some string" ]]
355+ ''
356+ */
357+ toShellVar = name: value:
358+ lib.throwIfNot (isValidPosixName name) "toShellVar: ${name} is not a valid shell variable name" (
359+ if isAttrs value then
360+ "declare -A ${name}=(${
361+ concatStringsSep " " (lib.mapAttrsToList (n: v:
362+ "[${escapeShellArg n}]=${escapeShellArg v}"
363+ ) value)
364+ })"
365+ else if isList value then
366+ "declare -a ${name}=(${escapeShellArgs value})"
367+ else
368+ "${name}=${escapeShellArg value}"
369+ );
370+
371+ /* Translate an attribute set into corresponding shell variable declarations
372+ using `toShellVar`.
373+
374+ Type: attrsOf (string | listOf string | attrsOf string) -> string
375+
376+ Example:
377+ let
378+ foo = "value";
379+ bar = foo;
380+ in ''
381+ ${toShellVars { inherit foo bar; }}
382+ [[ "$foo" == "$bar" ]]
383+ ''
384+ */
385+ toShellVars = vars: concatStringsSep "\n" (lib.mapAttrsToList toShellVar vars);
386+
330387 /* Turn a string into a Nix expression representing that string
331388
332389 Type: string -> string
@@ -362,6 +419,19 @@ rec {
362419 if match "[a-zA-Z_][a-zA-Z0-9_'-]*" s != null
363420 then s else escapeNixString s;
364421
422+ /* Escapes a string such that it is safe to include verbatim in an XML
423+ document.
424+
425+ Type: string -> string
426+
427+ Example:
428+ escapeXML ''"test" 'test' < & >''
429+ => "&quot;test&quot; &apos;test&apos; &lt; &amp; &gt;"
430+ */
431+ escapeXML = builtins.replaceStrings
432+ ["\"" "'" "<" ">" "&"]
433+ ["&quot;" "&apos;" "&lt;" "&gt;" "&amp;"];
434+
365435 # Obsolete - use replaceStrings instead.
366436 replaceChars = builtins.replaceStrings or (
367437 del: new: s:
@@ -743,7 +813,14 @@ rec {
743813 sanitizeDerivationName pkgs.hello
744814 => "-nix-store-2g75chlbpxlrqn15zlby2dfh8hr9qwbk-hello-2.10"
745815 */
746− sanitizeDerivationName = string: lib.pipe string [
816+ sanitizeDerivationName =
817+ let okRegex = match "[[:alnum:]+_?=-][[:alnum:]+._?=-]*";
818+ in
819+ string:
820+ # First detect the common case of already valid strings, to speed those up
821+ if stringLength string <= 207 && okRegex string != null
822+ then unsafeDiscardStringContext string
823+ else lib.pipe string [
747824 # Get rid of string context. This is safe under the assumption that the
748825 # resulting string is only used as a derivation name
749826 unsafeDiscardStringContext
@@ -761,4 +838,131 @@ rec {
761838 (x: if stringLength x == 0 then "unknown" else x)
762839 ];
763840
841+ /* Computes the Levenshtein distance between two strings.
842+ Complexity O(n*m) where n and m are the lengths of the strings.
843+ Algorithm adjusted from https://stackoverflow.com/a/9750974/6605742
844+
845+ Type: levenshtein :: string -> string -> int
846+
847+ Example:
848+ levenshtein "foo" "foo"
849+ => 0
850+ levenshtein "book" "hook"
851+ => 1
852+ levenshtein "hello" "Heyo"
853+ => 3
854+ */
855+ levenshtein = a: b: let
856+ # Two dimensional array with dimensions (stringLength a + 1, stringLength b + 1)
857+ arr = lib.genList (i:
858+ lib.genList (j:
859+ dist i j
860+ ) (stringLength b + 1)
861+ ) (stringLength a + 1);
862+ d = x: y: lib.elemAt (lib.elemAt arr x) y;
863+ dist = i: j:
864+ let c = if substring (i - 1) 1 a == substring (j - 1) 1 b
865+ then 0 else 1;
866+ in
867+ if j == 0 then i
868+ else if i == 0 then j
869+ else lib.min
870+ ( lib.min (d (i - 1) j + 1) (d i (j - 1) + 1))
871+ ( d (i - 1) (j - 1) + c );
872+ in d (stringLength a) (stringLength b);
873+
874+ /* Returns the length of the prefix common to both strings.
875+ */
876+ commonPrefixLength = a: b:
877+ let
878+ m = lib.min (stringLength a) (stringLength b);
879+ go = i: if i >= m then m else if substring i 1 a == substring i 1 b then go (i + 1) else i;
880+ in go 0;
881+
882+ /* Returns the length of the suffix common to both strings.
883+ */
884+ commonSuffixLength = a: b:
885+ let
886+ m = lib.min (stringLength a) (stringLength b);
887+ go = i: if i >= m then m else if substring (stringLength a - i - 1) 1 a == substring (stringLength b - i - 1) 1 b then go (i + 1) else i;
888+ in go 0;
889+
890+ /* Returns whether the levenshtein distance between two strings is at most some value
891+ Complexity is O(min(n,m)) for k <= 2 and O(n*m) otherwise
892+
893+ Type: levenshteinAtMost :: int -> string -> string -> bool
894+
895+ Example:
896+ levenshteinAtMost 0 "foo" "foo"
897+ => true
898+ levenshteinAtMost 1 "foo" "boa"
899+ => false
900+ levenshteinAtMost 2 "foo" "boa"
901+ => true
902+ levenshteinAtMost 2 "This is a sentence" "this is a sentense."
903+ => false
904+ levenshteinAtMost 3 "This is a sentence" "this is a sentense."
905+ => true
906+
907+ */
908+ levenshteinAtMost = let
909+ infixDifferAtMost1 = x: y: stringLength x <= 1 && stringLength y <= 1;
910+
911+ # This function takes two strings stripped by their common pre and suffix,
912+ # and returns whether they differ by at most two by Levenshtein distance.
913+ # Because of this stripping, if they do indeed differ by at most two edits,
914+ # we know that those edits were (if at all) done at the start or the end,
915+ # while the middle has to have stayed the same. This fact is used in the
916+ # implementation.
917+ infixDifferAtMost2 = x: y:
918+ let
919+ xlen = stringLength x;
920+ ylen = stringLength y;
921+ # This function is only called with |x| >= |y| and |x| - |y| <= 2, so
922+ # diff is one of 0, 1 or 2
923+ diff = xlen - ylen;
924+
925+ # Infix of x and y, stripped by the left and right most character
926+ xinfix = substring 1 (xlen - 2) x;
927+ yinfix = substring 1 (ylen - 2) y;
928+
929+ # x and y but a character deleted at the left or right
930+ xdelr = substring 0 (xlen - 1) x;
931+ xdell = substring 1 (xlen - 1) x;
932+ ydelr = substring 0 (ylen - 1) y;
933+ ydell = substring 1 (ylen - 1) y;
934+ in
935+ # A length difference of 2 can only be gotten with 2 delete edits,
936+ # which have to have happened at the start and end of x
937+ # Example: "abcdef" -> "bcde"
938+ if diff == 2 then xinfix == y
939+ # A length difference of 1 can only be gotten with a deletion on the
940+ # right and a replacement on the left or vice versa.
941+ # Example: "abcdef" -> "bcdez" or "zbcde"
942+ else if diff == 1 then xinfix == ydelr || xinfix == ydell
943+ # No length difference can either happen through replacements on both
944+ # sides, or a deletion on the left and an insertion on the right or
945+ # vice versa
946+ # Example: "abcdef" -> "zbcdez" or "bcdefz" or "zabcde"
947+ else xinfix == yinfix || xdelr == ydell || xdell == ydelr;
948+
949+ in k: if k <= 0 then a: b: a == b else
950+ let f = a: b:
951+ let
952+ alen = stringLength a;
953+ blen = stringLength b;
954+ prelen = commonPrefixLength a b;
955+ suflen = commonSuffixLength a b;
956+ presuflen = prelen + suflen;
957+ ainfix = substring prelen (alen - presuflen) a;
958+ binfix = substring prelen (blen - presuflen) b;
959+ in
960+ # Make a be the bigger string
961+ if alen < blen then f b a
962+ # If a has over k more characters than b, even with k deletes on a, b can't be reached
963+ else if alen - blen > k then false
964+ else if k == 1 then infixDifferAtMost1 ainfix binfix
965+ else if k == 2 then infixDifferAtMost2 ainfix binfix
966+ else levenshtein ainfix binfix <= k;
967+ in f;
764968}
lib/systems/default.nix+4−1
@@ -8,6 +8,7 @@ rec {
88 platforms = import ./platforms.nix { inherit lib; };
99 examples = import ./examples.nix { inherit lib; };
1010 architectures = import ./architectures.nix { inherit lib; };
11+ supported = import ./supported.nix { inherit lib; };
1112
1213 # Elaborate a `localSystem` or `crossSystem` so that it contains everything
1314 # necessary.
@@ -104,9 +105,11 @@ rec {
104105 else if final.isAarch64 then "arm64"
105106 else if final.isx86_32 then "i386"
106107 else if final.isx86_64 then "x86_64"
107− else if final.isMips then "mips"
108+ else if final.isMips32 then "mips"
109+ else if final.isMips64 then "mips" # linux kernel does not distinguish mips32/mips64
108110 else if final.isPower then "powerpc"
109111 else if final.isRiscV then "riscv"
112+ else if final.isS390 then "s390"
110113 else final.parsed.cpu.name;
111114
112115 qemuArch =
lib/systems/doubles.nix+18−8
@@ -26,20 +26,22 @@ let
2626
2727 # Linux
2828 "aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux"
29− "armv7l-linux" "i686-linux" "mipsel-linux" "powerpc64-linux"
30− "powerpc64le-linux" "riscv32-linux" "riscv64-linux" "x86_64-linux"
29+ "armv7l-linux" "i686-linux" "m68k-linux" "mipsel-linux" "mips64el-linux"
30+ "powerpc64-linux" "powerpc64le-linux" "riscv32-linux"
31+ "riscv64-linux" "s390-linux" "s390x-linux" "x86_64-linux"
3132
3233 # MMIXware
3334 "mmix-mmixware"
3435
3536 # NetBSD
3637 "aarch64-netbsd" "armv6l-netbsd" "armv7a-netbsd" "armv7l-netbsd"
37− "i686-netbsd" "mipsel-netbsd" "powerpc-netbsd" "riscv32-netbsd"
38− "riscv64-netbsd" "x86_64-netbsd"
38+ "i686-netbsd" "m68k-netbsd" "mipsel-netbsd" "powerpc-netbsd"
39+ "riscv32-netbsd" "riscv64-netbsd" "x86_64-netbsd"
3940
4041 # none
41− "aarch64-none" "arm-none" "armv6l-none" "avr-none" "i686-none" "msp430-none"
42− "or1k-none" "powerpc-none" "riscv32-none" "riscv64-none" "vc4-none"
42+ "aarch64_be-none" "aarch64-none" "arm-none" "armv6l-none" "avr-none" "i686-none"
43+ "msp430-none" "or1k-none" "m68k-none" "powerpc-none" "powerpcle-none"
44+ "riscv32-none" "riscv64-none" "s390-none" "s390x-none" "vc4-none"
4345 "x86_64-none"
4446
4547 # OpenBSD
@@ -72,8 +74,12 @@ in {
7274 mips = filterDoubles predicates.isMips;
7375 mmix = filterDoubles predicates.isMmix;
7476 riscv = filterDoubles predicates.isRiscV;
77+ riscv32 = filterDoubles predicates.isRiscV32;
78+ riscv64 = filterDoubles predicates.isRiscV64;
7579 vc4 = filterDoubles predicates.isVc4;
7680 or1k = filterDoubles predicates.isOr1k;
81+ m68k = filterDoubles predicates.isM68k;
82+ s390 = filterDoubles predicates.isS390;
7783 js = filterDoubles predicates.isJavaScript;
7884
7985 bigEndian = filterDoubles predicates.isBigEndian;
@@ -83,7 +89,11 @@ in {
8389 darwin = filterDoubles predicates.isDarwin;
8490 freebsd = filterDoubles predicates.isFreeBSD;
8591 # Should be better, but MinGW is unclear.
86− gnu = filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnu; }) ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabi; }) ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabihf; });
92+ gnu = filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnu; })
93+ ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabi; })
94+ ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnueabihf; })
95+ ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabin32; })
96+ ++ filterDoubles (matchAttrs { kernel = parse.kernels.linux; abi = parse.abis.gnuabi64; });
8797 illumos = filterDoubles predicates.isSunOS;
8898 linux = filterDoubles predicates.isLinux;
8999 netbsd = filterDoubles predicates.isNetBSD;
@@ -96,5 +106,5 @@ in {
96106
97107 embedded = filterDoubles predicates.isNone;
98108
99− mesaPlatforms = ["i686-linux" "x86_64-linux" "x86_64-darwin" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "armv7a-linux" "aarch64-linux" "powerpc64-linux" "powerpc64le-linux" "aarch64-darwin"];
109+ mesaPlatforms = ["i686-linux" "x86_64-linux" "x86_64-darwin" "armv5tel-linux" "armv6l-linux" "armv7l-linux" "armv7a-linux" "aarch64-linux" "powerpc64-linux" "powerpc64le-linux" "aarch64-darwin" "riscv64-linux"];
100110}
lib/systems/examples.nix+39
@@ -93,6 +93,26 @@ rec {
9393 config = "mipsel-unknown-linux-gnu";
9494 } // platforms.fuloong2f_n32;
9595
96+ # MIPS ABI table transcribed from here: https://wiki.debian.org/Multiarch/Tuples
97+
98+ # can execute on 32bit chip
99+ mips-linux-gnu = { config = "mips-linux-gnu"; } // platforms.gcc_mips32r2_o32;
100+ mipsel-linux-gnu = { config = "mipsel-linux-gnu"; } // platforms.gcc_mips32r2_o32;
101+ mipsisa32r6-linux-gnu = { config = "mipsisa32r6-linux-gnu"; } // platforms.gcc_mips32r6_o32;
102+ mipsisa32r6el-linux-gnu = { config = "mipsisa32r6el-linux-gnu"; } // platforms.gcc_mips32r6_o32;
103+
104+ # require 64bit chip (for more registers, 64-bit floating point, 64-bit "long long") but use 32bit pointers
105+ mips64-linux-gnuabin32 = { config = "mips64-linux-gnuabin32"; } // platforms.gcc_mips64r2_n32;
106+ mips64el-linux-gnuabin32 = { config = "mips64el-linux-gnuabin32"; } // platforms.gcc_mips64r2_n32;
107+ mipsisa64r6-linux-gnuabin32 = { config = "mipsisa64r6-linux-gnuabin32"; } // platforms.gcc_mips64r6_n32;
108+ mipsisa64r6el-linux-gnuabin32 = { config = "mipsisa64r6el-linux-gnuabin32"; } // platforms.gcc_mips64r6_n32;
109+
110+ # 64bit pointers
111+ mips64-linux-gnuabi64 = { config = "mips64-linux-gnuabi64"; } // platforms.gcc_mips64r2_64;
112+ mips64el-linux-gnuabi64 = { config = "mips64el-linux-gnuabi64"; } // platforms.gcc_mips64r2_64;
113+ mipsisa64r6-linux-gnuabi64 = { config = "mipsisa64r6-linux-gnuabi64"; } // platforms.gcc_mips64r6_64;
114+ mipsisa64r6el-linux-gnuabi64 = { config = "mipsisa64r6el-linux-gnuabi64"; } // platforms.gcc_mips64r6_64;
115+
96116 muslpi = raspberryPi // {
97117 config = "armv6l-unknown-linux-musleabihf";
98118 };
@@ -144,6 +164,18 @@ rec {
144164 libc = "newlib";
145165 };
146166
167+ m68k = {
168+ config = "m68k-unknown-linux-gnu";
169+ };
170+
171+ s390 = {
172+ config = "s390-unknown-linux-gnu";
173+ };
174+
175+ s390x = {
176+ config = "s390x-unknown-linux-gnu";
177+ };
178+
147179 arm-embedded = {
148180 config = "arm-none-eabi";
149181 libc = "newlib";
@@ -246,6 +278,12 @@ rec {
246278 platform = {};
247279 };
248280
281+ x86_64-darwin = {
282+ config = "x86_64-apple-darwin";
283+ xcodePlatform = "MacOSX";
284+ platform = {};
285+ };
286+
249287 #
250288 # Windows
251289 #
@@ -272,6 +310,7 @@ rec {
272310 libc = "nblibc";
273311 };
274312
313+ # this is broken and never worked fully
275314 x86_64-netbsd-llvm = {
276315 config = "x86_64-unknown-netbsd";
277316 libc = "nblibc";
lib/systems/inspect.nix+11−1
@@ -13,12 +13,19 @@ rec {
1313 isx86_64 = { cpu = { family = "x86"; bits = 64; }; };
1414 isPowerPC = { cpu = cpuTypes.powerpc; };
1515 isPower = { cpu = { family = "power"; }; };
16+ isPower64 = { cpu = { family = "power"; bits = 64; }; };
1617 isx86 = { cpu = { family = "x86"; }; };
1718 isAarch32 = { cpu = { family = "arm"; bits = 32; }; };
1819 isAarch64 = { cpu = { family = "arm"; bits = 64; }; };
1920 isMips = { cpu = { family = "mips"; }; };
21+ isMips32 = { cpu = { family = "mips"; bits = 32; }; };
22+ isMips64 = { cpu = { family = "mips"; bits = 64; }; };
23+ isMips64n32 = { cpu = { family = "mips"; bits = 64; }; abi = { abi = "n32"; }; };
24+ isMips64n64 = { cpu = { family = "mips"; bits = 64; }; abi = { abi = "64"; }; };
2025 isMmix = { cpu = { family = "mmix"; }; };
2126 isRiscV = { cpu = { family = "riscv"; }; };
27+ isRiscV32 = { cpu = { family = "riscv"; bits = 32; }; };
28+ isRiscV64 = { cpu = { family = "riscv"; bits = 64; }; };
2229 isSparc = { cpu = { family = "sparc"; }; };
2330 isWasm = { cpu = { family = "wasm"; }; };
2431 isMsp430 = { cpu = { family = "msp430"; }; };
@@ -26,6 +33,8 @@ rec {
2633 isAvr = { cpu = { family = "avr"; }; };
2734 isAlpha = { cpu = { family = "alpha"; }; };
2835 isOr1k = { cpu = { family = "or1k"; }; };
36+ isM68k = { cpu = { family = "m68k"; }; };
37+ isS390 = { cpu = { family = "s390"; }; };
2938 isJavaScript = { cpu = cpuTypes.js; };
3039
3140 is32bit = { cpu = { bits = 32; }; };
@@ -54,7 +63,8 @@ rec {
5463 isNone = { kernel = kernels.none; };
5564
5665 isAndroid = [ { abi = abis.android; } { abi = abis.androideabi; } ];
57− isMusl = with abis; map (a: { abi = a; }) [ musl musleabi musleabihf ];
66+ isGnu = with abis; map (a: { abi = a; }) [ gnuabi64 gnu gnueabi gnueabihf ];
67+ isMusl = with abis; map (a: { abi = a; }) [ musl musleabi musleabihf muslabin32 muslabi64 ];
5868 isUClibc = with abis; map (a: { abi = a; }) [ uclibc uclibceabi uclibceabihf ];
5969
6070 isEfi = map (family: { cpu.family = family; })
lib/systems/parse.nix+18−5
@@ -95,6 +95,8 @@ rec {
9595
9696 mmix = { bits = 64; significantByte = bigEndian; family = "mmix"; };
9797
98+ m68k = { bits = 32; significantByte = bigEndian; family = "m68k"; };
99+
98100 powerpc = { bits = 32; significantByte = bigEndian; family = "power"; };
99101 powerpc64 = { bits = 64; significantByte = bigEndian; family = "power"; };
100102 powerpc64le = { bits = 64; significantByte = littleEndian; family = "power"; };
@@ -103,6 +105,9 @@ rec {
103105 riscv32 = { bits = 32; significantByte = littleEndian; family = "riscv"; };
104106 riscv64 = { bits = 64; significantByte = littleEndian; family = "riscv"; };
105107
108+ s390 = { bits = 32; significantByte = bigEndian; family = "s390"; };
109+ s390x = { bits = 64; significantByte = bigEndian; family = "s390"; };
110+
106111 sparc = { bits = 32; significantByte = bigEndian; family = "sparc"; };
107112 sparc64 = { bits = 64; significantByte = bigEndian; family = "sparc"; };
108113
@@ -123,9 +128,10 @@ rec {
123128
124129 # GNU build systems assume that older NetBSD architectures are using a.out.
125130 gnuNetBSDDefaultExecFormat = cpu:
126− if (cpu.family == "x86" && cpu.bits == 32) ||
127− (cpu.family == "arm" && cpu.bits == 32) ||
128− (cpu.family == "sparc" && cpu.bits == 32)
131+ if (cpu.family == "arm" && cpu.bits == 32) ||
132+ (cpu.family == "sparc" && cpu.bits == 32) ||
133+ (cpu.family == "m68k" && cpu.bits == 32) ||
134+ (cpu.family == "x86" && cpu.bits == 32)
129135 then execFormats.aout
130136 else execFormats.elf;
131137
@@ -353,13 +359,20 @@ rec {
353359 ];
354360 };
355361 gnuabi64 = { abi = "64"; };
362+ muslabi64 = { abi = "64"; };
363+
364+ # NOTE: abi=n32 requires a 64-bit MIPS chip! That is not a typo.
365+ # It is basically the 64-bit abi with 32-bit pointers. Details:
366+ # https://www.linux-mips.org/pub/linux/mips/doc/ABI/MIPS-N32-ABI-Handbook.pdf
367+ gnuabin32 = { abi = "n32"; };
368+ muslabin32 = { abi = "n32"; };
356369
357370 musleabi = { float = "soft"; };
358371 musleabihf = { float = "hard"; };
359372 musl = {};
360373
361− uclibceabihf = { float = "soft"; };
362− uclibceabi = { float = "hard"; };
374+ uclibceabi = { float = "soft"; };
375+ uclibceabihf = { float = "hard"; };
363376 uclibc = {};
364377
365378 unknown = {};
lib/systems/platforms.nix+60−5
@@ -1,3 +1,10 @@
1+# Note: lib/systems/default.nix takes care of producing valid,
2+# fully-formed "platform" values (e.g. hostPlatform, buildPlatform,
3+# targetPlatform, etc) containing at least the minimal set of attrs
4+# required (see types.parsedPlatform in lib/systems/parse.nix). This
5+# file takes an already-valid platform and further elaborates it with
6+# optional fields; currently these are: linux-kernel, gcc, and rustc.
7+
18{ lib }:
29rec {
310 pc = {
@@ -20,15 +27,17 @@ rec {
2027 name = "PowerNV";
2128
2229 baseConfig = "powernv_defconfig";
23− target = "zImage";
24− installTarget = "install";
25− file = "vmlinux";
30+ target = "vmlinux";
2631 autoModules = true;
2732 # avoid driver/FS trouble arising from unusual page size
2833 extraConfig = ''
2934 PPC_64K_PAGES n
3035 PPC_4K_PAGES y
3136 IPV6 y
37+
38+ ATA_BMDMA y
39+ ATA_SFF y
40+ VIRTIO_MENU y
3241 '';
3342 };
3443 };
@@ -233,7 +242,7 @@ rec {
233242 };
234243 };
235244
236− scaleway-c1 = lib.recursiveUpdate armv7l-hf-multiplatform {
245+ scaleway-c1 = armv7l-hf-multiplatform // {
237246 gcc = {
238247 cpu = "cortex-a9";
239248 fpu = "vfpv3";
@@ -315,6 +324,12 @@ rec {
315324 # Disable OABI to have seccomp_filter (required for systemd)
316325 # https://github.com/raspberrypi/firmware/issues/651
317326 OABI_COMPAT n
327+
328+ # >=5.12 fails with:
329+ # drivers/net/ethernet/micrel/ks8851_common.o: in function `ks8851_probe_common':
330+ # ks8851_common.c:(.text+0x179c): undefined reference to `__this_module'
331+ # See: https://lore.kernel.org/netdev/20210116164828.40545-1-marex@denx.de/T/
332+ KS8851_MLL y
318333 '';
319334 };
320335 gcc = {
@@ -474,6 +489,43 @@ rec {
474489 };
475490 };
476491
492+ # can execute on 32bit chip
493+ gcc_mips32r2_o32 = { gcc = { arch = "mips32r2"; abi = "o32"; }; };
494+ gcc_mips32r6_o32 = { gcc = { arch = "mips32r6"; abi = "o32"; }; };
495+ gcc_mips64r2_n32 = { gcc = { arch = "mips64r2"; abi = "n32"; }; };
496+ gcc_mips64r6_n32 = { gcc = { arch = "mips64r6"; abi = "n32"; }; };
497+ gcc_mips64r2_64 = { gcc = { arch = "mips64r2"; abi = "64"; }; };
498+ gcc_mips64r6_64 = { gcc = { arch = "mips64r6"; abi = "64"; }; };
499+
500+ # based on:
501+ # https://www.mail-archive.com/qemu-discuss@nongnu.org/msg05179.html
502+ # https://gmplib.org/~tege/qemu.html#mips64-debian
503+ mips64el-qemu-linux-gnuabi64 = {
504+ linux-kernel = {
505+ name = "mips64el";
506+ baseConfig = "64r2el_defconfig";
507+ target = "vmlinuz";
508+ autoModules = false;
509+ DTB = true;
510+ # for qemu 9p passthrough filesystem
511+ extraConfig = ''
512+ MIPS_MALTA y
513+ PAGE_SIZE_4KB y
514+ CPU_LITTLE_ENDIAN y
515+ CPU_MIPS64_R2 y
516+ 64BIT y
517+ CPU_MIPS64_R2 y
518+
519+ NET_9P y
520+ NET_9P_VIRTIO y
521+ 9P_FS y
522+ 9P_FS_POSIX_ACL y
523+ PCI y
524+ VIRTIO_PCI y
525+ '';
526+ };
527+ };
528+
477529 ##
478530 ## Other
479531 ##
@@ -491,6 +543,9 @@ rec {
491543 };
492544 };
493545
546+ # This function takes a minimally-valid "platform" and returns an
547+ # attrset containing zero or more additional attrs which should be
548+ # included in the platform in order to further elaborate it.
494549 select = platform:
495550 # x86
496551 /**/ if platform.isx86 then pc
@@ -513,5 +568,5 @@ rec {
513568
514569 else if platform.parsed.cpu == lib.systems.parse.cpuTypes.powerpc64le then powernv
515570
516− else pc;
571+ else { };
517572}
lib/systems/supported.nixnew file+26
@@ -0,0 +1,26 @@
1+# Supported systems according to RFC0046's definition.
2+#
3+# https://github.com/NixOS/rfcs/blob/master/rfcs/0046-platform-support-tiers.md
4+{ lib }:
5+rec {
6+ # List of systems that are built by Hydra.
7+ hydra = tier1 ++ tier2 ++ tier3 ++ [
8+ "aarch64-darwin"
9+ ];
10+
11+ tier1 = [
12+ "x86_64-linux"
13+ ];
14+
15+ tier2 = [
16+ "aarch64-linux"
17+ "x86_64-darwin"
18+ ];
19+
20+ tier3 = [
21+ "armv6l-linux"
22+ "armv7l-linux"
23+ "i686-linux"
24+ "mipsel-linux"
25+ ];
26+}
lib/tests/flakes/subflakeTest/flake.nixnew file+8
@@ -0,0 +1,8 @@
1+{
2+ outputs = { self, subflake, callLocklessFlake }: rec {
3+ x = (callLocklessFlake {
4+ path = subflake;
5+ inputs = {};
6+ }).subflakeOutput;
7+ };
8+}
lib/tests/flakes/subflakeTest/subflake/flake.nixnew file+5
@@ -0,0 +1,5 @@
1+{
2+ outputs = { self }: {
3+ subflakeOutput = 1;
4+ };
5+}
lib/tests/maintainers.nix+6−2
@@ -16,6 +16,10 @@ let
1616 email = lib.mkOption {
1717 type = types.str;
1818 };
19+ matrix = lib.mkOption {
20+ type = types.nullOr types.str;
21+ default = null;
22+ };
1923 github = lib.mkOption {
2024 type = types.nullOr types.str;
2125 default = null;
@@ -61,9 +65,9 @@ let
6165
6266 missingGithubIds = lib.concatLists (lib.mapAttrsToList checkMaintainer lib.maintainers);
6367
64− success = pkgs.runCommandNoCC "checked-maintainers-success" {} ">$out";
68+ success = pkgs.runCommand "checked-maintainers-success" {} ">$out";
6569
66− failure = pkgs.runCommandNoCC "checked-maintainers-failure" {
70+ failure = pkgs.runCommand "checked-maintainers-failure" {
6771 nativeBuildInputs = [ pkgs.curl pkgs.jq ];
6872 outputHash = "sha256:${lib.fakeSha256}";
6973 outputHAlgo = "sha256";
lib/tests/misc.nix+464−2
@@ -22,6 +22,15 @@ in
2222
2323runTests {
2424
25+# FLAKES
26+
27+ testCallLocklessFlake = {
28+ expr = callLocklessFlake {
29+ path = ./flakes/subflakeTest;
30+ inputs = { subflake = ./flakes/subflakeTest/subflake; inherit callLocklessFlake; };
31+ };
32+ expected = { x = 1; outPath = ./flakes/subflakeTest; };
33+ };
2534
2635# TRIVIAL
2736
@@ -132,6 +141,16 @@ runTests {
132141 expected = [ 1 1 0 ];
133142 };
134143
144+ testFunctionArgsFunctor = {
145+ expr = functionArgs { __functor = self: { a, b }: null; };
146+ expected = { a = false; b = false; };
147+ };
148+
149+ testFunctionArgsSetFunctionArgs = {
150+ expr = functionArgs (setFunctionArgs (args: args.x) { x = false; });
151+ expected = { x = false; };
152+ };
153+
135154# STRINGS
136155
137156 testConcatMapStrings = {
@@ -236,6 +255,61 @@ runTests {
236255 };
237256 };
238257
258+ testEscapeXML = {
259+ expr = escapeXML ''"test" 'test' < & >'';
260+ expected = "&quot;test&quot; &apos;test&apos; &lt; &amp; &gt;";
261+ };
262+
263+ testToShellVars = {
264+ expr = ''
265+ ${toShellVars {
266+ STRing01 = "just a 'string'";
267+ _array_ = [ "with" "more strings" ];
268+ assoc."with some" = ''
269+ strings
270+ possibly newlines
271+ '';
272+ }}
273+ '';
274+ expected = ''
275+ STRing01='just a '\'''string'\''''
276+ declare -a _array_=('with' 'more strings')
277+ declare -A assoc=(['with some']='strings
278+ possibly newlines
279+ ')
280+ '';
281+ };
282+
283+ testHasInfixFalse = {
284+ expr = hasInfix "c" "abde";
285+ expected = false;
286+ };
287+
288+ testHasInfixTrue = {
289+ expr = hasInfix "c" "abcde";
290+ expected = true;
291+ };
292+
293+ testHasInfixDerivation = {
294+ expr = hasInfix "hello" (import ../.. { system = "x86_64-linux"; }).hello;
295+ expected = true;
296+ };
297+
298+ testHasInfixPath = {
299+ expr = hasInfix "tests" ./.;
300+ expected = true;
301+ };
302+
303+ testHasInfixPathStoreDir = {
304+ expr = hasInfix builtins.storeDir ./.;
305+ expected = true;
306+ };
307+
308+ testHasInfixToString = {
309+ expr = hasInfix "a" { __toString = _: "a"; };
310+ expected = true;
311+ };
312+
239313# LISTS
240314
241315 testFilter = {
@@ -456,6 +530,66 @@ runTests {
456530 '';
457531 };
458532
533+ testToINIWithGlobalSectionEmpty = {
534+ expr = generators.toINIWithGlobalSection {} {
535+ globalSection = {
536+ };
537+ sections = {
538+ };
539+ };
540+ expected = ''
541+ '';
542+ };
543+
544+ testToINIWithGlobalSectionGlobalEmptyIsTheSameAsToINI =
545+ let
546+ sections = {
547+ "section 1" = {
548+ attribute1 = 5;
549+ x = "Me-se JarJar Binx";
550+ };
551+ "foo" = {
552+ "he\\h=he" = "this is okay";
553+ };
554+ };
555+ in {
556+ expr =
557+ generators.toINIWithGlobalSection {} {
558+ globalSection = {};
559+ sections = sections;
560+ };
561+ expected = generators.toINI {} sections;
562+ };
563+
564+ testToINIWithGlobalSectionFull = {
565+ expr = generators.toINIWithGlobalSection {} {
566+ globalSection = {
567+ foo = "bar";
568+ test = false;
569+ };
570+ sections = {
571+ "section 1" = {
572+ attribute1 = 5;
573+ x = "Me-se JarJar Binx";
574+ };
575+ "foo" = {
576+ "he\\h=he" = "this is okay";
577+ };
578+ };
579+ };
580+ expected = ''
581+ foo=bar
582+ test=false
583+
584+ [foo]
585+ he\h\=he=this is okay
586+
587+ [section 1]
588+ attribute1=5
589+ x=Me-se JarJar Binx
590+ '';
591+ };
592+
459593 /* right now only invocation check */
460594 testToJSONSimple =
461595 let val = {
@@ -481,7 +615,7 @@ runTests {
481615
482616 testToPretty =
483617 let
484− deriv = derivation { name = "test"; builder = "/bin/sh"; system = builtins.currentSystem; };
618+ deriv = derivation { name = "test"; builder = "/bin/sh"; system = "aarch64-linux"; };
485619 in {
486620 expr = mapAttrs (const (generators.toPretty { multiline = false; })) rec {
487621 int = 42;
@@ -519,6 +653,25 @@ runTests {
519653 };
520654 };
521655
656+ testToPrettyLimit =
657+ let
658+ a.b = 1;
659+ a.c = a;
660+ in {
661+ expr = generators.toPretty { } (generators.withRecursion { throwOnDepthLimit = false; depthLimit = 2; } a);
662+ expected = "{\n b = 1;\n c = {\n b = \"<unevaluated>\";\n c = {\n b = \"<unevaluated>\";\n c = \"<unevaluated>\";\n };\n };\n}";
663+ };
664+
665+ testToPrettyLimitThrow =
666+ let
667+ a.b = 1;
668+ a.c = a;
669+ in {
670+ expr = (builtins.tryEval
671+ (generators.toPretty { } (generators.withRecursion { depthLimit = 2; } a))).success;
672+ expected = false;
673+ };
674+
522675 testToPrettyMultiline = {
523676 expr = mapAttrs (const (generators.toPretty { })) rec {
524677 list = [ 3 4 [ false ] ];
@@ -615,6 +768,11 @@ runTests {
615768 expected = "foo";
616769 };
617770
771+ testSanitizeDerivationNameUnicode = testSanitizeDerivationName {
772+ name = "fö";
773+ expected = "f-";
774+ };
775+
618776 testSanitizeDerivationNameAscii = testSanitizeDerivationName {
619777 name = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
620778 expected = "-+--.-0123456789-=-?-ABCDEFGHIJKLMNOPQRSTUVWXYZ-_-abcdefghijklmnopqrstuvwxyz-";
@@ -657,7 +815,7 @@ runTests {
657815
658816 locs = filter (o: ! o.internal) (optionAttrSetToDocList options);
659817 in map (o: o.loc) locs;
660− expected = [ [ "foo" ] [ "foo" "<name>" "bar" ] [ "foo" "bar" ] ];
818+ expected = [ [ "_module" "args" ] [ "foo" ] [ "foo" "<name>" "bar" ] [ "foo" "bar" ] ];
661819 };
662820
663821 testCartesianProductOfEmptySet = {
@@ -727,4 +885,308 @@ runTests {
727885 { a = 3; b = 30; c = 300; }
728886 ];
729887 };
888+
889+ # The example from the showAttrPath documentation
890+ testShowAttrPathExample = {
891+ expr = showAttrPath [ "foo" "10" "bar" ];
892+ expected = "foo.\"10\".bar";
893+ };
894+
895+ testShowAttrPathEmpty = {
896+ expr = showAttrPath [];
897+ expected = "<root attribute path>";
898+ };
899+
900+ testShowAttrPathVarious = {
901+ expr = showAttrPath [
902+ "."
903+ "foo"
904+ "2"
905+ "a2-b"
906+ "_bc'de"
907+ ];
908+ expected = ''".".foo."2".a2-b._bc'de'';
909+ };
910+
911+ testGroupBy = {
912+ expr = groupBy (n: toString (mod n 5)) (range 0 16);
913+ expected = {
914+ "0" = [ 0 5 10 15 ];
915+ "1" = [ 1 6 11 16 ];
916+ "2" = [ 2 7 12 ];
917+ "3" = [ 3 8 13 ];
918+ "4" = [ 4 9 14 ];
919+ };
920+ };
921+
922+ testGroupBy' = {
923+ expr = groupBy' builtins.add 0 (x: boolToString (x > 2)) [ 5 1 2 3 4 ];
924+ expected = { false = 3; true = 12; };
925+ };
926+
927+ # The example from the updateManyAttrsByPath documentation
928+ testUpdateManyAttrsByPathExample = {
929+ expr = updateManyAttrsByPath [
930+ {
931+ path = [ "a" "b" ];
932+ update = old: { d = old.c; };
933+ }
934+ {
935+ path = [ "a" "b" "c" ];
936+ update = old: old + 1;
937+ }
938+ {
939+ path = [ "x" "y" ];
940+ update = old: "xy";
941+ }
942+ ] { a.b.c = 0; };
943+ expected = { a = { b = { d = 1; }; }; x = { y = "xy"; }; };
944+ };
945+
946+ # If there are no updates, the value is passed through
947+ testUpdateManyAttrsByPathNone = {
948+ expr = updateManyAttrsByPath [] "something";
949+ expected = "something";
950+ };
951+
952+ # A single update to the root path is just like applying the function directly
953+ testUpdateManyAttrsByPathSingleIncrement = {
954+ expr = updateManyAttrsByPath [
955+ {
956+ path = [ ];
957+ update = old: old + 1;
958+ }
959+ ] 0;
960+ expected = 1;
961+ };
962+
963+ # Multiple updates can be applied are done in order
964+ testUpdateManyAttrsByPathMultipleIncrements = {
965+ expr = updateManyAttrsByPath [
966+ {
967+ path = [ ];
968+ update = old: old + "a";
969+ }
970+ {
971+ path = [ ];
972+ update = old: old + "b";
973+ }
974+ {
975+ path = [ ];
976+ update = old: old + "c";
977+ }
978+ ] "";
979+ expected = "abc";
980+ };
981+
982+ # If an update doesn't use the value, all previous updates are not evaluated
983+ testUpdateManyAttrsByPathLazy = {
984+ expr = updateManyAttrsByPath [
985+ {
986+ path = [ ];
987+ update = old: old + throw "nope";
988+ }
989+ {
990+ path = [ ];
991+ update = old: "untainted";
992+ }
993+ ] (throw "start");
994+ expected = "untainted";
995+ };
996+
997+ # Deeply nested attributes can be updated without affecting others
998+ testUpdateManyAttrsByPathDeep = {
999+ expr = updateManyAttrsByPath [
1000+ {
1001+ path = [ "a" "b" "c" ];
1002+ update = old: old + 1;
1003+ }
1004+ ] {
1005+ a.b.c = 0;
1006+
1007+ a.b.z = 0;
1008+ a.y.z = 0;
1009+ x.y.z = 0;
1010+ };
1011+ expected = {
1012+ a.b.c = 1;
1013+
1014+ a.b.z = 0;
1015+ a.y.z = 0;
1016+ x.y.z = 0;
1017+ };
1018+ };
1019+
1020+ # Nested attributes are updated first
1021+ testUpdateManyAttrsByPathNestedBeforehand = {
1022+ expr = updateManyAttrsByPath [
1023+ {
1024+ path = [ "a" ];
1025+ update = old: old // { x = old.b; };
1026+ }
1027+ {
1028+ path = [ "a" "b" ];
1029+ update = old: old + 1;
1030+ }
1031+ ] {
1032+ a.b = 0;
1033+ };
1034+ expected = {
1035+ a.b = 1;
1036+ a.x = 1;
1037+ };
1038+ };
1039+
1040+ ## Levenshtein distance functions and co.
1041+ testCommonPrefixLengthEmpty = {
1042+ expr = strings.commonPrefixLength "" "hello";
1043+ expected = 0;
1044+ };
1045+
1046+ testCommonPrefixLengthSame = {
1047+ expr = strings.commonPrefixLength "hello" "hello";
1048+ expected = 5;
1049+ };
1050+
1051+ testCommonPrefixLengthDiffering = {
1052+ expr = strings.commonPrefixLength "hello" "hey";
1053+ expected = 2;
1054+ };
1055+
1056+ testCommonSuffixLengthEmpty = {
1057+ expr = strings.commonSuffixLength "" "hello";
1058+ expected = 0;
1059+ };
1060+
1061+ testCommonSuffixLengthSame = {
1062+ expr = strings.commonSuffixLength "hello" "hello";
1063+ expected = 5;
1064+ };
1065+
1066+ testCommonSuffixLengthDiffering = {
1067+ expr = strings.commonSuffixLength "test" "rest";
1068+ expected = 3;
1069+ };
1070+
1071+ testLevenshteinEmpty = {
1072+ expr = strings.levenshtein "" "";
1073+ expected = 0;
1074+ };
1075+
1076+ testLevenshteinOnlyAdd = {
1077+ expr = strings.levenshtein "" "hello there";
1078+ expected = 11;
1079+ };
1080+
1081+ testLevenshteinOnlyRemove = {
1082+ expr = strings.levenshtein "hello there" "";
1083+ expected = 11;
1084+ };
1085+
1086+ testLevenshteinOnlyTransform = {
1087+ expr = strings.levenshtein "abcdef" "ghijkl";
1088+ expected = 6;
1089+ };
1090+
1091+ testLevenshteinMixed = {
1092+ expr = strings.levenshtein "kitchen" "sitting";
1093+ expected = 5;
1094+ };
1095+
1096+ testLevenshteinAtMostZeroFalse = {
1097+ expr = strings.levenshteinAtMost 0 "foo" "boo";
1098+ expected = false;
1099+ };
1100+
1101+ testLevenshteinAtMostZeroTrue = {
1102+ expr = strings.levenshteinAtMost 0 "foo" "foo";
1103+ expected = true;
1104+ };
1105+
1106+ testLevenshteinAtMostOneFalse = {
1107+ expr = strings.levenshteinAtMost 1 "car" "ct";
1108+ expected = false;
1109+ };
1110+
1111+ testLevenshteinAtMostOneTrue = {
1112+ expr = strings.levenshteinAtMost 1 "car" "cr";
1113+ expected = true;
1114+ };
1115+
1116+ # We test levenshteinAtMost 2 particularly well because it uses a complicated
1117+ # implementation
1118+ testLevenshteinAtMostTwoIsEmpty = {
1119+ expr = strings.levenshteinAtMost 2 "" "";
1120+ expected = true;
1121+ };
1122+
1123+ testLevenshteinAtMostTwoIsZero = {
1124+ expr = strings.levenshteinAtMost 2 "abcdef" "abcdef";
1125+ expected = true;
1126+ };
1127+
1128+ testLevenshteinAtMostTwoIsOne = {
1129+ expr = strings.levenshteinAtMost 2 "abcdef" "abddef";
1130+ expected = true;
1131+ };
1132+
1133+ testLevenshteinAtMostTwoDiff0False = {
1134+ expr = strings.levenshteinAtMost 2 "abcdef" "aczyef";
1135+ expected = false;
1136+ };
1137+
1138+ testLevenshteinAtMostTwoDiff0Outer = {
1139+ expr = strings.levenshteinAtMost 2 "abcdef" "zbcdez";
1140+ expected = true;
1141+ };
1142+
1143+ testLevenshteinAtMostTwoDiff0DelLeft = {
1144+ expr = strings.levenshteinAtMost 2 "abcdef" "bcdefz";
1145+ expected = true;
1146+ };
1147+
1148+ testLevenshteinAtMostTwoDiff0DelRight = {
1149+ expr = strings.levenshteinAtMost 2 "abcdef" "zabcde";
1150+ expected = true;
1151+ };
1152+
1153+ testLevenshteinAtMostTwoDiff1False = {
1154+ expr = strings.levenshteinAtMost 2 "abcdef" "bddez";
1155+ expected = false;
1156+ };
1157+
1158+ testLevenshteinAtMostTwoDiff1DelLeft = {
1159+ expr = strings.levenshteinAtMost 2 "abcdef" "bcdez";
1160+ expected = true;
1161+ };
1162+
1163+ testLevenshteinAtMostTwoDiff1DelRight = {
1164+ expr = strings.levenshteinAtMost 2 "abcdef" "zbcde";
1165+ expected = true;
1166+ };
1167+
1168+ testLevenshteinAtMostTwoDiff2False = {
1169+ expr = strings.levenshteinAtMost 2 "hello" "hxo";
1170+ expected = false;
1171+ };
1172+
1173+ testLevenshteinAtMostTwoDiff2True = {
1174+ expr = strings.levenshteinAtMost 2 "hello" "heo";
1175+ expected = true;
1176+ };
1177+
1178+ testLevenshteinAtMostTwoDiff3 = {
1179+ expr = strings.levenshteinAtMost 2 "hello" "ho";
1180+ expected = false;
1181+ };
1182+
1183+ testLevenshteinAtMostThreeFalse = {
1184+ expr = strings.levenshteinAtMost 3 "hello" "Holla!";
1185+ expected = false;
1186+ };
1187+
1188+ testLevenshteinAtMostThreeTrue = {
1189+ expr = strings.levenshteinAtMost 3 "hello" "Holla";
1190+ expected = true;
1191+ };
7301192}
lib/tests/modules.sh+180−121
@@ -1,8 +1,11 @@
1−#!/bin/sh
1+#!/usr/bin/env bash
22#
33# This script is used to test that the module system is working as expected.
44# By default it test the version of nixpkgs which is defined in the NIX_PATH.
55
6+set -o errexit -o noclobber -o nounset -o pipefail
7+shopt -s failglob inherit_errexit
8+
69# https://stackoverflow.com/a/246128/6605742
710DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
811
@@ -13,101 +16,103 @@ fail=0
1316
1417evalConfig() {
1518 local attr=$1
16− shift;
17− local script="import ./default.nix { modules = [ $@ ];}"
19+ shift
20+ local script="import ./default.nix { modules = [ $* ];}"
1821 nix-instantiate --timeout 1 -E "$script" -A "$attr" --eval-only --show-trace --read-write-mode
1922}
2023
2124reportFailure() {
2225 local attr=$1
23− shift;
24− local script="import ./default.nix { modules = [ $@ ];}"
26+ shift
27+ local script="import ./default.nix { modules = [ $* ];}"
2528 echo 2>&1 "$ nix-instantiate -E '$script' -A '$attr' --eval-only"
26− evalConfig "$attr" "$@"
27− fail=$((fail + 1))
29+ evalConfig "$attr" "$@" || true
30+ ((++fail))
2831}
2932
3033checkConfigOutput() {
3134 local outputContains=$1
32− shift;
35+ shift
3336 if evalConfig "$@" 2>/dev/null | grep --silent "$outputContains" ; then
34− pass=$((pass + 1))
35− return 0;
37+ ((++pass))
3638 else
3739 echo 2>&1 "error: Expected result matching '$outputContains', while evaluating"
3840 reportFailure "$@"
39− return 1
4041 fi
4142}
4243
4344checkConfigError() {
4445 local errorContains=$1
4546 local err=""
46− shift;
47− if err==$(evalConfig "$@" 2>&1 >/dev/null); then
47+ shift
48+ if err="$(evalConfig "$@" 2>&1 >/dev/null)"; then
4849 echo 2>&1 "error: Expected error code, got exit code 0, while evaluating"
4950 reportFailure "$@"
50− return 1
5151 else
5252 if echo "$err" | grep -zP --silent "$errorContains" ; then
53− pass=$((pass + 1))
54− return 0;
53+ ((++pass))
5554 else
5655 echo 2>&1 "error: Expected error matching '$errorContains', while evaluating"
5756 reportFailure "$@"
58− return 1
5957 fi
6058 fi
6159}
6260
6361# Check boolean option.
64−checkConfigOutput "false" config.enable ./declare-enable.nix
65−checkConfigError 'The option .* does not exist. Definition values:\n- In .*: true' config.enable ./define-enable.nix
62+checkConfigOutput '^false$' config.enable ./declare-enable.nix
63+checkConfigError 'The option .* does not exist. Definition values:\n\s*- In .*: true' config.enable ./define-enable.nix
64+
65+checkConfigOutput '^1$' config.bare-submodule.nested ./declare-bare-submodule.nix ./declare-bare-submodule-nested-option.nix
66+checkConfigOutput '^2$' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-deep-option.nix
67+checkConfigOutput '^42$' config.bare-submodule.nested ./declare-bare-submodule.nix ./declare-bare-submodule-nested-option.nix ./declare-bare-submodule-deep-option.nix ./define-bare-submodule-values.nix
68+checkConfigOutput '^420$' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-nested-option.nix ./declare-bare-submodule-deep-option.nix ./define-bare-submodule-values.nix
69+checkConfigOutput '^2$' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-deep-option.nix ./define-shorthandOnlyDefinesConfig-true.nix
70+checkConfigError 'The option .bare-submodule.deep. in .*/declare-bare-submodule-deep-option.nix. is already declared in .*/declare-bare-submodule-deep-option-duplicate.nix' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-deep-option.nix ./declare-bare-submodule-deep-option-duplicate.nix
6671
6772# Check integer types.
6873# unsigned
69−checkConfigOutput "42" config.value ./declare-int-unsigned-value.nix ./define-value-int-positive.nix
70−checkConfigError 'A definition for option .* is not of type.*unsigned integer.*. Definition values:\n- In .*: -23' config.value ./declare-int-unsigned-value.nix ./define-value-int-negative.nix
74+checkConfigOutput '^42$' config.value ./declare-int-unsigned-value.nix ./define-value-int-positive.nix
75+checkConfigError 'A definition for option .* is not of type.*unsigned integer.*. Definition values:\n\s*- In .*: -23' config.value ./declare-int-unsigned-value.nix ./define-value-int-negative.nix
7176# positive
72−checkConfigError 'A definition for option .* is not of type.*positive integer.*. Definition values:\n- In .*: 0' config.value ./declare-int-positive-value.nix ./define-value-int-zero.nix
77+checkConfigError 'A definition for option .* is not of type.*positive integer.*. Definition values:\n\s*- In .*: 0' config.value ./declare-int-positive-value.nix ./define-value-int-zero.nix
7378# between
74−checkConfigOutput "42" config.value ./declare-int-between-value.nix ./define-value-int-positive.nix
75−checkConfigError 'A definition for option .* is not of type.*between.*-21 and 43.*inclusive.*. Definition values:\n- In .*: -23' config.value ./declare-int-between-value.nix ./define-value-int-negative.nix
79+checkConfigOutput '^42$' config.value ./declare-int-between-value.nix ./define-value-int-positive.nix
80+checkConfigError 'A definition for option .* is not of type.*between.*-21 and 43.*inclusive.*. Definition values:\n\s*- In .*: -23' config.value ./declare-int-between-value.nix ./define-value-int-negative.nix
7681
7782# Check either types
7883# types.either
79−checkConfigOutput "42" config.value ./declare-either.nix ./define-value-int-positive.nix
80−checkConfigOutput "\"24\"" config.value ./declare-either.nix ./define-value-string.nix
84+checkConfigOutput '^42$' config.value ./declare-either.nix ./define-value-int-positive.nix
85+checkConfigOutput '^"24"$' config.value ./declare-either.nix ./define-value-string.nix
8186# types.oneOf
82−checkConfigOutput "42" config.value ./declare-oneOf.nix ./define-value-int-positive.nix
83−checkConfigOutput "[ ]" config.value ./declare-oneOf.nix ./define-value-list.nix
84−checkConfigOutput "\"24\"" config.value ./declare-oneOf.nix ./define-value-string.nix
87+checkConfigOutput '^42$' config.value ./declare-oneOf.nix ./define-value-int-positive.nix
88+checkConfigOutput '^\[ \]$' config.value ./declare-oneOf.nix ./define-value-list.nix
89+checkConfigOutput '^"24"$' config.value ./declare-oneOf.nix ./define-value-string.nix
8590
8691# Check mkForce without submodules.
8792set -- config.enable ./declare-enable.nix ./define-enable.nix
88−checkConfigOutput "true" "$@"
89−checkConfigOutput "false" "$@" ./define-force-enable.nix
90−checkConfigOutput "false" "$@" ./define-enable-force.nix
93+checkConfigOutput '^true$' "$@"
94+checkConfigOutput '^false$' "$@" ./define-force-enable.nix
95+checkConfigOutput '^false$' "$@" ./define-enable-force.nix
9196
9297# Check mkForce with option and submodules.
9398checkConfigError 'attribute .*foo.* .* not found' config.attrsOfSub.foo.enable ./declare-attrsOfSub-any-enable.nix
94−checkConfigOutput 'false' config.attrsOfSub.foo.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix
99+checkConfigOutput '^false$' config.attrsOfSub.foo.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix
95100set -- config.attrsOfSub.foo.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo-enable.nix
96−checkConfigOutput 'true' "$@"
97−checkConfigOutput 'false' "$@" ./define-force-attrsOfSub-foo-enable.nix
98−checkConfigOutput 'false' "$@" ./define-attrsOfSub-force-foo-enable.nix
99−checkConfigOutput 'false' "$@" ./define-attrsOfSub-foo-force-enable.nix
100−checkConfigOutput 'false' "$@" ./define-attrsOfSub-foo-enable-force.nix
101+checkConfigOutput '^true$' "$@"
102+checkConfigOutput '^false$' "$@" ./define-force-attrsOfSub-foo-enable.nix
103+checkConfigOutput '^false$' "$@" ./define-attrsOfSub-force-foo-enable.nix
104+checkConfigOutput '^false$' "$@" ./define-attrsOfSub-foo-force-enable.nix
105+checkConfigOutput '^false$' "$@" ./define-attrsOfSub-foo-enable-force.nix
101106
102107# Check overriding effect of mkForce on submodule definitions.
103108checkConfigError 'attribute .*bar.* .* not found' config.attrsOfSub.bar.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix
104−checkConfigOutput 'false' config.attrsOfSub.bar.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix ./define-attrsOfSub-bar.nix
109+checkConfigOutput '^false$' config.attrsOfSub.bar.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix ./define-attrsOfSub-bar.nix
105110set -- config.attrsOfSub.bar.enable ./declare-attrsOfSub-any-enable.nix ./define-attrsOfSub-foo.nix ./define-attrsOfSub-bar-enable.nix
106−checkConfigOutput 'true' "$@"
111+checkConfigOutput '^true$' "$@"
107112checkConfigError 'attribute .*bar.* .* not found' "$@" ./define-force-attrsOfSub-foo-enable.nix
108113checkConfigError 'attribute .*bar.* .* not found' "$@" ./define-attrsOfSub-force-foo-enable.nix
109−checkConfigOutput 'true' "$@" ./define-attrsOfSub-foo-force-enable.nix
110−checkConfigOutput 'true' "$@" ./define-attrsOfSub-foo-enable-force.nix
114+checkConfigOutput '^true$' "$@" ./define-attrsOfSub-foo-force-enable.nix
115+checkConfigOutput '^true$' "$@" ./define-attrsOfSub-foo-enable-force.nix
111116
112117# Check mkIf with submodules.
113118checkConfigError 'attribute .*foo.* .* not found' config.attrsOfSub.foo.enable ./declare-enable.nix ./declare-attrsOfSub-any-enable.nix
@@ -115,24 +120,24 @@ set -- config.attrsOfSub.foo.enable ./declare-enable.nix ./declare-attrsOfSub-an
115120checkConfigError 'attribute .*foo.* .* not found' "$@" ./define-if-attrsOfSub-foo-enable.nix
116121checkConfigError 'attribute .*foo.* .* not found' "$@" ./define-attrsOfSub-if-foo-enable.nix
117122checkConfigError 'attribute .*foo.* .* not found' "$@" ./define-attrsOfSub-foo-if-enable.nix
118−checkConfigOutput 'false' "$@" ./define-attrsOfSub-foo-enable-if.nix
119−checkConfigOutput 'true' "$@" ./define-enable.nix ./define-if-attrsOfSub-foo-enable.nix
120−checkConfigOutput 'true' "$@" ./define-enable.nix ./define-attrsOfSub-if-foo-enable.nix
121−checkConfigOutput 'true' "$@" ./define-enable.nix ./define-attrsOfSub-foo-if-enable.nix
122−checkConfigOutput 'true' "$@" ./define-enable.nix ./define-attrsOfSub-foo-enable-if.nix
123+checkConfigOutput '^false$' "$@" ./define-attrsOfSub-foo-enable-if.nix
124+checkConfigOutput '^true$' "$@" ./define-enable.nix ./define-if-attrsOfSub-foo-enable.nix
125+checkConfigOutput '^true$' "$@" ./define-enable.nix ./define-attrsOfSub-if-foo-enable.nix
126+checkConfigOutput '^true$' "$@" ./define-enable.nix ./define-attrsOfSub-foo-if-enable.nix
127+checkConfigOutput '^true$' "$@" ./define-enable.nix ./define-attrsOfSub-foo-enable-if.nix
123128
124129# Check disabledModules with config definitions and option declarations.
125130set -- config.enable ./define-enable.nix ./declare-enable.nix
126−checkConfigOutput "true" "$@"
127−checkConfigOutput "false" "$@" ./disable-define-enable.nix
128−checkConfigError "The option .*enable.* does not exist. Definition values:\n- In .*: true" "$@" ./disable-declare-enable.nix
131+checkConfigOutput '^true$' "$@"
132+checkConfigOutput '^false$' "$@" ./disable-define-enable.nix
133+checkConfigError "The option .*enable.* does not exist. Definition values:\n\s*- In .*: true" "$@" ./disable-declare-enable.nix
129134checkConfigError "attribute .*enable.* in selection path .*config.enable.* not found" "$@" ./disable-define-enable.nix ./disable-declare-enable.nix
130135checkConfigError "attribute .*enable.* in selection path .*config.enable.* not found" "$@" ./disable-enable-modules.nix
131136
132137# Check _module.args.
133138set -- config.enable ./declare-enable.nix ./define-enable-with-custom-arg.nix
134139checkConfigError 'while evaluating the module argument .*custom.* in .*define-enable-with-custom-arg.nix.*:' "$@"
135−checkConfigOutput "true" "$@" ./define-_module-args-custom.nix
140+checkConfigOutput '^true$' "$@" ./define-_module-args-custom.nix
136141
137142# Check that using _module.args on imports cause infinite recursions, with
138143# the proper error context.
@@ -142,71 +147,78 @@ checkConfigError 'infinite recursion encountered' "$@"
142147
143148# Check _module.check.
144149set -- config.enable ./declare-enable.nix ./define-enable.nix ./define-attrsOfSub-foo.nix
145−checkConfigError 'The option .* does not exist. Definition values:\n- In .*' "$@"
146−checkConfigOutput "true" "$@" ./define-module-check.nix
150+checkConfigError 'The option .* does not exist. Definition values:\n\s*- In .*' "$@"
151+checkConfigOutput '^true$' "$@" ./define-module-check.nix
147152
148153# Check coerced value.
149−checkConfigOutput "\"42\"" config.value ./declare-coerced-value.nix
150−checkConfigOutput "\"24\"" config.value ./declare-coerced-value.nix ./define-value-string.nix
151−checkConfigError 'A definition for option .* is not.*string or signed integer convertible to it.*. Definition values:\n- In .*: \[ \]' config.value ./declare-coerced-value.nix ./define-value-list.nix
154+checkConfigOutput '^"42"$' config.value ./declare-coerced-value.nix
155+checkConfigOutput '^"24"$' config.value ./declare-coerced-value.nix ./define-value-string.nix
156+checkConfigError 'A definition for option .* is not.*string or signed integer convertible to it.*. Definition values:\n\s*- In .*: \[ \]' config.value ./declare-coerced-value.nix ./define-value-list.nix
152157
153158# Check coerced value with unsound coercion
154−checkConfigOutput "12" config.value ./declare-coerced-value-unsound.nix
155−checkConfigError 'A definition for option .* is not of type .*. Definition values:\n- In .*: "1000"' config.value ./declare-coerced-value-unsound.nix ./define-value-string-bigint.nix
156−checkConfigError 'unrecognised JSON value' config.value ./declare-coerced-value-unsound.nix ./define-value-string-arbitrary.nix
159+checkConfigOutput '^12$' config.value ./declare-coerced-value-unsound.nix
160+checkConfigError 'A definition for option .* is not of type .*. Definition values:\n\s*- In .*: "1000"' config.value ./declare-coerced-value-unsound.nix ./define-value-string-bigint.nix
161+checkConfigError 'json.exception.parse_error' config.value ./declare-coerced-value-unsound.nix ./define-value-string-arbitrary.nix
157162
158163# Check mkAliasOptionModule.
159−checkConfigOutput "true" config.enable ./alias-with-priority.nix
160−checkConfigOutput "true" config.enableAlias ./alias-with-priority.nix
161−checkConfigOutput "false" config.enable ./alias-with-priority-can-override.nix
162−checkConfigOutput "false" config.enableAlias ./alias-with-priority-can-override.nix
164+checkConfigOutput '^true$' config.enable ./alias-with-priority.nix
165+checkConfigOutput '^true$' config.enableAlias ./alias-with-priority.nix
166+checkConfigOutput '^false$' config.enable ./alias-with-priority-can-override.nix
167+checkConfigOutput '^false$' config.enableAlias ./alias-with-priority-can-override.nix
163168
164169# submoduleWith
165170
166171## specialArgs should work
167−checkConfigOutput "foo" config.submodule.foo ./declare-submoduleWith-special.nix
172+checkConfigOutput '^"foo"$' config.submodule.foo ./declare-submoduleWith-special.nix
168173
169174## shorthandOnlyDefines config behaves as expected
170−checkConfigOutput "true" config.submodule.config ./declare-submoduleWith-shorthand.nix ./define-submoduleWith-shorthand.nix
175+checkConfigOutput '^true$' config.submodule.config ./declare-submoduleWith-shorthand.nix ./define-submoduleWith-shorthand.nix
171176checkConfigError 'is not of type `boolean' config.submodule.config ./declare-submoduleWith-shorthand.nix ./define-submoduleWith-noshorthand.nix
172−checkConfigError "You're trying to declare a value of type \`bool'\nrather than an attribute-set for the option" config.submodule.config ./declare-submoduleWith-noshorthand.nix ./define-submoduleWith-shorthand.nix
173−checkConfigOutput "true" config.submodule.config ./declare-submoduleWith-noshorthand.nix ./define-submoduleWith-noshorthand.nix
177+checkConfigError "You're trying to declare a value of type \`bool'\n\s*rather than an attribute-set for the option" config.submodule.config ./declare-submoduleWith-noshorthand.nix ./define-submoduleWith-shorthand.nix
178+checkConfigOutput '^true$' config.submodule.config ./declare-submoduleWith-noshorthand.nix ./define-submoduleWith-noshorthand.nix
174179
175180## submoduleWith should merge all modules in one swoop
176−checkConfigOutput "true" config.submodule.inner ./declare-submoduleWith-modules.nix
177−checkConfigOutput "true" config.submodule.outer ./declare-submoduleWith-modules.nix
181+checkConfigOutput '^true$' config.submodule.inner ./declare-submoduleWith-modules.nix
182+checkConfigOutput '^true$' config.submodule.outer ./declare-submoduleWith-modules.nix
183+# Should also be able to evaluate the type name (which evaluates freeformType,
184+# which evaluates all the modules defined by the type)
185+checkConfigOutput '^"submodule"$' options.submodule.type.description ./declare-submoduleWith-modules.nix
186+
187+## submodules can be declared using (evalModules {...}).type
188+checkConfigOutput '^true$' config.submodule.inner ./declare-submodule-via-evalModules.nix
189+checkConfigOutput '^true$' config.submodule.outer ./declare-submodule-via-evalModules.nix
178190# Should also be able to evaluate the type name (which evaluates freeformType,
179191# which evaluates all the modules defined by the type)
180−checkConfigOutput "submodule" options.submodule.type.description ./declare-submoduleWith-modules.nix
192+checkConfigOutput '^"submodule"$' options.submodule.type.description ./declare-submodule-via-evalModules.nix
181193
182194## Paths should be allowed as values and work as expected
183−checkConfigOutput "true" config.submodule.enable ./declare-submoduleWith-path.nix
195+checkConfigOutput '^true$' config.submodule.enable ./declare-submoduleWith-path.nix
184196
185197# Check that disabledModules works recursively and correctly
186−checkConfigOutput "true" config.enable ./disable-recursive/main.nix
187−checkConfigOutput "true" config.enable ./disable-recursive/{main.nix,disable-foo.nix}
188−checkConfigOutput "true" config.enable ./disable-recursive/{main.nix,disable-bar.nix}
189−checkConfigError 'The option .* does not exist. Definition values:\n- In .*: true' config.enable ./disable-recursive/{main.nix,disable-foo.nix,disable-bar.nix}
198+checkConfigOutput '^true$' config.enable ./disable-recursive/main.nix
199+checkConfigOutput '^true$' config.enable ./disable-recursive/{main.nix,disable-foo.nix}
200+checkConfigOutput '^true$' config.enable ./disable-recursive/{main.nix,disable-bar.nix}
201+checkConfigError 'The option .* does not exist. Definition values:\n\s*- In .*: true' config.enable ./disable-recursive/{main.nix,disable-foo.nix,disable-bar.nix}
190202
191203# Check that imports can depend on derivations
192−checkConfigOutput "true" config.enable ./import-from-store.nix
204+checkConfigOutput '^true$' config.enable ./import-from-store.nix
193205
194206# Check that configs can be conditional on option existence
195−checkConfigOutput true config.enable ./define-option-dependently.nix ./declare-enable.nix ./declare-int-positive-value.nix
196−checkConfigOutput 360 config.value ./define-option-dependently.nix ./declare-enable.nix ./declare-int-positive-value.nix
197−checkConfigOutput 7 config.value ./define-option-dependently.nix ./declare-int-positive-value.nix
198−checkConfigOutput true config.set.enable ./define-option-dependently-nested.nix ./declare-enable-nested.nix ./declare-int-positive-value-nested.nix
199−checkConfigOutput 360 config.set.value ./define-option-dependently-nested.nix ./declare-enable-nested.nix ./declare-int-positive-value-nested.nix
200−checkConfigOutput 7 config.set.value ./define-option-dependently-nested.nix ./declare-int-positive-value-nested.nix
207+checkConfigOutput '^true$' config.enable ./define-option-dependently.nix ./declare-enable.nix ./declare-int-positive-value.nix
208+checkConfigOutput '^360$' config.value ./define-option-dependently.nix ./declare-enable.nix ./declare-int-positive-value.nix
209+checkConfigOutput '^7$' config.value ./define-option-dependently.nix ./declare-int-positive-value.nix
210+checkConfigOutput '^true$' config.set.enable ./define-option-dependently-nested.nix ./declare-enable-nested.nix ./declare-int-positive-value-nested.nix
211+checkConfigOutput '^360$' config.set.value ./define-option-dependently-nested.nix ./declare-enable-nested.nix ./declare-int-positive-value-nested.nix
212+checkConfigOutput '^7$' config.set.value ./define-option-dependently-nested.nix ./declare-int-positive-value-nested.nix
201213
202214# Check attrsOf and lazyAttrsOf. Only lazyAttrsOf should be lazy, and only
203215# attrsOf should work with conditional definitions
204216# In addition, lazyAttrsOf should honor an options emptyValue
205217checkConfigError "is not lazy" config.isLazy ./declare-attrsOf.nix ./attrsOf-lazy-check.nix
206−checkConfigOutput "true" config.isLazy ./declare-lazyAttrsOf.nix ./attrsOf-lazy-check.nix
207−checkConfigOutput "true" config.conditionalWorks ./declare-attrsOf.nix ./attrsOf-conditional-check.nix
208−checkConfigOutput "false" config.conditionalWorks ./declare-lazyAttrsOf.nix ./attrsOf-conditional-check.nix
209−checkConfigOutput "empty" config.value.foo ./declare-lazyAttrsOf.nix ./attrsOf-conditional-check.nix
218+checkConfigOutput '^true$' config.isLazy ./declare-lazyAttrsOf.nix ./attrsOf-lazy-check.nix
219+checkConfigOutput '^true$' config.conditionalWorks ./declare-attrsOf.nix ./attrsOf-conditional-check.nix
220+checkConfigOutput '^false$' config.conditionalWorks ./declare-lazyAttrsOf.nix ./attrsOf-conditional-check.nix
221+checkConfigOutput '^"empty"$' config.value.foo ./declare-lazyAttrsOf.nix ./attrsOf-conditional-check.nix
210222
211223
212224# Even with multiple assignments, a type error should be thrown if any of them aren't valid
@@ -215,62 +227,109 @@ checkConfigError 'A definition for option .* is not of type .*' \
215227
216228## Freeform modules
217229# Assigning without a declared option should work
218−checkConfigOutput 24 config.value ./freeform-attrsOf.nix ./define-value-string.nix
230+checkConfigOutput '^"24"$' config.value ./freeform-attrsOf.nix ./define-value-string.nix
219231# No freeform assigments shouldn't make it error
220−checkConfigOutput '{ }' config ./freeform-attrsOf.nix
232+checkConfigOutput '^{ }$' config ./freeform-attrsOf.nix
221233# but only if the type matches
222234checkConfigError 'A definition for option .* is not of type .*' config.value ./freeform-attrsOf.nix ./define-value-list.nix
223235# and properties should be applied
224−checkConfigOutput yes config.value ./freeform-attrsOf.nix ./define-value-string-properties.nix
236+checkConfigOutput '^"yes"$' config.value ./freeform-attrsOf.nix ./define-value-string-properties.nix
225237# Options should still be declarable, and be able to have a type that doesn't match the freeform type
226−checkConfigOutput false config.enable ./freeform-attrsOf.nix ./define-value-string.nix ./declare-enable.nix
227−checkConfigOutput 24 config.value ./freeform-attrsOf.nix ./define-value-string.nix ./declare-enable.nix
238+checkConfigOutput '^false$' config.enable ./freeform-attrsOf.nix ./define-value-string.nix ./declare-enable.nix
239+checkConfigOutput '^"24"$' config.value ./freeform-attrsOf.nix ./define-value-string.nix ./declare-enable.nix
228240# and this should work too with nested values
229−checkConfigOutput false config.nest.foo ./freeform-attrsOf.nix ./freeform-nested.nix
230−checkConfigOutput bar config.nest.bar ./freeform-attrsOf.nix ./freeform-nested.nix
241+checkConfigOutput '^false$' config.nest.foo ./freeform-attrsOf.nix ./freeform-nested.nix
242+checkConfigOutput '^"bar"$' config.nest.bar ./freeform-attrsOf.nix ./freeform-nested.nix
231243# Check whether a declared option can depend on an freeform-typed one
232−checkConfigOutput null config.foo ./freeform-attrsOf.nix ./freeform-str-dep-unstr.nix
233−checkConfigOutput 24 config.foo ./freeform-attrsOf.nix ./freeform-str-dep-unstr.nix ./define-value-string.nix
244+checkConfigOutput '^null$' config.foo ./freeform-attrsOf.nix ./freeform-str-dep-unstr.nix
245+checkConfigOutput '^"24"$' config.foo ./freeform-attrsOf.nix ./freeform-str-dep-unstr.nix ./define-value-string.nix
234246# Check whether an freeform-typed value can depend on a declared option, this can only work with lazyAttrsOf
235247checkConfigError 'infinite recursion encountered' config.foo ./freeform-attrsOf.nix ./freeform-unstr-dep-str.nix
236248checkConfigError 'The option .* is used but not defined' config.foo ./freeform-lazyAttrsOf.nix ./freeform-unstr-dep-str.nix
237−checkConfigOutput 24 config.foo ./freeform-lazyAttrsOf.nix ./freeform-unstr-dep-str.nix ./define-value-string.nix
249+checkConfigOutput '^"24"$' config.foo ./freeform-lazyAttrsOf.nix ./freeform-unstr-dep-str.nix ./define-value-string.nix
250+# submodules in freeformTypes should have their locations annotated
251+checkConfigOutput '/freeform-submodules.nix"$' config.fooDeclarations.0 ./freeform-submodules.nix
252+# freeformTypes can get merged using `types.type`, including submodules
253+checkConfigOutput '^10$' config.free.xxx.foo ./freeform-submodules.nix
254+checkConfigOutput '^10$' config.free.yyy.bar ./freeform-submodules.nix
238255
239256## types.anything
240257# Check that attribute sets are merged recursively
241−checkConfigOutput null config.value.foo ./types-anything/nested-attrs.nix
242−checkConfigOutput null config.value.l1.foo ./types-anything/nested-attrs.nix
243−checkConfigOutput null config.value.l1.l2.foo ./types-anything/nested-attrs.nix
244−checkConfigOutput null config.value.l1.l2.l3.foo ./types-anything/nested-attrs.nix
258+checkConfigOutput '^null$' config.value.foo ./types-anything/nested-attrs.nix
259+checkConfigOutput '^null$' config.value.l1.foo ./types-anything/nested-attrs.nix
260+checkConfigOutput '^null$' config.value.l1.l2.foo ./types-anything/nested-attrs.nix
261+checkConfigOutput '^null$' config.value.l1.l2.l3.foo ./types-anything/nested-attrs.nix
245262# Attribute sets that are coercible to strings shouldn't be recursed into
246−checkConfigOutput foo config.value.outPath ./types-anything/attrs-coercible.nix
263+checkConfigOutput '^"foo"$' config.value.outPath ./types-anything/attrs-coercible.nix
247264# Multiple lists aren't concatenated together
248265checkConfigError 'The option .* has conflicting definitions' config.value ./types-anything/lists.nix
249266# Check that all equalizable atoms can be used as long as all definitions are equal
250−checkConfigOutput 0 config.value.int ./types-anything/equal-atoms.nix
251−checkConfigOutput false config.value.bool ./types-anything/equal-atoms.nix
252−checkConfigOutput '""' config.value.string ./types-anything/equal-atoms.nix
253−checkConfigOutput / config.value.path ./types-anything/equal-atoms.nix
254−checkConfigOutput null config.value.null ./types-anything/equal-atoms.nix
255−checkConfigOutput 0.1 config.value.float ./types-anything/equal-atoms.nix
267+checkConfigOutput '^0$' config.value.int ./types-anything/equal-atoms.nix
268+checkConfigOutput '^false$' config.value.bool ./types-anything/equal-atoms.nix
269+checkConfigOutput '^""$' config.value.string ./types-anything/equal-atoms.nix
270+checkConfigOutput '^/$' config.value.path ./types-anything/equal-atoms.nix
271+checkConfigOutput '^null$' config.value.null ./types-anything/equal-atoms.nix
272+checkConfigOutput '^0.1$' config.value.float ./types-anything/equal-atoms.nix
256273# Functions can't be merged together
257−checkConfigError "The option .* has conflicting definition values" config.value.multiple-lambdas ./types-anything/functions.nix
258−checkConfigOutput '<LAMBDA>' config.value.single-lambda ./types-anything/functions.nix
274+checkConfigError "The option .value.multiple-lambdas.<function body>. has conflicting option types" config.applied.multiple-lambdas ./types-anything/functions.nix
275+checkConfigOutput '^<LAMBDA>$' config.value.single-lambda ./types-anything/functions.nix
276+checkConfigOutput '^null$' config.applied.merging-lambdas.x ./types-anything/functions.nix
277+checkConfigOutput '^null$' config.applied.merging-lambdas.y ./types-anything/functions.nix
259278# Check that all mk* modifiers are applied
260279checkConfigError 'attribute .* not found' config.value.mkiffalse ./types-anything/mk-mods.nix
261−checkConfigOutput '{ }' config.value.mkiftrue ./types-anything/mk-mods.nix
262−checkConfigOutput 1 config.value.mkdefault ./types-anything/mk-mods.nix
263−checkConfigOutput '{ }' config.value.mkmerge ./types-anything/mk-mods.nix
264−checkConfigOutput true config.value.mkbefore ./types-anything/mk-mods.nix
265−checkConfigOutput 1 config.value.nested.foo ./types-anything/mk-mods.nix
266−checkConfigOutput baz config.value.nested.bar.baz ./types-anything/mk-mods.nix
280+checkConfigOutput '^{ }$' config.value.mkiftrue ./types-anything/mk-mods.nix
281+checkConfigOutput '^1$' config.value.mkdefault ./types-anything/mk-mods.nix
282+checkConfigOutput '^{ }$' config.value.mkmerge ./types-anything/mk-mods.nix
283+checkConfigOutput '^true$' config.value.mkbefore ./types-anything/mk-mods.nix
284+checkConfigOutput '^1$' config.value.nested.foo ./types-anything/mk-mods.nix
285+checkConfigOutput '^"baz"$' config.value.nested.bar.baz ./types-anything/mk-mods.nix
267286
268287## types.functionTo
269−checkConfigOutput "input is input" config.result ./functionTo/trivial.nix
270−checkConfigOutput "a b" config.result ./functionTo/merging-list.nix
271−checkConfigError 'A definition for option .fun.\[function body\]. is not of type .string.. Definition values:\n- In .*wrong-type.nix' config.result ./functionTo/wrong-type.nix
272−checkConfigOutput "b a" config.result ./functionTo/list-order.nix
273−checkConfigOutput "a c" config.result ./functionTo/merging-attrs.nix
288+checkConfigOutput '^"input is input"$' config.result ./functionTo/trivial.nix
289+checkConfigOutput '^"a b"$' config.result ./functionTo/merging-list.nix
290+checkConfigError 'A definition for option .fun.\[function body\]. is not of type .string.. Definition values:\n\s*- In .*wrong-type.nix' config.result ./functionTo/wrong-type.nix
291+checkConfigOutput '^"b a"$' config.result ./functionTo/list-order.nix
292+checkConfigOutput '^"a c"$' config.result ./functionTo/merging-attrs.nix
293+
294+# moduleType
295+checkConfigOutput '^"a b"$' config.resultFoo ./declare-variants.nix ./define-variant.nix
296+checkConfigOutput '^"a b y z"$' config.resultFooBar ./declare-variants.nix ./define-variant.nix
297+checkConfigOutput '^"a b c"$' config.resultFooFoo ./declare-variants.nix ./define-variant.nix
298+
299+## emptyValue's
300+checkConfigOutput "[ ]" config.list.a ./emptyValues.nix
301+checkConfigOutput "{ }" config.attrs.a ./emptyValues.nix
302+checkConfigOutput "null" config.null.a ./emptyValues.nix
303+checkConfigOutput "{ }" config.submodule.a ./emptyValues.nix
304+# These types don't have empty values
305+checkConfigError 'The option .int.a. is used but not defined' config.int.a ./emptyValues.nix
306+checkConfigError 'The option .nonEmptyList.a. is used but not defined' config.nonEmptyList.a ./emptyValues.nix
307+
308+## types.raw
309+checkConfigOutput "{ foo = <CODE>; }" config.unprocessedNesting ./raw.nix
310+checkConfigOutput "10" config.processedToplevel ./raw.nix
311+checkConfigError "The option .multiple. is defined multiple times" config.multiple ./raw.nix
312+checkConfigOutput "bar" config.priorities ./raw.nix
313+
314+## Option collision
315+checkConfigError \
316+ 'The option .set. in module .*/declare-set.nix. would be a parent of the following options, but its type .attribute set of signed integers. does not support nested options.\n\s*- option[(]s[)] with prefix .set.enable. in module .*/declare-enable-nested.nix.' \
317+ config.set \
318+ ./declare-set.nix ./declare-enable-nested.nix
319+
320+# Test that types.optionType merges types correctly
321+checkConfigOutput '^10$' config.theOption.int ./optionTypeMerging.nix
322+checkConfigOutput '^"hello"$' config.theOption.str ./optionTypeMerging.nix
323+
324+# Test that types.optionType correctly annotates option locations
325+checkConfigError 'The option .theOption.nested. in .other.nix. is already declared in .optionTypeFile.nix.' config.theOption.nested ./optionTypeFile.nix
326+
327+# Test that types.optionType leaves types untouched as long as they don't need to be merged
328+checkConfigOutput 'ok' config.freeformItems.foo.bar ./adhoc-freeformType-survives-type-merge.nix
329+
330+# Anonymous submodules don't get nixed by import resolution/deduplication
331+# because of an `extendModules` bug, issue 168767.
332+checkConfigOutput '^1$' config.sub.specialisation.value ./extendModules-168767-imports.nix
274333
275334cat <<EOF
276335====== module tests ======
@@ -278,7 +337,7 @@ $pass Pass
278337$fail Fail
279338EOF
280339
281−if test $fail -ne 0; then
340+if [ "$fail" -ne 0 ]; then
282341 exit 1
283342fi
284343exit 0
lib/tests/modules/adhoc-freeformType-survives-type-merge.nixnew file+14
@@ -0,0 +1,14 @@
1+{ lib, ... }: {
2+ options.dummy = lib.mkOption { type = lib.types.anything; default = {}; };
3+ freeformType =
4+ let
5+ a = lib.types.attrsOf (lib.types.submodule { options.bar = lib.mkOption { }; });
6+ in
7+ # modifying types like this breaks type merging.
8+ # This test makes sure that type merging is not performed when only a single declaration exists.
9+ # Don't modify types in practice!
10+ a // {
11+ merge = loc: defs: { freeformItems = a.merge loc defs; };
12+ };
13+ config.foo.bar = "ok";
14+}
lib/tests/modules/declare-attrsOf.nix+8−1
@@ -1,6 +1,13 @@
1−{ lib, ... }: {
1+{ lib, ... }:
2+let
3+ deathtrapArgs = lib.mapAttrs
4+ (k: _: throw "The module system is too strict, accessing an unused option's ${k} mkOption-attribute.")
5+ (lib.functionArgs lib.mkOption);
6+in
7+{
28 options.value = lib.mkOption {
39 type = lib.types.attrsOf lib.types.str;
410 default = {};
511 };
12+ options.testing-laziness-so-don't-read-me = lib.mkOption deathtrapArgs;
613}
lib/tests/modules/declare-bare-submodule-deep-option-duplicate.nixnew file+10
@@ -0,0 +1,10 @@
1+{ lib, ... }:
2+let
3+ inherit (lib) mkOption types;
4+in
5+{
6+ options.bare-submodule.deep = mkOption {
7+ type = types.int;
8+ default = 2;
9+ };
10+}
lib/tests/modules/declare-bare-submodule-deep-option.nixnew file+10
@@ -0,0 +1,10 @@
1+{ lib, ... }:
2+let
3+ inherit (lib) mkOption types;
4+in
5+{
6+ options.bare-submodule.deep = mkOption {
7+ type = types.int;
8+ default = 2;
9+ };
10+}
lib/tests/modules/declare-bare-submodule-nested-option.nixnew file+19
@@ -0,0 +1,19 @@
1+{ config, lib, ... }:
2+let
3+ inherit (lib) mkOption types;
4+in
5+{
6+ options.bare-submodule = mkOption {
7+ type = types.submoduleWith {
8+ shorthandOnlyDefinesConfig = config.shorthandOnlyDefinesConfig;
9+ modules = [
10+ {
11+ options.nested = mkOption {
12+ type = types.int;
13+ default = 1;
14+ };
15+ }
16+ ];
17+ };
18+ };
19+}
lib/tests/modules/declare-bare-submodule.nixnew file+18
@@ -0,0 +1,18 @@
1+{ config, lib, ... }:
2+let
3+ inherit (lib) mkOption types;
4+in
5+{
6+ options.bare-submodule = mkOption {
7+ type = types.submoduleWith {
8+ modules = [ ];
9+ shorthandOnlyDefinesConfig = config.shorthandOnlyDefinesConfig;
10+ };
11+ default = {};
12+ };
13+
14+ # config-dependent options: won't recommend, but useful for making this test parameterized
15+ options.shorthandOnlyDefinesConfig = mkOption {
16+ default = false;
17+ };
18+}
lib/tests/modules/declare-set.nixnew file+12
@@ -0,0 +1,12 @@
1+{ lib, ... }:
2+
3+{
4+ options.set = lib.mkOption {
5+ default = { };
6+ example = { a = 1; };
7+ type = lib.types.attrsOf lib.types.int;
8+ description = ''
9+ Some descriptive text
10+ '';
11+ };
12+}
lib/tests/modules/declare-submodule-via-evalModules.nixnew file+28
@@ -0,0 +1,28 @@
1+{ lib, ... }: {
2+ options.submodule = lib.mkOption {
3+ inherit (lib.evalModules {
4+ modules = [
5+ {
6+ options.inner = lib.mkOption {
7+ type = lib.types.bool;
8+ default = false;
9+ };
10+ }
11+ ];
12+ }) type;
13+ default = {};
14+ };
15+
16+ config.submodule = lib.mkMerge [
17+ ({ lib, ... }: {
18+ options.outer = lib.mkOption {
19+ type = lib.types.bool;
20+ default = false;
21+ };
22+ })
23+ {
24+ inner = true;
25+ outer = true;
26+ }
27+ ];
28+}
lib/tests/modules/declare-variants.nixnew file+9
@@ -0,0 +1,9 @@
1+{ lib, moduleType, ... }:
2+let inherit (lib) mkOption types;
3+in
4+{
5+ options.variants = mkOption {
6+ type = types.lazyAttrsOf moduleType;
7+ default = {};
8+ };
9+}
lib/tests/modules/define-bare-submodule-values.nixnew file+4
@@ -0,0 +1,4 @@
1+{
2+ bare-submodule.nested = 42;
3+ bare-submodule.deep = 420;
4+}
lib/tests/modules/define-shorthandOnlyDefinesConfig-true.nixnew file+1
@@ -0,0 +1 @@
1+{ shorthandOnlyDefinesConfig = true; }
lib/tests/modules/define-variant.nixnew file+22
@@ -0,0 +1,22 @@
1+{ config, lib, ... }:
2+let inherit (lib) types mkOption attrNames;
3+in
4+{
5+ options = {
6+ attrs = mkOption { type = types.attrsOf lib.types.int; };
7+ result = mkOption { };
8+ resultFoo = mkOption { };
9+ resultFooBar = mkOption { };
10+ resultFooFoo = mkOption { };
11+ };
12+ config = {
13+ attrs.a = 1;
14+ variants.foo.attrs.b = 1;
15+ variants.bar.attrs.y = 1;
16+ variants.foo.variants.bar.attrs.z = 1;
17+ variants.foo.variants.foo.attrs.c = 3;
18+ resultFoo = lib.concatMapStringsSep " " toString (attrNames config.variants.foo.attrs);
19+ resultFooBar = lib.concatMapStringsSep " " toString (attrNames config.variants.foo.variants.bar.attrs);
20+ resultFooFoo = lib.concatMapStringsSep " " toString (attrNames config.variants.foo.variants.foo.attrs);
21+ };
22+}
lib/tests/modules/emptyValues.nixnew file+36
@@ -0,0 +1,36 @@
1+{ lib, ... }:
2+let
3+ inherit (lib) types;
4+in {
5+
6+ options = {
7+ int = lib.mkOption {
8+ type = types.lazyAttrsOf types.int;
9+ };
10+ list = lib.mkOption {
11+ type = types.lazyAttrsOf (types.listOf types.int);
12+ };
13+ nonEmptyList = lib.mkOption {
14+ type = types.lazyAttrsOf (types.nonEmptyListOf types.int);
15+ };
16+ attrs = lib.mkOption {
17+ type = types.lazyAttrsOf (types.attrsOf types.int);
18+ };
19+ null = lib.mkOption {
20+ type = types.lazyAttrsOf (types.nullOr types.int);
21+ };
22+ submodule = lib.mkOption {
23+ type = types.lazyAttrsOf (types.submodule {});
24+ };
25+ };
26+
27+ config = {
28+ int.a = lib.mkIf false null;
29+ list.a = lib.mkIf false null;
30+ nonEmptyList.a = lib.mkIf false null;
31+ attrs.a = lib.mkIf false null;
32+ null.a = lib.mkIf false null;
33+ submodule.a = lib.mkIf false null;
34+ };
35+
36+}
lib/tests/modules/extendModules-168767-imports.nixnew file+41
@@ -0,0 +1,41 @@
1+{ lib
2+, extendModules
3+, ...
4+}:
5+with lib;
6+{
7+ imports = [
8+
9+ {
10+ options.sub = mkOption {
11+ default = { };
12+ type = types.submodule (
13+ { config
14+ , extendModules
15+ , ...
16+ }:
17+ {
18+ options.value = mkOption {
19+ type = types.int;
20+ };
21+
22+ options.specialisation = mkOption {
23+ default = { };
24+ inherit
25+ (extendModules {
26+ modules = [{
27+ specialisation = mkOverride 0 { };
28+ }];
29+ })
30+ type;
31+ };
32+ }
33+ );
34+ };
35+ }
36+
37+ { config.sub.value = 1; }
38+
39+
40+ ];
41+}
lib/tests/modules/freeform-nested.nix+8−1
@@ -1,7 +1,14 @@
1−{ lib, ... }: {
1+{ lib, ... }:
2+let
3+ deathtrapArgs = lib.mapAttrs
4+ (k: _: throw "The module system is too strict, accessing an unused option's ${k} mkOption-attribute.")
5+ (lib.functionArgs lib.mkOption);
6+in
7+{
28 options.nest.foo = lib.mkOption {
39 type = lib.types.bool;
410 default = false;
511 };
12+ options.nest.unused = lib.mkOption deathtrapArgs;
613 config.nest.bar = "bar";
714}
lib/tests/modules/freeform-submodules.nixnew file+22
@@ -0,0 +1,22 @@
1+{ lib, options, ... }: with lib.types; {
2+
3+ options.fooDeclarations = lib.mkOption {
4+ default = (options.free.type.getSubOptions [])._freeformOptions.foo.declarations;
5+ };
6+
7+ options.free = lib.mkOption {
8+ type = submodule {
9+ config._module.freeformType = lib.mkMerge [
10+ (attrsOf (submodule {
11+ options.foo = lib.mkOption {};
12+ }))
13+ (attrsOf (submodule {
14+ options.bar = lib.mkOption {};
15+ }))
16+ ];
17+ };
18+ };
19+
20+ config.free.xxx.foo = 10;
21+ config.free.yyy.bar = 10;
22+}
lib/tests/modules/optionTypeFile.nixnew file+28
@@ -0,0 +1,28 @@
1+{ config, lib, ... }: {
2+
3+ _file = "optionTypeFile.nix";
4+
5+ options.theType = lib.mkOption {
6+ type = lib.types.optionType;
7+ };
8+
9+ options.theOption = lib.mkOption {
10+ type = config.theType;
11+ default = {};
12+ };
13+
14+ config.theType = lib.mkMerge [
15+ (lib.types.submodule {
16+ options.nested = lib.mkOption {
17+ type = lib.types.int;
18+ };
19+ })
20+ (lib.types.submodule {
21+ _file = "other.nix";
22+ options.nested = lib.mkOption {
23+ type = lib.types.str;
24+ };
25+ })
26+ ];
27+
28+}
lib/tests/modules/optionTypeMerging.nixnew file+27
@@ -0,0 +1,27 @@
1+{ config, lib, ... }: {
2+
3+ options.theType = lib.mkOption {
4+ type = lib.types.optionType;
5+ };
6+
7+ options.theOption = lib.mkOption {
8+ type = config.theType;
9+ };
10+
11+ config.theType = lib.mkMerge [
12+ (lib.types.submodule {
13+ options.int = lib.mkOption {
14+ type = lib.types.int;
15+ default = 10;
16+ };
17+ })
18+ (lib.types.submodule {
19+ options.str = lib.mkOption {
20+ type = lib.types.str;
21+ };
22+ })
23+ ];
24+
25+ config.theOption.str = "hello";
26+
27+}
lib/tests/modules/raw.nixnew file+30
@@ -0,0 +1,30 @@
1+{ lib, ... }: {
2+
3+ options = {
4+ processedToplevel = lib.mkOption {
5+ type = lib.types.raw;
6+ };
7+ unprocessedNesting = lib.mkOption {
8+ type = lib.types.raw;
9+ };
10+ multiple = lib.mkOption {
11+ type = lib.types.raw;
12+ };
13+ priorities = lib.mkOption {
14+ type = lib.types.raw;
15+ };
16+ };
17+
18+ config = {
19+ processedToplevel = lib.mkIf true 10;
20+ unprocessedNesting.foo = throw "foo";
21+ multiple = lib.mkMerge [
22+ "foo"
23+ "foo"
24+ ];
25+ priorities = lib.mkMerge [
26+ "foo"
27+ (lib.mkForce "bar")
28+ ];
29+ };
30+}
lib/tests/modules/types-anything/functions.nix+9−3
@@ -1,16 +1,22 @@
1−{ lib, ... }: {
1+{ lib, config, ... }: {
22
33 options.value = lib.mkOption {
44 type = lib.types.anything;
55 };
66
7+ options.applied = lib.mkOption {
8+ default = lib.mapAttrs (name: fun: fun null) config.value;
9+ };
10+
711 config = lib.mkMerge [
812 {
913 value.single-lambda = x: x;
10− value.multiple-lambdas = x: x;
14+ value.multiple-lambdas = x: { inherit x; };
15+ value.merging-lambdas = x: { inherit x; };
1116 }
1217 {
13− value.multiple-lambdas = x: x;
18+ value.multiple-lambdas = x: [ x ];
19+ value.merging-lambdas = y: { inherit y; };
1420 }
1521 ];
1622
lib/tests/release.nix+9−1
@@ -3,7 +3,7 @@
33 pkgs ? import ../.. {} // { lib = throw "pkgs.lib accessed, but the lib tests should use nixpkgs' lib path directly!"; }
44}:
55
6−pkgs.runCommandNoCC "nixpkgs-lib-tests" {
6+pkgs.runCommand "nixpkgs-lib-tests" {
77 buildInputs = [
88 pkgs.nix
99 (import ./check-eval.nix)
@@ -23,10 +23,18 @@ pkgs.runCommandNoCC "nixpkgs-lib-tests" {
2323 export NIX_STORE_DIR=$TEST_ROOT/store
2424 export PAGER=cat
2525 cacheDir=$TEST_ROOT/binary-cache
26+
27+ mkdir -p $NIX_CONF_DIR
28+ echo "experimental-features = nix-command" >> $NIX_CONF_DIR/nix.conf
29+
2630 nix-store --init
2731
2832 cp -r ${../.} lib
33+ echo "Running lib/tests/modules.sh"
2934 bash lib/tests/modules.sh
3035
36+ echo "Running lib/tests/sources.sh"
37+ TEST_LIB=$PWD/lib bash lib/tests/sources.sh
38+
3139 touch $out
3240''
lib/tests/sources.shnew file+61
@@ -0,0 +1,61 @@
1+#!/usr/bin/env bash
2+set -euo pipefail
3+shopt -s inherit_errexit
4+
5+# Use
6+# || die
7+die() {
8+ echo >&2 "test case failed: " "$@"
9+ exit 1
10+}
11+
12+if test -n "${TEST_LIB:-}"; then
13+ NIX_PATH=nixpkgs="$(dirname "$TEST_LIB")"
14+else
15+ NIX_PATH=nixpkgs="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.."; pwd)"
16+fi
17+export NIX_PATH
18+
19+work="$(mktemp -d)"
20+clean_up() {
21+ rm -rf "$work"
22+}
23+trap clean_up EXIT
24+cd "$work"
25+
26+touch {README.md,module.o,foo.bar}
27+
28+# nix-instantiate doesn't write out the source, only computing the hash, so
29+# this uses the experimental nix command instead.
30+
31+dir="$(nix eval --impure --raw --expr '(with import <nixpkgs/lib>; "${
32+ cleanSource ./.
33+}")')"
34+(cd "$dir"; find) | sort -f | diff -U10 - <(cat <<EOF
35+.
36+./foo.bar
37+./README.md
38+EOF
39+) || die "cleanSource 1"
40+
41+
42+dir="$(nix eval --impure --raw --expr '(with import <nixpkgs/lib>; "${
43+ cleanSourceWith { src = '"$work"'; filter = path: type: ! hasSuffix ".bar" path; }
44+}")')"
45+(cd "$dir"; find) | sort -f | diff -U10 - <(cat <<EOF
46+.
47+./module.o
48+./README.md
49+EOF
50+) || die "cleanSourceWith 1"
51+
52+dir="$(nix eval --impure --raw --expr '(with import <nixpkgs/lib>; "${
53+ cleanSourceWith { src = cleanSource '"$work"'; filter = path: type: ! hasSuffix ".bar" path; }
54+}")')"
55+(cd "$dir"; find) | sort -f | diff -U10 - <(cat <<EOF
56+.
57+./README.md
58+EOF
59+) || die "cleanSourceWith + cleanSource"
60+
61+echo >&2 tests ok
lib/tests/systems.nix+6−3
@@ -17,8 +17,11 @@ with lib.systems.doubles; lib.runTests {
1717
1818 testarm = mseteq arm [ "armv5tel-linux" "armv6l-linux" "armv6l-netbsd" "armv6l-none" "armv7a-linux" "armv7a-netbsd" "armv7l-linux" "armv7l-netbsd" "arm-none" "armv7a-darwin" ];
1919 testi686 = mseteq i686 [ "i686-linux" "i686-freebsd" "i686-genode" "i686-netbsd" "i686-openbsd" "i686-cygwin" "i686-windows" "i686-none" "i686-darwin" ];
20− testmips = mseteq mips [ "mipsel-linux" "mipsel-netbsd" ];
20+ testmips = mseteq mips [ "mips64el-linux" "mipsel-linux" "mipsel-netbsd" ];
2121 testmmix = mseteq mmix [ "mmix-mmixware" ];
22+ testriscv = mseteq riscv [ "riscv32-linux" "riscv64-linux" "riscv32-netbsd" "riscv64-netbsd" "riscv32-none" "riscv64-none" ];
23+ testriscv32 = mseteq riscv32 [ "riscv32-linux" "riscv32-netbsd" "riscv32-none" ];
24+ testriscv64 = mseteq riscv64 [ "riscv64-linux" "riscv64-netbsd" "riscv64-none" ];
2225 testx86_64 = mseteq x86_64 [ "x86_64-linux" "x86_64-darwin" "x86_64-freebsd" "x86_64-genode" "x86_64-redox" "x86_64-openbsd" "x86_64-netbsd" "x86_64-cygwin" "x86_64-solaris" "x86_64-windows" "x86_64-none" ];
2326
2427 testcygwin = mseteq cygwin [ "i686-cygwin" "x86_64-cygwin" ];
@@ -28,8 +31,8 @@ with lib.systems.doubles; lib.runTests {
2831 testredox = mseteq redox [ "x86_64-redox" ];
2932 testgnu = mseteq gnu (linux /* ++ kfreebsd ++ ... */);
3033 testillumos = mseteq illumos [ "x86_64-solaris" ];
31− testlinux = mseteq linux [ "aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux" "armv7l-linux" "i686-linux" "mipsel-linux" "riscv32-linux" "riscv64-linux" "x86_64-linux" "powerpc64-linux" "powerpc64le-linux" ];
32− testnetbsd = mseteq netbsd [ "aarch64-netbsd" "armv6l-netbsd" "armv7a-netbsd" "armv7l-netbsd" "i686-netbsd" "mipsel-netbsd" "powerpc-netbsd" "riscv32-netbsd" "riscv64-netbsd" "x86_64-netbsd" ];
34+ testlinux = mseteq linux [ "aarch64-linux" "armv5tel-linux" "armv6l-linux" "armv7a-linux" "armv7l-linux" "i686-linux" "mips64el-linux" "mipsel-linux" "riscv32-linux" "riscv64-linux" "x86_64-linux" "powerpc64-linux" "powerpc64le-linux" "m68k-linux" "s390-linux" "s390x-linux" ];
35+ testnetbsd = mseteq netbsd [ "aarch64-netbsd" "armv6l-netbsd" "armv7a-netbsd" "armv7l-netbsd" "i686-netbsd" "m68k-netbsd" "mipsel-netbsd" "powerpc-netbsd" "riscv32-netbsd" "riscv64-netbsd" "x86_64-netbsd" ];
3336 testopenbsd = mseteq openbsd [ "i686-openbsd" "x86_64-openbsd" ];
3437 testwindows = mseteq windows [ "i686-cygwin" "x86_64-cygwin" "i686-windows" "x86_64-windows" ];
3538 testunix = mseteq unix (linux ++ darwin ++ freebsd ++ openbsd ++ netbsd ++ illumos ++ cygwin ++ redox);
lib/trivial.nix+128−10
@@ -61,11 +61,11 @@ rec {
6161 pipe = val: functions:
6262 let reverseApply = x: f: f x;
6363 in builtins.foldl' reverseApply val functions;
64− /* note please don’t add a function like `compose = flip pipe`.
65− This would confuse users, because the order of the functions
66− in the list is not clear. With pipe, it’s obvious that it
67− goes first-to-last. With `compose`, not so much.
68− */
64+
65+ # note please don’t add a function like `compose = flip pipe`.
66+ # This would confuse users, because the order of the functions
67+ # in the list is not clear. With pipe, it’s obvious that it
68+ # goes first-to-last. With `compose`, not so much.
6969
7070 ## Named versions corresponding to some builtin operators.
7171
@@ -166,12 +166,36 @@ rec {
166166 /* Returns the current nixpkgs release number as string. */
167167 release = lib.strings.fileContents ../.version;
168168
169+ /* The latest release that is supported, at the time of release branch-off,
170+ if applicable.
171+
172+ Ideally, out-of-tree modules should be able to evaluate cleanly with all
173+ supported Nixpkgs versions (master, release and old release until EOL).
174+ So if possible, deprecation warnings should take effect only when all
175+ out-of-tree expressions/libs/modules can upgrade to the new way without
176+ losing support for supported Nixpkgs versions.
177+
178+ This release number allows deprecation warnings to be implemented such that
179+ they take effect as soon as the oldest release reaches end of life. */
180+ oldestSupportedRelease =
181+ # Update on master only. Do not backport.
182+ 2111;
183+
184+ /* Whether a feature is supported in all supported releases (at the time of
185+ release branch-off, if applicable). See `oldestSupportedRelease`. */
186+ isInOldestRelease =
187+ /* Release number of feature introduction as an integer, e.g. 2111 for 21.11.
188+ Set it to the upcoming release, matching the nixpkgs/.version file.
189+ */
190+ release:
191+ release <= lib.trivial.oldestSupportedRelease;
192+
169193 /* Returns the current nixpkgs release code name.
170194
171195 On each release the first letter is bumped and a new animal is chosen
172196 starting with that new letter.
173197 */
174− codeName = "Porcupine";
198+ codeName = "Quokka";
175199
176200 /* Returns the current nixpkgs version suffix as string. */
177201 versionSuffix =
@@ -303,12 +327,84 @@ rec {
303327 # TODO: figure out a clever way to integrate location information from
304328 # something like __unsafeGetAttrPos.
305329
306− warn = msg: builtins.trace "warning: ${msg}";
307− warnIf = cond: msg: if cond then warn msg else id;
330+ /*
331+ Print a warning before returning the second argument. This function behaves
332+ like `builtins.trace`, but requires a string message and formats it as a
333+ warning, including the `warning: ` prefix.
334+
335+ To get a call stack trace and abort evaluation, set the environment variable
336+ `NIX_ABORT_ON_WARN=true` and set the Nix options `--option pure-eval false --show-trace`
337+
338+ Type: string -> a -> a
339+ */
340+ warn =
341+ if lib.elem (builtins.getEnv "NIX_ABORT_ON_WARN") ["1" "true" "yes"]
342+ then msg: builtins.trace "warning: ${msg}" (abort "NIX_ABORT_ON_WARN=true; warnings are treated as unrecoverable errors.")
343+ else msg: builtins.trace "warning: ${msg}";
344+
345+ /*
346+ Like warn, but only warn when the first argument is `true`.
347+
348+ Type: bool -> string -> a -> a
349+ */
350+ warnIf = cond: msg: if cond then warn msg else x: x;
351+
352+ /*
353+ Like warnIf, but negated (warn if the first argument is `false`).
354+
355+ Type: bool -> string -> a -> a
356+ */
357+ warnIfNot = cond: msg: if cond then x: x else warn msg;
358+
359+ /*
360+ Like the `assert b; e` expression, but with a custom error message and
361+ without the semicolon.
362+
363+ If true, return the identity function, `r: r`.
364+
365+ If false, throw the error message.
366+
367+ Calls can be juxtaposed using function application, as `(r: r) a = a`, so
368+ `(r: r) (r: r) a = a`, and so forth.
369+
370+ Type: bool -> string -> a -> a
371+
372+ Example:
373+
374+ throwIfNot (lib.isList overlays) "The overlays argument to nixpkgs must be a list."
375+ lib.foldr (x: throwIfNot (lib.isFunction x) "All overlays passed to nixpkgs must be functions.") (r: r) overlays
376+ pkgs
377+
378+ */
379+ throwIfNot = cond: msg: if cond then x: x else throw msg;
380+
381+ /*
382+ Like throwIfNot, but negated (throw if the first argument is `true`).
383+
384+ Type: bool -> string -> a -> a
385+ */
386+ throwIf = cond: msg: if cond then throw msg else x: x;
387+
388+ /* Check if the elements in a list are valid values from a enum, returning the identity function, or throwing an error message otherwise.
389+
390+ Example:
391+ let colorVariants = ["bright" "dark" "black"]
392+ in checkListOfEnum "color variants" [ "standard" "light" "dark" ] colorVariants;
393+ =>
394+ error: color variants: bright, black unexpected; valid ones: standard, light, dark
395+
396+ Type: String -> List ComparableVal -> List ComparableVal -> a -> a
397+ */
398+ checkListOfEnum = msg: valid: given:
399+ let
400+ unexpected = lib.subtractLists valid given;
401+ in
402+ lib.throwIfNot (unexpected == [])
403+ "${msg}: ${builtins.concatStringsSep ", " (builtins.map builtins.toString unexpected)} unexpected; valid ones: ${builtins.concatStringsSep ", " (builtins.map builtins.toString valid)}";
308404
309405 info = msg: builtins.trace "INFO: ${msg}";
310406
311− showWarnings = warnings: res: lib.fold (w: x: warn w x) res warnings;
407+ showWarnings = warnings: res: lib.foldr (w: x: warn w x) res warnings;
312408
313409 ## Function annotations
314410
@@ -334,7 +430,10 @@ rec {
334430 has the same return type and semantics as builtins.functionArgs.
335431 setFunctionArgs : (a → b) → Map String Bool.
336432 */
337− functionArgs = f: f.__functionArgs or (builtins.functionArgs f);
433+ functionArgs = f:
434+ if f ? __functor
435+ then f.__functionArgs or (lib.functionArgs (f.__functor f))
436+ else builtins.functionArgs f;
338437
339438 /* Check whether something is a function or something
340439 annotated with function args.
@@ -342,6 +441,25 @@ rec {
342441 isFunction = f: builtins.isFunction f ||
343442 (f ? __functor && isFunction (f.__functor f));
344443
444+ /*
445+ Turns any non-callable values into constant functions.
446+ Returns callable values as is.
447+
448+ Example:
449+
450+ nix-repl> lib.toFunction 1 2
451+ 1
452+
453+ nix-repl> lib.toFunction (x: x + 1) 2
454+ 3
455+ */
456+ toFunction =
457+ # Any value
458+ v:
459+ if isFunction v
460+ then v
461+ else k: v;
462+
345463 /* Convert the given positive integer to a string of its hexadecimal
346464 representation. For example:
347465
lib/types.nix+153−52
@@ -32,7 +32,6 @@ let
3232 last
3333 length
3434 tail
35− unique
3635 ;
3736 inherit (lib.attrsets)
3837 attrNames
@@ -48,6 +47,7 @@ let
4847 mergeDefaultOption
4948 mergeEqualOption
5049 mergeOneOption
50+ mergeUniqueOption
5151 showFiles
5252 showOption
5353 ;
@@ -61,7 +61,11 @@ let
6161 boolToString
6262 ;
6363
64− inherit (lib.modules) mergeDefinitions;
64+ inherit (lib.modules)
65+ mergeDefinitions
66+ fixupOptionType
67+ mergeOptionDecls
68+ ;
6569 outer_types =
6670rec {
6771 isType = type: x: (x._type or "") == type;
@@ -162,6 +166,13 @@ rec {
162166 # nixos/doc/manual/development/option-types.xml!
163167 types = rec {
164168
169+ raw = mkOptionType rec {
170+ name = "raw";
171+ description = "raw value";
172+ check = value: true;
173+ merge = mergeOneOption;
174+ };
175+
165176 anything = mkOptionType {
166177 name = "anything";
167178 description = "anything";
@@ -192,6 +203,12 @@ rec {
192203 else (listOf anything).merge;
193204 # This is the type of packages, only accept a single definition
194205 stringCoercibleSet = mergeOneOption;
206+ lambda = loc: defs: arg: anything.merge
207+ (loc ++ [ "<function body>" ])
208+ (map (def: {
209+ file = def.file;
210+ value = def.value arg;
211+ }) defs);
195212 # Otherwise fall back to only allowing all equal definitions
196213 }.${commonType} or mergeEqualOption;
197214 in mergeFunction loc defs;
@@ -287,6 +304,26 @@ rec {
287304 merge = mergeEqualOption;
288305 };
289306
307+ nonEmptyStr = mkOptionType {
308+ name = "nonEmptyStr";
309+ description = "non-empty string";
310+ check = x: str.check x && builtins.match "[ \t\n]*" x == null;
311+ inherit (str) merge;
312+ };
313+
314+ # Allow a newline character at the end and trim it in the merge function.
315+ singleLineStr =
316+ let
317+ inherit (strMatching "[^\n\r]*\n?") check merge;
318+ in
319+ mkOptionType {
320+ name = "singleLineStr";
321+ description = "(optionally newline-terminated) single-line string";
322+ inherit check;
323+ merge = loc: defs:
324+ lib.removeSuffix "\n" (merge loc defs);
325+ };
326+
290327 strMatching = pattern: mkOptionType {
291328 name = "strMatching ${escapeNixString pattern}";
292329 description = "string matching the pattern ${pattern}";
@@ -331,13 +368,21 @@ rec {
331368 emptyValue = { value = {}; };
332369 };
333370
334− # derivation is a reserved keyword.
371+ # A package is a top-level store path (/nix/store/hash-name). This includes:
372+ # - derivations
373+ # - more generally, attribute sets with an `outPath` or `__toString` attribute
374+ # pointing to a store path, e.g. flake inputs
375+ # - strings with context, e.g. "${pkgs.foo}" or (toString pkgs.foo)
376+ # - hardcoded store path literals (/nix/store/hash-foo) or strings without context
377+ # ("/nix/store/hash-foo"). These get a context added to them using builtins.storePath.
335378 package = mkOptionType {
336379 name = "package";
337380 check = x: isDerivation x || isStorePath x;
338381 merge = loc: defs:
339382 let res = mergeOneOption loc defs;
340− in if isDerivation res then res else toDerivation res;
383+ in if builtins.isPath res || (builtins.isString res && ! builtins.hasContext res)
384+ then toDerivation res
385+ else res;
341386 };
342387
343388 shellPackage = package // {
@@ -364,7 +409,7 @@ rec {
364409 ).optionalValue
365410 ) def.value
366411 ) defs)));
367− emptyValue = { value = {}; };
412+ emptyValue = { value = []; };
368413 getSubOptions = prefix: elemType.getSubOptions (prefix ++ ["*"]);
369414 getSubModules = elemType.getSubModules;
370415 substSubModules = m: listOf (elemType.substSubModules m);
@@ -376,7 +421,7 @@ rec {
376421 let list = addCheck (types.listOf elemType) (l: l != []);
377422 in list // {
378423 description = "non-empty " + list.description;
379− # Note: emptyValue is left as is, because another module may define an element.
424+ emptyValue = { }; # no .value attr, meaning unset
380425 };
381426
382427 attrsOf = elemType: mkOptionType rec {
@@ -444,6 +489,18 @@ rec {
444489 nestedTypes.elemType = elemType;
445490 };
446491
492+ unique = { message }: type: mkOptionType rec {
493+ name = "unique";
494+ inherit (type) description check;
495+ merge = mergeUniqueOption { inherit message; };
496+ emptyValue = type.emptyValue;
497+ getSubOptions = type.getSubOptions;
498+ getSubModules = type.getSubModules;
499+ substSubModules = m: uniq (type.substSubModules m);
500+ functor = (defaultFunctor name) // { wrapped = type; };
501+ nestedTypes.elemType = type;
502+ };
503+
447504 # Null or value of ...
448505 nullOr = elemType: mkOptionType rec {
449506 name = "nullOr";
@@ -465,7 +522,7 @@ rec {
465522
466523 functionTo = elemType: mkOptionType {
467524 name = "functionTo";
468− description = "function that evaluates to a(n) ${elemType.name}";
525+ description = "function that evaluates to a(n) ${elemType.description}";
469526 check = isFunction;
470527 merge = loc: defs:
471528 fnArgs: (mergeDefinitions (loc ++ [ "[function body]" ]) elemType (map (fn: { inherit (fn) file; value = fn.value fnArgs; }) defs)).mergedValue;
@@ -480,29 +537,84 @@ rec {
480537 modules = toList modules;
481538 };
482539
540+ # The type of a type!
541+ optionType = mkOptionType {
542+ name = "optionType";
543+ description = "optionType";
544+ check = value: value._type or null == "option-type";
545+ merge = loc: defs:
546+ if length defs == 1
547+ then (head defs).value
548+ else let
549+ # Prepares the type definitions for mergeOptionDecls, which
550+ # annotates submodules types with file locations
551+ optionModules = map ({ value, file }:
552+ {
553+ _file = file;
554+ # There's no way to merge types directly from the module system,
555+ # but we can cheat a bit by just declaring an option with the type
556+ options = lib.mkOption {
557+ type = value;
558+ };
559+ }
560+ ) defs;
561+ # Merges all the types into a single one, including submodule merging.
562+ # This also propagates file information to all submodules
563+ mergedOption = fixupOptionType loc (mergeOptionDecls loc optionModules);
564+ in mergedOption.type;
565+ };
566+
483567 submoduleWith =
484568 { modules
485569 , specialArgs ? {}
486570 , shorthandOnlyDefinesConfig ? false
571+
572+ # Internal variable to avoid `_key` collisions regardless
573+ # of `extendModules`. Wired through by `evalModules`.
574+ # Test case: lib/tests/modules, "168767"
575+ , extensionOffset ? 0
487576 }@attrs:
488577 let
489578 inherit (lib.modules) evalModules;
490579
491− coerce = unify: value: if isFunction value
492− then setFunctionArgs (args: unify (value args)) (functionArgs value)
493− else unify (if shorthandOnlyDefinesConfig then { config = value; } else value);
494−
495− allModules = defs: modules ++ imap1 (n: { value, file }:
496− if isAttrs value || isFunction value then
497− # Annotate the value with the location of its definition for better error messages
498− coerce (lib.modules.unifyModuleSyntax file "${toString file}-${toString n}") value
580+ shorthandToModule = if shorthandOnlyDefinesConfig == false
581+ then value: value
582+ else value: { config = value; };
583+
584+ allModules = defs: imap1 (n: { value, file }:
585+ if isFunction value
586+ then setFunctionArgs
587+ (args: lib.modules.unifyModuleSyntax file "${toString file}-${toString (n + extensionOffset)}" (value args))
588+ (functionArgs value)
589+ else if isAttrs value
590+ then
591+ lib.modules.unifyModuleSyntax file "${toString file}-${toString (n + extensionOffset)}" (shorthandToModule value)
499592 else value
500593 ) defs;
501594
502− freeformType = (evalModules {
503− inherit modules specialArgs;
504− args.name = "‹name›";
505− })._module.freeformType;
595+ base = evalModules {
596+ inherit specialArgs;
597+ modules = [{
598+ # This is a work-around for the fact that some sub-modules,
599+ # such as the one included in an attribute set, expects an "args"
600+ # attribute to be given to the sub-module. As the option
601+ # evaluation does not have any specific attribute name yet, we
602+ # provide a default for the documentation and the freeform type.
603+ #
604+ # This is necessary as some option declaration might use the
605+ # "name" attribute given as argument of the submodule and use it
606+ # as the default of option declarations.
607+ #
608+ # We use lookalike unicode single angle quotation marks because
609+ # of the docbook transformation the options receive. In all uses
610+ # &gt; and &lt; wouldn't be encoded correctly so the encoded values
611+ # would be used, and use of `<` and `>` would break the XML document.
612+ # It shouldn't cause an issue since this is cosmetic for the manual.
613+ _module.args.name = lib.mkOptionDefault "‹name›";
614+ }] ++ modules;
615+ };
616+
617+ freeformType = base._module.freeformType;
506618
507619 in
508620 mkOptionType rec {
@@ -510,32 +622,14 @@ rec {
510622 description = freeformType.description or name;
511623 check = x: isAttrs x || isFunction x || path.check x;
512624 merge = loc: defs:
513− (evalModules {
514− modules = allModules defs;
515− inherit specialArgs;
516− args.name = last loc;
625+ (base.extendModules {
626+ modules = [ { _module.args.name = last loc; } ] ++ allModules defs;
517627 prefix = loc;
628+ extensionOffset = extensionOffset + length defs;
518629 }).config;
519630 emptyValue = { value = {}; };
520− getSubOptions = prefix: (evalModules
521− { inherit modules prefix specialArgs;
522− # This is a work-around due to the fact that some sub-modules,
523− # such as the one included in an attribute set, expects a "args"
524− # attribute to be given to the sub-module. As the option
525− # evaluation does not have any specific attribute name, we
526− # provide a default one for the documentation.
527− #
528− # This is mandatory as some option declaration might use the
529− # "name" attribute given as argument of the submodule and use it
530− # as the default of option declarations.
531− #
532− # Using lookalike unicode single angle quotation marks because
533− # of the docbook transformation the options receive. In all uses
534− # &gt; and &lt; wouldn't be encoded correctly so the encoded values
535− # would be used, and use of `<` and `>` would break the XML document.
536− # It shouldn't cause an issue since this is cosmetic for the manual.
537− args.name = "‹name›";
538− }).options // optionalAttrs (freeformType != null) {
631+ getSubOptions = prefix: (base.extendModules
632+ { inherit prefix; }).options // optionalAttrs (freeformType != null) {
539633 # Expose the sub options of the freeform type. Note that the option
540634 # discovery doesn't care about the attribute name used here, so this
541635 # is just to avoid conflicts with potential options from the submodule
@@ -563,7 +657,11 @@ rec {
563657 then lhs.specialArgs // rhs.specialArgs
564658 else throw "A submoduleWith option is declared multiple times with the same specialArgs \"${toString (attrNames intersecting)}\"";
565659 shorthandOnlyDefinesConfig =
566− if lhs.shorthandOnlyDefinesConfig == rhs.shorthandOnlyDefinesConfig
660+ if lhs.shorthandOnlyDefinesConfig == null
661+ then rhs.shorthandOnlyDefinesConfig
662+ else if rhs.shorthandOnlyDefinesConfig == null
663+ then lhs.shorthandOnlyDefinesConfig
664+ else if lhs.shorthandOnlyDefinesConfig == rhs.shorthandOnlyDefinesConfig
567665 then lhs.shorthandOnlyDefinesConfig
568666 else throw "A submoduleWith option is declared multiple times with conflicting shorthandOnlyDefinesConfig values";
569667 };
@@ -573,6 +671,7 @@ rec {
573671 # A value from a set of allowed ones.
574672 enum = values:
575673 let
674+ inherit (lib.lists) unique;
576675 show = v:
577676 if builtins.isString v then ''"${v}"''
578677 else if builtins.isInt v then builtins.toString v
@@ -581,7 +680,17 @@ rec {
581680 in
582681 mkOptionType rec {
583682 name = "enum";
584− description = "one of ${concatMapStringsSep ", " show values}";
683+ description =
684+ # Length 0 or 1 enums may occur in a design pattern with type merging
685+ # where an "interface" module declares an empty enum and other modules
686+ # provide implementations, each extending the enum with their own
687+ # identifier.
688+ if values == [] then
689+ "impossible (empty enum)"
690+ else if builtins.length values == 1 then
691+ "value ${show (builtins.head values)} (singular enum)"
692+ else
693+ "one of ${concatMapStringsSep ", " show values}";
585694 check = flip elem values;
586695 merge = mergeEqualOption;
587696 functor = (defaultFunctor name) // { payload = values; binOp = a: b: unique (a ++ b); };
@@ -646,14 +755,6 @@ rec {
646755 nestedTypes.finalType = finalType;
647756 };
648757
649− # Obsolete alternative to configOf. It takes its option
650− # declarations from the ‘options’ attribute of containing option
651− # declaration.
652− optionSet = mkOptionType {
653− name = "optionSet";
654− description = "option set";
655− deprecationMessage = "Use `types.submodule' instead";
656− };
657758 # Augment the given type with an additional type check function.
658759 addCheck = elemType: check: elemType // { check = x: elemType.check x && check x; };
659760
maintainers/maintainer-list.nix+2981−212
@@ -6,6 +6,7 @@
66 email = "address@example.org";
77
88 # Optional
9+ matrix = "@user:example.org";
910 github = "GithubUsername";
1011 githubId = your-github-id;
1112 keys = [{
@@ -19,7 +20,8 @@
1920
2021 - `handle` is the handle you are going to use in nixpkgs expressions,
2122 - `name` is your, preferably real, name,
22− - `email` is your maintainer email address, and
23+ - `email` is your maintainer email address,
24+ - `matrix` is your Matrix user ID,
2325 - `github` is your GitHub handle (as it appears in the URL of your profile page, `https://github.com/<userhandle>`),
2426 - `githubId` is your GitHub user ID, which can be found at `https://api.github.com/users/<userhandle>`,
2527 - `keys` is a list of your PGP/GPG key IDs and fingerprints.
@@ -56,6 +58,7 @@
5658 };
5759 _0x4A6F = {
5860 email = "mail-maintainer@0x4A6F.dev";
61+ matrix = "@0x4a6f:matrix.org";
5962 name = "Joachim Ernst";
6063 github = "0x4A6F";
6164 githubId = 9675338;
@@ -80,12 +83,24 @@
8083 githubId = 791309;
8184 name = "Jan Hrnko";
8285 };
86+ _1000teslas = {
87+ name = "Kevin Tran";
88+ email = "47207223+1000teslas@users.noreply.github.com";
89+ github = "1000teslas";
90+ githubId = 47207223;
91+ };
8392 _3699n = {
8493 email = "nicholas@nvk.pm";
8594 github = "3699n";
8695 githubId = 7414843;
8796 name = "Nicholas von Klitzing";
8897 };
98+ _13r0ck = {
99+ name = "Brock Szuszczewicz";
100+ email = "bnr@tuta.io";
101+ github = "13r0ck";
102+ githubId = 58987761;
103+ };
89104 _3noch = {
90105 email = "eacameron@gmail.com";
91106 github = "3noch";
@@ -110,18 +125,32 @@
110125 githubId = 241628;
111126 name = "Adam Russell";
112127 };
128+ aadibajpai = {
129+ email = "hello@aadibajpai.com";
130+ github = "aadibajpai";
131+ githubId = 27063113;
132+ name = "Aadi Bajpai";
133+ };
113134 aanderse = {
114135 email = "aaron@fosslib.net";
136+ matrix = "@aanderse:nixos.dev";
115137 github = "aanderse";
116138 githubId = 7755101;
117139 name = "Aaron Andersen";
118140 };
119141 aaronjanse = {
120142 email = "aaron@ajanse.me";
143+ matrix = "@aaronjanse:matrix.org";
121144 github = "aaronjanse";
122145 githubId = 16829510;
123146 name = "Aaron Janse";
124147 };
148+ aaronjheng = {
149+ email = "wentworth@outlook.com";
150+ github = "aaronjheng";
151+ githubId = 806876;
152+ name = "Aaron Jheng";
153+ };
125154 aaronschif = {
126155 email = "aaronschif@gmail.com";
127156 github = "aaronschif";
@@ -148,6 +177,7 @@
148177 };
149178 abbe = {
150179 email = "ashish.is@lostca.se";
180+ matrix = "@abbe:badti.me";
151181 github = "wahjava";
152182 githubId = 2255192;
153183 name = "Ashish SHUKLA";
@@ -236,12 +266,14 @@
236266 };
237267 addict3d = {
238268 email = "nickbathum@gmail.com";
269+ matrix = "@nbathum:matrix.org";
239270 github = "addict3d";
240271 githubId = 49227;
241272 name = "Nick Bathum";
242273 };
243274 adisbladis = {
244275 email = "adisbladis@gmail.com";
276+ matrix = "@adis:blad.is";
245277 github = "adisbladis";
246278 githubId = 63286;
247279 name = "Adam Hose";
@@ -264,6 +296,12 @@
264296 githubId = 1250775;
265297 name = "Adolfo E. García Castro";
266298 };
299+ AdsonCicilioti = {
300+ name = "Adson Cicilioti";
301+ email = "adson.cicilioti@live.com";
302+ github = "AdsonCicilioti";
303+ githubId = 6278398;
304+ };
267305 adsr = {
268306 email = "as@php.net";
269307 github = "adsr";
@@ -318,6 +356,12 @@
318356 githubId = 4296804;
319357 name = "Alex Franchuk";
320358 };
359+ agbrooks = {
360+ email = "andrewgrantbrooks@gmail.com";
361+ github = "agbrooks";
362+ githubId = 19290901;
363+ name = "Andrew Brooks";
364+ };
321365 aherrmann = {
322366 email = "andreash87@gmx.ch";
323367 github = "aherrmann";
@@ -331,10 +375,16 @@
331375 name = "AmirHossein Roozbahani";
332376 };
333377 ahuzik = {
334− email = "ales.guzik@gmail.com";
335− github = "alesguzik";
378+ email = "ah1990au@gmail.com";
379+ github = "alesya-h";
336380 githubId = 209175;
337− name = "Ales Huzik";
381+ name = "Alesya Huzik";
382+ };
383+ aidalgol = {
384+ email = "aidalgol+nixpkgs@fastmail.net";
385+ github = "aidalgol";
386+ githubId = 2313201;
387+ name = "Aidan Gauland";
338388 };
339389 aij = {
340390 email = "aij+git@mrph.org";
@@ -342,8 +392,15 @@
342392 githubId = 4732885;
343393 name = "Ivan Jager";
344394 };
395+ airwoodix = {
396+ email = "airwoodix@posteo.me";
397+ github = "airwoodix";
398+ githubId = 44871469;
399+ name = "Etienne Wodey";
400+ };
345401 ajs124 = {
346402 email = "nix@ajs124.de";
403+ matrix = "@andreas.schraegle:helsinki-systems.de";
347404 github = "ajs124";
348405 githubId = 1229027;
349406 name = "Andreas Schrägle";
@@ -384,6 +441,12 @@
384441 githubId = 1318982;
385442 name = "Anders Claesson";
386443 };
444+ akho = {
445+ name = "Alexander Khodyrev";
446+ email = "a@akho.name";
447+ github = "akho";
448+ githubId = 104951;
449+ };
387450 akru = {
388451 email = "mail@akru.me";
389452 github = "akru";
@@ -408,6 +471,12 @@
408471 githubId = 173595;
409472 name = "Caleb Maclennan";
410473 };
474+ ALEX11BR = {
475+ email = "alexioanpopa11@gmail.com";
476+ github = "ALEX11BR";
477+ githubId = 49609151;
478+ name = "Popa Ioan Alexandru";
479+ };
411480 alexarice = {
412481 email = "alexrice999@hotmail.co.uk";
413482 github = "alexarice";
@@ -438,6 +507,12 @@
438507 githubId = 2335822;
439508 name = "Alexandre Esteves";
440509 };
510+ alexnortung = {
511+ name = "alexnortung";
512+ email = "alex_nortung@live.dk";
513+ github = "alexnortung";
514+ githubId = 1552267;
515+ };
441516 alexvorobiev = {
442517 email = "alexander.vorobiev@gmail.com";
443518 github = "alexvorobiev";
@@ -450,9 +525,11 @@
450525 githubId = 38869148;
451526 name = "Alex Eyre";
452527 };
453− algorith = {
454− email = "dries_van_daele@telenet.be";
455− name = "Dries Van Daele";
528+ algram = {
529+ email = "aliasgram@gmail.com";
530+ github = "Algram";
531+ githubId = 5053729;
532+ name = "Alias Gram";
456533 };
457534 alibabzo = {
458535 email = "alistair.bill@gmail.com";
@@ -514,6 +591,16 @@
514591 fingerprint = "B422 CFB1 C9EF 73F7 E1E2 698D F53E 3233 42F7 A6D3A";
515592 }];
516593 };
594+ alyaeanyx = {
595+ email = "alexandra.hollmeier@mailbox.org";
596+ github = "alyaeanyx";
597+ githubId = 74795488;
598+ name = "Alexandra Hollmeier";
599+ keys = [{
600+ longkeyid = "rsa3072/0x87D1AADCD25B8DEE";
601+ fingerprint = "1F73 8879 5E5A 3DFC E2B3 FA32 87D1 AADC D25B 8DEE";
602+ }];
603+ };
517604 amanjeev = {
518605 email = "aj@amanjeev.com";
519606 github = "amanjeev";
@@ -526,6 +613,12 @@
526613 githubId = 15623522;
527614 name = "Amar Paul";
528615 };
616+ amarshall = {
617+ email = "andrew@johnandrewmarshall.com";
618+ github = "amarshall";
619+ githubId = 153175;
620+ name = "Andrew Marshall";
621+ };
529622 ambroisie = {
530623 email = "bruno.nixpkgs@belanyi.fr";
531624 github = "ambroisie";
@@ -538,6 +631,22 @@
538631 githubId = 2626481;
539632 name = "Ambroz Bizjak";
540633 };
634+ ametrine = {
635+ name = "Matilde Ametrine";
636+ email = "matilde@diffyq.xyz";
637+ github = "matilde-ametrine";
638+ githubId = 90799677;
639+ keys = [{
640+ longkeyid = "rsa3072/0x07EE1FFCA58A11C5";
641+ fingerprint = "7931 EB4E 4712 D7BE 04F8 6D34 07EE 1FFC A58A 11C5";
642+ }];
643+ };
644+ amfl = {
645+ email = "amfl@none.none";
646+ github = "amfl";
647+ githubId = 382798;
648+ name = "amfl";
649+ };
541650 amiddelk = {
542651 email = "amiddelk@gmail.com";
543652 github = "amiddelk";
@@ -572,6 +681,18 @@
572681 githubId = 858965;
573682 name = "Andrew Morsillo";
574683 };
684+ an-empty-string = {
685+ name = "Tris Emmy Wilson";
686+ email = "tris@tris.fyi";
687+ github = "an-empty-string";
688+ githubId = 681716;
689+ };
690+ AnatolyPopov = {
691+ email = "aipopov@live.ru";
692+ github = "AnatolyPopov";
693+ githubId = 2312534;
694+ name = "Anatolii Popov";
695+ };
575696 andehen = {
576697 email = "git@andehen.net";
577698 github = "andehen";
@@ -684,6 +805,18 @@
684805 fingerprint = "AA4B 8EC3 F971 D350 482E 4E20 0299 AFF9 ECBB 5169";
685806 }];
686807 };
808+ anhduy = {
809+ email = "vo@anhduy.io";
810+ github = "voanhduy1512";
811+ githubId = 1771266;
812+ name = "Vo Anh Duy";
813+ };
814+ anirrudh = {
815+ email = "anik597@gmail.com";
816+ github = "anirrudh";
817+ githubId = 6091755;
818+ name = "Anirrudh Krishnan";
819+ };
687820 ankhers = {
688821 email = "me@ankhers.dev";
689822 github = "ankhers";
@@ -708,6 +841,13 @@
708841 githubId = 5327697;
709842 name = "Anatolii Prylutskyi";
710843 };
844+ anselmschueler = {
845+ email = "mail@anselmschueler.com";
846+ github = "schuelermine";
847+ githubId = 48802534;
848+ name = "Anselm Schüler";
849+ matrix = "@schuelermine:matrix.org";
850+ };
711851 antoinerg = {
712852 email = "roygobeil.antoine@gmail.com";
713853 github = "antoinerg";
@@ -758,7 +898,7 @@
758898 keys = [{
759899 longkeyid = "rsa4096/0xAAA50652F0479205";
760900 fingerprint = "BF8B F725 DA30 E53E 7F11 4ED8 AAA5 0652 F047 9205";
761− }];
901+ }];
762902 };
763903 ar1a = {
764904 email = "aria@ar1as.space";
@@ -784,12 +924,24 @@
784924 githubId = 13426784;
785925 name = "arcnmx";
786926 };
927+ arcticlimer = {
928+ email = "vinigm.nho@gmail.com";
929+ github = "arcticlimer";
930+ githubId = 59743220;
931+ name = "Vinícius Müller";
932+ };
787933 ardumont = {
788934 email = "eniotna.t@gmail.com";
789935 github = "ardumont";
790936 githubId = 718812;
791937 name = "Antoine R. Dumont";
792938 };
939+ arezvov = {
940+ email = "alex@rezvov.ru";
941+ github = "arezvov";
942+ githubId = 58516559;
943+ name = "Alexander Rezvov";
944+ };
793945 arianvp = {
794946 email = "arian.vanputten@gmail.com";
795947 github = "arianvp";
@@ -808,6 +960,18 @@
808960 githubId = 1296771;
809961 name = "Anders Riutta";
810962 };
963+ arjan-s = {
964+ email = "github@anymore.nl";
965+ github = "arjan-s";
966+ githubId = 10400299;
967+ name = "Arjan Schrijver";
968+ };
969+ arkivm = {
970+ email = "vikram186@gmail.com";
971+ github = "arkivm";
972+ githubId = 1118815;
973+ name = "Vikram Narayanan";
974+ };
811975 armijnhemel = {
812976 email = "armijn@tjaldur.nl";
813977 github = "armijnhemel";
@@ -826,6 +990,12 @@
826990 githubId = 59696216;
827991 name = "Arnold Farkas";
828992 };
993+ arnoutkroeze = {
994+ email = "nixpkgs@arnoutkroeze.nl";
995+ github = "arnoutkroeze";
996+ githubId = 37151054;
997+ name = "Arnout Kroeze";
998+ };
829999 arobyn = {
8301000 email = "shados@shados.net";
8311001 github = "shados";
@@ -868,6 +1038,7 @@
8681038 };
8691039 asbachb = {
8701040 email = "asbachb-nixpkgs-5c2a@impl.it";
1041+ matrix = "@asbachb:matrix.org";
8711042 github = "asbachb";
8721043 githubId = 1482768;
8731044 name = "Benjamin Asbach";
@@ -896,6 +1067,12 @@
8961067 githubId = 869771;
8971068 name = "Kirill Boltaev";
8981069 };
1070+ ashley = {
1071+ email = "ashley@kira64.xyz";
1072+ github = "kira64xyz";
1073+ githubId = 84152630;
1074+ name = "Ashley Chiara";
1075+ };
8991076 asppsa = {
9001077 email = "asppsa@gmail.com";
9011078 github = "asppsa";
@@ -942,6 +1119,12 @@
9421119 githubId = 55833;
9431120 name = "Troels Henriksen";
9441121 };
1122+ atila = {
1123+ name = "Átila Saraiva";
1124+ email = "atilasaraiva@gmail.com";
1125+ github = "AtilaSaraiva";
1126+ githubId = 29521461;
1127+ };
9451128 atkinschang = {
9461129 email = "atkinschang+nixpkgs@gmail.com";
9471130 github = "AtkinsChang";
@@ -972,6 +1155,12 @@
9721155 githubId = 354741;
9731156 name = "Austin Butler";
9741157 };
1158+ autophagy = {
1159+ email = "mail@autophagy.io";
1160+ github = "autophagy";
1161+ githubId = 12958979;
1162+ name = "Mika Naylor";
1163+ };
9751164 avaq = {
9761165 email = "nixpkgs@account.avaq.it";
9771166 github = "avaq";
@@ -1024,12 +1213,42 @@
10241213 githubId = 135230;
10251214 name = "Aycan iRiCAN";
10261215 };
1216+ arjix = {
1217+ email = "arjix@protonmail.com";
1218+ github = "arjix";
1219+ githubId = 62168569;
1220+ name = "arjix";
1221+ };
10271222 artturin = {
10281223 email = "artturin@artturin.com";
1224+ matrix = "@artturin:matrix.org";
10291225 github = "artturin";
10301226 githubId = 56650223;
10311227 name = "Artturi N";
10321228 };
1229+ azahi = {
1230+ name = "Azat Bahawi";
1231+ email = "azat@bahawi.net";
1232+ matrix = "@azahi:azahi.cc";
1233+ github = "azahi";
1234+ githubId = 22211000;
1235+ keys = [{
1236+ longkeyid = "rsa4096/0xC8C6BDDB3847F72B";
1237+ fingerprint = "2688 0377 C31D 9E81 9BDF 83A8 C8C6 BDDB 3847 F72B";
1238+ }];
1239+ };
1240+ ayazhafiz = {
1241+ email = "ayaz.hafiz.1@gmail.com";
1242+ github = "ayazhafiz";
1243+ githubId = 262763;
1244+ name = "Ayaz Hafiz";
1245+ };
1246+ azuwis = {
1247+ email = "azuwis@gmail.com";
1248+ github = "azuwis";
1249+ githubId = 9315;
1250+ name = "Zhong Jianxin";
1251+ };
10331252 b4dm4n = {
10341253 email = "fabianm88@gmail.com";
10351254 github = "B4dM4n";
@@ -1044,7 +1263,11 @@
10441263 email = "babathriviere@gmail.com";
10451264 github = "babariviere";
10461265 githubId = 12128029;
1047− name = "babariviere";
1266+ name = "Bastien Rivière";
1267+ keys = [{
1268+ longkeyid = "rsa4096/0xF202AD3B6EDF4BD1";
1269+ fingerprint = "2F85 B362 B274 0012 37E2 81EE F202 AD3B 6EDF 4BD1";
1270+ }];
10481271 };
10491272 babbaj = {
10501273 name = "babbaj";
@@ -1058,6 +1281,7 @@
10581281 };
10591282 bachp = {
10601283 email = "pascal.bach@nextrem.ch";
1284+ matrix = "@bachp:matrix.org";
10611285 github = "bachp";
10621286 githubId = 333807;
10631287 name = "Pascal Bach";
@@ -1078,6 +1302,12 @@
10781302 email = "sivaraman.balaji@gmail.com";
10791303 name = "Balaji Sivaraman";
10801304 };
1305+ balodja = {
1306+ email = "balodja@gmail.com";
1307+ github = "balodja";
1308+ githubId = 294444;
1309+ name = "Vladimir Korolev";
1310+ };
10811311 baloo = {
10821312 email = "nixpkgs@superbaloo.net";
10831313 github = "baloo";
@@ -1102,12 +1332,24 @@
11021332 githubId = 127523;
11031333 name = "Herman Fries";
11041334 };
1335+ BarinovMaxim = {
1336+ name = "Barinov Maxim";
1337+ email = "barinov274@gmail.com";
1338+ github = "barinov274";
1339+ githubId = 54442153;
1340+ };
11051341 barrucadu = {
11061342 email = "mike@barrucadu.co.uk";
11071343 github = "barrucadu";
11081344 githubId = 75235;
11091345 name = "Michael Walker";
11101346 };
1347+ bartsch = {
1348+ email = "consume.noise@gmail.com";
1349+ github = "bartsch";
1350+ githubId = 3390885;
1351+ name = "Daniel Martin";
1352+ };
11111353 bartuka = {
11121354 email = "wand@hey.com";
11131355 github = "wandersoncferreira";
@@ -1132,6 +1374,7 @@
11321374 };
11331375 bb010g = {
11341376 email = "me@bb010g.com";
1377+ matrix = "@bb010g:matrix.org";
11351378 github = "bb010g";
11361379 githubId = 340132;
11371380 name = "Brayden Banks";
@@ -1166,6 +1409,12 @@
11661409 githubId = 164148;
11671410 name = "Ben Darwin";
11681411 };
1412+ bdd = {
1413+ email = "bdd@mindcast.org";
1414+ github = "bdd";
1415+ githubId = 11135;
1416+ name = "Berk D. Demir";
1417+ };
11691418 bdesham = {
11701419 email = "benjamin@esham.io";
11711420 github = "bdesham";
@@ -1184,8 +1433,15 @@
11841433 github = "beardhatcode";
11851434 githubId = 662538;
11861435 };
1436+ beezow = {
1437+ name = "beezow";
1438+ email = "zbeezow@gmail.com";
1439+ github = "beezow";
1440+ githubId = 42082156;
1441+ };
11871442 bendlas = {
11881443 email = "herwig@bendlas.net";
1444+ matrix = "@bendlas:matrix.org";
11891445 github = "bendlas";
11901446 githubId = 214787;
11911447 name = "Herwig Hochleitner";
@@ -1202,6 +1458,16 @@
12021458 github = "benneti";
12031459 githubId = 11725645;
12041460 };
1461+ bertof = {
1462+ name = "Filippo Berto";
1463+ email = "berto.f@protonmail.com";
1464+ github = "bertof";
1465+ githubId = 9915675;
1466+ keys = [{
1467+ longkeyid = "rsa4096/0xFE98AE5EC52B1056";
1468+ fingerprint = "17C5 1EF9 C0FE 2EB2 FE56 BB53 FE98 AE5E C52B 1056";
1469+ }];
1470+ };
12051471 bennofs = {
12061472 email = "benno.fuenfstueck@gmail.com";
12071473 github = "bennofs";
@@ -1222,6 +1488,7 @@
12221488 };
12231489 berberman = {
12241490 email = "berberman@yandex.com";
1491+ matrix = "@berberman:mozilla.org";
12251492 github = "berberman";
12261493 githubId = 26041945;
12271494 name = "Potato Hatsue";
@@ -1244,12 +1511,24 @@
12441511 githubId = 251106;
12451512 name = "Daniel Bergey";
12461513 };
1514+ bergkvist = {
1515+ email = "tobias@bergkv.ist";
1516+ github = "bergkvist";
1517+ githubId = 410028;
1518+ name = "Tobias Bergkvist";
1519+ };
12471520 betaboon = {
12481521 email = "betaboon@0x80.ninja";
12491522 github = "betaboon";
12501523 githubId = 7346933;
12511524 name = "betaboon";
12521525 };
1526+ bew = {
1527+ email = "benoit.dechezelles@gmail.com";
1528+ github = "bew";
1529+ githubId = 9730330;
1530+ name = "Benoit de Chezelles";
1531+ };
12531532 bfortz = {
12541533 email = "bernard.fortz@gmail.com";
12551534 github = "bfortz";
@@ -1280,6 +1559,12 @@
12801559 githubId = 28444296;
12811560 name = "Benjamin Hougland";
12821561 };
1562+ billewanick = {
1563+ email = "bill@ewanick.com";
1564+ github = "billewanick";
1565+ githubId = 13324165;
1566+ name = "Bill Ewanick";
1567+ };
12831568 binarin = {
12841569 email = "binarin@binarin.ru";
12851570 github = "binarin";
@@ -1316,6 +1601,7 @@
13161601 };
13171602 blitz = {
13181603 email = "js@alien8.de";
1604+ matrix = "@js:ukvly.org";
13191605 github = "blitz";
13201606 githubId = 37907;
13211607 name = "Julian Stecklina";
@@ -1350,6 +1636,13 @@
13501636 githubId = 10221570;
13511637 name = "Bo Bakker";
13521638 };
1639+ bobby285271 = {
1640+ name = "Bobby Rong";
1641+ email = "rjl931189261@126.com";
1642+ matrix = "@bobby285271:matrix.org";
1643+ github = "bobby285271";
1644+ githubId = 20080233;
1645+ };
13531646 bobvanderlinden = {
13541647 email = "bobvanderlinden@gmail.com";
13551648 github = "bobvanderlinden";
@@ -1380,6 +1673,16 @@
13801673 githubId = 87764;
13811674 name = "Ben Ford";
13821675 };
1676+ boppyt = {
1677+ email = "boppy@nwcpz.com";
1678+ github = "boppyt";
1679+ githubId = 71049646;
1680+ name = "Zack A";
1681+ keys = [{
1682+ longkeyid = "rsa4096/0x6310C97DE31D1545";
1683+ fingerprint = "E8D7 5C19 9F65 269B 439D F77B 6310 C97D E31D 1545";
1684+ }];
1685+ };
13831686 borisbabic = {
13841687 email = "boris.ivan.babic@gmail.com";
13851688 github = "borisbabic";
@@ -1434,11 +1737,11 @@
14341737 githubId = 355401;
14351738 name = "Brian Hicks";
14361739 };
1437− bricewge = {
1438− email = "bricewge@gmail.com";
1439− github = "bricewge";
1440− githubId = 5525646;
1441− name = "Brice Waegeneire";
1740+ brianmcgee = {
1741+ name = "Brian McGee";
1742+ email = "brian@41north.dev";
1743+ github = "brianmcgee";
1744+ githubId = 1173648;
14421745 };
14431746 Br1ght0ne = {
14441747 email = "brightone@protonmail.com";
@@ -1468,6 +1771,12 @@
14681771 githubId = 1111035;
14691772 name = "Break Yang";
14701773 };
1774+ brecht = {
1775+ email = "brecht.savelkoul@alumni.lse.ac.uk";
1776+ github = "brechtcs";
1777+ githubId = 6107054;
1778+ name = "Brecht Savelkoul";
1779+ };
14711780 brettlyons = {
14721781 email = "blyons@fastmail.com";
14731782 github = "brettlyons";
@@ -1484,8 +1793,15 @@
14841793 fingerprint = "BF4FCB85C69989B4ED95BF938AE74787A4B7C07E";
14851794 }];
14861795 };
1796+ broke = {
1797+ email = "broke@in-fucking.space";
1798+ github = "broke";
1799+ githubId = 1071610;
1800+ name = "Gunnar Nitsche";
1801+ };
14871802 bryanasdev000 = {
14881803 email = "bryanasdev000@gmail.com";
1804+ matrix = "@bryanasdev000:matrix.org";
14891805 github = "bryanasdev000";
14901806 githubId = 53131727;
14911807 name = "Bryan Albuquerque";
@@ -1498,6 +1814,7 @@
14981814 };
14991815 buckley310 = {
15001816 email = "sean.bck@gmail.com";
1817+ matrix = "@buckley310:matrix.org";
15011818 github = "buckley310";
15021819 githubId = 2379774;
15031820 name = "Sean Buckley";
@@ -1514,6 +1831,12 @@
15141831 githubId = 7214361;
15151832 name = "Roman Gerasimenko";
15161833 };
1834+ builditluc = {
1835+ email = "builditluc@icloud.com";
1836+ github = "builditluc";
1837+ githubId = 37375448;
1838+ name = "Buildit";
1839+ };
15171840 bburdette = {
15181841 email = "bburdette@protonmail.com";
15191842 github = "bburdette";
@@ -1591,6 +1914,12 @@
15911914 githubId = 7435854;
15921915 name = "Victor Calvert";
15931916 };
1917+ cameronnemo = {
1918+ email = "cnemo@tutanota.com";
1919+ github = "cameronnemo";
1920+ githubId = 3212452;
1921+ name = "Cameron Nemo";
1922+ };
15941923 campadrenalin = {
15951924 email = "campadrenalin@gmail.com";
15961925 github = "campadrenalin";
@@ -1627,6 +1956,12 @@
16271956 githubId = 82591;
16281957 name = "Carl Sverre";
16291958 };
1959+ carpinchomug = {
1960+ email = "aki.suda@protonmail.com";
1961+ github = "carpinchomug";
1962+ githubId = 101536256;
1963+ name = "Akiyoshi Suda";
1964+ };
16301965 cartr = {
16311966 email = "carter.sande@duodecima.technology";
16321967 github = "cartr";
@@ -1651,14 +1986,32 @@
16511986 githubId = 495429;
16521987 name = "Claas Augner";
16531988 };
1989+ cawilliamson = {
1990+ email = "home@chrisaw.com";
1991+ github = "cawilliamson";
1992+ githubId = 1141769;
1993+ matrix = "@cawilliamson:nixos.dev";
1994+ name = "Christopher A. Williamson";
1995+ };
16541996 cbley = {
16551997 email = "claudio.bley@gmail.com";
16561998 github = "avdv";
16571999 githubId = 3471749;
16582000 name = "Claudio Bley";
16592001 };
2002+ cburstedde = {
2003+ email = "burstedde@ins.uni-bonn.de";
2004+ github = "cburstedde";
2005+ githubId = 109908;
2006+ name = "Carsten Burstedde";
2007+ keys = [{
2008+ longkeyid = "rsa2048/0x0704CD9E550A6BCD";
2009+ fingerprint = "1127 A432 6524 BF02 737B 544E 0704 CD9E 550A 6BCD";
2010+ }];
2011+ };
16602012 cdepillabout = {
16612013 email = "cdep.illabout@gmail.com";
2014+ matrix = "@cdepillabout:matrix.org";
16622015 github = "cdepillabout";
16632016 githubId = 64804;
16642017 name = "Dennis Gosnell";
@@ -1675,6 +2028,18 @@
16752028 githubId = 977929;
16762029 name = "Cody Allen";
16772030 };
2031+ centromere = {
2032+ email = "nix@centromere.net";
2033+ github = "centromere";
2034+ githubId = 543423;
2035+ name = "Alex Wied";
2036+ };
2037+ cfhammill = {
2038+ email = "cfhammill@gmail.com";
2039+ github = "cfhammill";
2040+ githubId = 7467038;
2041+ name = "Chris Hammill";
2042+ };
16782043 cfouche = {
16792044 email = "chaddai.fouche@gmail.com";
16802045 github = "Chaddai";
@@ -1715,6 +2080,18 @@
17152080 githubId = 1762540;
17162081 name = "Changlin Li";
17172082 };
2083+ chanley = {
2084+ email = "charlieshanley@gmail.com";
2085+ github = "charlieshanley";
2086+ githubId = 8228888;
2087+ name = "Charlie Hanley";
2088+ };
2089+ charlesbaynham = {
2090+ email = "charlesbaynham@gmail.com";
2091+ github = "charlesbaynham";
2092+ githubId = 4397637;
2093+ name = "Charles Baynham";
2094+ };
17182095 CharlesHD = {
17192096 email = "charleshdespointes@gmail.com";
17202097 github = "CharlesHD";
@@ -1731,6 +2108,12 @@
17312108 email = "me@philscotted.com";
17322109 name = "Phil Scott";
17332110 };
2111+ chekoopa = {
2112+ email = "chekoopa@mail.ru";
2113+ github = "chekoopa";
2114+ githubId = 1689801;
2115+ name = "Mikhail Chekan";
2116+ };
17342117 ChengCat = {
17352118 email = "yu@cheng.cat";
17362119 github = "ChengCat";
@@ -1749,12 +2132,6 @@
17492132 githubId = 18648043;
17502133 name = "Daniel Cartwright";
17512134 };
1752− chiiruno = {
1753− email = "okinan@protonmail.com";
1754− github = "chiiruno";
1755− githubId = 30435868;
1756− name = "Okina Matara";
1757− };
17582135 Chili-Man = {
17592136 email = "dr.elhombrechile@gmail.com";
17602137 name = "Diego Rodriguez";
@@ -1771,6 +2148,12 @@
17712148 githubId = 3086255;
17722149 name = "Barry Moore II";
17732150 };
2151+ chisui = {
2152+ email = "chisui.pd@gmail.com";
2153+ github = "chisui";
2154+ githubId = 4526429;
2155+ name = "Philipp Dargel";
2156+ };
17742157 chivay = {
17752158 email = "hubert.jasudowicz@gmail.com";
17762159 github = "chivay";
@@ -1807,18 +2190,18 @@
18072190 githubId = 399718;
18082191 name = "Chris Martin";
18092192 };
1810− chrisaw = {
1811− email = "home@chrisaw.com";
1812− github = "cawilliamson";
1813− githubId = 1141769;
1814− name = "Christopher A. Williamson";
1815− };
18162193 chrisjefferson = {
18172194 email = "chris@bubblescope.net";
18182195 github = "chrisjefferson";
18192196 githubId = 811527;
18202197 name = "Christopher Jefferson";
18212198 };
2199+ chrispickard = {
2200+ email = "chrispickard9@gmail.com";
2201+ github = "chrispickard";
2202+ githubId = 1438690;
2203+ name = "Chris Pickard";
2204+ };
18222205 chrisrosset = {
18232206 email = "chris@rosset.org.uk";
18242207 github = "chrisrosset";
@@ -1847,30 +2230,81 @@
18472230 githubId = 12386805;
18482231 name = "Chua Hou";
18492232 };
2233+ chuangzhu = {
2234+ name = "Chuang Zhu";
2235+ email = "chuang@melty.land";
2236+ matrix = "@chuangzhu:matrix.org";
2237+ github = "chuangzhu";
2238+ githubId = 31200881;
2239+ keys = [{
2240+ longkeyid = "rsa4096/E838CED81CFFD3F9";
2241+ fingerprint = "5D03 A5E6 0754 A3E3 CA57 5037 E838 CED8 1CFF D3F9";
2242+ }];
2243+ };
18502244 chvp = {
18512245 email = "nixpkgs@cvpetegem.be";
2246+ matrix = "@charlotte:vanpetegem.me";
18522247 github = "chvp";
18532248 githubId = 42220376;
18542249 name = "Charlotte Van Petegem";
18552250 };
2251+ cigrainger = {
2252+ name = "Christopher Grainger";
2253+ email = "chris@amplified.ai";
2254+ github = "cigrainger";
2255+ githubId = 3984794;
2256+ };
18562257 ciil = {
18572258 email = "simon@lackerbauer.com";
18582259 github = "ciil";
18592260 githubId = 3956062;
18602261 name = "Simon Lackerbauer";
18612262 };
2263+ cirno-999 = {
2264+ email = "reverene@protonmail.com";
2265+ github = "cirno-999";
2266+ githubId = 73712874;
2267+ name = "cirno-999";
2268+ };
2269+ citadelcore = {
2270+ email = "alex@arctarus.co.uk";
2271+ github = "citadelcore";
2272+ githubId = 5567402;
2273+ name = "Alex Zero";
2274+ keys = [{
2275+ longkeyid = "rsa4096/0xA51550EDB450302C";
2276+ fingerprint = "A0AA 4646 B8F6 9D45 4553 5A88 A515 50ED B450 302C";
2277+ }];
2278+ };
18622279 cizra = {
18632280 email = "todurov+nix@gmail.com";
18642281 github = "cizra";
18652282 githubId = 2131991;
18662283 name = "Elmo Todurov";
18672284 };
2285+ cjab = {
2286+ email = "chad+nixpkgs@jablonski.xyz";
2287+ github = "cjab";
2288+ githubId = 136485;
2289+ name = "Chad Jablonski";
2290+ };
18682291 ck3d = {
18692292 email = "ck3d@gmx.de";
18702293 github = "ck3d";
18712294 githubId = 25088352;
18722295 name = "Christian Kögler";
18732296 };
2297+ ckie = {
2298+ email = "nixpkgs-0efe364@ckie.dev";
2299+ github = "ckiee";
2300+ githubId = 25263210;
2301+ keys = [{
2302+ longkeyid = "rsa4096/0x13E79449C0525215";
2303+ fingerprint = "539F 0655 4D35 38A5 429A E253 13E7 9449 C052 5215";
2304+ }];
2305+ name = "ckie";
2306+ matrix = "@ckie:ckie.dev";
2307+ };
18742308 clkamp = {
18752309 email = "c@lkamp.de";
18762310 github = "clkamp";
@@ -1895,8 +2329,15 @@
18952329 githubId = 199180;
18962330 name = "Claes Wallin";
18972331 };
2332+ cleeyv = {
2333+ email = "cleeyv@riseup.net";
2334+ github = "cleeyv";
2335+ githubId = 71959829;
2336+ name = "Cleeyv";
2337+ };
18982338 cleverca22 = {
18992339 email = "cleverca22@gmail.com";
2340+ matrix = "@cleverca22:matrix.org";
19002341 github = "cleverca22";
19012342 githubId = 848609;
19022343 name = "Michael Bishop";
@@ -1907,6 +2348,16 @@
19072348 githubId = 3392199;
19082349 name = "Calum MacRae";
19092350 };
2351+ cmars = {
2352+ email = "nix@cmars.tech";
2353+ github = "cmars";
2354+ githubId = 23741;
2355+ name = "Casey Marshall";
2356+ keys = [{
2357+ longkeyid = "rsa3072/0x6DEC2758ACD5A973";
2358+ fingerprint = "6B78 7E5F B493 FA4F D009 5D10 6DEC 2758 ACD5 A973";
2359+ }];
2360+ };
19102361 cmcdragonkai = {
19112362 email = "roger.qiu@matrix.ai";
19122363 github = "cmcdragonkai";
@@ -1931,6 +2382,12 @@
19312382 githubId = 34317;
19322383 name = "Corey O'Connor";
19332384 };
2385+ CodeLongAndProsper90 = {
2386+ github = "CodeLongAndProsper90";
2387+ githubId = 50145141;
2388+ email = "jupiter@m.rdis.dev";
2389+ name = "Scott Little";
2390+ };
19342391 codsl = {
19352392 email = "codsl@riseup.net";
19362393 github = "codsl";
@@ -1943,6 +2400,13 @@
19432400 githubId = 5561189;
19442401 name = "Cody Opel";
19452402 };
2403+ Cogitri = {
2404+ email = "oss@cogitri.dev";
2405+ github = "Cogitri";
2406+ githubId = 8766773;
2407+ matrix = "@cogitri:cogitri.dev";
2408+ name = "Rasmus Thomsen";
2409+ };
19462410 cohei = {
19472411 email = "a.d.xvii.kal.mai@gmail.com";
19482412 github = "cohei";
@@ -1957,6 +2421,7 @@
19572421 };
19582422 colemickens = {
19592423 email = "cole.mickens@gmail.com";
2424+ matrix = "@colemickens:matrix.org";
19602425 github = "colemickens";
19612426 githubId = 327028;
19622427 name = "Cole Mickens";
@@ -1970,6 +2435,7 @@
19702435 cole-h = {
19712436 name = "Cole Helbling";
19722437 email = "cole.e.helbling@outlook.com";
2438+ matrix = "@cole-h:matrix.org";
19732439 github = "cole-h";
19742440 githubId = 28582702;
19752441 keys = [{
@@ -2013,6 +2479,13 @@
20132479 githubId = 11145016;
20142480 name = "J.C.";
20152481 };
2482+ congee = {
2483+ email = "changshengwu@pm.me";
2484+ matrix = "@congeec:matrix.org";
2485+ github = "congee";
2486+ name = "Changsheng Wu";
2487+ githubId = 2083950;
2488+ };
20162489 contrun = {
20172490 email = "uuuuuu@protonmail.com";
20182491 github = "contrun";
@@ -2025,6 +2498,23 @@
20252498 githubId = 5510514;
20262499 name = "Conrad Mearns";
20272500 };
2501+ corbanr = {
2502+ email = "corban@raunco.co";
2503+ github = "CorbanR";
2504+ githubId = 1918683;
2505+ matrix = "@corbansolo:matrix.org";
2506+ name = "Corban Raun";
2507+ keys = [
2508+ {
2509+ longkeyid = "rsa4096/0xA697A56F1F151189";
2510+ fingerprint = "6607 0B24 8CE5 64ED 22CE 0950 A697 A56F 1F15 1189";
2511+ }
2512+ {
2513+ longkeyid = "ed25519/0x230F4AC153F90F29";
2514+ fingerprint = "D8CB 816A B678 A4E6 1EC7 5325 230F 4AC1 53F9 0F29";
2515+ }
2516+ ];
2517+ };
20282518 couchemar = {
20292519 email = "couchemar@yandex.ru";
20302520 github = "couchemar";
@@ -2065,6 +2555,12 @@
20652555 githubId = 12202789;
20662556 name = "CrazedProgrammer";
20672557 };
2558+ creator54 = {
2559+ email = "hi.creator54@gmail.com";
2560+ github = "creator54";
2561+ githubId = 34543609;
2562+ name = "creator54";
2563+ };
20682564 cript0nauta = {
20692565 email = "shareman1204@gmail.com";
20702566 github = "cript0nauta";
@@ -2073,6 +2569,7 @@
20732569 };
20742570 CRTified = {
20752571 email = "carl.schneider+nixos@rub.de";
2572+ matrix = "@schnecfk:ruhr-uni-bochum.de";
20762573 github = "CRTified";
20772574 githubId = 2440581;
20782575 name = "Carl Richard Theodor Schneider";
@@ -2127,6 +2624,12 @@
21272624 githubId = 1382175;
21282625 name = "Oliver Matthews";
21292626 };
2627+ cyounkins = {
2628+ name = "Craig Younkins";
2629+ email = "cyounkins@gmail.com";
2630+ github = "cyounkins";
2631+ githubId = 346185;
2632+ };
21302633 cypherpunk2140 = {
21312634 email = "stefan.mihaila@pm.me";
21322635 github = "stefan-mihaila";
@@ -2145,6 +2648,7 @@
21452648 };
21462649 cyplo = {
21472650 email = "nixos@cyplo.dev";
2651+ matrix = "@cyplo:cyplo.dev";
21482652 github = "cyplo";
21492653 githubId = 217899;
21502654 name = "Cyryl Płotnicki";
@@ -2159,6 +2663,12 @@
21592663 fingerprint = "1C4E F4FE 7F8E D8B7 1E88 CCDF BAB1 D15F B7B4 D4CE";
21602664 }];
21612665 };
2666+ d-xo = {
2667+ email = "hi@d-xo.org";
2668+ github = "d-xo";
2669+ githubId = 6689924;
2670+ name = "David Terry";
2671+ };
21622672 dadada = {
21632673 name = "dadada";
21642674 email = "dadada@dadada.li";
@@ -2175,6 +2685,12 @@
21752685 githubId = 4331004;
21762686 name = "Naoya Hatta";
21772687 };
2688+ dalpd = {
2689+ email = "denizalpd@ogr.iu.edu.tr";
2690+ github = "dalpd";
2691+ githubId = 16895361;
2692+ name = "Deniz Alp Durmaz";
2693+ };
21782694 DamienCassou = {
21792695 email = "damien@cassou.me";
21802696 github = "DamienCassou";
@@ -2201,6 +2717,7 @@
22012717 };
22022718 dandellion = {
22032719 email = "daniel@dodsorf.as";
2720+ matrix = "@dandellion:dodsorf.as";
22042721 github = "dali99";
22052722 githubId = 990767;
22062723 name = "Daniel Olsen";
@@ -2235,6 +2752,30 @@
22352752 githubId = 1298344;
22362753 name = "Daniel Fullmer";
22372754 };
2755+ danth = {
2756+ name = "Daniel Thwaites";
2757+ email = "danthwaites30@btinternet.com";
2758+ matrix = "@danth:matrix.org";
2759+ github = "danth";
2760+ githubId = 28959268;
2761+ keys = [{
2762+ longkeyid = "rsa3072/0xD8AFC4BF05670F9D";
2763+ fingerprint = "4779 D1D5 3C97 2EAE 34A5 ED3D D8AF C4BF 0567 0F9D";
2764+ }];
2765+ };
2766+ dan4ik605743 = {
2767+ email = "6057430gu@gmail.com";
2768+ github = "dan4ik605743";
2769+ githubId = 86075850;
2770+ name = "Danil Danevich";
2771+ };
2772+ darkonion0 = {
2773+ name = "Alexandre Peruggia";
2774+ email = "darkgenius1@protonmail.com";
2775+ matrix = "@alexoo:matrix.org";
2776+ github = "DarkOnion0";
2777+ githubId = 68606322;
2778+ };
22382779 das-g = {
22392780 email = "nixpkgs@raphael.dasgupta.ch";
22402781 github = "das-g";
@@ -2243,6 +2784,7 @@
22432784 };
22442785 das_j = {
22452786 email = "janne@hess.ooo";
2787+ matrix = "@janne.hess:helsinki-systems.de";
22462788 github = "dasJ";
22472789 githubId = 4971975;
22482790 name = "Janne Heß";
@@ -2267,6 +2809,12 @@
22672809 email = "christoph.senjak@googlemail.com";
22682810 name = "Christoph-Simon Senjak";
22692811 };
2812+ datafoo = {
2813+ email = "34766150+datafoo@users.noreply.github.com";
2814+ github = "datafoo";
2815+ githubId = 34766150;
2816+ name = "datafoo";
2817+ };
22702818 davhau = {
22712819 email = "d.hauer.it@gmail.com";
22722820 name = "David Hauer";
@@ -2287,10 +2835,17 @@
22872835 };
22882836 davidak = {
22892837 email = "post@davidak.de";
2838+ matrix = "@davidak:matrix.org";
22902839 github = "davidak";
22912840 githubId = 91113;
22922841 name = "David Kleuker";
22932842 };
2843+ davidarmstronglewis = {
2844+ email = "davidlewis@mac.com";
2845+ github = "davidarmstronglewis";
2846+ githubId = 6754950;
2847+ name = "David Armstrong Lewis";
2848+ };
22942849 davidrusu = {
22952850 email = "davidrusu.me@gmail.com";
22962851 github = "davidrusu";
@@ -2319,6 +2874,12 @@
23192874 githubId = 49904992;
23202875 name = "Dawid Sowa";
23212876 };
2877+ dbeckwith = {
2878+ email = "djbsnx@gmail.com";
2879+ github = "dbeckwith";
2880+ githubId = 1279939;
2881+ name = "Daniel Beckwith";
2882+ };
23222883 dbirks = {
23232884 email = "david@birks.dev";
23242885 github = "dbirks";
@@ -2353,24 +2914,56 @@
23532914 githubId = 75067;
23542915 name = "Daniel Duan";
23552916 };
2917+ dearrude = {
2918+ name = "Ebrahim Nejati";
2919+ email = "dearrude@tfwno.gf";
2920+ github = "dearrude";
2921+ githubId = 30749142;
2922+ keys = [{
2923+ longkeyid = "rsa4096/19151E03BF2CF012";
2924+ fingerprint = "4E35 F2E5 2132 D654 E815 A672 DB2C BC24 2868 6000";
2925+ }];
2926+ };
23562927 deepfire = {
23572928 email = "_deepfire@feelingofgreen.ru";
23582929 github = "deepfire";
23592930 githubId = 452652;
23602931 name = "Kosyrev Serge";
23612932 };
2933+ DeeUnderscore = {
2934+ email = "d.anzorge@gmail.com";
2935+ github = "DeeUnderscore";
2936+ githubId = 156239;
2937+ name = "D Anzorge";
2938+ };
23622939 delan = {
23632940 name = "Delan Azabani";
23642941 email = "delan@azabani.com";
23652942 github = "delan";
23662943 githubId = 465303;
23672944 };
2945+ deliciouslytyped = {
2946+ email = "47436522+deliciouslytyped@users.noreply.github.com";
2947+ github = "deliciouslytyped";
2948+ githubId = 47436522;
2949+ name = "deliciouslytyped";
2950+ };
23682951 delroth = {
23692952 email = "delroth@gmail.com";
23702953 github = "delroth";
23712954 githubId = 202798;
23722955 name = "Pierre Bourdon";
23732956 };
2957+ delta = {
2958+ email = "d4delta@outlook.fr";
2959+ name = "Delta";
2960+ };
2961+ deltadelta = {
2962+ email = "contact@libellules.eu";
2963+ name = "Dara Ly";
2964+ github = "tournemire";
2965+ githubId = 20159432;
2966+ };
23742967 deltaevo = {
23752968 email = "deltaduartedavid@gmail.com";
23762969 github = "DeltaEvo";
@@ -2401,12 +2994,24 @@
24012994 githubId = 706758;
24022995 name = "Christian Gerbrandt";
24032996 };
2997+ derekcollison = {
2998+ email = "derek@nats.io";
2999+ github = "derekcollison";
3000+ githubId = 90097;
3001+ name = "Derek Collison";
3002+ };
24043003 DerGuteMoritz = {
24053004 email = "moritz@twoticketsplease.de";
24063005 github = "DerGuteMoritz";
24073006 githubId = 19733;
24083007 name = "Moritz Heidkamp";
24093008 };
3009+ DerickEddington = {
3010+ email = "derick.eddington@pm.me";
3011+ github = "DerickEddington";
3012+ githubId = 4731128;
3013+ name = "Derick Eddington";
3014+ };
24103015 dermetfan = {
24113016 email = "serverkorken@gmail.com";
24123017 github = "dermetfan";
@@ -2455,12 +3060,24 @@
24553060 githubId = 4708206;
24563061 name = "Daniel Fox Franke";
24573062 };
3063+ dgliwka = {
3064+ email = "dawid.gliwka@gmail.com";
3065+ github = "dgliwka";
3066+ githubId = 33262214;
3067+ name = "Dawid Gliwka";
3068+ };
24583069 dgonyeo = {
24593070 email = "derek@gonyeo.com";
24603071 github = "dgonyeo";
24613072 githubId = 2439413;
24623073 name = "Derek Gonyeo";
24633074 };
3075+ dguenther = {
3076+ email = "dguenther9@gmail.com";
3077+ github = "dguenther";
3078+ githubId = 767083;
3079+ name = "Derek Guenther";
3080+ };
24643081 dhkl = {
24653082 email = "david@davidslab.com";
24663083 github = "dhl";
@@ -2479,6 +3096,18 @@
24793096 githubId = 8404455;
24803097 name = "Diego Lelis";
24813098 };
3099+ DieracDelta = {
3100+ email = "justin@restivo.me";
3101+ github = "DieracDelta";
3102+ githubId = 13730968;
3103+ name = "Justin Restivo";
3104+ };
3105+ diffumist = {
3106+ email = "git@diffumist.me";
3107+ github = "diffumist";
3108+ githubId = 32810399;
3109+ name = "Diffumist";
3110+ };
24823111 diogox = {
24833112 name = "Diogo Xavier";
24843113 email = "13244408+diogox@users.noreply.github.com";
@@ -2509,6 +3138,12 @@
25093138 githubId = 40633781;
25103139 name = "Sergei S.";
25113140 };
3141+ dit7ya = {
3142+ email = "7rat13@gmail.com";
3143+ github = "dit7ya";
3144+ githubId = 14034137;
3145+ name = "Mostly Void";
3146+ };
25123147 dizfer = {
25133148 email = "david@izquierdofernandez.com";
25143149 github = "dizfer";
@@ -2545,6 +3180,12 @@
25453180 githubId = 28980797;
25463181 name = "David Leslie";
25473182 };
3183+ dlip = {
3184+ email = "dane@lipscombe.com.au";
3185+ github = "dlip";
3186+ githubId = 283316;
3187+ name = "Dane Lipscombe";
3188+ };
25483189 dmalikov = {
25493190 email = "malikov.d.y@gmail.com";
25503191 github = "dmalikov";
@@ -2607,6 +3248,7 @@
26073248 };
26083249 dotlambda = {
26093250 email = "rschuetz17@gmail.com";
3251+ matrix = "@robert:funklause.de";
26103252 github = "dotlambda";
26113253 githubId = 6806011;
26123254 name = "Robert Schütz";
@@ -2677,6 +3319,39 @@
26773319 githubId = 10198051;
26783320 name = "Drew Risinger";
26793321 };
3322+ drperceptron = {
3323+ email = "92106371+drperceptron@users.noreply.github.com";
3324+ github = "drperceptron";
3325+ githubId = 92106371;
3326+ name = "Dr Perceptron";
3327+ keys = [{
3328+ longkeyid = "rsa4096/0x95EB6DFF26D1CEB0";
3329+ fingerprint = "7E38 89D9 B1A8 B381 C8DE A15F 95EB 6DFF 26D1 CEB0";
3330+ }];
3331+ };
3332+ drupol = {
3333+ name = "Pol Dellaiera";
3334+ email = "pol.dellaiera@protonmail.com";
3335+ matrix = "@drupol:matrix.org";
3336+ github = "drupol";
3337+ githubId = 252042;
3338+ keys = [{
3339+ longkeyid = "ed25519/0x0AAF2901E8040715";
3340+ fingerprint = "85F3 72DF 4AF3 EF13 ED34 72A3 0AAF 2901 E804 0715";
3341+ }];
3342+ };
3343+ drzoidberg = {
3344+ email = "jakob@mast3rsoft.com";
3345+ github = "jakobneufeld";
3346+ githubId = 24791219;
3347+ name = "Jakob Neufeld";
3348+ };
3349+ dsalaza4 = {
3350+ email = "podany270895@gmail.com";
3351+ github = "dsalaza4";
3352+ githubId = 11205987;
3353+ name = "Daniel Salazar";
3354+ };
26803355 dschrempf = {
26813356 name = "Dominik Schrempf";
26823357 email = "dominik.schrempf@gmail.com";
@@ -2733,6 +3408,7 @@
27333408 };
27343409 dywedir = {
27353410 email = "dywedir@gra.red";
3411+ matrix = "@dywedir:matrix.org";
27363412 github = "dywedir";
27373413 githubId = 399312;
27383414 name = "Vladyslav M.";
@@ -2775,10 +3451,21 @@
27753451 };
27763452 earvstedt = {
27773453 email = "erik.arvstedt@gmail.com";
3454+ matrix = "@erikarvstedt:matrix.org";
27783455 github = "erikarvstedt";
27793456 githubId = 36110478;
27803457 name = "Erik Arvstedt";
27813458 };
3459+ ebbertd = {
3460+ email = "daniel@ebbert.nrw";
3461+ github = "ebbertd";
3462+ githubId = 20522234;
3463+ name = "Daniel Ebbert";
3464+ keys = [{
3465+ longkeyid = "rsa2048/0x47BC155927CBB9C7";
3466+ fingerprint = "E765 FCA3 D9BF 7FDB 856E AD73 47BC 1559 27CB B9C7";
3467+ }];
3468+ };
27823469 ebzzry = {
27833470 email = "ebzzry@ebzzry.io";
27843471 github = "ebzzry";
@@ -2809,11 +3496,11 @@
28093496 githubId = 50854;
28103497 name = "edef";
28113498 };
2812− edibopp = {
2813− email = "eduard.bopp@aepsil0n.de";
2814− github = "edibopp";
2815− githubId = 3098430;
2816− name = "Eduard Bopp";
3499+ edlimerkaj = {
3500+ name = "Edli Merkaj";
3501+ email = "edli.merkaj@identinet.io";
3502+ github = "edlimerkaj";
3503+ githubId = 71988351;
28173504 };
28183505 emantor = {
28193506 email = "rouven+nixos@czerwinskis.de";
@@ -2833,6 +3520,12 @@
28333520 githubId = 18535642;
28343521 name = "Emily";
28353522 };
3523+ emilytrau = {
3524+ name = "Emily Trau";
3525+ email = "nix@angus.ws";
3526+ github = "emilytrau";
3527+ githubId = 13267947;
3528+ };
28363529 enderger = {
28373530 email = "endergeryt@gmail.com";
28383531 github = "enderger";
@@ -2851,12 +3544,6 @@
28513544 githubId = 119483;
28523545 name = "Matthew Brown";
28533546 };
2854− eduardosm = {
2855− email = "esm@eduardosm.net";
2856− github = "eduardosm";
2857− githubId = 761151;
2858− name = "Eduardo Sánchez Muñoz";
2859− };
28603547 eduarrrd = {
28613548 email = "e.bachmakov@gmail.com";
28623549 github = "eduarrrd";
@@ -2901,6 +3588,7 @@
29013588 };
29023589 ekleog = {
29033590 email = "leo@gaspard.io";
3591+ matrix = "@leo:gaspard.ninja";
29043592 github = "ekleog";
29053593 githubId = 411447;
29063594 name = "Leo Gaspard";
@@ -2911,6 +3599,12 @@
29113599 githubId = 4742;
29123600 name = "Aaron Bull Schaefer";
29133601 };
3602+ elatov = {
3603+ email = "elatov@gmail.com";
3604+ github = "elatov";
3605+ githubId = 7494394;
3606+ name = "Karim Elatov";
3607+ };
29143608 eleanor = {
29153609 email = "dejan@proteansec.com";
29163610 github = "proteansec";
@@ -2923,6 +3617,12 @@
29233617 githubId = 103082;
29243618 name = "Ed Brindley";
29253619 };
3620+ elliot = {
3621+ email = "hack00mind@gmail.com";
3622+ github = "Eliot00";
3623+ githubId = 18375468;
3624+ name = "Elliot Xu";
3625+ };
29263626 elliottvillars = {
29273627 email = "elliottvillars@gmail.com";
29283628 github = "elliottvillars";
@@ -2931,6 +3631,7 @@
29313631 };
29323632 eliasp = {
29333633 email = "mail@eliasprobst.eu";
3634+ matrix = "@eliasp:kde.org";
29343635 github = "eliasp";
29353636 githubId = 48491;
29363637 name = "Elias Probst";
@@ -2983,12 +3684,25 @@
29833684 githubId = 57923898;
29843685 name = "Elyhaka";
29853686 };
3687+ em0lar = {
3688+ email = "nix@em0lar.dev";
3689+ github = "em0lar";
3690+ githubId = 11006031;
3691+ name = "Leo Maroni";
3692+ };
29863693 emmanuelrosa = {
2987− email = "emmanuel_rosa@aol.com";
3694+ email = "emmanuelrosa@protonmail.com";
3695+ matrix = "@emmanuelrosa:matrix.org";
29883696 github = "emmanuelrosa";
29893697 githubId = 13485450;
29903698 name = "Emmanuel Rosa";
29913699 };
3700+ emptyflask = {
3701+ email = "jon@emptyflask.dev";
3702+ github = "emptyflask";
3703+ githubId = 28287;
3704+ name = "Jon Roberts";
3705+ };
29923706 endgame = {
29933707 email = "jack@jackkelly.name";
29943708 github = "endgame";
@@ -3007,9 +3721,9 @@
30073721 githubId = 5493775;
30083722 name = "Ente";
30093723 };
3010− enzime = {
3724+ Enzime = {
30113725 email = "enzime@users.noreply.github.com";
3012− github = "enzime";
3726+ github = "Enzime";
30133727 githubId = 10492681;
30143728 name = "Michael Hoang";
30153729 };
@@ -3057,6 +3771,13 @@
30573771 fingerprint = "2D37 1AD2 7E2B BC77 97E1 B759 6C79 278F 3FCD CC02";
30583772 }];
30593773 };
3774+ ereslibre = {
3775+ email = "ereslibre@ereslibre.es";
3776+ matrix = "@ereslibre:matrix.org";
3777+ github = "ereslibre";
3778+ githubId = 8706;
3779+ name = "Rafael Fernández López";
3780+ };
30603781 ericbmerritt = {
30613782 email = "eric@afiniate.com";
30623783 github = "ericbmerritt";
@@ -3077,6 +3798,7 @@
30773798 };
30783799 ericson2314 = {
30793800 email = "John.Ericson@Obsidian.Systems";
3801+ matrix = "@ericson2314:matrix.org";
30803802 github = "ericson2314";
30813803 githubId = 1055245;
30823804 name = "John Ericson";
@@ -3159,8 +3881,22 @@
31593881 githubId = 222467;
31603882 name = "Dmitry Ivanov";
31613883 };
3884+ ethindp = {
3885+ name = "Ethin Probst";
3886+ email = "harlydavidsen@gmail.com";
3887+ matrix = "@ethindp:the-gdn.net";
3888+ github = "ethindp";
3889+ githubId = 8030501;
3890+ };
3891+ Etjean = {
3892+ email = "et.jean@outlook.fr";
3893+ github = "Etjean";
3894+ githubId = 32169529;
3895+ name = "Etienne Jean";
3896+ };
31623897 etu = {
31633898 email = "elis@hirwing.se";
3899+ matrix = "@etu:semi.social";
31643900 github = "etu";
31653901 githubId = 461970;
31663902 name = "Elis Hirwing";
@@ -3178,6 +3914,7 @@
31783914 evalexpr = {
31793915 name = "Jonathan Wilkins";
31803916 email = "nixos@wilkins.tech";
3917+ matrix = "@evalexpr:matrix.org";
31813918 github = "evalexpr";
31823919 githubId = 23485511;
31833920 keys = [{
@@ -3211,6 +3948,7 @@
32113948 };
32123949 evils = {
32133950 email = "evils.devils@protonmail.com";
3951+ matrix = "@evils:nixos.dev";
32143952 github = "evils";
32153953 githubId = 30512529;
32163954 name = "Evils";
@@ -3221,6 +3959,12 @@
32213959 githubId = 454695;
32223960 name = "Artur Taranchiev";
32233961 };
3962+ exarkun = {
3963+ email = "exarkun@twistedmatrix.com";
3964+ github = "exarkun";
3965+ githubId = 254565;
3966+ name = "Jean-Paul Calderone";
3967+ };
32243968 exfalso = {
32253969 email = "0slemi0@gmail.com";
32263970 github = "exfalso";
@@ -3241,9 +3985,14 @@
32413985 };
32423986 expipiplus1 = {
32433987 email = "nix@monoid.al";
3988+ matrix = "@ellie:monoid.al";
32443989 github = "expipiplus1";
32453990 githubId = 857308;
3246− name = "Joe Hermaszewski";
3991+ name = "Ellie Hermaszewska";
3992+ keys = [{
3993+ longkeyid = "rsa4096/0xC8116E3A0C1CA76A";
3994+ fingerprint = "FC1D 3E4F CBCA 80DF E870 6397 C811 6E3A 0C1C A76A";
3995+ }];
32473996 };
32483997 extends = {
32493998 email = "sharosari@gmail.com";
@@ -3253,6 +4002,7 @@
32534002 };
32544003 eyjhb = {
32554004 email = "eyjhbb@gmail.com";
4005+ matrix = "@eyjhb:eyjhb.dk";
32564006 github = "eyJhb";
32574007 githubId = 25955146;
32584008 name = "eyJhb";
@@ -3271,6 +4021,7 @@
32714021 };
32724022 fab = {
32734023 email = "mail@fabian-affolter.ch";
4024+ matrix = "@fabaff:matrix.org";
32744025 name = "Fabian Affolter";
32754026 github = "fabaff";
32764027 githubId = 116184;
@@ -3279,6 +4030,12 @@
32794030 fingerprint = "2F6C 930F D3C4 7E38 6AFA 4EB4 E23C D2DD 36A4 397F";
32804031 }];
32814032 };
4033+ fabiangd = {
4034+ email = "fabian.g.droege@gmail.com";
4035+ name = "Fabian G. Dröge";
4036+ github = "FabianGD";
4037+ githubId = 40316600;
4038+ };
32824039 fabianhauser = {
32834040 email = "fabian.nixos@fh2.ch";
32844041 github = "fabianhauser";
@@ -3319,6 +4076,12 @@
33194076 githubId = 1276854;
33204077 name = "Florian Peter";
33214078 };
4079+ fbeffa = {
4080+ email = "beffa@fbengineering.ch";
4081+ github = "fedeinthemix";
4082+ githubId = 7670450;
4083+ name = "Federico Beffa";
4084+ };
33224085 fbrs = {
33234086 email = "yuuki@protonmail.com";
33244087 github = "cideM";
@@ -3331,6 +4094,13 @@
33314094 githubId = 541748;
33324095 name = "Felipe Espinoza";
33334096 };
4097+ fedx-sudo = {
4098+ email = "fedx-sudo@pm.me";
4099+ github = "Fedx-sudo";
4100+ githubId = 66258975;
4101+ name = "Fedx sudo";
4102+ matrix = "fedx:matrix.org";
4103+ };
33344104 fehnomenal = {
33354105 email = "fehnomenal@fehn.systems";
33364106 github = "fehnomenal";
@@ -3351,13 +4121,21 @@
33514121 };
33524122 felschr = {
33534123 email = "dev@felschr.com";
4124+ matrix = "@felschr:matrix.org";
33544125 github = "felschr";
33554126 githubId = 3314323;
3356− name = "Felix Tenley";
3357− keys = [{
3358− longkeyid = "ed25519/0x910ACB9F6BD26F58";
3359− fingerprint = "6AB3 7A28 5420 9A41 82D9 0068 910A CB9F 6BD2 6F58";
3360− }];
4127+ name = "Felix Schröter";
4128+ keys = [
4129+ {
4130+ # historical
4131+ longkeyid = "ed25519/0x910ACB9F6BD26F58";
4132+ fingerprint = "6AB3 7A28 5420 9A41 82D9 0068 910A CB9F 6BD2 6F58";
4133+ }
4134+ {
4135+ longkeyid = "ed25519/0x671E39E6744C807D";
4136+ fingerprint = "7E08 6842 0934 AA1D 6821 1F2A 671E 39E6 744C 807D";
4137+ }
4138+ ];
33614139 };
33624140 ffinkdevs = {
33634141 email = "fink@h0st.space";
@@ -3367,12 +4145,14 @@
33674145 };
33684146 fgaz = {
33694147 email = "fgaz@fgaz.me";
4148+ matrix = "@fgaz:matrix.org";
33704149 github = "fgaz";
33714150 githubId = 8182846;
33724151 name = "Francesco Gazzetta";
33734152 };
33744153 figsoda = {
33754154 email = "figsoda@pm.me";
4155+ matrix = "@figsoda:matrix.org";
33764156 github = "figsoda";
33774157 githubId = 40620903;
33784158 name = "figsoda";
@@ -3401,6 +4181,12 @@
34014181 github = "fitzgibbon";
34024182 githubId = 617048;
34034183 };
4184+ fkautz = {
4185+ name = "Frederick F. Kautz IV";
4186+ email = "fkautz@alumni.cmu.edu";
4187+ github = "fkautz";
4188+ githubId = 135706;
4189+ };
34044190 Flakebi = {
34054191 email = "flakebi@t-online.de";
34064192 github = "Flakebi";
@@ -3411,6 +4197,12 @@
34114197 fingerprint = "2F93 661D AC17 EA98 A104 F780 ECC7 55EE 583C 1672";
34124198 }];
34134199 };
4200+ flexagoon = {
4201+ email = "flexagoon@pm.me";
4202+ github = "flexagoon";
4203+ githubId = 66178592;
4204+ name = "Pavel Zolotarevskiy";
4205+ };
34144206 flexw = {
34154207 email = "felix.weilbach@t-online.de";
34164208 github = "FlexW";
@@ -3429,6 +4221,12 @@
34294221 githubId = 183879;
34304222 name = "Florian Klink";
34314223 };
4224+ florentc = {
4225+ email = "florentc@users.noreply.github.com";
4226+ github = "florentc";
4227+ githubId = 1149048;
4228+ name = "Florent Ch.";
4229+ };
34324230 FlorianFranzen = {
34334231 email = "Florian.Franzen@gmail.com";
34344232 github = "FlorianFranzen";
@@ -3485,6 +4283,7 @@
34854283 };
34864284 fortuneteller2k = {
34874285 email = "lythe1107@gmail.com";
4286+ matrix = "@fortuneteller2k:matrix.org";
34884287 github = "fortuneteller2k";
34894288 githubId = 20619776;
34904289 name = "fortuneteller2k";
@@ -3512,19 +4311,18 @@
35124311 githubId = 119691;
35134312 name = "Michael Gough";
35144313 };
3515−
4314+ freax13 = {
4315+ email = "erbse.13@gmx.de";
4316+ github = "freax13";
4317+ githubId = 14952658;
4318+ name = "Tom Dohrmann";
4319+ };
35164320 fredeb = {
35174321 email = "im@fredeb.dev";
35184322 github = "fredeeb";
35194323 githubId = 7551358;
35204324 name = "Frede Emil";
35214325 };
3522− freepotion = {
3523− email = "42352817+freepotion@users.noreply.github.com";
3524− github = "freepotion";
3525− githubId = 42352817;
3526− name = "Free Potion";
3527− };
35284326 freezeboy = {
35294327 email = "freezeboy@users.noreply.github.com";
35304328 github = "freezeboy";
@@ -3647,6 +4445,16 @@
36474445 githubId = 1313787;
36484446 name = "Gabriel Gonzalez";
36494447 };
4448+ gador = {
4449+ email = "florian.brandes@posteo.de";
4450+ github = "gador";
4451+ githubId = 1883533;
4452+ name = "Florian Brandes";
4453+ keys = [{
4454+ longkeyid = "rsa4096/0xBBB3E40E53797FD9";
4455+ fingerprint = "0200 3EF8 8D2B CF2D 8F00 FFDC BBB3 E40E 5379 7FD9";
4456+ }];
4457+ };
36504458 gal_bolle = {
36514459 email = "florent.becker@ens-lyon.org";
36524460 github = "FlorentBecker";
@@ -3671,6 +4479,12 @@
36714479 githubId = 20208;
36724480 name = "Rok Garbas";
36734481 };
4482+ gardspirito = {
4483+ name = "gardspirito";
4484+ email = "nyxoroso@gmail.com";
4485+ github = "gardspirito";
4486+ githubId = 29687558;
4487+ };
36744488 garrison = {
36754489 email = "jim@garrison.cc";
36764490 github = "garrison";
@@ -3689,18 +4503,44 @@
36894503 githubId = 16470252;
36904504 name = "Gemini Lasswell";
36914505 };
4506+ gbtb = {
4507+ email = "goodbetterthebeast3@gmail.com";
4508+ github = "gbtb";
4509+ githubId = 37017396;
4510+ name = "gbtb";
4511+ };
36924512 gebner = {
36934513 email = "gebner@gebner.org";
36944514 github = "gebner";
36954515 githubId = 313929;
36964516 name = "Gabriel Ebner";
36974517 };
4518+ genofire = {
4519+ name = "genofire";
4520+ email = "geno+dev@fireorbit.de";
4521+ github = "genofire";
4522+ githubId = 6905586;
4523+ keys = [{
4524+ longkeyid = "rsa4096/0xFC83907C125BC2BC";
4525+ fingerprint = "386E D1BF 848A BB4A 6B4A 3C45 FC83 907C 125B C2BC";
4526+ }];
4527+ };
36984528 georgewhewell = {
36994529 email = "georgerw@gmail.com";
37004530 github = "georgewhewell";
37014531 githubId = 1176131;
37024532 name = "George Whewell";
37034533 };
4534+ georgyo = {
4535+ email = "george@shamm.as";
4536+ github = "georgyo";
4537+ githubId = 19374;
4538+ name = "George Shammas";
4539+ keys = [{
4540+ longkeyid = "rsa4096/0x82BB70D541AE2DB4";
4541+ fingerprint = "D0CF 440A A703 E0F9 73CB A078 82BB 70D5 41AE 2DB4";
4542+ }];
4543+ };
37044544 gerschtli = {
37054545 email = "tobias.happ@gmx.de";
37064546 github = "Gerschtli";
@@ -3715,10 +4555,17 @@
37154555 };
37164556 ggpeti = {
37174557 email = "ggpeti@gmail.com";
4558+ matrix = "@ggpeti:ggpeti.com";
37184559 github = "ggpeti";
37194560 githubId = 3217744;
37204561 name = "Peter Ferenczy";
37214562 };
4563+ ghostbuster91 = {
4564+ name = "Kasper Kondzielski";
4565+ email = "kghost0@gmail.com";
4566+ github = "ghostbuster91";
4567+ githubId = 5662622;
4568+ };
37224569 ghuntley = {
37234570 email = "ghuntley@ghuntley.com";
37244571 github = "ghuntley";
@@ -3737,12 +4584,24 @@
37374584 githubId = 27668;
37384585 name = "Tobias Pflug";
37394586 };
4587+ gin66 = {
4588+ email = "jochen@kiemes.de";
4589+ github = "gin66";
4590+ githubId = 5549373;
4591+ name = "Jochen Kiemes";
4592+ };
37404593 giogadi = {
37414594 email = "lgtorres42@gmail.com";
37424595 github = "giogadi";
37434596 githubId = 1713676;
37444597 name = "Luis G. Torres";
37454598 };
4599+ GKasparov = {
4600+ email = "mizozahr@gmail.com";
4601+ github = "GKasparov";
4602+ githubId = 60962839;
4603+ name = "Mazen Zahr";
4604+ };
37464605 gleber = {
37474606 email = "gleber.p@gmail.com";
37484607 github = "gleber";
@@ -3807,6 +4666,16 @@
38074666 githubId = 1621335;
38084667 name = "Andrew Trachenko";
38094668 };
4669+ gordias = {
4670+ name = "Gordias";
4671+ email = "gordias@disroot.org";
4672+ github = "gordiasdot";
4673+ githubId = 94724133;
4674+ keys = [{
4675+ longkeyid = "ed25519/0x5D47284830FAA4FA";
4676+ fingerprint = "C006 B8A0 0618 F3B6 E0E4 2ECD 5D47 2848 30FA A4FA";
4677+ }];
4678+ };
38104679 govanify = {
38114680 name = "Gauvain 'GovanifY' Roussel-Tarbouriech";
38124681 email = "gauvain@govanify.com";
@@ -3817,6 +4686,16 @@
38174686 fingerprint = "5214 2D39 A7CE F8FA 872B CA7F DE62 E1E2 A614 5556";
38184687 }];
38194688 };
4689+ gpanders = {
4690+ name = "Gregory Anders";
4691+ email = "greg@gpanders.com";
4692+ github = "gpanders";
4693+ githubId = 8965202;
4694+ keys = [{
4695+ longkeyid = "rsa2048/0x56E93C2FB6B08BDB";
4696+ fingerprint = "B9D5 0EDF E95E ECD0 C135 00A9 56E9 3C2F B6B0 8BDB";
4697+ }];
4698+ };
38204699 gpyh = {
38214700 email = "yacine.hmito@gmail.com";
38224701 github = "yacinehmito";
@@ -3841,6 +4720,12 @@
38414720 githubId = 4656860;
38424721 name = "Gaute Ravndal";
38434722 };
4723+ graysonhead = {
4724+ email = "grayson@graysonhead.net";
4725+ github = "graysonhead";
4726+ githubId = 6179496;
4727+ name = "Grayson Head";
4728+ };
38444729 grburst = {
38454730 email = "GRBurst@protonmail.com";
38464731 github = "GRBurst";
@@ -3869,6 +4754,12 @@
38694754 githubId = 201997;
38704755 name = "Eric Seidel";
38714756 };
4757+ grindhold = {
4758+ name = "grindhold";
4759+ email = "grindhold+nix@skarphed.org";
4760+ github = "grindhold";
4761+ githubId = 2592640;
4762+ };
38724763 gspia = {
38734764 email = "iahogsp@gmail.com";
38744765 github = "gspia";
@@ -3887,6 +4778,18 @@
38874778 githubId = 343415;
38884779 name = "Greg Roodt";
38894780 };
4781+ grnnja = {
4782+ email = "grnnja@gmail.com";
4783+ github = "grnnja";
4784+ githubId = 31556469;
4785+ name = "Prem Netsuwan";
4786+ };
4787+ gruve-p = {
4788+ email = "groestlcoin@gmail.com";
4789+ github = "gruve-p";
4790+ githubId = 11212268;
4791+ name = "gruve-p";
4792+ };
38904793 gschwartz = {
38914794 email = "gsch@pennmedicine.upenn.edu";
38924795 github = "GregorySchwartz";
@@ -3938,9 +4841,16 @@
39384841 gytis-ivaskevicius = {
39394842 name = "Gytis Ivaskevicius";
39404843 email = "me@gytis.io";
4844+ matrix = "@gytis-ivaskevicius:matrix.org";
39414845 github = "gytis-ivaskevicius";
39424846 githubId = 23264966;
39434847 };
4848+ hagl = {
4849+ email = "harald@glie.be";
4850+ github = "hagl";
4851+ githubId = 1162118;
4852+ name = "Harald Gliebe";
4853+ };
39444854 hakuch = {
39454855 email = "hakuch@gmail.com";
39464856 github = "hakuch";
@@ -3953,6 +4863,12 @@
39534863 githubId = 1742172;
39544864 name = "Hamish Hutchings";
39554865 };
4866+ hanemile = {
4867+ email = "mail@emile.space";
4868+ github = "hanemile";
4869+ githubId = 22756350;
4870+ name = "Emile Hansmaennel";
4871+ };
39564872 hansjoergschurr = {
39574873 email = "commits@schurr.at";
39584874 github = "hansjoergschurr";
@@ -3971,6 +4887,7 @@
39714887 };
39724888 happysalada = {
39734889 email = "raphael@megzari.com";
4890+ matrix = "@happysalada:matrix.org";
39744891 github = "happysalada";
39754892 githubId = 5317234;
39764893 name = "Raphael Megzari";
@@ -3981,6 +4898,16 @@
39814898 githubId = 54728477;
39824899 name = "Happy River";
39834900 };
4901+ hardselius = {
4902+ email = "martin@hardselius.dev";
4903+ github = "hardselius";
4904+ githubId = 1422583;
4905+ name = "Martin Hardselius";
4906+ keys = [{
4907+ longkeyid = "rsa4096/0x03A6E6F786936619";
4908+ fingerprint = "3F35 E4CA CBF4 2DE1 2E90 53E5 03A6 E6F7 8693 6619";
4909+ }];
4910+ };
39844911 haslersn = {
39854912 email = "haslersn@fius.informatik.uni-stuttgart.de";
39864913 github = "haslersn";
@@ -3993,8 +4920,15 @@
39934920 githubId = 731722;
39944921 name = "Ryan Scheel";
39954922 };
4923+ hawkw = {
4924+ email = "eliza@elizas.website";
4925+ github = "hawkw";
4926+ githubId = 2796466;
4927+ name = "Eliza Weisman";
4928+ };
39964929 hax404 = {
39974930 email = "hax404foogit@hax404.de";
4931+ matrix = "@hax404:hax404.de";
39984932 github = "hax404";
39994933 githubId = 1379411;
40004934 name = "Georg Haas";
@@ -4011,6 +4945,16 @@
40114945 githubId = 147689;
40124946 name = "Hans-Christian Esperer";
40134947 };
4948+ hdhog = {
4949+ name = "Serg Larchenko";
4950+ email = "hdhog@hdhog.ru";
4951+ github = "hdhog";
4952+ githubId = 386666;
4953+ keys = [{
4954+ longkeyid = "rsa496/952EACB76703BA63";
4955+ fingerprint = "A25F 6321 AAB4 4151 4085 9924 952E ACB7 6703 BA63";
4956+ }];
4957+ };
40144958 hectorj = {
40154959 email = "hector.jusforgues+nixos@gmail.com";
40164960 github = "hectorj";
@@ -4035,6 +4979,13 @@
40354979 githubId = 2405974;
40364980 name = "Sébastian Méric de Bellefon";
40374981 };
4982+ henkkalkwater = {
4983+ email = "chris+nixpkgs@netsoj.nl";
4984+ github = "HenkKalkwater";
4985+ githubId = 4262067;
4986+ matrix = "@chris:netsoj.nl";
4987+ name = "Chris Josten";
4988+ };
40384989 henrikolsson = {
40394990 email = "henrik@fixme.se";
40404991 github = "henrikolsson";
@@ -4047,6 +4998,12 @@
40474998 githubId = 6430643;
40484999 name = "Henry Till";
40495000 };
5001+ heph2 = {
5002+ email = "srht@mrkeebs.eu";
5003+ github = "heph2";
5004+ githubId = 87579883;
5005+ name = "Marco";
5006+ };
40505007 herberteuler = {
40515008 email = "herberteuler@gmail.com";
40525009 github = "herberteuler";
@@ -4055,10 +5012,17 @@
40555012 };
40565013 hexa = {
40575014 email = "hexa@darmstadt.ccc.de";
5015+ matrix = "@hexa:lossy.network";
40585016 github = "mweinelt";
40595017 githubId = 131599;
40605018 name = "Martin Weinelt";
40615019 };
5020+ hexagonal-sun = {
5021+ email = "dev@mattleach.net";
5022+ github = "hexagonal-sun";
5023+ githubId = 222664;
5024+ name = "Matthew Leach";
5025+ };
40625026 hh = {
40635027 email = "hh@m-labs.hk";
40645028 github = "HarryMakes";
@@ -4077,6 +5041,12 @@
40775041 github = "higebu";
40785042 githubId = 733288;
40795043 };
5044+ hiljusti = {
5045+ name = "J.R. Hill";
5046+ email = "hiljusti@so.dang.cool";
5047+ github = "hiljusti";
5048+ githubId = 17605298;
5049+ };
40805050 hinton = {
40815051 email = "t@larkery.com";
40825052 name = "Tom Hinton";
@@ -4113,6 +5083,12 @@
41135083 fingerprint = "D618 7A03 A40A 3D56 62F5 4B46 03EF BF83 9A5F DC15";
41145084 }];
41155085 };
5086+ hleboulanger = {
5087+ email = "hleboulanger@protonmail.com";
5088+ name = "Harold Leboulanger";
5089+ github = "thbkrhsw";
5090+ githubId = 33122;
5091+ };
41165092 hlolli = {
41175093 email = "hlolli@gmail.com";
41185094 github = "hlolli";
@@ -4141,6 +5117,12 @@
41415117 githubId = 896431;
41425118 name = "Chris Hodapp";
41435119 };
5120+ hollowman6 = {
5121+ email = "hollowman@hollowman.ml";
5122+ github = "HollowMan6";
5123+ githubId = 43995067;
5124+ name = "Songlin Jiang";
5125+ };
41445126 holymonson = {
41455127 email = "holymonson@gmail.com";
41465128 github = "holymonson";
@@ -4161,6 +5143,7 @@
41615143 };
41625144 hoverbear = {
41635145 email = "operator+nix@hoverbear.org";
5146+ matrix = "@hoverbear:matrix.org";
41645147 github = "hoverbear";
41655148 githubId = 130903;
41665149 name = "Ana Hobden";
@@ -4171,12 +5154,24 @@
41715154 github = "HolgerPeters";
41725155 githubId = 4097049;
41735156 };
5157+ hqurve = {
5158+ email = "hqurve@outlook.com";
5159+ github = "hqurve";
5160+ githubId = 53281855;
5161+ name = "hqurve";
5162+ };
41745163 hrdinka = {
41755164 email = "c.nix@hrdinka.at";
41765165 github = "hrdinka";
41775166 githubId = 1436960;
41785167 name = "Christoph Hrdinka";
41795168 };
5169+ hrhino = {
5170+ email = "hora.rhino@gmail.com";
5171+ github = "hrhino";
5172+ githubId = 28076058;
5173+ name = "Harrison Houghton";
5174+ };
41805175 hschaeidt = {
41815176 email = "he.schaeidt@gmail.com";
41825177 github = "hschaeidt";
@@ -4207,6 +5202,16 @@
42075202 githubId = 12491746;
42085203 name = "Masato Yonekawa";
42095204 };
5205+ hyshka = {
5206+ name = "Bryan Hyshka";
5207+ email = "bryan@hyshka.com";
5208+ github = "hyshka";
5209+ githubId = 2090758;
5210+ keys = [{
5211+ longkeyid = "rsa2048/0xDB2D93D1BFAAA6EA";
5212+ fingerprint = "24F4 1925 28C4 8797 E539 F247 DB2D 93D1 BFAA A6EA";
5213+ }];
5214+ };
42105215 hyzual = {
42115216 email = "hyzual@gmail.com";
42125217 github = "Hyzual";
@@ -4225,8 +5230,19 @@
42255230 githubId = 2789926;
42265231 name = "Imran Hossain";
42275232 };
5233+ iagoq = {
5234+ email = "18238046+iagocq@users.noreply.github.com";
5235+ github = "iagocq";
5236+ githubId = 18238046;
5237+ name = "Iago Manoel Brito";
5238+ keys = [{
5239+ longkeyid = "rsa4096/0x35D39F9A9A1BC8DA";
5240+ fingerprint = "DF90 9D58 BEE4 E73A 1B8C 5AF3 35D3 9F9A 9A1B C8DA";
5241+ }];
5242+ };
42285243 iammrinal0 = {
42295244 email = "nixpkgs@mrinalpurohit.in";
5245+ matrix = "@iammrinal0:nixos.dev";
42305246 github = "iammrinal0";
42315247 githubId = 890062;
42325248 name = "Mrinal";
@@ -4255,6 +5271,13 @@
42555271 githubId = 3661115;
42565272 name = "Ingo Blechschmidt";
42575273 };
5274+ icy-thought = {
5275+ name = "Icy-Thought";
5276+ email = "gilganyx@pm.me";
5277+ matrix = "@gilganix:matrix.org";
5278+ github = "Icy-Thought";
5279+ githubId = 53710398;
5280+ };
42585281 idontgetoutmuch = {
42595282 email = "dominic@steinitz.org";
42605283 github = "idontgetoutmuch";
@@ -4291,6 +5314,13 @@
42915314 githubId = 36193715;
42925315 name = "Lassi Haasio";
42935316 };
5317+ ilkecan = {
5318+ email = "ilkecan@protonmail.com";
5319+ matrix = "@ilkecan:matrix.org";
5320+ github = "ilkecan";
5321+ githubId = 40234257;
5322+ name = "ilkecan bozdogan";
5323+ };
42945324 illegalprime = {
42955325 email = "themichaeleden@gmail.com";
42965326 github = "illegalprime";
@@ -4321,6 +5351,12 @@
43215351 githubId = 592849;
43225352 name = "Ilya Kolpakov";
43235353 };
5354+ ilyakooo0 = {
5355+ name = "Ilya Kostyuchenko";
5356+ email = "ilyakooo0@gmail.com";
5357+ github = "ilyakooo0";
5358+ githubId = 6209627;
5359+ };
43245360 imalison = {
43255361 email = "IvanMalison@gmail.com";
43265362 github = "IvanMalison";
@@ -4333,6 +5369,12 @@
43335369 githubId = 993484;
43345370 name = "Greg Hale";
43355371 };
5372+ imgabe = {
5373+ email = "gabrielpmonte@hotmail.com";
5374+ github = "imgabe";
5375+ githubId = 24387926;
5376+ name = "Gabriel Pereira";
5377+ };
43365378 imlonghao = {
43375379 email = "nixos@esd.cc";
43385380 github = "imlonghao";
@@ -4341,6 +5383,7 @@
43415383 };
43425384 immae = {
43435385 email = "ismael@bouya.org";
5386+ matrix = "@immae:immae.eu";
43445387 github = "immae";
43455388 githubId = 510202;
43465389 name = "Ismaël Bouya";
@@ -4351,8 +5394,15 @@
43515394 githubId = 4085046;
43525395 name = "Imuli";
43535396 };
5397+ ineol = {
5398+ email = "leo.stefanesco@gmail.com";
5399+ github = "ineol";
5400+ githubId = 37965;
5401+ name = "Léo Stefanesco";
5402+ };
43545403 infinisil = {
43555404 email = "contact@infinisil.com";
5405+ matrix = "@infinisil:matrix.org";
43565406 github = "infinisil";
43575407 githubId = 20525370;
43585408 name = "Silvan Mosberger";
@@ -4370,6 +5420,7 @@
43705420 irenes = {
43715421 name = "Irene Knapp";
43725422 email = "ireneista@gmail.com";
5423+ matrix = "@irenes:matrix.org";
43735424 github = "IreneKnapp";
43745425 githubId = 157678;
43755426 keys = [{
@@ -4393,6 +5444,13 @@
43935444 fingerprint = "1412 816B A9FA F62F D051 1975 D3E1 B013 B463 1293";
43945445 }];
43955446 };
5447+ ius = {
5448+ email = "j.de.gram@gmail.com";
5449+ name = "Joerie de Gram";
5450+ matrix = "@ius:nltrix.net";
5451+ github = "ius";
5452+ githubId = 529626;
5453+ };
43965454 ivan = {
43975455 email = "ivan@ludios.org";
43985456 github = "ivan";
@@ -4426,7 +5484,7 @@
44265484 }];
44275485 };
44285486 ivankovnatsky = {
4429− email = "ikovnatsky@protonmail.ch";
5487+ email = "75213+ivankovnatsky@users.noreply.github.com";
44305488 github = "ivankovnatsky";
44315489 githubId = 75213;
44325490 name = "Ivan Kovnatsky";
@@ -4441,6 +5499,12 @@
44415499 githubId = 41924494;
44425500 name = "Ivar";
44435501 };
5502+ iwanb = {
5503+ email = "tracnar@gmail.com";
5504+ github = "iwanb";
5505+ githubId = 4035835;
5506+ name = "Iwan";
5507+ };
44445508 ixmatus = {
44455509 email = "parnell@digitalmentat.com";
44465510 github = "ixmatus";
@@ -4459,6 +5523,12 @@
44595523 githubId = 26877687;
44605524 name = "Yurii Izorkin";
44615525 };
5526+ j0xaf = {
5527+ email = "j0xaf@j0xaf.de";
5528+ name = "Jörn Gersdorf";
5529+ github = "j0xaf";
5530+ githubId = 932697;
5531+ };
44625532 j0hax = {
44635533 name = "Johannes Arnold";
44645534 email = "johannes.arnold@stud.uni-hannover.de";
@@ -4483,6 +5553,18 @@
44835553 githubId = 6874204;
44845554 name = "Jason Carr";
44855555 };
5556+ j-brn = {
5557+ email = "me@bricker.io";
5558+ github = "j-brn";
5559+ githubId = 40566146;
5560+ name = "Jonas Braun";
5561+ };
5562+ j-hui = {
5563+ email = "j-hui@cs.columbia.edu";
5564+ github = "j-hui";
5565+ githubId = 11800204;
5566+ name = "John Hui";
5567+ };
44865568 j-keck = {
44875569 email = "jhyphenkeck@gmail.com";
44885570 github = "j-keck";
@@ -4567,6 +5649,12 @@
45675649 githubId = 488556;
45685650 name = "Javier Aguirre";
45695651 };
5652+ jayesh-bhoot = {
5653+ name = "Jayesh Bhoot";
5654+ email = "jayesh@bhoot.sh";
5655+ github = "jayesh-bhoot";
5656+ githubId = 1915507;
5657+ };
45705658 jb55 = {
45715659 email = "jb55@jb55.com";
45725660 github = "jb55";
@@ -4581,6 +5669,7 @@
45815669 };
45825670 jbedo = {
45835671 email = "cu@cua0.org";
5672+ matrix = "@jb:vk3.wtf";
45845673 github = "jbedo";
45855674 githubId = 372912;
45865675 name = "Justin Bedő";
@@ -4591,30 +5680,52 @@
45915680 githubId = 221929;
45925681 name = "Jean-Baptiste Giraudeau";
45935682 };
5683+ jc = {
5684+ name = "Josh Cooper";
5685+ email = "josh@cooper.is";
5686+ github = "joshua-cooper";
5687+ githubId = 35612334;
5688+ };
5689+ jceb = {
5690+ name = "jceb";
5691+ email = "jceb@e-jc.de";
5692+ github = "jceb";
5693+ githubId = 101593;
5694+ };
45945695 jchw = {
45955696 email = "johnwchadwick@gmail.com";
45965697 github = "jchv";
45975698 githubId = 938744;
45985699 name = "John Chadwick";
45995700 };
5701+ jcouyang = {
5702+ email = "oyanglulu@gmail.com";
5703+ github = "jcouyang";
5704+ githubId = 1235045;
5705+ name = "Jichao Ouyang";
5706+ keys = [{
5707+ longkeyid = "rsa2048/0xDA8B833B52604E63";
5708+ fingerprint = "A506 C38D 5CC8 47D0 DF01 134A DA8B 833B 5260 4E63";
5709+ }];
5710+ };
46005711 jcumming = {
46015712 email = "jack@mudshark.org";
46025713 github = "jcumming";
46035714 githubId = 1982341;
46045715 name = "Jack Cummings";
46055716 };
4606− jD91mZM2 = {
4607− email = "me@krake.one";
4608− github = "jD91mZM2";
4609− githubId = 12830969;
4610− name = "jD91mZM2";
4611− };
46125717 jdagilliland = {
46135718 email = "jdagilliland@gmail.com";
46145719 github = "jdagilliland";
46155720 githubId = 1383440;
46165721 name = "Jason Gilliland";
46175722 };
5723+ jdahm = {
5724+ email = "johann.dahm@gmail.com";
5725+ github = "jdahm";
5726+ githubId = 68032;
5727+ name = "Johann Dahm";
5728+ };
46185729 jdanek = {
46195730 email = "jdanek@redhat.com";
46205731 github = "jdanekrh";
@@ -4637,12 +5748,30 @@
46375748 githubId = 117874;
46385749 name = "Jeroen de Haas";
46395750 };
5751+ jdreaver = {
5752+ email = "johndreaver@gmail.com";
5753+ github = "jdreaver";
5754+ githubId = 1253071;
5755+ name = "David Reaver";
5756+ };
46405757 jduan = {
46415758 name = "Jingjing Duan";
46425759 email = "duanjingjing@gmail.com";
46435760 github = "jduan";
46445761 githubId = 452450;
46455762 };
5763+ jdupak = {
5764+ name = "Jakub Dupak";
5765+ email = "dev@jakubdupak.com";
5766+ github = "jdupak";
5767+ githubId = 22683640;
5768+ };
5769+ jecaro = {
5770+ email = "jeancharles.quillet@gmail.com";
5771+ github = "jecaro";
5772+ githubId = 17029738;
5773+ name = "Jean-Charles Quillet";
5774+ };
46465775 jefdaj = {
46475776 email = "jefdaj@gmail.com";
46485777 github = "jefdaj";
@@ -4691,6 +5820,16 @@
46915820 githubId = 143075;
46925821 name = "James Felix Black";
46935822 };
5823+ jfchevrette = {
5824+ email = "jfchevrette@gmail.com";
5825+ github = "jfchevrette";
5826+ githubId = 3001;
5827+ name = "Jean-Francois Chevrette";
5828+ keys = [{
5829+ longkeyid = "rsa4096/0x67A0585801290DC6";
5830+ fingerprint = "B612 96A9 498E EECD D5E9 C0F0 67A0 5858 0129 0DC6";
5831+ }];
5832+ };
46945833 jflanglois = {
46955834 email = "yourstruly@julienlanglois.me";
46965835 github = "jflanglois";
@@ -4706,6 +5845,7 @@
47065845 jfroche = {
47075846 name = "Jean-François Roche";
47085847 email = "jfroche@pyxel.be";
5848+ matrix = "@jfroche:matrix.pyxel.cloud";
47095849 github = "jfroche";
47105850 githubId = 207369;
47115851 keys = [{
@@ -4713,6 +5853,12 @@
47135853 fingerprint = "7EB1 C02A B62B B464 6D7C E4AE D1D0 9DE1 69EA 19A0";
47145854 }];
47155855 };
5856+ jgart = {
5857+ email = "jgart@dismail.de";
5858+ github = "jgarte";
5859+ githubId = 47760695;
5860+ name = "Jorge Gomez";
5861+ };
47165862 jgeerds = {
47175863 email = "jascha@geerds.org";
47185864 github = "jgeerds";
@@ -4775,10 +5921,17 @@
47755921 };
47765922 jk = {
47775923 email = "hello+nixpkgs@j-k.io";
5924+ matrix = "@j-k:matrix.org";
47785925 github = "06kellyjac";
47795926 githubId = 9866621;
47805927 name = "Jack";
47815928 };
5929+ jkarlson = {
5930+ email = "jekarlson@gmail.com";
5931+ github = "jkarlson";
5932+ githubId = 1204734;
5933+ name = "Emil Karlson";
5934+ };
47825935 jlesquembre = {
47835936 email = "jl@lafuente.me";
47845937 github = "jlesquembre";
@@ -4809,12 +5962,42 @@
48095962 githubId = 8900;
48105963 name = "Johan Magnus Jonsson";
48115964 };
5965+ jmc-figueira = {
5966+ email = "business+nixos@jmc-figueira.dev";
5967+ github = "jmc-figueira";
5968+ githubId = 6634716;
5969+ name = "João Figueira";
5970+ keys = [
5971+ # GitHub signing key
5972+ {
5973+ longkeyid = "rsa4096/0xDC7AE56AE98E02D7";
5974+ fingerprint = "EC08 7AA3 DEAD A972 F015 6371 DC7A E56A E98E 02D7";
5975+ }
5976+ # Email encryption
5977+ {
5978+ longkeyid = "ed25519/0x197F9A632D139E30";
5979+ fingerprint = "816D 23F5 E672 EC58 7674 4A73 197F 9A63 2D13 9E30";
5980+ }
5981+ ];
5982+ };
48125983 jmettes = {
48135984 email = "jonathan@jmettes.com";
48145985 github = "jmettes";
48155986 githubId = 587870;
48165987 name = "Jonathan Mettes";
48175988 };
5989+ jmgilman = {
5990+ email = "joshuagilman@gmail.com";
5991+ github = "jmgilman";
5992+ githubId = 2308444;
5993+ name = "Joshua Gilman";
5994+ };
5995+ jo1gi = {
5996+ email = "joakimholm@protonmail.com";
5997+ github = "jo1gi";
5998+ githubId = 26695750;
5999+ name = "Joakim Holm";
6000+ };
48186001 joachifm = {
48196002 email = "joachifm@fastmail.fm";
48206003 github = "joachifm";
@@ -4863,6 +6046,7 @@
48636046 };
48646047 joepie91 = {
48656048 email = "admin@cryto.net";
6049+ matrix = "@joepie91:pixie.town";
48666050 name = "Sven Slootweg";
48676051 github = "joepie91";
48686052 githubId = 1663259;
@@ -4909,6 +6093,12 @@
49096093 githubId = 8735102;
49106094 name = "John Ramsden";
49116095 };
6096+ johnrichardrinehart = {
6097+ email = "johnrichardrinehart@gmail.com";
6098+ github = "johnrichardrinehart";
6099+ githubId = 6321578;
6100+ name = "John Rinehart";
6101+ };
49126102 johntitor = {
49136103 email = "huyuumi.dev@gmail.com";
49146104 github = "JohnTitor";
@@ -4918,6 +6108,7 @@
49186108 jojosch = {
49196109 name = "Johannes Schleifenbaum";
49206110 email = "johannes@js-webcoding.de";
6111+ matrix = "@jojosch:jswc.de";
49216112 github = "jojosch";
49226113 githubId = 327488;
49236114 keys = [{
@@ -4956,6 +6147,7 @@
49566147 };
49576148 jonringer = {
49586149 email = "jonringer117@gmail.com";
6150+ matrix = "@jonringer:matrix.org";
49596151 github = "jonringer";
49606152 githubId = 7673602;
49616153 name = "Jonathan Ringer";
@@ -4996,6 +6188,12 @@
49966188 githubId = 20675;
49976189 name = "Joël Perras";
49986190 };
6191+ jpetrucciani = {
6192+ email = "j@cobi.dev";
6193+ github = "jpetrucciani";
6194+ githubId = 8117202;
6195+ name = "Jacobi Petrucciani";
6196+ };
49996197 jpierre03 = {
50006198 email = "nix@prunetwork.fr";
50016199 github = "jpierre03";
@@ -5020,8 +6218,15 @@
50206218 githubId = 4611077;
50216219 name = "Raymond Gauthier";
50226220 };
6221+ jrpotter = {
6222+ email = "jrpotter2112@gmail.com";
6223+ github = "jrpotter";
6224+ githubId = 3267697;
6225+ name = "Joshua Potter";
6226+ };
50236227 jschievink = {
50246228 email = "jonasschievink@gmail.com";
6229+ matrix = "@jschievink:matrix.org";
50256230 github = "jonas-schievink";
50266231 githubId = 1786438;
50276232 name = "Jonas Schievink";
@@ -5038,6 +6243,13 @@
50386243 githubId = 107689;
50396244 name = "Josh Holland";
50406245 };
6246+ jsierles = {
6247+ email = "joshua@hey.com";
6248+ matrix = "@jsierles:matrix.org";
6249+ name = "Joshua Sierles";
6250+ github = "jsierles";
6251+ githubId = 82;
6252+ };
50416253 jtcoolen = {
50426254 email = "jtcoolen@pm.me";
50436255 name = "Julien Coolen";
@@ -5056,22 +6268,35 @@
50566268 };
50576269 jtojnar = {
50586270 email = "jtojnar@gmail.com";
6271+ matrix = "@jtojnar:matrix.org";
50596272 github = "jtojnar";
50606273 githubId = 705123;
50616274 name = "Jan Tojnar";
50626275 };
50636276 juaningan = {
50646277 email = "juaningan@gmail.com";
5065− github = "juaningan";
6278+ github = "uningan";
50666279 githubId = 810075;
50676280 name = "Juan Rodal";
50686281 };
6282+ juboba = {
6283+ email = "juboba@gmail.com";
6284+ github = "juboba";
6285+ githubId = 1189739;
6286+ name = "Julio Borja Barra";
6287+ };
50696288 juliendehos = {
50706289 email = "dehos@lisic.univ-littoral.fr";
50716290 github = "juliendehos";
50726291 githubId = 11947756;
50736292 name = "Julien Dehos";
50746293 };
6294+ julienmalka = {
6295+ email = "julien.malka@me.com";
6296+ github = "JulienMalka";
6297+ githubId = 1792886;
6298+ name = "Julien Malka";
6299+ };
50756300 julm = {
50766301 email = "julm+nixpkgs@sourcephile.fr";
50776302 github = "ju1m";
@@ -5084,6 +6309,12 @@
50846309 githubId = 39434424;
50856310 name = "Felix Springer";
50866311 };
6312+ junjihashimoto = {
6313+ email = "junji.hashimoto@gmail.com";
6314+ github = "junjihashimoto";
6315+ githubId = 2469618;
6316+ name = "Junji Hashimoto";
6317+ };
50876318 justinas = {
50886319 email = "justinas@justinas.org";
50896320 github = "justinas";
@@ -5102,6 +6333,16 @@
51026333 githubId = 2396926;
51036334 name = "Justin Woo";
51046335 };
6336+ jvanbruegge = {
6337+ email = "supermanitu@gmail.com";
6338+ github = "jvanbruegge";
6339+ githubId = 1529052;
6340+ name = "Jan van Brügge";
6341+ keys = [{
6342+ longkeyid = "rsa4096/0x366572BE7D6C78A2";
6343+ fingerprint = "3513 5CE5 77AD 711F 3825 9A99 3665 72BE 7D6C 78A2";
6344+ }];
6345+ };
51056346 jwatt = {
51066347 email = "jwatt@broken.watch";
51076348 github = "jjwatt";
@@ -5124,12 +6365,28 @@
51246365 email = "jwilberding@afiniate.com";
51256366 name = "Jordan Wilberding";
51266367 };
6368+ jwoudenberg = {
6369+ email = "nixpkgs@jasperwoudenberg.com";
6370+ github = "jwoudenberg";
6371+ githubId = 1525551;
6372+ name = "Jasper Woudenberg";
6373+ };
51276374 jwygoda = {
51286375 email = "jaroslaw@wygoda.me";
51296376 github = "jwygoda";
51306377 githubId = 20658981;
51316378 name = "Jarosław Wygoda";
51326379 };
6380+ jyooru = {
6381+ email = "joel@joel.tokyo";
6382+ github = "jyooru";
6383+ githubId = 63786778;
6384+ name = "Joel";
6385+ keys = [{
6386+ longkeyid = "rsa4096/18550BD205E9EF64";
6387+ fingerprint = "9148 DC9E F4D5 3EB6 A30E 8EF0 1855 0BD2 05E9 EF64";
6388+ }];
6389+ };
51336390 jyp = {
51346391 email = "jeanphilippe.bernardy@gmail.com";
51356392 github = "jyp";
@@ -5142,6 +6399,19 @@
51426399 githubId = 66669;
51436400 name = "Jeff Zellner";
51446401 };
6402+ k4leg = {
6403+ name = "k4leg";
6404+ email = "python.bogdan@gmail.com";
6405+ github = "k4leg";
6406+ githubId = 39882583;
6407+ };
6408+ k900 = {
6409+ name = "Ilya K.";
6410+ email = "me@0upti.me";
6411+ github = "K900";
6412+ githubId = 386765;
6413+ matrix = "@k900:0upti.me";
6414+ };
51456415 kaction = {
51466416 name = "Dmitry Bogatov";
51476417 email = "KAction@disroot.org";
@@ -5160,6 +6430,7 @@
51606430 };
51616431 kalbasit = {
51626432 email = "wael.nasreddine@gmail.com";
6433+ matrix = "@kalbasit:matrix.org";
51636434 github = "kalbasit";
51646435 githubId = 87115;
51656436 name = "Wael Nasreddine";
@@ -5192,6 +6463,12 @@
51926463 githubId = 3831860;
51936464 name = "Arnold Krille";
51946465 };
6466+ kanashimia = {
6467+ email = "chad@redpilled.dev";
6468+ github = "kanashimia";
6469+ githubId = 56224949;
6470+ name = "Mia Kanashi";
6471+ };
51956472 karantan = {
51966473 name = "Gasper Vozel";
51976474 email = "karantan@gmail.com";
@@ -5226,6 +6503,12 @@
52266503 githubId = 37185887;
52276504 name = "Calvin Kim";
52286505 };
6506+ keldu = {
6507+ email = "mail@keldu.de";
6508+ github = "keldu";
6509+ githubId = 15373888;
6510+ name = "Claudius Holeksa";
6511+ };
52296512 kennyballou = {
52306513 email = "kb@devnulllabs.io";
52316514 github = "kennyballou";
@@ -5250,6 +6533,7 @@
52506533 };
52516534 kevincox = {
52526535 email = "kevincox@kevincox.ca";
6536+ matrix = "@kevincox:matrix.org";
52536537 github = "kevincox";
52546538 githubId = 494012;
52556539 name = "Kevin Cox";
@@ -5260,6 +6544,12 @@
52606544 githubId = 209729;
52616545 name = "Kevin Griffin";
52626546 };
6547+ kevink = {
6548+ email = "kevin@kevink.dev";
6549+ github = "Unkn0wnCat";
6550+ githubId = 8211181;
6551+ name = "Kevin Kandlbinder";
6552+ };
52636553 kfollesdal = {
52646554 email = "kfollesdal@gmail.com";
52656555 github = "kfollesdal";
@@ -5271,13 +6561,23 @@
52716561 github = "kho-dialga";
52726562 githubId = 55767703;
52736563 name = "Iván Brito";
5274− };
6564+ };
52756565 khumba = {
52766566 email = "bog@khumba.net";
52776567 github = "khumba";
52786568 githubId = 788813;
52796569 name = "Bryan Gardiner";
52806570 };
6571+ khushraj = {
6572+ email = "khushraj.rathod@gmail.com";
6573+ github = "KhushrajRathod";
6574+ githubId = 44947946;
6575+ name = "Khushraj Rathod";
6576+ keys = [{
6577+ longkeyid = "rsa2048/0xB77B2A40E7702F19";
6578+ fingerprint = "1988 3FD8 EA2E B4EC 0A93 1E22 B77B 2A40 E770 2F19";
6579+ }];
6580+ };
52816581 KibaFox = {
52826582 email = "kiba.fox@foxypossibilities.com";
52836583 github = "KibaFox";
@@ -5290,6 +6590,12 @@
52906590 githubId = 25607;
52916591 name = "Raimon Grau";
52926592 };
6593+ kidonng = {
6594+ email = "hi@xuann.wang";
6595+ github = "kidonng";
6596+ githubId = 44045911;
6597+ name = "Kid";
6598+ };
52936599 kierdavis = {
52946600 email = "kierdavis@gmail.com";
52956601 github = "kierdavis";
@@ -5334,6 +6640,7 @@
53346640 };
53356641 kirelagin = {
53366642 email = "kirelagin@gmail.com";
6643+ matrix = "@kirelagin:matrix.org";
53376644 github = "kirelagin";
53386645 githubId = 451835;
53396646 name = "Kirill Elagin";
@@ -5350,6 +6657,16 @@
53506657 githubId = 148352;
53516658 name = "Jim Fowler";
53526659 };
6660+ kittywitch = {
6661+ email = "kat@kittywit.ch";
6662+ github = "kittywitch";
6663+ githubId = 67870215;
6664+ name = "kat witch";
6665+ keys = [{
6666+ longkeyid = "rsa4096/0x7248991EFA8EFBEE";
6667+ fingerprint = "01F5 0A29 D4AA 9117 5A11 BDB1 7248 991E FA8E FBEE";
6668+ }];
6669+ };
53536670 kiwi = {
53546671 email = "envy1988@gmail.com";
53556672 github = "Kiwi";
@@ -5366,10 +6683,22 @@
53666683 githubId = 8260207;
53676684 name = "Karthik Iyengar";
53686685 };
6686+ kjeremy = {
6687+ email = "kjeremy@gmail.com";
6688+ name = "Jeremy Kolb";
6689+ github = "kjeremy";
6690+ githubId = 4325700;
6691+ };
53696692 kkallio = {
53706693 email = "tierpluspluslists@gmail.com";
53716694 name = "Karn Kallio";
53726695 };
6696+ klden = {
6697+ name = "Kenzyme Le";
6698+ email = "kl@kenzymele.com";
6699+ github = "klDen";
6700+ githubId = 5478260;
6701+ };
53736702 klntsky = {
53746703 email = "klntsky@gmail.com";
53756704 name = "Vladimir Kalnitsky";
@@ -5377,7 +6706,8 @@
53776706 githubId = 18447310;
53786707 };
53796708 kloenk = {
5380− email = "me@kloenk.de";
6709+ email = "me@kloenk.dev";
6710+ matrix = "@kloenk:petabyte.dev";
53816711 name = "Finn Behrens";
53826712 github = "kloenk";
53836713 githubId = 12898828;
@@ -5400,7 +6730,7 @@
54006730 };
54016731
54026732 kmein = {
5403− email = "kieran.meinhardt@gmail.com";
6733+ email = "kmein@posteo.de";
54046734 name = "Kierán Meinhardt";
54056735 github = "kmein";
54066736 githubId = 10352507;
@@ -5453,6 +6783,12 @@
54536783 githubId = 15692230;
54546784 name = "Muhammad Herdiansyah";
54556785 };
6786+ koozz = {
6787+ email = "koozz@linux.com";
6788+ github = "koozz";
6789+ githubId = 264372;
6790+ name = "Jan van den Berg";
6791+ };
54566792 koral = {
54576793 email = "koral@mailoo.org";
54586794 github = "k0ral";
@@ -5477,6 +6813,12 @@
54776813 githubId = 787421;
54786814 name = "Kevin Quick";
54796815 };
6816+ kradalby = {
6817+ name = "Kristoffer Dalby";
6818+ email = "kristoffer@dalby.cc";
6819+ github = "kradalby";
6820+ githubId = 98431;
6821+ };
54806822 kraem = {
54816823 email = "me@kraem.xyz";
54826824 github = "kraem";
@@ -5489,6 +6831,12 @@
54896831 githubId = 735008;
54906832 name = "Louis Taylor";
54916833 };
6834+ kranzes = {
6835+ email = "personal@ilanjoselevich.com";
6836+ github = "Kranzes";
6837+ githubId = 56614642;
6838+ name = "Ilan Joselevich";
6839+ };
54926840 krav = {
54936841 email = "kristoffer@microdisko.no";
54946842 github = "krav";
@@ -5537,11 +6885,17 @@
55376885 githubId = 99639;
55386886 name = "Pawel Kruszewski";
55396887 };
5540− ktosiek = {
5541− email = "tomasz.kontusz@gmail.com";
5542− github = "ktosiek";
5543− githubId = 278013;
5544− name = "Tomasz Kontusz";
6888+ kubukoz = {
6889+ email = "kubukoz@gmail.com";
6890+ github = "kubukoz";
6891+ githubId = 894884;
6892+ name = "Jakub Kozłowski";
6893+ };
6894+ kurnevsky = {
6895+ email = "kurnevsky@gmail.com";
6896+ github = "kurnevsky";
6897+ githubId = 2943605;
6898+ name = "Evgeny Kurnevsky";
55456899 };
55466900 kuznero = {
55476901 email = "roman@kuznero.com";
@@ -5549,6 +6903,13 @@
55496903 githubId = 449813;
55506904 name = "Roman Kuznetsov";
55516905 };
6906+ kvark = {
6907+ name = "Dzmitry Malyshau";
6908+ email = "kvark@fastmail.com";
6909+ matrix = "@kvark:matrix.org";
6910+ github = "kvark";
6911+ githubId = 107301;
6912+ };
55526913 kwohlfahrt = {
55536914 email = "kai.wohlfahrt@gmail.com";
55546915 github = "kwohlfahrt";
@@ -5567,7 +6928,7 @@
55676928 };
55686929 kylesferrazza = {
55696930 name = "Kyle Sferrazza";
5570− email = "kyle.sferrazza@gmail.com";
6931+ email = "nixpkgs@kylesferrazza.com";
55716932
55726933 github = "kylesferrazza";
55736934 githubId = 6677292;
@@ -5579,6 +6940,7 @@
55796940 };
55806941 l-as = {
55816942 email = "las@protonmail.ch";
6943+ matrix = "@Las:matrix.org";
55826944 github = "L-as";
55836945 githubId = 22075344;
55846946 keys = [{
@@ -5589,16 +6951,33 @@
55896951 };
55906952 l3af = {
55916953 email = "L3afMeAlon3@gmail.com";
6954+ matrix = "@L3afMe:matrix.org";
55926955 github = "L3afMe";
55936956 githubId = 72546287;
55946957 name = "L3af";
55956958 };
6959+ lach = {
6960+ email = "iam@lach.pw";
6961+ github = "CertainLach";
6962+ githubId = 6235312;
6963+ keys = [{
6964+ longkeyid = "rsa3072/40B5D6948143175F";
6965+ fingerprint = "323C 95B5 DBF7 2D74 8570 C0B7 40B5 D694 8143 175F";
6966+ }];
6967+ name = "Yaroslav Bolyukin";
6968+ };
55966969 laikq = {
55976970 email = "gwen@quasebarth.de";
55986971 github = "laikq";
55996972 githubId = 55911173;
56006973 name = "Gwendolyn Quasebarth";
56016974 };
6975+ lammermann = {
6976+ email = "k.o.b.e.r@web.de";
6977+ github = "lammermann";
6978+ githubId = 695526;
6979+ name = "Benjamin Kober";
6980+ };
56026981 larsr = {
56036982 email = "Lars.Rasmusson@gmail.com";
56046983 github = "larsr";
@@ -5619,6 +6998,7 @@
56196998 };
56206999 lassulus = {
56217000 email = "lassulus@gmail.com";
7001+ matrix = "@lassulus:nixos.dev";
56227002 github = "Lassulus";
56237003 githubId = 621759;
56247004 name = "Lassulus";
@@ -5660,6 +7040,18 @@
56607040 githubId = 1104419;
56617041 name = "Lucas Hoffmann";
56627042 };
7043+ lucasew = {
7044+ email = "lucas59356@gmail.com";
7045+ github = "lucasew";
7046+ githubId = 15693688;
7047+ name = "Lucas Eduardo Wendt";
7048+ };
7049+ lde = {
7050+ email = "lilian.deloche@puck.fr";
7051+ github = "lde";
7052+ githubId = 1447020;
7053+ name = "Lilian Deloche";
7054+ };
56637055 ldelelis = {
56647056 email = "ldelelis@est.frba.utn.edu.ar";
56657057 github = "ldelelis";
@@ -5674,6 +7066,7 @@
56747066 };
56757067 ldesgoui = {
56767068 email = "ldesgoui@gmail.com";
7069+ matrix = "@ldesgoui:matrix.org";
56777070 github = "ldesgoui";
56787071 githubId = 2472678;
56797072 name = "Lucas Desgouilles";
@@ -5714,11 +7107,27 @@
57147107 githubId = 4158274;
57157108 name = "Michiel Leenaars";
57167109 };
5717− legendofmiracles = {
7110+ lom = {
57187111 email = "legendofmiracles@protonmail.com";
7112+ matrix = "@legendofmiracles:matrix.org";
57197113 github = "legendofmiracles";
57207114 githubId = 30902201;
57217115 name = "legendofmiracles";
7116+ keys = [{
7117+ longkeyid = "rsa4096/0x19B082B3DEFE5451";
7118+ fingerprint = "CC50 F82C 985D 2679 0703 AF15 19B0 82B3 DEFE 5451";
7119+ }];
7120+ };
7121+ leixb = {
7122+ email = "abone9999+nixpkgs@gmail.com";
7123+ matrix = "@leix_b:matrix.org";
7124+ github = "LeixB";
7125+ githubId = 17183803;
7126+ name = "Aleix Boné";
7127+ keys = [{
7128+ longkeyid = "rsa4096/0xFC035BB2BB28E15D";
7129+ fingerprint = "63D3 F436 EDE8 7E1F 1292 24AF FC03 5BB2 BB28 E15D";
7130+ }];
57227131 };
57237132 lejonet = {
57247133 email = "daniel@kuehn.se";
@@ -5764,6 +7173,7 @@
57647173 };
57657174 lewo = {
57667175 email = "lewo@abesis.fr";
7176+ matrix = "@lewo:matrix.org";
57677177 github = "nlewo";
57687178 githubId = 3425311;
57697179 name = "Antoine Eiche";
@@ -5808,6 +7218,13 @@
58087218 githubId = 1769386;
58097219 name = "Liam Diprose";
58107220 };
7221+ libjared = {
7222+ email = "jared@perrycode.com";
7223+ github = "libjared";
7224+ githubId = 3746656;
7225+ matrix = "@libjared:matrix.org";
7226+ name = "Jared Perry";
7227+ };
58117228 liff = {
58127229 email = "liff@iki.fi";
58137230 github = "liff";
@@ -5838,18 +7255,19 @@
58387255 githubId = 714;
58397256 name = "Lily Ballard";
58407257 };
7258+ lilyinstarlight = {
7259+ email = "lily@lily.flowers";
7260+ matrix = "@lily:lily.flowers";
7261+ github = "lilyinstarlight";
7262+ githubId = 298109;
7263+ name = "Lily Foster";
7264+ };
58417265 limeytexan = {
58427266 email = "limeytexan@gmail.com";
58437267 github = "limeytexan";
58447268 githubId = 36448130;
58457269 name = "Michael Brantley";
58467270 };
5847− linarcx = {
5848− email = "linarcx@gmail.com";
5849− github = "linarcx";
5850− githubId = 10884422;
5851− name = "Kaveh Ahangar";
5852− };
58537271 linc01n = {
58547272 email = "git@lincoln.hk";
58557273 github = "linc01n";
@@ -5862,6 +7280,12 @@
58627280 githubId = 791115;
58637281 name = "Linquize";
58647282 };
7283+ linsui = {
7284+ email = "linsui555@gmail.com";
7285+ github = "linsui";
7286+ githubId = 36977733;
7287+ name = "linsui";
7288+ };
58657289 linus = {
58667290 email = "linusarver@gmail.com";
58677291 github = "listx";
@@ -5888,12 +7312,30 @@
58887312 fingerprint = "5B93 9CFA E8FC 4D8F E07A 3AEA DFE1 D4A0 1733 7E2A";
58897313 }];
58907314 };
7315+ lorenzleutgeb = {
7316+ email = "lorenz@leutgeb.xyz";
7317+ github = "lorenzleutgeb";
7318+ githubId = 542154;
7319+ name = "Lorenz Leutgeb";
7320+ };
58917321 luis = {
58927322 email = "luis.nixos@gmail.com";
58937323 github = "Luis-Hebendanz";
58947324 githubId = 22085373;
58957325 name = "Luis Hebendanz";
58967326 };
7327+ lunarequest = {
7328+ email = "nullarequest@vivlaid.net";
7329+ github = "Lunarequest";
7330+ githubId = 30698906;
7331+ name = "Luna D Dragon";
7332+ };
7333+ LunNova = {
7334+ email = "nixpkgs-maintainer@lunnova.dev";
7335+ github = "LunNova";
7336+ githubId = 782440;
7337+ name = "Luna Nova";
7338+ };
58977339 lionello = {
58987340 email = "lio@lunesu.com";
58997341 github = "lionello";
@@ -5930,6 +7372,29 @@
59307372 githubId = 1267527;
59317373 name = "Daniel Firth";
59327374 };
7375+ lockejan = {
7376+ email = "git@smittie.de";
7377+ matrix = "@jan:smittie.de";
7378+ github = "lockejan";
7379+ githubId = 25434434;
7380+ name = "Jan Schmitt";
7381+ keys = [{
7382+ longkeyid = "dsa2048/0xA2BC3C6F14351991";
7383+ fingerprint = "1763 9903 2D7C 5B82 5D5A 0EAD A2BC 3C6F 1435 1991";
7384+ }];
7385+ };
7386+ lodi = {
7387+ email = "anthony.lodi@gmail.com";
7388+ github = "lodi";
7389+ githubId = 918448;
7390+ name = "Anthony Lodi";
7391+ };
7392+ loicreynier = {
7393+ email = "loic@loicreynier.fr";
7394+ github = "loicreynier";
7395+ githubId = 88983487;
7396+ name = "Loïc Reynier";
7397+ };
59337398 lopsided98 = {
59347399 email = "benwolsieffer@gmail.com";
59357400 github = "lopsided98";
@@ -5962,12 +7427,13 @@
59627427 };
59637428 lovesegfault = {
59647429 email = "meurerbernardo@gmail.com";
7430+ matrix = "@lovesegfault:matrix.org";
59657431 github = "lovesegfault";
59667432 githubId = 7243783;
59677433 name = "Bernardo Meurer";
59687434 keys = [{
5969− longkeyid = "rsa4096/0xF4C0D53B8D14C246";
5970− fingerprint = "F193 7596 57D5 6DA4 CCD4 786B F4C0 D53B 8D14 C246";
7435+ longkeyid = "rsa4096/0xF4C0D53B8D14C246";
7436+ fingerprint = "F193 7596 57D5 6DA4 CCD4 786B F4C0 D53B 8D14 C246";
59717437 }];
59727438 };
59737439 lowfatcomputing = {
@@ -5976,6 +7442,12 @@
59767442 githubId = 10626;
59777443 name = "Andreas Wagner";
59787444 };
7445+ lrewega = {
7446+ email = "lrewega@c32.ca";
7447+ github = "lrewega";
7448+ githubId = 639066;
7449+ name = "Luke Rewega";
7450+ };
59797451 lromor = {
59807452 email = "leonardo.romor@gmail.com";
59817453 github = "lromor";
@@ -5988,6 +7460,7 @@
59887460 };
59897461 lschuermann = {
59907462 email = "leon.git@is.currently.online";
7463+ matrix = "@leons:is.currently.online";
59917464 github = "lschuermann";
59927465 githubId = 5341193;
59937466 name = "Leon Schuermann";
@@ -6064,6 +7537,7 @@
60647537 };
60657538 lukegb = {
60667539 email = "nix@lukegb.com";
7540+ matrix = "@lukegb:zxcvbnm.ninja";
60677541 github = "lukegb";
60687542 githubId = 246745;
60697543 name = "Luke Granger-Brown";
@@ -6074,6 +7548,12 @@
60747548 githubId = 13791;
60757549 name = "Luke Gorrie";
60767550 };
7551+ luker = {
7552+ email = "luker@fenrirproject.org";
7553+ github = "LucaFulchir";
7554+ githubId = 2486026;
7555+ name = "Luca Fulchir";
7556+ };
60777557 lumi = {
60787558 email = "lumi@pew.im";
60797559 github = "lumi-me-not";
@@ -6082,6 +7562,7 @@
60827562 };
60837563 lunik1 = {
60847564 email = "ch.nixpkgs@themaw.xyz";
7565+ matrix = "@lunik1:lunik.one";
60857566 github = "lunik1";
60867567 githubId = 13547699;
60877568 name = "Corin Hoad";
@@ -6090,6 +7571,12 @@
60907571 fingerprint = "BA3A 5886 AE6D 526E 20B4 57D6 6A37 DF94 8318 8492";
60917572 }];
60927573 };
7574+ lux = {
7575+ email = "lux@lux.name";
7576+ githubId = 1208273;
7577+ matrix = "@lux:ontheblueplanet.com";
7578+ name = "Lux";
7579+ };
60937580 luz = {
60947581 email = "luz666@daum.net";
60957582 github = "Luz";
@@ -6118,6 +7605,12 @@
61187605 email = "wheatdoge@gmail.com";
61197606 name = "Tim Liou";
61207607 };
7608+ m00wl = {
7609+ name = "Moritz Lumme";
7610+ email = "moritz.lumme@gmail.com";
7611+ github = "m00wl";
7612+ githubId = 46034439;
7613+ };
61217614 m1cr0man = {
61227615 email = "lucas+nix@m1cr0man.com";
61237616 github = "m1cr0man";
@@ -6130,6 +7623,7 @@
61307623 };
61317624 ma27 = {
61327625 email = "maximilian@mbosch.me";
7626+ matrix = "@ma27:nicht-so.sexy";
61337627 github = "ma27";
61347628 githubId = 6025220;
61357629 name = "Maximilian Bosch";
@@ -6140,12 +7634,24 @@
61407634 githubId = 36235154;
61417635 name = "Sean Haugh";
61427636 };
7637+ maaslalani = {
7638+ email = "maaslalani0@gmail.com";
7639+ github = "maaslalani";
7640+ githubId = 42545625;
7641+ name = "Maas Lalani";
7642+ };
61437643 madjar = {
61447644 email = "georges.dubus@compiletoi.net";
61457645 github = "madjar";
61467646 githubId = 109141;
61477647 name = "Georges Dubus";
61487648 };
7649+ Madouura = {
7650+ email = "madouura@gmail.com";
7651+ github = "Madouura";
7652+ githubId = 93990818;
7653+ name = "Madoura";
7654+ };
61497655 mafo = {
61507656 email = "Marc.Fontaine@gmx.de";
61517657 github = "MarcFontaine";
@@ -6194,6 +7700,12 @@
61947700 githubId = 34393802;
61957701 name = "Malte Voos";
61967702 };
7703+ malbarbo = {
7704+ email = "malbarbo@gmail.com";
7705+ github = "malbarbo";
7706+ githubId = 1678126;
7707+ name = "Marco A L Barbosa";
7708+ };
61977709 malyn = {
61987710 email = "malyn@strangeGizmo.com";
61997711 github = "malyn";
@@ -6208,12 +7720,14 @@
62087720 };
62097721 manveru = {
62107722 email = "m.fellinger@gmail.com";
7723+ matrix = "@manveru:matrix.org";
62117724 github = "manveru";
62127725 githubId = 3507;
62137726 name = "Michael Fellinger";
62147727 };
62157728 maralorn = {
62167729 email = "malte.brandy@maralorn.de";
7730+ matrix = "@maralorn:maralorn.de";
62177731 github = "maralorn";
62187732 githubId = 1651325;
62197733 name = "Malte Brandy";
@@ -6276,12 +7790,24 @@
62767790 githubId = 623509;
62777791 name = "Martijn Vermaat";
62787792 };
7793+ martinetd = {
7794+ email = "f.ktfhrvnznqxacf@noclue.notk.org";
7795+ github = "martinetd";
7796+ githubId = 1729331;
7797+ name = "Dominique Martinet";
7798+ };
62797799 martingms = {
62807800 email = "martin@mg.am";
62817801 github = "martingms";
62827802 githubId = 458783;
62837803 name = "Martin Gammelsæter";
62847804 };
7805+ martfont = {
7806+ name = "Martino Fontana";
7807+ email = "tinozzo123@tutanota.com";
7808+ github = "SuperSamus";
7809+ githubId = 40663462;
7810+ };
62857811 marzipankaiser = {
62867812 email = "nixos@gaisseml.de";
62877813 github = "marzipankaiser";
@@ -6298,6 +7824,12 @@
62987824 githubId = 775189;
62997825 name = "Jordi Masip";
63007826 };
7827+ MaskedBelgian = {
7828+ email = "michael.colicchia@imio.be";
7829+ github = "MaskedBelgian";
7830+ githubId = 29855073;
7831+ name = "Michael Colicchia";
7832+ };
63017833 matejc = {
63027834 email = "cotman.matej@gmail.com";
63037835 github = "matejc";
@@ -6336,6 +7868,7 @@
63367868 };
63377869 matthiasbeyer = {
63387870 email = "mail@beyermatthias.de";
7871+ matrix = "@musicmatze:beyermatthi.as";
63397872 github = "matthiasbeyer";
63407873 githubId = 427866;
63417874 name = "Matthias Beyer";
@@ -6352,6 +7885,16 @@
63527885 githubId = 279868;
63537886 name = "Matti Kariluoma";
63547887 };
7888+ matthewpi = {
7889+ email = "me+nix@matthewp.io";
7890+ github = "matthewpi";
7891+ githubId = 26559841;
7892+ name = "Matthew Penner";
7893+ keys = [{
7894+ longkeyid = "ed25519/0x31311906AD4CF6D6";
7895+ fingerprint = "5118 F1CC B7B0 6C17 4DD1 5267 3131 1906 AD4C F6D6";
7896+ }];
7897+ };
63557898 maurer = {
63567899 email = "matthew.r.maurer+nix@gmail.com";
63577900 github = "maurer";
@@ -6364,6 +7907,16 @@
63647907 githubId = 95194;
63657908 name = "Mauricio Scheffer";
63667909 };
7910+ max-niederman = {
7911+ email = "max@maxniederman.com";
7912+ github = "max-niederman";
7913+ githubId = 19580458;
7914+ name = "Max Niederman";
7915+ keys = [{
7916+ longkeyid = "rsa3072/0x9AED881481D8444E";
7917+ fingerprint = "1DE4 424D BF77 1192 5DC4 CF5E 9AED 8814 81D8 444E";
7918+ }];
7919+ };
63677920 maxdamantus = {
63687921 email = "maxdamantus@gmail.com";
63697922 github = "Maxdamantus";
@@ -6376,18 +7929,36 @@
63767929 githubId = 35892750;
63777930 name = "Maxine Aubrey";
63787931 };
7932+ maxhille = {
7933+ email = "mh@lambdasoup.com";
7934+ github = "maxhille";
7935+ githubId = 693447;
7936+ name = "Max Hille";
7937+ };
63797938 maxhbr = {
63807939 email = "nixos@maxhbr.dev";
63817940 github = "maxhbr";
63827941 githubId = 1187050;
63837942 name = "Maximilian Huber";
63847943 };
7944+ maximsmol = {
7945+ email = "maximsmol@gmail.com";
7946+ github = "maximsmol";
7947+ githubId = 1472826;
7948+ name = "Max Smolin";
7949+ };
63857950 maxxk = {
63867951 email = "maxim.krivchikov@gmail.com";
63877952 github = "maxxk";
63887953 githubId = 1191859;
63897954 name = "Maxim Krivchikov";
63907955 };
7956+ MayNiklas = {
7957+ email = "info@niklas-steffen.de";
7958+ github = "MayNiklas";
7959+ githubId = 44636701;
7960+ name = "Niklas Steffen";
7961+ };
63917962 mazurel = {
63927963 email = "mateusz.mazur@yahoo.com";
63937964 github = "Mazurel";
@@ -6400,12 +7971,6 @@
64007971 githubId = 2649304;
64017972 name = "M. Baeten";
64027973 };
6403− mbakke = {
6404− email = "mbakke@fastmail.com";
6405− github = "mbakke";
6406− githubId = 1269099;
6407− name = "Marius Bakke";
6408− };
64097974 mbaillie = {
64107975 email = "martin@baillie.id";
64117976 github = "martinbaillie";
@@ -6436,6 +8001,12 @@
64368001 githubId = 51356;
64378002 name = "Mathieu Boespflug";
64388003 };
8004+ mbprtpmnr = {
8005+ name = "mbprtpmnr";
8006+ email = "mbprtpmnr@pm.me";
8007+ github = "mbprtpmnr";
8008+ githubId = 88109321;
8009+ };
64398010 mbrgm = {
64408011 email = "marius@yeai.de";
64418012 github = "mbrgm";
@@ -6461,10 +8032,14 @@
64618032 name = "Matthias C. M. Troffaes";
64628033 };
64638034 McSinyx = {
6464− email = "vn.mcsinyx@gmail.com";
8035+ email = "mcsinyx@disroot.org";
64658036 github = "McSinyx";
64668037 githubId = 13689192;
64678038 name = "Nguyễn Gia Phong";
8039+ keys = [{
8040+ longkeyid = "rsa3072/0x27148B2C06A2224B";
8041+ fingerprint = "E90E 11B8 0493 343B 6132 E394 2714 8B2C 06A2 224B";
8042+ }];
64688043 };
64698044 mcwitt = {
64708045 email = "mcwitt@gmail.com";
@@ -6494,16 +8069,6 @@
64948069 fingerprint = "D709 03C8 0BE9 ACDC 14F0 3BFB 77BF E531 397E DE94";
64958070 }];
64968071 };
6497− mdsp = {
6498− github = "Mdsp9070";
6499− githubId = 44469426;
6500− name = "Matheus de Souza Pessanha";
6501− email = "matheus_pessanha2001@outlook.com";
6502− keys = [{
6503− longkeyid = "rsa4096/6DFD656220A3B849";
6504− fingerprint = "2D4D 488F 17FB FF75 664E C016 6DFD 6562 20A3 B849";
6505− }];
6506− };
65078072 meatcar = {
65088073 email = "nixpkgs@denys.me";
65098074 github = "meatcar";
@@ -6562,12 +8127,6 @@
65628127 github = "kira-bruneau";
65638128 githubId = 382041;
65648129 };
6565− meutraa = {
6566− email = "paul+nixpkgs@lost.host";
6567− name = "Paul Meredith";
6568− github = "meutraa";
6569− githubId = 68550871;
6570− };
65718130 mephistophiles = {
65728131 email = "mussitantesmortem@gmail.com";
65738132 name = "Maxim Zhukov";
@@ -6610,14 +8169,27 @@
66108169 githubId = 668926;
66118170 name = "Maximilian Güntner";
66128171 };
8172+ mh = {
8173+ email = "68288772+markus-heinrich@users.noreply.github.com";
8174+ github = "markus-heinrich";
8175+ githubId = 68288772;
8176+ name = "Markus Heinrich";
8177+ };
66138178 mhaselsteiner = {
66148179 email = "magdalena.haselsteiner@gmx.at";
66158180 github = "mhaselsteiner";
66168181 githubId = 20536514;
66178182 name = "Magdalena Haselsteiner";
66188183 };
8184+ mh182 = {
8185+ email = "mh182@chello.at";
8186+ github = "mh182";
8187+ githubId = 9980864;
8188+ name = "Max Hofer";
8189+ };
66198190 mic92 = {
66208191 email = "joerg@thalheim.io";
8192+ matrix = "@mic92:nixos.dev";
66218193 github = "mic92";
66228194 githubId = 96200;
66238195 name = "Jörg Thalheim";
@@ -6627,6 +8199,12 @@
66278199 fingerprint = "3DEE 1C55 6E1C 3DC5 54F5 875A 003F 2096 411B 5F92";
66288200 }];
66298201 };
8202+ michaeladler = {
8203+ email = "therisen06@gmail.com";
8204+ github = "michaeladler";
8205+ githubId = 1575834;
8206+ name = "Michael Adler";
8207+ };
66308208 michaelpj = {
66318209 email = "michaelpj@gmail.com";
66328210 github = "michaelpj";
@@ -6651,6 +8229,12 @@
66518229 githubId = 21156022;
66528230 name = "Michal Minář";
66538231 };
8232+ michzappa = {
8233+ email = "me@michzappa.com";
8234+ github = "michzappa";
8235+ githubId = 59343378;
8236+ name = "Michael Zappa";
8237+ };
66548238 mickours = {
66558239 email = "mickours@gmail.com<";
66568240 github = "mickours";
@@ -6659,6 +8243,7 @@
66598243 };
66608244 midchildan = {
66618245 email = "git@midchildan.org";
8246+ matrix = "@midchildan:matrix.org";
66628247 github = "midchildan";
66638248 githubId = 7343721;
66648249 name = "midchildan";
@@ -6667,6 +8252,12 @@
66678252 fingerprint = "FEF0 AE2D 5449 3482 5F06 40AA 186A 1EDA C5C6 3F83";
66688253 }];
66698254 };
8255+ mihnea-s = {
8256+ email = "mihn.stn@gmail.com";
8257+ github = "mihnea-s";
8258+ githubId = 43088426;
8259+ name = "Mihnea Stoian";
8260+ };
66708261 mikefaille = {
66718262 email = "michael@faille.io";
66728263 github = "mikefaille";
@@ -6695,18 +8286,36 @@
66958286 fingerprint = "DB43 2895 CF68 F0CE D4B7 EF60 DA01 5B05 B5A1 1B22";
66968287 }];
66978288 };
8289+ milahu = {
8290+ email = "milahu@gmail.com";
8291+ github = "milahu";
8292+ githubId = 12958815;
8293+ name = "Milan Hauth";
8294+ };
66988295 milesbreslin = {
66998296 email = "milesbreslin@gmail.com";
67008297 github = "milesbreslin";
67018298 githubId = 38543128;
67028299 name = "Miles Breslin";
67038300 };
8301+ milibopp = {
8302+ email = "contact@ebopp.de";
8303+ github = "milibopp";
8304+ githubId = 3098430;
8305+ name = "Emilia Bopp";
8306+ };
67048307 millerjason = {
67058308 email = "mailings-github@millerjason.com";
67068309 github = "millerjason";
67078310 githubId = 7610974;
67088311 name = "Jason Miller";
67098312 };
8313+ milogert = {
8314+ email = "milo@milogert.com";
8315+ github = "milogert";
8316+ githubId = 5378535;
8317+ name = "Milo Gertjejansen";
8318+ };
67108319 miltador = {
67118320 email = "miltador@yandex.ua";
67128321 name = "Vasiliy Solovey";
@@ -6751,6 +8360,17 @@
67518360 githubId = 1776903;
67528361 name = "Andrew Abbott";
67538362 };
8363+ misterio77 = {
8364+ email = "eu@misterio.me";
8365+ github = "misterio77";
8366+ githubId = 5727578;
8367+ matrix = "@misterio:matrix.org";
8368+ name = "Gabriel Fontes";
8369+ keys = [{
8370+ longkeyid = "rsa3072/0x245CAB70B4C225E9";
8371+ fingerprint = "7088 C742 1873 E0DB 97FF 17C2 245C AB70 B4C2 25E9";
8372+ }];
8373+ };
67548374 mitchmindtree = {
67558375 email = "mail@mitchellnordine.com";
67568376 github = "mitchmindtree";
@@ -6763,12 +8383,6 @@
67638383 githubId = 1001112;
67648384 name = "Marcin Janczyk";
67658385 };
6766− mjlbach = {
6767− email = "m.j.lbach@gmail.com";
6768− github = "mjlbach";
6769− githubId = 13316262;
6770− name = "Michael Lingelbach";
6771− };
67728386 mjp = {
67738387 email = "mike@mythik.co.uk";
67748388 github = "MikePlayle";
@@ -6805,6 +8419,7 @@
68058419 };
68068420 mkg20001 = {
68078421 email = "mkg20001+nix@gmail.com";
8422+ matrix = "@mkg20001:matrix.org";
68088423 github = "mkg20001";
68098424 githubId = 7735145;
68108425 name = "Maciej Krüger";
@@ -6888,6 +8503,7 @@
68888503 mohe2015 = {
68898504 name = "Moritz Hedtke";
68908505 email = "Moritz.Hedtke@t-online.de";
8506+ matrix = "@moritz.hedtke:matrix.org";
68918507 github = "mohe2015";
68928508 githubId = 13287984;
68938509 keys = [{
@@ -6929,6 +8545,12 @@
69298545 githubId = 99988;
69308546 name = "Maarten Hoogendoorn";
69318547 };
8548+ MoritzBoehme = {
8549+ email = "mail@moritzboeh.me";
8550+ github = "MoritzBoehme";
8551+ githubId = 42215704;
8552+ name = "Moritz Böhme";
8553+ };
69328554 MostAwesomeDude = {
69338555 email = "cds@corbinsimpson.com";
69348556 github = "MostAwesomeDude";
@@ -6995,6 +8617,17 @@
69958617 githubId = 3073833;
69968618 name = "Massimo Redaelli";
69978619 };
8620+ mrhedgehog = {
8621+ name = "Mr Hedgehog";
8622+ email = "hedgehog@mrhedgehog.xyz";
8623+ matrix = "@mrhedgehog:jupiterbroadcasting.com";
8624+ github = "ModdedGamers";
8625+ githubId = 35778371;
8626+ keys = [{
8627+ longkeyid = "rsa4096/0x7D5107866B1C6752";
8628+ fingerprint = "38A0 29B0 4A7E 4C13 A4BB 86C8 7D51 0786 6B1C 6752";
8629+ }];
8630+ };
69988631 mrkkrp = {
69998632 email = "markkarpov92@gmail.com";
70008633 github = "mrkkrp";
@@ -7033,6 +8666,16 @@
70338666 name = "Maxim Schuwalow";
70348667 email = "maxim.schuwalow@gmail.com";
70358668 };
8669+ msfjarvis = {
8670+ github = "msfjarvis";
8671+ githubId = 13348378;
8672+ name = "Harsh Shandilya";
8673+ email = "nixos@msfjarvis.dev";
8674+ keys = [{
8675+ longkeyid = "rsa4096/0xB7843F823355E9B9";
8676+ fingerprint = "8F87 050B 0F9C B841 1515 7399 B784 3F82 3355 E9B9";
8677+ }];
8678+ };
70368679 msiedlarek = {
70378680 email = "mikolaj@siedlarek.pl";
70388681 github = "msiedlarek";
@@ -7069,6 +8712,12 @@
70698712 githubId = 4996739;
70708713 name = "Masayuki Takeda";
70718714 };
8715+ mtesseract = {
8716+ email = "moritz@stackrox.com";
8717+ github = "mtesseract";
8718+ githubId = 11706080;
8719+ name = "Moritz Clasmeier";
8720+ };
70728721 MtP = {
70738722 email = "marko.nixos@poikonen.de";
70748723 github = "MtP76";
@@ -7076,10 +8725,10 @@
70768725 name = "Marko Poikonen";
70778726 };
70788727 mtreca = {
7079− email = "maxime@treca.dev";
7080− name = "Maxime Tréca";
8728+ email = "maxime.treca@gmail.com";
70818729 github = "mtreca";
70828730 githubId = 16440823;
8731+ name = "Maxime Tréca";
70838732 };
70848733 mtreskin = {
70858734 email = "zerthurd@gmail.com";
@@ -7123,12 +8772,30 @@
71238772 githubId = 25388474;
71248773 name = "Matej Urbas";
71258774 };
8775+ mvisonneau = {
8776+ name = "Maxime VISONNEAU";
8777+ email = "maxime@visonneau.fr";
8778+ matrix = "@maxime:visonneau.fr";
8779+ github = "mvisonneau";
8780+ githubId = 1761583;
8781+ keys = [{
8782+ longkeyid = "rsa4096/0x150D6F0AE9198D24";
8783+ fingerprint = "EC63 0CEA E8BC 5EE5 5C58 F2E3 150D 6F0A E919 8D24";
8784+ }];
8785+ };
71268786 mvnetbiz = {
71278787 email = "mvnetbiz@gmail.com";
8788+ matrix = "@mvtva:matrix.org";
71288789 github = "mvnetbiz";
71298790 githubId = 6455574;
71308791 name = "Matt Votava";
71318792 };
8793+ mvs = {
8794+ email = "mvs@nya.yt";
8795+ github = "illdefined";
8796+ githubId = 772914;
8797+ name = "Mikael Voss";
8798+ };
71328799 maxwilson = {
71338800 email = "nixpkgs@maxwilson.dev";
71348801 github = "mwilsoncoding";
@@ -7141,6 +8808,12 @@
71418808 githubId = 9636071;
71428809 name = "Myrl Hex";
71438810 };
8811+ n0emis = {
8812+ email = "nixpkgs@n0emis.network";
8813+ github = "n0emis";
8814+ githubId = 22817873;
8815+ name = "Ember Keske";
8816+ };
71448817 nadrieril = {
71458818 email = "nadrieril@gmail.com";
71468819 github = "nadrieril";
@@ -7173,6 +8846,12 @@
71738846 email = "natedevv@gmail.com";
71748847 name = "Nathan Moore";
71758848 };
8849+ nathanruiz = {
8850+ email = "nathanruiz@protonmail.com";
8851+ github = "nathanruiz";
8852+ githubId = 18604892;
8853+ name = "Nathan Ruiz";
8854+ };
71768855 nathan-gs = {
71778856 email = "nathan@nathan.gs";
71788857 github = "nathan-gs";
@@ -7185,12 +8864,46 @@
71858864 githubId = 818502;
71868865 name = "Nathan Yong";
71878866 };
8867+ natto1784 = {
8868+ email = "natto@weirdnatto.in";
8869+ github = "natto1784";
8870+ githubId = 56316606;
8871+ name = "Amneesh Singh";
8872+ };
8873+ nazarewk = {
8874+ name = "Krzysztof Nazarewski";
8875+ email = "3494992+nazarewk@users.noreply.github.com";
8876+ matrix = "@nazarewk:matrix.org";
8877+ github = "nazarewk";
8878+ githubId = 3494992;
8879+ keys = [{
8880+ longkeyid = "rsa4096/0x916D8B67241892AE";
8881+ fingerprint = "4BFF 0614 03A2 47F0 AA0B 4BC4 916D 8B67 2418 92AE";
8882+ }];
8883+ };
8884+ nbr = {
8885+ email = "nbr@users.noreply.github.com";
8886+ github = "nbr";
8887+ githubId = 3819225;
8888+ name = "Nick Braga";
8889+ };
71888890 nbren12 = {
71898891 email = "nbren12@gmail.com";
71908892 github = "nbren12";
71918893 githubId = 1386642;
71928894 name = "Noah Brenowitz";
71938895 };
8896+ ncfavier = {
8897+ email = "n@monade.li";
8898+ matrix = "@ncfavier:matrix.org";
8899+ github = "ncfavier";
8900+ githubId = 4323933;
8901+ name = "Naïm Favier";
8902+ keys = [{
8903+ longkeyid = "rsa2048/0x49B07322580B7EE2";
8904+ fingerprint = "51A0 705E 7DD2 3CBC 5EAA B43E 49B0 7322 580B 7EE2";
8905+ }];
8906+ };
71948907 nckx = {
71958908 email = "github@tobias.gr";
71968909 github = "nckx";
@@ -7209,18 +8922,47 @@
72098922 githubId = 3747396;
72108923 name = "Nathan Isom";
72118924 };
8925+ neilmayhew = {
8926+ email = "nix@neil.mayhew.name";
8927+ github = "neilmayhew";
8928+ githubId = 166791;
8929+ name = "Neil Mayhew";
8930+ };
8931+ nelsonjeppesen = {
8932+ email = "nix@jeppesen.io";
8933+ github = "NelsonJeppesen";
8934+ githubId = 50854675;
8935+ name = "Nelson Jeppesen";
8936+ };
72128937 neonfuz = {
72138938 email = "neonfuz@gmail.com";
72148939 github = "neonfuz";
72158940 githubId = 2590830;
72168941 name = "Sage Raflik";
72178942 };
8943+ neosimsim = {
8944+ email = "me@abn.sh";
8945+ github = "neosimsim";
8946+ githubId = 1771772;
8947+ name = "Alexander Ben Nasrallah";
8948+ };
72188949 nequissimus = {
72198950 email = "tim@nequissimus.com";
72208951 github = "nequissimus";
72218952 githubId = 628342;
72228953 name = "Tim Steinbach";
72238954 };
8955+ nerdypepper = {
8956+ email = "nerdy@peppe.rs";
8957+ github = "nerdypepper";
8958+ githubId = 23743547;
8959+ name = "Akshay Oppiliappan";
8960+ };
8961+ nessdoor = {
8962+ name = "Tomas Antonio Lopez";
8963+ email = "entropy.overseer@protonmail.com";
8964+ githubId = 25993494;
8965+ };
72248966 netcrns = {
72258967 email = "jason.wing@gmx.de";
72268968 github = "netcrns";
@@ -7239,6 +8981,18 @@
72398981 githubId = 17120571;
72408982 name = "Xinhao Luo";
72418983 };
8984+ newam = {
8985+ email = "alex@thinglab.org";
8986+ github = "newAM";
8987+ githubId = 7845120;
8988+ name = "Alex Martens";
8989+ };
8990+ nialov = {
8991+ email = "nikolasovaskainen@gmail.com";
8992+ github = "nialov";
8993+ githubId = 47318483;
8994+ name = "Nikolas Ovaskainen";
8995+ };
72428996 nikitavoloboev = {
72438997 email = "nikita.voloboev@gmail.com";
72448998 github = "nikitavoloboev";
@@ -7251,6 +9005,7 @@
72519005 };
72529006 nh2 = {
72539007 email = "mail@nh2.me";
9008+ matrix = "@nh2:matrix.org";
72549009 github = "nh2";
72559010 githubId = 399535;
72569011 name = "Niklas Hambüchen";
@@ -7277,6 +9032,12 @@
72779032 githubId = 1665818;
72789033 name = "Philipp Eder";
72799034 };
9035+ nickcao = {
9036+ name = "Nick Cao";
9037+ email = "nickcao@nichi.co";
9038+ github = "NickCao";
9039+ githubId = 15247171;
9040+ };
72809041 nickhu = {
72819042 email = "me@nickhu.co.uk";
72829043 github = "nickhu";
@@ -7295,6 +9056,12 @@
72959056 githubId = 8214542;
72969057 name = "Nicolò Balzarotti";
72979058 };
9059+ nidabdella = {
9060+ name = "Mohamed Nidabdella";
9061+ email = "nidabdella.mohamed@gmail.com";
9062+ github = "nidabdella";
9063+ githubId = 8083813;
9064+ };
72989065 NieDzejkob = {
72999066 email = "kuba@kadziolka.net";
73009067 github = "NieDzejkob";
@@ -7323,8 +9090,15 @@
73239090 githubId = 26231126;
73249091 name = "Nils ANDRÉ-CHANG";
73259092 };
9093+ nils-degroot = {
9094+ email = "nils@peeko.nl";
9095+ github = "nils-degroot";
9096+ githubId = 53556985;
9097+ name = "Nils de Groot";
9098+ };
73269099 ninjatrappeur = {
73279100 email = "felix@alternativebit.fr";
9101+ matrix = "@ninjatrappeur:matrix.org";
73289102 github = "ninjatrappeur";
73299103 githubId = 1219785;
73309104 name = "Félix Baylac-Jacqué";
@@ -7345,6 +9119,22 @@
73459119 githubId = 3159451;
73469120 name = "Nicolas Schneider";
73479121 };
9122+ nkje = {
9123+ name = "Niels Kristian Lyshøj Jensen";
9124+ email = "n@nk.je";
9125+ github = "NKJe";
9126+ githubId = 1102306;
9127+ keys = [{
9128+ longkeyid = "nistp256/0xDE3BADFECD31A89D";
9129+ fingerprint = "B956 C6A4 22AF 86A0 8F77 A8CA DE3B ADFE CD31 A89D";
9130+ }];
9131+ };
9132+ nitsky = {
9133+ name = "nitsky";
9134+ email = "492793+nitsky@users.noreply.github.com";
9135+ github = "nitsky";
9136+ githubId = 492793;
9137+ };
73489138 nkpvk = {
73499139 email = "niko.pavlinek@gmail.com";
73509140 github = "nkpvk";
@@ -7363,6 +9153,7 @@
73639153 };
73649154 nixinator = {
73659155 email = "33lockdown33@protonmail.com";
9156+ matrix = "@nixinator:nixos.dev";
73669157 github = "nixinator";
73679158 githubId = 66913205;
73689159 name = "Rick Sanchez";
@@ -7373,6 +9164,12 @@
73739164 githubId = 7588406;
73749165 name = "Andrew R. M.";
73759166 };
9167+ nkalupahana = {
9168+ email = "hello@nisa.la";
9169+ github = "nkalupahana";
9170+ githubId = 7347290;
9171+ name = "Nisala Kalupahana";
9172+ };
73769173 nloomans = {
73779174 email = "noah@nixos.noahloomans.com";
73789175 github = "nloomans";
@@ -7397,6 +9194,12 @@
73979194 githubId = 810877;
73989195 name = "Tom Doggett";
73999196 };
9197+ noisersup = {
9198+ email = "patryk@kwiatek.xyz";
9199+ github = "noisersup";
9200+ githubId = 42322511;
9201+ name = "Patryk Kwiatek";
9202+ };
74009203 nomeata = {
74019204 email = "mail@joachim-breitner.de";
74029205 github = "nomeata";
@@ -7411,13 +9214,14 @@
74119214 };
74129215 noneucat = {
74139216 email = "andy@lolc.at";
9217+ matrix = "@noneucat:lolc.at";
74149218 github = "noneucat";
74159219 githubId = 40049608;
74169220 name = "Andy Chun";
74179221 };
74189222 noreferences = {
74199223 email = "norkus@norkus.net";
7420− github = "noreferences";
9224+ github = "jozuas";
74219225 githubId = 13085275;
74229226 name = "Juozas Norkus";
74239227 };
@@ -7433,9 +9237,9 @@
74339237 githubId = 2946283;
74349238 name = "Brian Cohen";
74359239 };
7436− novoxudonoser = {
9240+ novoxd = {
74379241 email = "radnovox@gmail.com";
7438− github = "novoxudonoser";
9242+ github = "novoxd";
74399243 githubId = 6052922;
74409244 name = "Kirill Struokov";
74419245 };
@@ -7453,6 +9257,7 @@
74539257 };
74549258 nrdxp = {
74559259 email = "tim.deh@pm.me";
9260+ matrix = "@timdeh:matrix.org";
74569261 github = "nrdxp";
74579262 githubId = 34083928;
74589263 name = "Tim DeHerrera";
@@ -7473,6 +9278,12 @@
74739278 githubId = 1839979;
74749279 name = "Niklas Thörne";
74759280 };
9281+ nukaduka = {
9282+ email = "ksgokte@gmail.com";
9283+ github = "NukaDuka";
9284+ githubId = 22592293;
9285+ name = "Kartik Gokte";
9286+ };
74769287 nullx76 = {
74779288 email = "nix@xirion.net";
74789289 github = "NULLx76";
@@ -7488,6 +9299,7 @@
74889299 numkem = {
74899300 name = "Sebastien Bariteau";
74909301 email = "numkem@numkem.org";
9302+ matrix = "@numkem:matrix.org";
74919303 github = "numkem";
74929304 githubId = 332423;
74939305 };
@@ -7509,6 +9321,17 @@
75099321 githubId = 127548;
75109322 name = "Judson Lester";
75119323 };
9324+ nzbr = {
9325+ email = "nixos@nzbr.de";
9326+ github = "nzbr";
9327+ githubId = 7851175;
9328+ name = "nzbr";
9329+ matrix = "@nzbr:nzbr.de";
9330+ keys = [{
9331+ longkeyid = "rsa2048/0x6C78B50B97A42F8A";
9332+ fingerprint = "BF3A 3EE6 3144 2C5F C9FB 39A7 6C78 B50B 97A4 2F8A";
9333+ }];
9334+ };
75129335 nzhang-zh = {
75139336 email = "n.zhang.hp.au@gmail.com";
75149337 github = "nzhang-zh";
@@ -7529,6 +9352,7 @@
75299352 };
75309353 obfusk = {
75319354 email = "flx@obfusk.net";
9355+ matrix = "@obfusk:matrix.org";
75329356 github = "obfusk";
75339357 githubId = 1260687;
75349358 name = "Felix C. Stegerman";
@@ -7543,6 +9367,12 @@
75439367 githubId = 158758;
75449368 name = "Oliver Dunkl";
75459369 };
9370+ ofek = {
9371+ email = "oss@ofek.dev";
9372+ github = "ofek";
9373+ githubId = 9677399;
9374+ name = "Ofek Lev";
9375+ };
75469376 offline = {
75479377 email = "jaka@x-truder.net";
75489378 github = "offlinehacker";
@@ -7577,6 +9407,12 @@
75779407 githubId = 72201;
75789408 name = "Ole Jørgen Brønner";
75799409 };
9410+ ollieB = {
9411+ email = "1237862+oliverbunting@users.noreply.github.com";
9412+ github = "oliverbunting";
9413+ githubId = 1237862;
9414+ name = "Ollie Bunting";
9415+ };
75809416 olynch = {
75819417 email = "owen@olynch.me";
75829418 github = "olynch";
@@ -7619,12 +9455,24 @@
76199455 githubId = 757752;
76209456 name = "Jonas Heinrich";
76219457 };
9458+ ony = {
9459+ name = "Mykola Orliuk";
9460+ email = "virkony@gmail.com";
9461+ github = "ony";
9462+ githubId = 11265;
9463+ };
76229464 OPNA2608 = {
76239465 email = "christoph.neidahl@gmail.com";
76249466 github = "OPNA2608";
76259467 githubId = 23431373;
76269468 name = "Christoph Neidahl";
76279469 };
9470+ opeik = {
9471+ email = "sandro@stikic.com";
9472+ github = "opeik";
9473+ githubId = 11566773;
9474+ name = "Sandro Stikić";
9475+ };
76289476 orbekk = {
76299477 email = "kjetil.orbekk@gmail.com";
76309478 github = "orbekk";
@@ -7643,6 +9491,12 @@
76439491 githubId = 101514;
76449492 name = "Orivej Desh";
76459493 };
9494+ ornxka = {
9495+ email = "ornxka@littledevil.sh";
9496+ github = "ornxka";
9497+ githubId = 52086525;
9498+ name = "ornxka";
9499+ };
76469500 oro = {
76479501 email = "marco@orovecchia.at";
76489502 github = "oro";
@@ -7703,6 +9557,12 @@
77039557 githubId = 15930073;
77049558 name = "Moritz Scheuren";
77059559 };
9560+ ozkutuk = {
9561+ email = "ozkutuk@protonmail.com";
9562+ github = "ozkutuk";
9563+ githubId = 5948762;
9564+ name = "Berk Özkütük";
9565+ };
77069566 pablovsky = {
77079567 email = "dealberapablo07@gmail.com";
77089568 github = "pablo1107";
@@ -7717,6 +9577,7 @@
77179577 };
77189578 pacman99 = {
77199579 email = "pachum99@gmail.com";
9580+ matrix = "@pachumicchu:myrdd.info";
77209581 github = "Pacman99";
77219582 githubId = 16345849;
77229583 name = "Parthiv Seetharaman";
@@ -7747,6 +9608,7 @@
77479608 };
77489609 pamplemousse = {
77499610 email = "xav.maso@gmail.com";
9611+ matrix = "@pamplemouss_:matrix.org";
77509612 github = "Pamplemousse";
77519613 githubId = 2647236;
77529614 name = "Xavier Maso";
@@ -7769,6 +9631,13 @@
77699631 githubId = 71795;
77709632 name = "Mica Semrick";
77719633 };
9634+ papojari = {
9635+ email = "papojari-git.ovoid@aleeas.com";
9636+ matrix = "@papojari:artemislena.eu";
9637+ github = "papojari";
9638+ githubId = 81317317;
9639+ name = "papojari";
9640+ };
77729641 paraseba = {
77739642 email = "paraseba@gmail.com";
77749643 github = "paraseba";
@@ -7800,7 +9669,7 @@
78009669 name = "pasqui23";
78019670 };
78029671 patryk27 = {
7803− email = "wychowaniec.patryk@gmail.com";
9672+ email = "pwychowaniec@pm.me";
78049673 github = "Patryk27";
78059674 githubId = 3395477;
78069675 name = "Patryk Wychowaniec";
@@ -7827,6 +9696,12 @@
78279696 githubId = 116740;
78289697 name = "Paweł Pacana";
78299698 };
9699+ pb- = {
9700+ email = "pbaecher@gmail.com";
9701+ github = "pb-";
9702+ githubId = 84886;
9703+ name = "Paul Baecher";
9704+ };
78309705 pbogdan = {
78319706 email = "ppbogdan@gmail.com";
78329707 github = "pbogdan";
@@ -7851,18 +9726,18 @@
78519726 githubId = 8641;
78529727 name = "Pierre Carrier";
78539728 };
7854− pengmeiyu = {
7855− email = "pengmyu@gmail.com";
7856− github = "pmeiyu";
7857− githubId = 8529551;
7858− name = "Peng Mei Yu";
7859− };
78609729 penguwin = {
78619730 email = "penguwin@penguwin.eu";
78629731 github = "penguwin";
78639732 githubId = 13225611;
78649733 name = "Nicolas Martin";
78659734 };
9735+ pennae = {
9736+ name = "pennae";
9737+ email = "github@quasiparticle.net";
9738+ github = "pennae";
9739+ githubId = 82953136;
9740+ };
78669741 p3psi = {
78679742 name = "Elliot Boo";
78689743 email = "p3psi.boo@gmail.com";
@@ -7877,6 +9752,7 @@
78779752 };
78789753 petabyteboy = {
78799754 email = "milan@petabyte.dev";
9755+ matrix = "@milan:petabyte.dev";
78809756 github = "petabyteboy";
78819757 githubId = 3250809;
78829758 name = "Milan Pässler";
@@ -7889,6 +9765,7 @@
78899765 };
78909766 peterhoeg = {
78919767 email = "peter@hoeg.com";
9768+ matrix = "@peter:hoeg.com";
78929769 github = "peterhoeg";
78939770 githubId = 722550;
78949771 name = "Peter Hoeg";
@@ -7941,17 +9818,23 @@
79419818 githubId = 1640697;
79429819 name = "Philipp Hausmann";
79439820 };
9821+ Philipp-M = {
9822+ email = "philipp@mildenberger.me";
9823+ github = "Philipp-M";
9824+ githubId = 9267430;
9825+ name = "Philipp Mildenberger";
9826+ };
79449827 Phlogistique = {
79459828 email = "noe.rubinstein@gmail.com";
79469829 github = "Phlogistique";
79479830 githubId = 421510;
79489831 name = "Noé Rubinstein";
79499832 };
7950− phreedom = {
7951− email = "phreedom@yandex.ru";
7952− github = "phreedom";
7953− githubId = 62577;
7954− name = "Evgeny Egorochkin";
9833+ photex = {
9834+ email = "photex@gmail.com";
9835+ github = "photex";
9836+ githubId = 301903;
9837+ name = "Chip Collier";
79559838 };
79569839 phryneas = {
79579840 email = "mail@lenzw.de";
@@ -7968,6 +9851,7 @@
79689851 piegames = {
79699852 name = "piegames";
79709853 email = "nix@piegames.de";
9854+ matrix = "@piegames:matrix.org";
79719855 github = "piegamesde";
79729856 githubId = 14054505;
79739857 };
@@ -7995,6 +9879,12 @@
79959879 githubId = 1179566;
79969880 name = "Nicolas B. Pierron";
79979881 };
9882+ pimeys = {
9883+ email = "julius@nauk.io";
9884+ github = "pimeys";
9885+ githubId = 34967;
9886+ name = "Julius de Bruijn";
9887+ };
79989888 pingiun = {
79999889 email = "nixos@pingiun.com";
80009890 github = "pingiun";
@@ -8011,7 +9901,7 @@
80119901 githubId = 1719781;
80129902 name = "Pablo Ovelleiro Corral";
80139903 keys = [{
8014− longkeyid = "sa4096/0x823A6154426408D3";
9904+ longkeyid = "rsa4096/0x823A6154426408D3";
80159905 fingerprint = "D03B 218C AE77 1F77 D7F9 20D9 823A 6154 4264 08D3";
80169906 }];
80179907 };
@@ -8105,6 +9995,12 @@
81059995 githubId = 178496;
81069996 name = "Philipp Middendorf";
81079997 };
9998+ pmy = {
9999+ email = "pmy@xqzp.net";
10000+ github = "pmeiyu";
10001+ githubId = 8529551;
10002+ name = "Peng Mei Yu";
10003+ };
810810004 pmyjavec = {
810910005 email = "pauly@myjavec.com";
811010006 github = "pmyjavec";
@@ -8123,6 +10019,12 @@
812310019 githubId = 11365056;
812410020 name = "Kevin Liu";
812510021 };
10022+ pnmadelaine = {
10023+ name = "Paul-Nicolas Madelaine";
10024+ email = "pnm@pnm.tf";
10025+ github = "pnmadelaine";
10026+ githubId = 21977014;
10027+ };
812610028 pnotequalnp = {
812710029 email = "kevin@pnotequalnp.com";
812810030 github = "pnotequalnp";
@@ -8133,12 +10035,30 @@
813310035 fingerprint = "2CD2 B030 BD22 32EF DF5A 008A 3618 20A4 5DB4 1E9A";
813410036 }];
813510037 };
10038+ podocarp = {
10039+ email = "xdjiaxd@gmail.com";
10040+ github = "podocarp";
10041+ githubId = 10473184;
10042+ name = "Jia Xiaodong";
10043+ };
813610044 polendri = {
813710045 email = "paul@ijj.li";
813810046 github = "polendri";
813910047 githubId = 1829032;
814010048 name = "Paul Hendry";
814110049 };
10050+ polygon = {
10051+ email = "polygon@wh2.tu-dresden.de";
10052+ name = "Polygon";
10053+ github = "polygon";
10054+ githubId = 51489;
10055+ };
10056+ polykernel = {
10057+ email = "81340136+polykernel@users.noreply.github.com";
10058+ github = "polykernel";
10059+ githubId = 81340136;
10060+ name = "polykernel";
10061+ };
814210062 polyrod = {
814310063 email = "dc1mdp@gmail.com";
814410064 github = "polyrod";
@@ -8156,12 +10076,22 @@
815610076 github = "poscat0x04";
815710077 githubId = 53291983;
815810078 name = "Poscat Tarski";
8159− keys = [
8160− {
8161− longkeyid = "rsa4096/2D2595A00D08ACE0";
8162− fingerprint = "48AD DE10 F27B AFB4 7BB0 CCAF 2D25 95A0 0D08 ACE0";
8163− }
8164− ];
10079+ keys = [{
10080+ longkeyid = "rsa4096/2D2595A00D08ACE0";
10081+ fingerprint = "48AD DE10 F27B AFB4 7BB0 CCAF 2D25 95A0 0D08 ACE0";
10082+ }];
10083+ };
10084+ ppenguin = {
10085+ name = "Jeroen Versteeg";
10086+ email = "hieronymusv@gmail.com";
10087+ github = "ppenguin";
10088+ githubId = 17690377;
10089+ };
10090+ ppom = {
10091+ name = "Paco Pompeani";
10092+ email = "paco@ecomail.io";
10093+ github = "aopom";
10094+ githubId = 38916722;
816510095 };
816610096 pradeepchhetri = {
816710097 email = "pradeep.chhetri89@gmail.com";
@@ -8199,6 +10129,7 @@
819910129 };
820010130 primeos = {
820110131 email = "dev.primeos@gmail.com";
10132+ matrix = "@primeos:matrix.org";
820210133 github = "primeos";
820310134 githubId = 7537109;
820410135 name = "Michael Weiss";
@@ -8259,14 +10190,23 @@
825910190 githubId = 33375;
826010191 name = "Peter Sanford";
826110192 };
10193+ pshirshov = {
10194+ email = "pshirshov@eml.cc";
10195+ github = "pshirshov";
10196+ githubId = 295225;
10197+ name = "Pavel Shirshov";
10198+ };
826210199 psibi = {
826310200 email = "sibi@psibi.in";
10201+ matrix = "@psibi:matrix.org";
826410202 github = "psibi";
826510203 githubId = 737477;
8266− name = "Sibi";
10204+ name = "Sibi Prabakaran";
826710205 };
826810206 pstn = {
826910207 email = "philipp@xndr.de";
10208+ github = "pstn";
10209+ githubId = 1329940;
827010210 name = "Philipp Steinpaß";
827110211 };
827210212 pSub = {
@@ -8281,6 +10221,12 @@
828110221 githubId = 20524473;
828210222 name = "Psyanticy";
828310223 };
10224+ psydvl = {
10225+ email = "psydvl@fea.st";
10226+ github = "psydvl";
10227+ githubId = 43755002;
10228+ name = "Dmitriy P";
10229+ };
828410230 ptival = {
828510231 email = "valentin.robert.42@gmail.com";
828610232 github = "Ptival";
@@ -8311,6 +10257,13 @@
831110257 githubId = 5636;
831210258 name = "Steve Purcell";
831310259 };
10260+ putchar = {
10261+ email = "slim.cadoux@gmail.com";
10262+ matrix = "@putch4r:matrix.org";
10263+ github = "putchar";
10264+ githubId = 8208767;
10265+ name = "Slim Cadoux";
10266+ };
831410267 puzzlewolf = {
831510268 email = "nixos@nora.pink";
831610269 github = "puzzlewolf";
@@ -8347,6 +10300,12 @@
834710300 githubId = 115877;
834810301 name = "Kenny Shen";
834910302 };
10303+ quag = {
10304+ email = "quaggy@gmail.com";
10305+ github = "quag";
10306+ githubId = 35086;
10307+ name = "Jonathan Wright";
10308+ };
835010309 queezle = {
835110310 email = "git@queezle.net";
835210311 github = "qzle";
@@ -8375,8 +10334,15 @@
837510334 githubId = 52847440;
837610335 name = "Ryan Burns";
837710336 };
10337+ r3dl3g = {
10338+ email = "redleg@rothfuss-web.de";
10339+ github = "r3dl3g";
10340+ githubId = 35229674;
10341+ name = "Armin Rothfuss";
10342+ };
837810343 raboof = {
837910344 email = "arnout@bzzt.net";
10345+ matrix = "@raboof:matrix.org";
838010346 github = "raboof";
838110347 githubId = 131856;
838210348 name = "Arnout Engelen";
@@ -8393,6 +10359,13 @@
839310359 githubId = 1016742;
839410360 name = "Rafael García";
839510361 };
10362+ raitobezarius = {
10363+ email = "ryan@lahfa.xyz";
10364+ matrix = "@raitobezarius:matrix.org";
10365+ github = "RaitoBezarius";
10366+ githubId = 314564;
10367+ name = "Ryan Lahfa";
10368+ };
839610369 raquelgb = {
839710370 email = "raquel.garcia.bautista@gmail.com";
839810371 github = "raquelgb";
@@ -8407,6 +10380,7 @@
840710380 };
840810381 ralith = {
840910382 email = "ben.e.saunders@gmail.com";
10383+ matrix = "@ralith:ralith.com";
841010384 github = "ralith";
841110385 githubId = 104558;
841210386 name = "Benjamin Saunders";
@@ -8475,6 +10449,16 @@
847510449 githubId = 16487165;
847610450 name = "Rafael Basso";
847710451 };
10452+ rbreslow = {
10453+ name = "Rocky Breslow";
10454+ email = "1774125+rbreslow@users.noreply.github.com";
10455+ github = "rbreslow";
10456+ githubId = 1774125;
10457+ keys = [{
10458+ longkeyid = "ed25519/0xA0D32ACCA38B88ED";
10459+ fingerprint = "B5B7 BCA0 EE6F F31E 263A 69E3 A0D3 2ACC A38B 88ED";
10460+ }];
10461+ };
847810462 rbrewer = {
847910463 email = "rwb123@gmail.com";
848010464 github = "rbrewer123";
@@ -8493,6 +10477,20 @@
849310477 githubId = 16624;
849410478 name = "Maxim Ivanov";
849510479 };
10480+ reckenrode = {
10481+ name = "Randy Eckenrode";
10482+ email = "randy@largeandhighquality.com";
10483+ matrix = "@reckenrode:matrix.org";
10484+ github = "reckenrode";
10485+ githubId = 7413633;
10486+ keys = [
10487+ # compare with https://keybase.io/reckenrode
10488+ {
10489+ longkeyid = "ed25519/0xFBF19A982CCE0048";
10490+ fingerprint = "01D7 5486 3A6D 64EA AC77 0D26 FBF1 9A98 2CCE 0048";
10491+ }
10492+ ];
10493+ };
849610494 redfish64 = {
849710495 email = "engler@gmail.com";
849810496 github = "redfish64";
@@ -8547,6 +10545,12 @@
854710545 githubId = 546296;
854810546 name = "Eric Ren";
854910547 };
10548+ renesat = {
10549+ name = "Ivan Smolyakov";
10550+ email = "smol.ivan97@gmail.com";
10551+ github = "renesat";
10552+ githubId = 11363539;
10553+ };
855010554 renzo = {
855110555 email = "renzocarbonara@gmail.com";
855210556 github = "k0001";
@@ -8559,12 +10563,40 @@
855910563 githubId = 500703;
856010564 name = "Tadas Barzdžius";
856110565 };
10566+ revol-xut = {
10567+ email = "revol-xut@protonmail.com";
10568+ name = "Tassilo Tanneberger";
10569+ github = "revol-xut";
10570+ githubId = 32239737;
10571+ keys = [{
10572+ longkeyid = "rsa4096/B966009D57E69CC6";
10573+ fingerprint = "91EB E870 1639 1323 642A 6803 B966 009D 57E6 9CC6";
10574+ }];
10575+ };
856210576 rexim = {
856310577 email = "reximkut@gmail.com";
856410578 github = "rexim";
856510579 githubId = 165283;
856610580 name = "Alexey Kutepov";
856710581 };
10582+ rewine = {
10583+ email = "lhongxu@outlook.com";
10584+ github = "wineee";
10585+ githubId = 22803888;
10586+ name = "Lu Hongxu";
10587+ };
10588+ rgnns = {
10589+ email = "jglievano@gmail.com";
10590+ github = "rgnns";
10591+ githubId = 811827;
10592+ name = "Gabriel Lievano";
10593+ };
10594+ rgrinberg = {
10595+ name = "Rudi Grinberg";
10596+ email = "me@rgrinberg.com";
10597+ github = "rgrinberg";
10598+ githubId = 139003;
10599+ };
856810600 rgrunbla = {
856910601 email = "remy@grunblatt.org";
857010602 github = "rgrunbla";
@@ -8589,6 +10621,19 @@
858910621 githubId = 6047658;
859010622 name = "Ryan Horiguchi";
859110623 };
10624+ rhysmdnz = {
10625+ email = "rhys@memes.nz";
10626+ matrix = "@rhys:memes.nz";
10627+ github = "rhysmdnz";
10628+ githubId = 2162021;
10629+ name = "Rhys Davies";
10630+ };
10631+ ribose-jeffreylau = {
10632+ name = "Jeffrey Lau";
10633+ email = "jeffrey.lau@ribose.com";
10634+ github = "ribose-jeffreylau";
10635+ githubId = 2649467;
10636+ };
859210637 richardipsum = {
859310638 email = "richardipsum@fastmail.co.uk";
859410639 github = "richardipsum";
@@ -8607,6 +10652,13 @@
860710652 githubId = 16779;
860810653 name = "Rickard Nilsson";
860910654 };
10655+ ricochet = {
10656+ email = "behayes2@gmail.com";
10657+ github = "ricochet";
10658+ githubId = 974323;
10659+ matrix = "@ricochetcode:matrix.org";
10660+ name = "Bailey Hayes";
10661+ };
861010662 riey = {
861110663 email = "creeper844@gmail.com";
861210664 github = "Riey";
@@ -8625,6 +10677,12 @@
862510677 githubId = 37246692;
862610678 name = "Riley Inman";
862710679 };
10680+ riotbib = {
10681+ email = "github-nix@lnrt.de";
10682+ github = "riotbib";
10683+ githubId = 43172581;
10684+ name = "Lennart Mühlenmeier";
10685+ };
862810686 ris = {
862910687 email = "code@humanleg.org.uk";
863010688 github = "risicle";
@@ -8634,6 +10692,7 @@
863410692 risson = {
863510693 name = "Marc Schmitt";
863610694 email = "marc.schmitt@risson.space";
10695+ matrix = "@risson:lama-corp.space";
863710696 github = "rissson";
863810697 githubId = 18313093;
863910698 keys = [
@@ -8647,12 +10706,6 @@
864710706 }
864810707 ];
864910708 };
8650− rittelle = {
8651− email = "rittelle@posteo.de";
8652− github = "rittelle";
8653− githubId = 33598633;
8654− name = "Lennart Rittel";
8655− };
865610709 rixed = {
865710710 email = "rixed-github@happyleptic.org";
865810711 github = "rixed";
@@ -8691,12 +10744,14 @@
869110744 };
869210745 rmcgibbo = {
869310746 email = "rmcgibbo@gmail.com";
10747+ matrix = "@rmcgibbo:matrix.org";
869410748 github = "rmcgibbo";
869510749 githubId = 641278;
869610750 name = "Robert T. McGibbon";
869710751 };
869810752 rnhmjoj = {
869910753 email = "rnhmjoj@inventati.org";
10754+ matrix = "@rnhmjoj:maxwell.ydns.eu";
870010755 github = "rnhmjoj";
870110756 githubId = 2817565;
870210757 name = "Michele Guerini Rocco";
@@ -8737,6 +10792,7 @@
873710792 };
873810793 roberth = {
873910794 email = "nixpkgs@roberthensing.nl";
10795+ matrix = "@roberthensing:matrix.org";
874010796 github = "roberth";
874110797 githubId = 496447;
874210798 name = "Robert Hensing";
@@ -8795,18 +10851,9 @@
879510851 githubId = 1312525;
879610852 name = "Rongcui Dong";
879710853 };
8798− ronthecookie = {
8799− name = "Ron B";
8800− email = "me@ronthecookie.me";
8801− github = "ronthecookie";
8802− githubId = 2526321;
8803− keys = [{
8804− longkeyid = "rsa2048/0x6F5B32DE5E5FA80C";
8805− fingerprint = "4B2C DDA5 FA35 642D 956D 7294 6F5B 32DE 5E5F A80C";
8806− }];
8807− };
880810854 roosemberth = {
880910855 email = "roosembert.palacios+nixpkgs@posteo.ch";
10856+ matrix = "@roosemberth:orbstheorem.ch";
881010857 github = "roosemberth";
881110858 githubId = 3621083;
881210859 name = "Roosembert (Roosemberth) Palacios";
@@ -8843,6 +10890,12 @@
884310890 githubId = 592876;
884410891 name = "Robert W. Pearce";
884510892 };
10893+ rprecenth = {
10894+ email = "rasmus@precenth.eu";
10895+ github = "Prillan";
10896+ githubId = 1675190;
10897+ name = "Rasmus Précenth";
10898+ };
884610899 rprospero = {
884710900 email = "rprospero+nix@gmail.com";
884810901 github = "rprospero";
@@ -8861,12 +10914,24 @@
886110914 githubId = 373566;
886210915 name = "Ronuk Raval";
886310916 };
10917+ rski = {
10918+ name = "rski";
10919+ email = "rom.skiad+nix@gmail.com";
10920+ github = "rski";
10921+ githubId = 2960312;
10922+ };
886410923 rszibele = {
886510924 email = "richard@szibele.com";
886610925 github = "rszibele";
886710926 githubId = 1387224;
886810927 name = "Richard Szibele";
886910928 };
10929+ rsynnest = {
10930+ email = "contact@rsynnest.com";
10931+ github = "rsynnest";
10932+ githubId = 4392850;
10933+ name = "Roland Synnestvedt";
10934+ };
887010935 rtburns-jpl = {
887110936 email = "rtburns@jpl.nasa.gov";
887210937 github = "rtburns-jpl";
@@ -8941,6 +11006,7 @@
894111006 };
894211007 ryantm = {
894311008 email = "ryan@ryantm.com";
11009+ matrix = "@ryantm:matrix.org";
894411010 github = "ryantm";
894511011 githubId = 4804;
894611012 name = "Ryan Mulligan";
@@ -8973,6 +11039,16 @@
897311039 githubId = 3280280;
897411040 name = "Ryne Everett";
897511041 };
11042+ rytone = {
11043+ email = "max@ryt.one";
11044+ github = "rytone";
11045+ githubId = 8082305;
11046+ name = "Maxwell Beck";
11047+ keys = [{
11048+ longkeyid = "rsa2048/0xBB3EFA303760A0DB";
11049+ fingerprint = "D260 79E3 C2BC 2E43 905B D057 BB3E FA30 3760 A0DB";
11050+ }];
11051+ };
897611052 rzetterberg = {
897711053 email = "richard.zetterberg@gmail.com";
897811054 github = "rzetterberg";
@@ -8981,10 +11057,28 @@
898111057 };
898211058 s1341 = {
898311059 email = "s1341@shmarya.net";
11060+ matrix = "@s1341:matrix.org";
898411061 name = "Shmarya Rubenstein";
898511062 github = "s1341";
898611063 githubId = 5682183;
898711064 };
11065+ sagikazarmark = {
11066+ name = "Mark Sagi-Kazar";
11067+ email = "mark.sagikazar@gmail.com";
11068+ matrix = "@mark.sagikazar:matrix.org";
11069+ github = "sagikazarmark";
11070+ githubId = 1226384;
11071+ keys = [{
11072+ longkeyid = "rsa4096/0xF251ADDC9D041C7E";
11073+ fingerprint = "E628 C811 6FB8 1657 F706 4EA4 F251 ADDC 9D04 1C7E";
11074+ }];
11075+ };
11076+ samalws = {
11077+ email = "sam@samalws.com";
11078+ name = "Sam Alws";
11079+ github = "samalws";
11080+ githubId = 20981725;
11081+ };
898811082 samb96 = {
898911083 email = "samb96@gmail.com";
899011084 github = "samb96";
@@ -9019,28 +11113,35 @@
901911113 githubId = 115821;
902011114 name = "Sam Rose";
902111115 };
11116+ samuela = {
11117+ email = "skainsworth@gmail.com";
11118+ github = "samuela";
11119+ githubId = 226872;
11120+ name = "Samuel Ainsworth";
11121+ };
902211122 samueldr = {
902311123 email = "samuel@dionne-riel.com";
11124+ matrix = "@samueldr:matrix.org";
902411125 github = "samueldr";
902511126 githubId = 132835;
902611127 name = "Samuel Dionne-Riel";
902711128 };
9028− samuelgrf = {
9029− email = "git@samuelgrf.com";
9030− github = "samuelgrf";
9031− githubId = 67663538;
9032− name = "Samuel Gräfenstein";
9033− keys = [{
9034− longkeyid = "rsa4096/0xEF76A063F15C63C8";
9035− fingerprint = "FF24 5832 8FAF 4660 18C6 186E EF76 A063 F15C 63C8";
9036− }];
9037− };
903811129 samuelrivas = {
903911130 email = "samuelrivas@gmail.com";
904011131 github = "samuelrivas";
904111132 githubId = 107703;
904211133 name = "Samuel Rivas";
904311134 };
11135+ samyak = {
11136+ name = "Samyak Sarnayak";
11137+ email = "samyak201@gmail.com";
11138+ github = "Samyak2";
11139+ githubId = 34161949;
11140+ keys = [{
11141+ longkeyid = "rsa4096/0x365873F2F0C6153B";
11142+ fingerprint = "155C F413 0129 C058 9A5F 5524 3658 73F2 F0C6 153B";
11143+ }];
11144+ };
904411145 sander = {
904511146 email = "s.vanderburg@tudelft.nl";
904611147 github = "svanderburg";
@@ -9089,6 +11190,12 @@
908911190 githubId = 720864;
909011191 name = "Sébastien Bourdeauducq";
909111192 };
11193+ sbellem = {
11194+ email = "sbellem@gmail.com";
11195+ github = "sbellem";
11196+ githubId = 125458;
11197+ name = "Sylvain Bellemare";
11198+ };
909211199 sbond75 = {
909311200 name = "sbond75";
909411201 email = "43617712+sbond75@users.noreply.github.com";
@@ -9141,6 +11248,16 @@
914111248 email = "schristopher@konputa.com";
914211249 name = "Scott Christopher";
914311250 };
11251+ sciencentistguy = {
11252+ email = "jamie@quigley.xyz";
11253+ name = "Jamie Quigley";
11254+ github = "Sciencentistguy";
11255+ githubId = 4983935;
11256+ keys = [{
11257+ longkeyid = "rsa2048/0x8E8FF66E2AE8D970";
11258+ fingerprint = "30BB FF3F AB0B BB3E 0435 F83C 8E8F F66E 2AE8 D970";
11259+ }];
11260+};
914411261 scode = {
914511262 email = "peter.schuller@infidyne.com";
914611263 github = "scode";
@@ -9161,6 +11278,7 @@
916111278 };
916211279 Scriptkiddi = {
916311280 email = "nixos@scriptkiddi.de";
11281+ matrix = "@fritz.otlinghaus:helsinki-systems.de";
916411282 github = "scriptkiddi";
916511283 githubId = 3598650;
916611284 name = "Fritz Otlinghaus";
@@ -9173,16 +11291,11 @@
917311291 };
917411292 sdier = {
917511293 email = "scott@dier.name";
11294+ matrix = "@sdier:matrix.org";
917611295 github = "sdier";
917711296 githubId = 11613056;
917811297 name = "Scott Dier";
917911298 };
9180− sdll = {
9181− email = "sasha.delly@gmail.com";
9182− github = "sdll";
9183− githubId = 17913919;
9184− name = "Sasha Illarionov";
9185− };
918611299 SeanZicari = {
918711300 email = "sean.zicari@gmail.com";
918811301 github = "SeanZicari";
@@ -9195,12 +11308,30 @@
919511308 githubId = 19472270;
919611309 name = "Sebastian";
919711310 };
11311+ sebastianblunt = {
11312+ name = "Sebastian Blunt";
11313+ email = "nix@sebastianblunt.com";
11314+ github = "sebastianblunt";
11315+ githubId = 47431204;
11316+ };
919811317 sebbadk = {
919911318 email = "sebastian@sebba.dk";
920011319 github = "SEbbaDK";
920111320 githubId = 1567527;
920211321 name = "Sebastian Hyberts";
920311322 };
11323+ sebbel = {
11324+ email = "hej@sebastian-ball.de";
11325+ github = "sebbel";
11326+ githubId = 1940568;
11327+ name = "Sebastian Ball";
11328+ };
11329+ sebtm = {
11330+ email = "mail@sebastian-sellmeier.de";
11331+ github = "sebtm";
11332+ githubId = 17243347;
11333+ name = "Sebastian Sellmeier";
11334+ };
920411335 sellout = {
920511336 email = "greg@technomadic.org";
920611337 github = "sellout";
@@ -9237,6 +11368,18 @@
923711368 githubId = 307899;
923811369 name = "Gurkan Gur";
923911370 };
11371+ serge = {
11372+ email = "sb@canva.com";
11373+ github = "serge-belov";
11374+ githubId = 38824235;
11375+ name = "Serge Belov";
11376+ };
11377+ sersorrel = {
11378+ email = "ash@sorrel.sh";
11379+ github = "sersorrel";
11380+ githubId = 9433472;
11381+ name = "ash";
11382+ };
924011383 servalcatty = {
924111384 email = "servalcat@pm.me";
924211385 github = "servalcatty";
@@ -9247,6 +11390,16 @@
924711390 fingerprint = "A317 37B3 693C 921B 480C C629 4A2A AAA3 82F8 294C";
924811391 }];
924911392 };
11393+ seylerius = {
11394+ name = "Sable Seyler";
11395+ email = "sable@seyleri.us";
11396+ github = "seylerius";
11397+ githubId = 1145981;
11398+ keys = [{
11399+ longkeyid = "rsa4096/0xDC26B921A9E9DBDE";
11400+ fingerprint = "7246 B6E1 ABB9 9A48 4395 FD11 DC26 B921 A9E9 DBDE";
11401+ }];
11402+ };
925011403 sfrijters = {
925111404 email = "sfrijters@gmail.com";
925211405 github = "sfrijters";
@@ -9265,6 +11418,12 @@
926511418 githubId = 1151264;
926611419 name = "Sebastian Graf";
926711420 };
11421+ shadaj = {
11422+ email = "shadaj@users.noreply.github.com";
11423+ github = "shadaj";
11424+ githubId = 543055;
11425+ name = "Shadaj Laddad";
11426+ };
926811427 shahrukh330 = {
926911428 email = "shahrukh330@gmail.com";
927011429 github = "shahrukh330";
@@ -9289,12 +11448,28 @@
928911448 githubId = 6720672;
929011449 name = "Shane Pearlman";
929111450 };
11451+ shanesveller = {
11452+ email = "shane@sveller.dev";
11453+ github = "shanesveller";
11454+ githubId = 831;
11455+ keys = [{
11456+ longkeyid = "rsa4096/0x9210C218023C15CD";
11457+ fingerprint = "F83C 407C ADC4 5A0F 1F2F 44E8 9210 C218 023C 15CD";
11458+ }];
11459+ name = "Shane Sveller";
11460+ };
929211461 shawndellysse = {
929311462 email = "sdellysse@gmail.com";
929411463 github = "shawndellysse";
929511464 githubId = 293035;
929611465 name = "Shawn Dellysse";
929711466 };
11467+ shawn8901 = {
11468+ email = "shawn8901@googlemail.com";
11469+ github = "shawn8901";
11470+ githubId = 12239057;
11471+ name = "Shawn8901";
11472+ };
929811473 shazow = {
929911474 email = "andrey.petrov@shazow.net";
930011475 github = "shazow";
@@ -9325,6 +11500,22 @@
932511500 githubId = 251028;
932611501 name = "Shell Turner";
932711502 };
11503+ shikanime = {
11504+ name = "William Phetsinorath";
11505+ email = "deva.shikanime@protonmail.com";
11506+ github = "shikanime";
11507+ githubId = 22115108;
11508+ };
11509+ shiryel = {
11510+ email = "contact@shiryel.com";
11511+ name = "Shiryel";
11512+ github = "shiryel";
11513+ githubId = 35617139;
11514+ keys = [{
11515+ longkeyid = "ed25519/0xC4041EA6B32633DE";
11516+ fingerprint = "AB63 4CD9 3322 BD42 6231 F764 C404 1EA6 B326 33DE";
11517+ }];
11518+ };
932811519 shlevy = {
932911520 email = "shea@shealevy.com";
933011521 github = "shlevy";
@@ -9355,6 +11546,16 @@
935511546 githubId = 819413;
935611547 name = "Benedict Aas";
935711548 };
11549+ shreerammodi = {
11550+ name = "Shreeram Modi";
11551+ email = "shreerammodi10@gmail.com";
11552+ github = "Shrimpram";
11553+ githubId = 67710369;
11554+ keys = [{
11555+ longkeyid = "rsa4096/0x163B16EE76ED24CE";
11556+ fingerprint = "EA88 EA07 26E9 6CBF 6365 3966 163B 16EE 76ED 24CE";
11557+ }];
11558+ };
935811559 shyim = {
935911560 email = "s.sayakci@gmail.com";
936011561 github = "shyim";
@@ -9386,7 +11587,7 @@
938611587 name = "Yann Hodique";
938711588 };
938811589 sikmir = {
9389− email = "sikmir@gmail.com";
11590+ email = "sikmir@disroot.org";
939011591 github = "sikmir";
939111592 githubId = 688044;
939211593 name = "Nikolay Korotkiy";
@@ -9395,20 +11596,39 @@
939511596 fingerprint = "ADF4 C13D 0E36 1240 BD01 9B51 D1DE 6D7F 6936 63A5";
939611597 }];
939711598 };
11599+ simarra = {
11600+ name = "simarra";
11601+ email = "loic.martel@protonmail.com";
11602+ github = "simarra";
11603+ githubId = 14372987;
11604+ };
939811605 simonchatts = {
939911606 email = "code@chatts.net";
940011607 github = "simonchatts";
940111608 githubId = 11135311;
940211609 name = "Simon Chatterjee";
940311610 };
11611+ simonkampe = {
11612+ email = "simon.kampe+nix@gmail.com";
11613+ github = "simonkampe";
11614+ githubId = 254799;
11615+ name = "Simon Kämpe";
11616+ };
940411617 simonvandel = {
940511618 email = "simon.vandel@gmail.com";
940611619 github = "simonvandel";
940711620 githubId = 2770647;
940811621 name = "Simon Vandel Sillesen";
940911622 };
11623+ sir4ur0n = {
11624+ email = "sir4ur0n@users.noreply.github.com";
11625+ github = "sir4ur0n";
11626+ githubId = 1204125;
11627+ name = "sir4ur0n";
11628+ };
941011629 siraben = {
941111630 email = "bensiraphob@gmail.com";
11631+ matrix = "@siraben:matrix.org";
941211632 github = "siraben";
941311633 githubId = 8219659;
941411634 name = "Siraphob Phipathananunth";
@@ -9423,6 +11643,12 @@
942311643 fingerprint = "B234 EFD4 2B42 FE81 EE4D 7627 F72C 4A88 7F9A 24CA";
942411644 }];
942511645 };
11646+ sirseruju = {
11647+ email = "sir.seruju@yandex.ru";
11648+ github = "sirseruju";
11649+ githubId = 74881555;
11650+ name = "Fofanov Sergey";
11651+ };
942611652 sivteck = {
942711653 email = "sivaram1992@gmail.com";
942811654 github = "sivteck";
@@ -9481,6 +11707,7 @@
948111707 };
948211708 SlothOfAnarchy = {
948311709 email = "slothofanarchy1@gmail.com";
11710+ matrix = "@michel.weitbrecht:helsinki-systems.de";
948411711 github = "SlothOfAnarchy";
948511712 githubId = 12828415;
948611713 name = "Michel Weitbrecht";
@@ -9495,6 +11722,12 @@
949511722 fingerprint = "6F8A 18AE 4101 103F 3C54 24B9 6AA2 3A11 93B7 064B";
949611723 }];
949711724 };
11725+ smancill = {
11726+ email = "smancill@smancill.dev";
11727+ github = "smancill";
11728+ githubId = 238528;
11729+ name = "Sebastián Mancilla";
11730+ };
949811731 smaret = {
949911732 email = "sebastien.maret@icloud.com";
950011733 github = "smaret";
@@ -9505,12 +11738,25 @@
950511738 fingerprint = "4242 834C D401 86EF 8281 4093 86E3 0E5A 0F5F C59C";
950611739 }];
950711740 };
11741+ smasher164 = {
11742+ email = "aindurti@gmail.com";
11743+ github = "smasher164";
11744+ githubId = 12636891;
11745+ name = "Akhil Indurti";
11746+ };
950811747 smironov = {
950911748 email = "grrwlf@gmail.com";
951011749 github = "grwlf";
951111750 githubId = 4477729;
951211751 name = "Sergey Mironov";
951311752 };
11753+ smitop = {
11754+ name = "Smitty van Bodegom";
11755+ email = "me@smitop.com";
11756+ matrix = "@smitop:kde.org";
11757+ github = "Smittyvb";
11758+ githubId = 10530973;
11759+ };
951411760 sna = {
951511761 email = "abouzahra.9@wright.edu";
951611762 github = "s-na";
@@ -9549,10 +11795,18 @@
954911795 };
955011796 solson = {
955111797 email = "scott@solson.me";
11798+ matrix = "@solson:matrix.org";
955211799 github = "solson";
955311800 githubId = 26806;
955411801 name = "Scott Olson";
955511802 };
11803+ SomeoneSerge = {
11804+ email = "sergei.kozlukov@aalto.fi";
11805+ matrix = "@ss:someonex.net";
11806+ github = "SomeoneSerge";
11807+ githubId = 9720532;
11808+ name = "Sergei K";
11809+ };
955611810 sondr3 = {
955711811 email = "nilsen.sondre@gmail.com";
955811812 github = "sondr3";
@@ -9601,6 +11855,7 @@
960111855 };
960211856 spencerjanssen = {
960311857 email = "spencerjanssen@gmail.com";
11858+ matrix = "@sjanssen:matrix.org";
960411859 github = "spencerjanssen";
960511860 githubId = 2600039;
960611861 name = "Spencer Janssen";
@@ -9649,6 +11904,7 @@
964911904 };
965011905 srhb = {
965111906 email = "sbrofeldt@gmail.com";
11907+ matrix = "@srhb:matrix.org";
965211908 github = "srhb";
965311909 githubId = 219362;
965411910 name = "Sarah Brofeldt";
@@ -9665,12 +11921,47 @@
966511921 githubId = 8668915;
966611922 name = "Stephane Schitter";
966711923 };
11924+ staccato = {
11925+ name = "staccato";
11926+ email = "moveq@riseup.net";
11927+ github = "staccato";
11928+ githubId = 86573128;
11929+ };
11930+ stackshadow = {
11931+ email = "stackshadow@evilbrain.de";
11932+ github = "stackshadow";
11933+ githubId = 7512804;
11934+ name = "Martin Langlotz";
11935+ };
11936+ steamwalker = {
11937+ email = "steamwalker@xs4all.nl";
11938+ github = "steamwalker";
11939+ githubId = 94006354;
11940+ name = "steamwalker";
11941+ };
966811942 steell = {
966911943 email = "steve@steellworks.com";
967011944 github = "Steell";
967111945 githubId = 1699155;
967211946 name = "Steve Elliott";
967311947 };
11948+ stehessel = {
11949+ email = "stephan@stehessel.de";
11950+ github = "stehessel";
11951+ githubId = 55607356;
11952+ name = "Stephan Heßelmann";
11953+ };
11954+ steinybot = {
11955+ name = "Jason Pickens";
11956+ email = "jasonpickensnz@gmail.com";
11957+ matrix = "@steinybot:matrix.org";
11958+ github = "steinybot";
11959+ githubId = 4659562;
11960+ keys = [{
11961+ longkeyid = "ed25519/0x21DE1CAE59762A0F";
11962+ fingerprint = "2709 1DEC CC42 4635 4299 569C 21DE 1CAE 5976 2A0F";
11963+ }];
11964+ };
967411965 stelcodes = {
967511966 email = "stel@stel.codes";
967611967 github = "stelcodes";
@@ -9679,6 +11970,7 @@
967911970 };
968011971 stephank = {
968111972 email = "nix@stephank.nl";
11973+ matrix = "@skochen:matrix.org";
968211974 github = "stephank";
968311975 githubId = 89950;
968411976 name = "Stéphan Kochen";
@@ -9729,12 +12021,24 @@
972912021 githubId = 1829294;
973012022 name = "Steve Chávez";
973112023 };
12024+ stevebob = {
12025+ email = "stephen@sherra.tt";
12026+ github = "stevebob";
12027+ githubId = 417118;
12028+ name = "Stephen Sherratt";
12029+ };
973212030 steveej = {
973312031 email = "mail@stefanjunker.de";
973412032 github = "steveej";
973512033 githubId = 1181362;
973612034 name = "Stefan Junker";
973712035 };
12036+ stevenroose = {
12037+ email = "github@stevenroose.org";
12038+ github = "stevenroose";
12039+ githubId = 853468;
12040+ name = "Steven Roose";
12041+ };
973812042 stianlagstad = {
973912043 email = "stianlagstad@gmail.com";
974012044 github = "stianlagstad";
@@ -9759,6 +12063,12 @@
975912063 githubId = 1694705;
976012064 name = "Sam Stites";
976112065 };
12066+ strager = {
12067+ email = "strager.nds@gmail.com";
12068+ github = "strager";
12069+ githubId = 48666;
12070+ name = "Matthew \"strager\" Glazar";
12071+ };
976212072 stumoss = {
976312073 email = "samoss@gmail.com";
976412074 github = "stumoss";
@@ -9772,10 +12082,16 @@
977212082 name = "Felix Bühler";
977312083 };
977412084 stupremee = {
9775− email = "jutus.k@protonmail.com";
9776− github = "Stupremee";
9777− githubId = 39732259;
9778− name = "Justus K";
12085+ email = "jutus.k@protonmail.com";
12086+ github = "Stupremee";
12087+ githubId = 39732259;
12088+ name = "Justus K";
12089+ };
12090+ SubhrajyotiSen = {
12091+ email = "subhrajyoti12@gmail.com";
12092+ github = "SubhrajyotiSen";
12093+ githubId = 12984845;
12094+ name = "Subhrajyoti Sen";
977912095 };
978012096 suhr = {
978112097 email = "suhr@i2pmail.org";
@@ -9798,11 +12114,13 @@
979812114 superherointj = {
979912115 name = "Sérgio G.";
980012116 email = "5861043+superherointj@users.noreply.github.com";
12117+ matrix = "@superherointj:matrix.org";
980112118 github = "superherointj";
980212119 githubId = 5861043;
980312120 };
980412121 SuperSandro2000 = {
980512122 email = "sandro.jaeckel@gmail.com";
12123+ matrix = "@sandro:supersandro.de";
980612124 github = "SuperSandro2000";
980712125 githubId = 7258858;
980812126 name = "Sandro Jäckel";
@@ -9887,6 +12205,7 @@
988712205 };
988812206 symphorien = {
988912207 email = "symphorien_nixpkgs@xlumurb.eu";
12208+ matrix = "@symphorien:xlumurb.eu";
989012209 github = "symphorien";
989112210 githubId = 12595971;
989212211 name = "Guillaume Girol";
@@ -9955,6 +12274,16 @@
995512274 githubId = 321799;
995612275 name = "Paul Colomiets";
995712276 };
12277+ taikx4 = {
12278+ email = "taikx4@taikx4szlaj2rsdupcwabg35inbny4jk322ngeb7qwbbhd5i55nf5yyd.onion";
12279+ github = "taikx4";
12280+ githubId = 94917129;
12281+ name = "taikx4";
12282+ keys = [{
12283+ longkeyid = "ed25519/0xCCD52C7B37BB837E";
12284+ fingerprint = "6B02 8103 C4E5 F68C D77C 9E54 CCD5 2C7B 37BB 837E";
12285+ }];
12286+ };
995812287 takagiy = {
995912288 email = "takagiy.4dev@gmail.com";
996012289 github = "takagiy";
@@ -9975,6 +12304,7 @@
997512304 };
997612305 taktoa = {
997712306 email = "taktoa@gmail.com";
12307+ matrix = "@taktoa:matrix.org";
997812308 github = "taktoa";
997912309 githubId = 553443;
998012310 name = "Remy Goldschmidt";
@@ -9993,6 +12323,7 @@
999312323 };
999412324 talyz = {
999512325 email = "kim.lindberger@gmail.com";
12326+ matrix = "@talyz:matrix.org";
999612327 github = "talyz";
999712328 githubId = 63433;
999812329 name = "Kim Lindberger";
@@ -10027,6 +12358,13 @@
1002712358 githubId = 863327;
1002812359 name = "Tyler Benster";
1002912360 };
12361+ tboerger = {
12362+ email = "thomas@webhippie.de";
12363+ matrix = "@tboerger:matrix.org";
12364+ github = "tboerger";
12365+ githubId = 156964;
12366+ name = "Thomas Boerger";
12367+ };
1003012368 tcbravo = {
1003112369 email = "tomas.bravo@protonmail.ch";
1003212370 github = "tcbravo";
@@ -10039,6 +12377,12 @@
1003912377 githubId = 2389333;
1004012378 name = "Andy Tockman";
1004112379 };
12380+ techknowlogick = {
12381+ email = "techknowlogick@gitea.io";
12382+ github = "techknowlogick";
12383+ githubId = 164197;
12384+ name = "techknowlogick";
12385+ };
1004212386 Technical27 = {
1004312387 email = "38222826+Technical27@users.noreply.github.com";
1004412388 github = "Technical27";
@@ -10075,6 +12419,12 @@
1007512419 githubId = 280235;
1007612420 name = "Terje Larsen";
1007712421 };
12422+ terrorjack = {
12423+ email = "astrohavoc@gmail.com";
12424+ github = "TerrorJack";
12425+ githubId = 3889585;
12426+ name = "Cheng Shao";
12427+ };
1007812428 tesq0 = {
1007912429 email = "mikolaj.galkowski@gmail.com";
1008012430 github = "tesq0";
@@ -10101,6 +12451,7 @@
1010112451 };
1010212452 tfc = {
1010312453 email = "jacek@galowicz.de";
12454+ matrix = "@jonge:ukvly.org";
1010412455 github = "tfc";
1010512456 githubId = 29044;
1010612457 name = "Jacek Galowicz";
@@ -10111,6 +12462,12 @@
1011112462 githubId = 378734;
1011212463 name = "TG ⊗ Θ";
1011312464 };
12465+ tgunnoe = {
12466+ email = "t@gvno.net";
12467+ github = "tgunnoe";
12468+ githubId = 7254833;
12469+ name = "Taylor Gunnoe";
12470+ };
1011412471 th0rgal = {
1011512472 email = "thomas.marchand@tuta.io";
1011612473 github = "Th0rgal";
@@ -10135,6 +12492,17 @@
1013512492 githubId = 1141680;
1013612493 name = "Thane Gill";
1013712494 };
12495+ thblt = {
12496+ name = "Thibault Polge";
12497+ email = "thibault@thb.lt";
12498+ matrix = "@thbltp:matrix.org";
12499+ github = "thblt";
12500+ githubId = 2453136;
12501+ keys = [{
12502+ longkeyid = "rsa4096/0x63A44817A52EAB7B";
12503+ fingerprint = "D2A2 F0A1 E7A8 5E6F B711 DEE5 63A4 4817 A52E AB7B";
12504+ }];
12505+ };
1013812506 TheBrainScrambler = {
1013912507 email = "esthromeris@riseup.net";
1014012508 github = "TheBrainScrambler";
@@ -10193,8 +12561,15 @@
1019312561 githubId = 844343;
1019412562 name = "Thiago K. Okada";
1019512563 };
12564+ thibaultlemaire = {
12565+ email = "thibault.lemaire@protonmail.com";
12566+ github = "ThibaultLemaire";
12567+ githubId = 21345269;
12568+ name = "Thibault Lemaire";
12569+ };
1019612570 thibautmarty = {
1019712571 email = "github@thibautmarty.fr";
12572+ matrix = "@thibaut:thibautmarty.fr";
1019812573 github = "ThibautMarty";
1019912574 githubId = 3268082;
1020012575 name = "Thibaut Marty";
@@ -10257,6 +12632,13 @@
1025712632 githubId = 1618946;
1025812633 name = "Tiago Castro";
1025912634 };
12635+ tilcreator = {
12636+ name = "TilCreator";
12637+ email = "contact.nixos@tc-j.de";
12638+ matrix = "@tilcreator:matrix.org";
12639+ github = "TilCreator";
12640+ githubId = 18621411;
12641+ };
1026012642 tilpner = {
1026112643 email = "till@hoeppner.ws";
1026212644 github = "tilpner";
@@ -10321,6 +12703,12 @@
1032112703 fingerprint = "556A 403F B0A2 D423 F656 3424 8489 B911 F9ED 617B";
1032212704 }];
1032312705 };
12706+ tmarkovski = {
12707+ email = "tmarkovski@gmail.com";
12708+ github = "tmarkovski";
12709+ githubId = 1280118;
12710+ name = "Tomislav Markovski";
12711+ };
1032412712 tmountain = {
1032512713 email = "tinymountain@gmail.com";
1032612714 github = "tmountain";
@@ -10335,10 +12723,22 @@
1033512723 };
1033612724 tnias = {
1033712725 email = "phil@grmr.de";
12726+ matrix = "@tnias:stratum0.org";
1033812727 github = "tnias";
1033912728 githubId = 9853194;
1034012729 name = "Philipp Bartsch";
1034112730 };
12731+ toastal = {
12732+ email = "toastal+nix@posteo.net";
12733+ matrix = "@toastal:matrix.org";
12734+ github = "toastal";
12735+ githubId = 561087;
12736+ name = "toastal";
12737+ keys = [{
12738+ longkeyid = "ed25519/5CCE6F1466D47C9E";
12739+ fingerprint = "7944 74B7 D236 DAB9 C9EF E7F9 5CCE 6F14 66D4 7C9E";
12740+ }];
12741+ };
1034212742 tobim = {
1034312743 email = "nix@tobim.fastmail.fm";
1034412744 github = "tobim";
@@ -10371,6 +12771,7 @@
1037112771 };
1037212772 tomberek = {
1037312773 email = "tomberek@gmail.com";
12774+ matrix = "@tomberek:matrix.org";
1037412775 github = "tomberek";
1037512776 githubId = 178444;
1037612777 name = "Thomas Bereknyei";
@@ -10389,6 +12790,7 @@
1038912790 };
1039012791 toonn = {
1039112792 email = "nixpkgs@toonn.io";
12793+ matrix = "@toonn:matrix.org";
1039212794 github = "toonn";
1039312795 githubId = 1486805;
1039412796 name = "Toon Nolten";
@@ -10405,12 +12807,31 @@
1040512807 github = "totoroot";
1040612808 githubId = 39650930;
1040712809 };
12810+ ToxicFrog = {
12811+ email = "toxicfrog@ancilla.ca";
12812+ github = "ToxicFrog";
12813+ githubId = 90456;
12814+ name = "Rebecca (Bex) Kelly";
12815+ };
12816+ tpw_rules = {
12817+ name = "Thomas Watson";
12818+ email = "twatson52@icloud.com";
12819+ matrix = "@tpw_rules:matrix.org";
12820+ github = "tpwrules";
12821+ githubId = 208010;
12822+ };
1040812823 travisbhartwell = {
1040912824 email = "nafai@travishartwell.net";
1041012825 github = "travisbhartwell";
1041112826 githubId = 10110;
1041212827 name = "Travis B. Hartwell";
1041312828 };
12829+ travisdavis-ops = {
12830+ email = "travisdavismedia@gmail.com";
12831+ github = "travisdavis-ops";
12832+ githubId = 52011418;
12833+ name = "Travis Davis";
12834+ };
1041412835 TredwellGit = {
1041512836 email = "tredwell@tutanota.com";
1041612837 github = "TredwellGit";
@@ -10459,12 +12880,24 @@
1045912880 githubId = 1183303;
1046012881 name = "Jakob Klepp";
1046112882 };
12883+ trundle = {
12884+ name = "Andreas Stührk";
12885+ email = "andy@hammerhartes.de";
12886+ github = "Trundle";
12887+ githubId = 332418;
12888+ };
1046212889 tscholak = {
1046312890 email = "torsten.scholak@googlemail.com";
1046412891 github = "tscholak";
1046512892 githubId = 1568873;
1046612893 name = "Torsten Scholak";
1046712894 };
12895+ tshaynik = {
12896+ email = "tshaynik@protonmail.com";
12897+ github = "tshaynik";
12898+ githubId = 15064765;
12899+ name = "tshaynik";
12900+ };
1046812901 tstrobel = {
1046912902 email = "4ZKTUB6TEP74PYJOPWIR013S2AV29YUBW5F9ZH2F4D5UMJUJ6S@hash.domains";
1047012903 name = "Thomas Strobel";
@@ -10543,24 +12976,66 @@
1054312976 fingerprint = "E631 8869 586F 99B4 F6E6 D785 5942 58F0 389D 2802";
1054412977 }];
1054512978 };
12979+ twitchyliquid64 = {
12980+ name = "Tom";
12981+ email = "twitchyliquid64@ciphersink.net";
12982+ github = "twitchyliquid64";
12983+ githubId = 6328589;
12984+ };
1054612985 typetetris = {
1054712986 email = "ericwolf42@mail.com";
1054812987 github = "typetetris";
1054912988 githubId = 1983821;
1055012989 name = "Eric Wolf";
1055112990 };
12991+ uakci = {
12992+ name = "uakci";
12993+ email = "uakci@uakci.pl";
12994+ github = "uakci";
12995+ githubId = 6961268;
12996+ };
1055212997 udono = {
1055312998 email = "udono@virtual-things.biz";
1055412999 github = "udono";
1055513000 githubId = 347983;
1055613001 name = "Udo Spallek";
1055713002 };
13003+ ulrikstrid = {
13004+ email = "ulrik.strid@outlook.com";
13005+ github = "ulrikstrid";
13006+ githubId = 1607770;
13007+ name = "Ulrik Strid";
13008+ };
13009+ unclechu = {
13010+ name = "Viacheslav Lotsmanov";
13011+ email = "lotsmanov89@gmail.com";
13012+ github = "unclechu";
13013+ githubId = 799353;
13014+ keys = [{
13015+ longkeyid = "rsa4096/0xD276FF7467007335";
13016+ fingerprint = "EE59 5E29 BB5B F2B3 5ED2 3F1C D276 FF74 6700 7335";
13017+ }];
13018+ };
13019+ uniquepointer = {
13020+ email = "uniquepointer@mailbox.org";
13021+ matrix = "@uniquepointer:matrix.org";
13022+ github = "uniquepointer";
13023+ githubId = 71751817;
13024+ name = "uniquepointer";
13025+ };
1055813026 unode = {
1055913027 email = "alves.rjc@gmail.com";
13028+ matrix = "@renato_alves:matrix.org";
1056013029 github = "unode";
1056113030 githubId = 122319;
1056213031 name = "Renato Alves";
1056313032 };
13033+ unrooted = {
13034+ name = "Konrad Klawikowski";
13035+ email = "konrad.root.klawikowski@gmail.com";
13036+ github = "unrooted";
13037+ githubId = 30440603;
13038+ };
1056413039 uralbash = {
1056513040 email = "root@uralbash.ru";
1056613041 github = "uralbash";
@@ -10579,6 +13054,12 @@
1057913054 githubId = 33242106;
1058013055 name = "Uri Baghin";
1058113056 };
13057+ urlordjames = {
13058+ email = "urlordjames@gmail.com";
13059+ github = "urlordjames";
13060+ githubId = 32751441;
13061+ name = "urlordjames";
13062+ };
1058213063 uskudnik = {
1058313064 email = "urban.skudnik@gmail.com";
1058413065 github = "uskudnik";
@@ -10609,14 +13090,9 @@
1060913090 github = "deviant";
1061013091 githubId = 68829907;
1061113092 };
10612− va1entin = {
10613− email = "github@valentinsblog.com";
10614− github = "va1entin";
10615− githubId = 31535155;
10616− name = "Valentin Heidelberger";
10617− };
1061813093 vaibhavsagar = {
1061913094 email = "vaibhavsagar@gmail.com";
13095+ matrix = "@vaibhavsagar:matrix.org";
1062013096 github = "vaibhavsagar";
1062113097 githubId = 1525767;
1062213098 name = "Vaibhav Sagar";
@@ -10635,6 +13111,7 @@
1063513111 };
1063613112 valodim = {
1063713113 email = "look@my.amazin.horse";
13114+ matrix = "@Valodim:stratum0.org";
1063813115 github = "valodim";
1063913116 githubId = 27813;
1064013117 name = "Vincent Breitmoser";
@@ -10645,6 +13122,16 @@
1064513122 githubId = 608417;
1064613123 name = "Jos van den Oever";
1064713124 };
13125+ vanilla = {
13126+ email = "osu_vanilla@126.com";
13127+ github = "VergeDX";
13128+ githubId = 25173827;
13129+ name = "Vanilla";
13130+ keys = [{
13131+ longkeyid = "rsa4096/0x3750028ED04FA42E";
13132+ fingerprint = "2649 340C C909 F821 D251 6714 3750 028E D04F A42E";
13133+ }];
13134+ };
1064813135 vanschelven = {
1064913136 email = "klaas@vanschelven.com";
1065013137 github = "vanschelven";
@@ -10685,6 +13172,7 @@
1068513172 name = "Vladimír Čunát";
1068613173 # vcunat@gmail.com predominated in commits before 2019/03
1068713174 email = "v@cunat.cz";
13175+ matrix = "@vcunat:matrix.org";
1068813176 github = "vcunat";
1068913177 githubId = 1785925;
1069013178 keys = [{
@@ -10710,7 +13198,7 @@
1071013198 };
1071113199 vel = {
1071213200 email = "llathasa@outlook.com";
10713− github = "llathasa-veleth";
13201+ github = "q60";
1071413202 githubId = 61933599;
1071513203 name = "vel";
1071613204 };
@@ -10732,15 +13220,21 @@
1073213220 githubId = 335406;
1073313221 name = "David Asabina";
1073413222 };
13223+ vidister = {
13224+ email = "v@vidister.de";
13225+ github = "vidister";
13226+ githubId = 11413574;
13227+ name = "Fiona Weber";
13228+ };
1073513229 vifino = {
1073613230 email = "vifino@tty.sh";
1073713231 github = "vifino";
1073813232 githubId = 5837359;
1073913233 name = "Adrian Pistol";
1074013234 };
10741− vika_nezrimaya = {
13235+ vikanezrimaya = {
1074213236 email = "vika@fireburn.ru";
10743− github = "kisik21";
13237+ github = "vikanezrimaya";
1074413238 githubId = 7953163;
1074513239 name = "Vika Shleina";
1074613240 keys = [{
@@ -10764,6 +13258,12 @@
1076413258 githubId = 118959;
1076513259 name = "VinyMeuh";
1076613260 };
13261+ viraptor = {
13262+ email = "nix@viraptor.info";
13263+ github = "viraptor";
13264+ githubId = 188063;
13265+ name = "Stanisław Pitucha";
13266+ };
1076713267 viric = {
1076813268 email = "viric@viric.name";
1076913269 github = "viric";
@@ -10794,6 +13294,12 @@
1079413294 githubId = 1771332;
1079513295 name = "László Vaskó";
1079613296 };
13297+ vlinkz = {
13298+ email = "vmfuentes64@gmail.com";
13299+ github = "vlinkz";
13300+ githubId = 20145996;
13301+ name = "Victor Fuentes";
13302+ };
1079713303 vlstill = {
1079813304 email = "xstill@fi.muni.cz";
1079913305 github = "vlstill";
@@ -10843,10 +13349,6 @@
1084313349 githubId = 3413119;
1084413350 name = "Vonfry";
1084513351 };
10846− vozz = {
10847− email = "oliver.huntuk@gmail.com";
10848− name = "Oliver Hunt";
10849− };
1085013352 vq = {
1085113353 email = "vq@erq.se";
1085213354 name = "Daniel Nilsson";
@@ -10887,6 +13389,26 @@
1088713389 githubId = 3889405;
1088813390 name = "vyp";
1088913391 };
13392+ wackbyte = {
13393+ name = "wackbyte";
13394+ email = "wackbyte@pm.me";
13395+ github = "wackbyte";
13396+ githubId = 29505620;
13397+ keys = [{
13398+ longkeyid = "rsa4096/0x937F2AE5CCEFBF59";
13399+ fingerprint = "E595 7FE4 FEF6 714B 1AD3 1483 937F 2AE5 CCEF BF59";
13400+ }];
13401+ };
13402+ wakira = {
13403+ name = "Sheng Wang";
13404+ email = "sheng@a64.work";
13405+ github = "wakira";
13406+ githubId = 2338339;
13407+ keys = [{
13408+ longkeyid = "rsa4096/0x8C9B0A8FC0C0D862";
13409+ fingerprint = "47F7 009E 3AE3 1DA7 988E 12E1 8C9B 0A8F C0C0 D862";
13410+ }];
13411+ };
1089013412 wamserma = {
1089113413 name = "Markus S. Wamser";
1089213414 email = "github-dev@mail2013.wamser.eu";
@@ -10905,16 +13427,44 @@
1090513427 githubId = 34962284;
1090613428 name = "wchresta";
1090713429 };
13430+ wdavidw = {
13431+ name = "David Worms";
13432+ email = "david@adaltas.com";
13433+ github = "wdavidw";
13434+ githubId = 46896;
13435+ };
1090813436 wedens = {
1090913437 email = "kirill.wedens@gmail.com";
1091013438 name = "wedens";
1091113439 };
13440+ wegank = {
13441+ name = "Weijia Wang";
13442+ email = "contact@weijia.wang";
13443+ github = "wegank";
13444+ githubId = 9713184;
13445+ };
1091213446 weihua = {
1091313447 email = "luwh364@gmail.com";
1091413448 github = "weihua-lu";
1091513449 githubId = 9002575;
1091613450 name = "Weihua Lu";
1091713451 };
13452+ welteki = {
13453+ email = "welteki@pm.me";
13454+ github = "welteki";
13455+ githubId = 16267532;
13456+ name = "Han Verstraete";
13457+ keys = [{
13458+ longkeyid = "rsa4096/0x11F7BAEA856743FF";
13459+ fingerprint = "2145 955E 3F5E 0C95 3458 41B5 11F7 BAEA 8567 43FF";
13460+ }];
13461+ };
13462+ wentasah = {
13463+ name = "Michal Sojka";
13464+ email = "wsh@2x.cz";
13465+ github = "wentasah";
13466+ githubId = 140542;
13467+ };
1091813468 wheelsandmetal = {
1091913469 email = "jakob@schmutz.co.uk";
1092013470 github = "wheelsandmetal";
@@ -10927,6 +13477,12 @@
1092713477 githubId = 19174984;
1092813478 name = "Alex Whitt";
1092913479 };
13480+ whonore = {
13481+ email = "wolfhonore@gmail.com";
13482+ github = "whonore";
13483+ githubId = 7121530;
13484+ name = "Wolf Honoré";
13485+ };
1093013486 wildsebastian = {
1093113487 name = "Sebastian Wild";
1093213488 email = "sebastian@wild-siena.com";
@@ -10947,6 +13503,12 @@
1094713503 email = "tim.williams.public@gmail.com";
1094813504 name = "Tim Philip Williams";
1094913505 };
13506+ willcohen = {
13507+ email = "willcohen@users.noreply.github.com";
13508+ github = "willcohen";
13509+ githubId = 5185341;
13510+ name = "Will Cohen";
13511+ };
1095013512 winden = {
1095113513 email = "windenntw@gmail.com";
1095213514 name = "Antonio Vargas Gonzalez";
@@ -10957,12 +13519,18 @@
1095713519 githubId = 6016963;
1095813520 name = "Patrick Winter";
1095913521 };
10960− winterqt = {
13522+ winter = {
1096113523 email = "nixos@winter.cafe";
1096213524 github = "winterqt";
1096313525 githubId = 78392041;
1096413526 name = "Winter";
1096513527 };
13528+ wintrmvte = {
13529+ name = "Jakub Lutczyn";
13530+ email = "kubalutczyn@gmail.com";
13531+ github = "wintrmvte";
13532+ githubId = 41823252;
13533+ };
1096613534 wirew0rm = {
1096713535 email = "alex@wirew0rm.de";
1096813536 github = "wirew0rm";
@@ -11024,7 +13592,7 @@
1102413592 name = "Andrei Pampu";
1102513593 };
1102613594 wolfangaukang = {
11027− email = "liquid.query960@4wrd.cc";
13595+ email = "clone.gleeful135+nixpkgs@anonaddy.me";
1102813596 github = "wolfangaukang";
1102913597 githubId = 8378365;
1103013598 name = "P. R. d. O.";
@@ -11041,6 +13609,12 @@
1104113609 githubId = 28888242;
1104213610 name = "WORLDofPEACE";
1104313611 };
13612+ wr0belj = {
13613+ name = "Jakub Wróbel";
13614+ email = "wrobel.jakub@protonmail.com";
13615+ github = "wr0belj";
13616+ githubId = 40501814;
13617+ };
1104413618 wscott = {
1104513619 email = "wsc9tt@gmail.com";
1104613620 github = "wscott";
@@ -11048,7 +13622,7 @@
1104813622 name = "Wayne Scott";
1104913623 };
1105013624 wucke13 = {
11051− email = "info@wucke13.de";
13625+ email = "wucke13@gmail.com";
1105213626 github = "wucke13";
1105313627 githubId = 20400405;
1105413628 name = "Wucke";
@@ -11071,12 +13645,25 @@
1107113645 github = "wunderbrick";
1107213646 githubId = 52174714;
1107313647 };
13648+ wyndon = {
13649+ email = "72203260+wyndon@users.noreply.github.com";
13650+ matrix = "@wyndon:envs.net";
13651+ github = "wyndon";
13652+ githubId = 72203260;
13653+ name = "wyndon";
13654+ };
1107413655 wyvie = {
1107513656 email = "elijahrum@gmail.com";
1107613657 github = "wyvie";
1107713658 githubId = 3992240;
1107813659 name = "Elijah Rum";
1107913660 };
13661+ x3ro = {
13662+ name = "^x3ro";
13663+ email = "nix@x3ro.dev";
13664+ github = "x3rAx";
13665+ githubId = 2268851;
13666+ };
1108013667 xaverdh = {
1108113668 email = "hoe.dom@gmx.de";
1108213669 github = "xaverdh";
@@ -11097,6 +13684,7 @@
1109713684 };
1109813685 xe = {
1109913686 email = "me@christine.website";
13687+ matrix = "@withoutwithin:matrix.org";
1110013688 github = "Xe";
1110113689 githubId = 529003;
1110213690 name = "Christine Dodrill";
@@ -11115,10 +13703,17 @@
1111513703 };
1111613704 xfix = {
1111713705 email = "konrad@borowski.pw";
13706+ matrix = "@xfix:matrix.org";
1111813707 github = "xfix";
1111913708 githubId = 1297598;
1112013709 name = "Konrad Borowski";
1112113710 };
13711+ xgroleau = {
13712+ email = "xgroleau@gmail.com";
13713+ github = "xgroleau";
13714+ githubId = 31734358;
13715+ name = "Xavier Groleau";
13716+ };
1112213717 xiorcale = {
1112313718 email = "quentin.vaucher@pm.me";
1112413719 github = "xiorcale";
@@ -11161,12 +13756,6 @@
1116113756 githubId = 1962985;
1116213757 name = "Vincenzo Mantova";
1116313758 };
11164− xwvvvvwx = {
11165− email = "davidterry@posteo.de";
11166− github = "xwvvvvwx";
11167− githubId = 6689924;
11168− name = "David Terry";
11169− };
1117013759 xzfc = {
1117113760 email = "xzfcpw@gmail.com";
1117213761 github = "xzfc";
@@ -11179,6 +13768,12 @@
1117913768 githubId = 2242427;
1118013769 name = "Yoann Ono";
1118113770 };
13771+ yana = {
13772+ email = "yana@riseup.net";
13773+ github = "sowelisuwi";
13774+ githubId = 1643293;
13775+ name = "Yana Timoshenko";
13776+ };
1118213777 yarny = {
1118313778 email = "41838844+Yarny0@users.noreply.github.com";
1118413779 github = "Yarny0";
@@ -11191,11 +13786,12 @@
1119113786 githubId = 3705333;
1119213787 name = "Dmitry V.";
1119313788 };
11194− yegortimoshenko = {
11195− email = "yegortimoshenko@riseup.net";
11196− github = "yegortimoshenko";
11197− githubId = 1643293;
11198− name = "Yegor Timoshenko";
13789+ yayayayaka = {
13790+ email = "nixpkgs@uwu.is";
13791+ matrix = "@lara:uwu.is";
13792+ github = "yayayayaka";
13793+ githubId = 73759599;
13794+ name = "Lara A.";
1119913795 };
1120013796 yesbox = {
1120113797 email = "jesper.geertsen.jonsson@gmail.com";
@@ -11203,12 +13799,30 @@
1120313799 githubId = 4113027;
1120413800 name = "Jesper Geertsen Jonsson";
1120513801 };
13802+ yinfeng = {
13803+ email = "lin.yinfeng@outlook.com";
13804+ github = "linyinfeng";
13805+ githubId = 11229748;
13806+ name = "Lin Yinfeng";
13807+ };
13808+ ylecornec = {
13809+ email = "yves.stan.lecornec@tweag.io";
13810+ github = "ylecornec";
13811+ githubId = 5978566;
13812+ name = "Yves-Stan Le Cornec";
13813+ };
1120613814 ylwghst = {
1120713815 email = "ylwghst@onionmail.info";
1120813816 github = "ylwghst";
1120913817 githubId = 26011724;
1121013818 name = "Burim Augustin Berisa";
1121113819 };
13820+ yl3dy = {
13821+ email = "aleksandr.kiselyov@gmail.com";
13822+ github = "yl3dy";
13823+ githubId = 1311192;
13824+ name = "Alexander Kiselyov";
13825+ };
1121213826 yochai = {
1121313827 email = "yochai@titat.info";
1121413828 github = "yochai";
@@ -11223,6 +13837,7 @@
1122313837 };
1122413838 yorickvp = {
1122513839 email = "yorickvanpelt@gmail.com";
13840+ matrix = "@yorickvp:matrix.org";
1122613841 github = "yorickvp";
1122713842 githubId = 647076;
1122813843 name = "Yorick van Pelt";
@@ -11233,6 +13848,12 @@
1123313848 githubId = 452;
1123413849 name = "Yurii Rashkovskii";
1123513850 };
13851+ yrd = {
13852+ name = "Yannik Rödel";
13853+ email = "nix@yannik.info";
13854+ github = "yrd";
13855+ githubId = 1820447;
13856+ };
1123613857 ysndr = {
1123713858 email = "me@ysndr.de";
1123813859 github = "ysndr";
@@ -11261,8 +13882,16 @@
1126113882 fingerprint = "85F8 E850 F8F2 F823 F934 535B EC50 6589 9AEA AF4C";
1126213883 }];
1126313884 };
13885+ yuka = {
13886+ email = "yuka@yuka.dev";
13887+ matrix = "@yuka:yuka.dev";
13888+ github = "yu-re-ka";
13889+ githubId = 86169957;
13890+ name = "Yureka";
13891+ };
1126413892 yusdacra = {
1126513893 email = "y.bera003.06@protonmail.com";
13894+ matrix = "@yusdacra:nixos.dev";
1126613895 github = "yusdacra";
1126713896 githubId = 19897088;
1126813897 name = "Yusuf Bera Ertan";
@@ -11271,6 +13900,16 @@
1127113900 fingerprint = "9270 66BD 8125 A45B 4AC4 0326 6180 7181 F60E FCB2";
1127213901 }];
1127313902 };
13903+ yuu = {
13904+ email = "yuuyin@protonmail.com";
13905+ github = "yuuyins";
13906+ githubId = 86538850;
13907+ name = "Yuu Yin";
13908+ keys = [{
13909+ longkeyid = "rsa4096/0x416F303B43C20AC3";
13910+ fingerprint = "9F19 3AE8 AA25 647F FC31 46B5 416F 303B 43C2 0AC3";
13911+ }];
13912+ };
1127413913 yvesf = {
1127513914 email = "yvesf+nix@xapek.org";
1127613915 github = "yvesf";
@@ -11365,6 +14004,7 @@
1136514004 };
1136614005 zhaofengli = {
1136714006 email = "hello@zhaofeng.li";
14007+ matrix = "@zhaofeng:zhaofeng.li";
1136814008 github = "zhaofengli";
1136914009 githubId = 2189609;
1137014010 name = "Zhaofeng Li";
@@ -11393,12 +14033,6 @@
1139314033 githubId = 1772064;
1139414034 name = "Tim Zook";
1139514035 };
11396− zoomulator = {
11397− email = "zoomulator@gmail.com";
11398− github = "zoomulator";
11399− githubId = 1069303;
11400− name = "Kim Simmons";
11401− };
1140214036 zopieux = {
1140314037 email = "zopieux@gmail.com";
1140414038 github = "zopieux";
@@ -11495,12 +14129,6 @@
1149514129 githubId = 8686360;
1149614130 name = "Illia Shestakov";
1149714131 };
11498− foxit64 = {
11499− email = "o4nsxy05@gmail.com";
11500− github = "foxit64";
11501− githubId = 56247270;
11502− name = "Foxit";
11503− };
1150414132 masaeedu = {
1150514133 email = "masaeedu@gmail.com";
1150614134 github = "masaeedu";
@@ -11583,9 +14211,16 @@
1158314211 github = "deifactor";
1158414212 githubId = 30192992;
1158514213 };
14214+ deinferno = {
14215+ name = "deinferno";
14216+ email = "14363193+deinferno@users.noreply.github.com";
14217+ github = "deinferno";
14218+ githubId = 14363193;
14219+ };
1158614220 fzakaria = {
1158714221 name = "Farid Zakaria";
1158814222 email = "farid.m.zakaria@gmail.com";
14223+ matrix = "@fzakaria:matrix.org";
1158914224 github = "fzakaria";
1159014225 githubId = 605070;
1159114226 };
@@ -11595,15 +14230,16 @@
1159514230 github = "nagisa";
1159614231 githubId = 679122;
1159714232 };
11598− yevhenshymotiuk = {
14233+ yshym = {
1159914234 name = "Yevhen Shymotiuk";
11600− email = "yevhenshymotiuk@gmail.com";
11601− github = "yevhenshymotiuk";
14235+ email = "yshym@pm.me";
14236+ github = "yshym";
1160214237 githubId = 44244245;
1160314238 };
1160414239 hmenke = {
1160514240 name = "Henri Menke";
1160614241 email = "henri@henrimenke.de";
14242+ matrix = "@hmenke:matrix.org";
1160714243 github = "hmenke";
1160814244 githubId = 1903556;
1160914245 keys = [{
@@ -11667,6 +14303,17 @@
1166714303 github = "pulsation";
1166814304 githubId = 1838397;
1166914305 };
14306+ princemachiavelli = {
14307+ name = "Josh Hoffer";
14308+ email = "jhoffer@sansorgan.es";
14309+ matrix = "@princemachiavelli:matrix.org";
14310+ github = "princemachiavelli";
14311+ githubId = 2730968;
14312+ keys = [{
14313+ longkeyid = "ed25519/0x83124F97A318EA18";
14314+ fingerprint = "DD54 130B ABEC B65C 1F6B 2A38 8312 4F97 A318 EA18";
14315+ }];
14316+ };
1167014317 ydlr = {
1167114318 name = "ydlr";
1167214319 email = "ydlr@ydlr.io";
@@ -11687,12 +14334,51 @@
1168714334 fingerprint = "61AE D40F 368B 6F26 9DAE 3892 6861 6B2D 8AC4 DCC5";
1168814335 }];
1168914336 };
14337+ zbioe = {
14338+ name = "Iury Fukuda";
14339+ email = "zbioe@protonmail.com";
14340+ github = "zbioe";
14341+ githubId = 7332055;
14342+ };
14343+ zendo = {
14344+ name = "zendo";
14345+ email = "linzway@qq.com";
14346+ github = "zendo";
14347+ githubId = 348013;
14348+ };
14349+ zenithal = {
14350+ name = "zenithal";
14351+ email = "i@zenithal.me";
14352+ github = "ZenithalHourlyRate";
14353+ githubId = 19512674;
14354+ keys = [{
14355+ longkeyid = "rsa4096/0x87E17EEF9B18B6C9";
14356+ fingerprint = "1127 F188 280A E312 3619 3329 87E1 7EEF 9B18 B6C9";
14357+ }];
14358+ };
1169014359 zeri = {
1169114360 name = "zeri";
1169214361 email = "68825133+zeri42@users.noreply.github.com";
14362+ matrix = "@zeri:matrix.org";
1169314363 github = "zeri42";
1169414364 githubId = 68825133;
1169514365 };
14366+ zoedsoupe = {
14367+ github = "zoedsoupe";
14368+ githubId = 44469426;
14369+ name = "Zoey de Souza Pessanha";
14370+ email = "zoey.spessanha@outlook.com";
14371+ keys = [{
14372+ longkeyid = "rsa4096/0x1E1E889CDBD6A315";
14373+ fingerprint = "EAA1 51DB 472B 0122 109A CB17 1E1E 889C DBD6 A315";
14374+ }];
14375+ };
14376+ zombiezen = {
14377+ name = "Ross Light";
14378+ email = "ross@zombiezen.com";
14379+ github = "zombiezen";
14380+ githubId = 181535;
14381+ };
1169614382 zseri = {
1169714383 name = "zseri";
1169814384 email = "zseri.devel@ytrizja.de";
@@ -11709,4 +14395,87 @@
1170914395 github = "zupo";
1171014396 githubId = 311580;
1171114397 };
14398+ sei40kr = {
14399+ name = "Seong Yong-ju";
14400+ email = "sei40kr@gmail.com";
14401+ github = "sei40kr";
14402+ githubId = 11665236;
14403+ };
14404+ vdot0x23 = {
14405+ name = "Victor Büttner";
14406+ email = "nix.victor@0x23.dk";
14407+ github = "vdot0x23";
14408+ githubId = 40716069;
14409+ };
14410+ jpagex = {
14411+ name = "Jérémy Pagé";
14412+ email = "contact@jeremypage.me";
14413+ github = "jpagex";
14414+ githubId = 635768;
14415+ };
14416+ vbrandl = {
14417+ name = "Valentin Brandl";
14418+ email = "mail+nixpkgs@vbrandl.net";
14419+ github = "vbrandl";
14420+ githubId = 20639051;
14421+ };
14422+ portothree = {
14423+ name = "Gustavo Porto";
14424+ email = "gustavoporto@ya.ru";
14425+ github = "portothree";
14426+ githubId = 3718120;
14427+ };
14428+ pwoelfel = {
14429+ name = "Philipp Woelfel";
14430+ email = "philipp.woelfel@gmail.com";
14431+ github = "PhilippWoelfel";
14432+ githubId = 19400064;
14433+ };
14434+ qbit = {
14435+ name = "Aaron Bieber";
14436+ email = "aaron@bolddaemon.com";
14437+ github = "qbit";
14438+ githubId = 68368;
14439+ matrix = "@qbit:tapenet.org";
14440+ keys = [{
14441+ longkeyid = "rsa4096/0x1F81112D62A9ADCE";
14442+ fingerprint = "3586 3350 BFEA C101 DB1A 4AF0 1F81 112D 62A9 ADCE";
14443+ }];
14444+ };
14445+ ameer = {
14446+ name = "Ameer Taweel";
14447+ email = "ameertaweel2002@gmail.com";
14448+ github = "AmeerTaweel";
14449+ githubId = 20538273;
14450+ };
14451+ nigelgbanks = {
14452+ name = "Nigel Banks";
14453+ email = "nigel.g.banks@gmail.com";
14454+ github = "nigelgbanks";
14455+ githubId = 487373;
14456+ };
14457+ zanculmarktum = {
14458+ name = "Azure Zanculmarktum";
14459+ email = "zanculmarktum@gmail.com";
14460+ github = "zanculmarktum";
14461+ githubId = 16958511;
14462+ };
14463+ kuwii = {
14464+ name = "kuwii";
14465+ email = "kuwii.someone@gmail.com";
14466+ github = "kuwii";
14467+ githubId = 10705175;
14468+ };
14469+ melias122 = {
14470+ name = "Martin Elias";
14471+ email = "martin+nixpkgs@elias.sx";
14472+ github = "melias122";
14473+ githubId = 1027766;
14474+ };
14475+ bryanhonof = {
14476+ name = "Bryan Honof";
14477+ email = "bryanhonof@gmail.com";
14478+ github = "bryanhonof";
14479+ githubId = 5932804;
14480+ };
1171214481}
maintainers/scripts/check-maintainer-github-handles.sh+9−9
@@ -4,20 +4,19 @@
44# Example how to work with the `lib.maintainers` attrset.
55# Can be used to check whether all user handles are still valid.
66
7−set -e
8−
9−# nixpkgs='<nixpkgs>'
10−# if [ -n "$1" ]; then
7+set -o errexit -o noclobber -o nounset -o pipefail
8+shopt -s failglob inherit_errexit
119
1210function checkCommits {
13− local user="$1"
14− local tmp=$(mktemp)
11+ local ret status tmp user
12+ user="$1"
13+ tmp=$(mktemp)
1514 curl --silent -w "%{http_code}" \
1615 "https://github.com/NixOS/nixpkgs/commits?author=$user" \
1716 > "$tmp"
1817 # the last line of tmp contains the http status
19− local status=$(tail -n1 "$tmp")
20− local ret=
18+ status=$(tail -n1 "$tmp")
19+ ret=
2120 case $status in
2221 200) if <"$tmp" grep -i "no commits found" > /dev/null; then
2322 ret=1
@@ -31,7 +30,7 @@ function checkCommits {
3130 checkCommits "$user"
3231 ret=$?
3332 ;;
34− *) printf "BAD STATUS: $(tail -n1 $tmp) for %s\n" "$user"; ret=1
33+ *) printf "BAD STATUS: $(tail -n1 "$tmp") for %s\n" "$user"; ret=1
3534 ret=1
3635 ;;
3736 esac
@@ -63,4 +62,5 @@ nix-instantiate -A lib.maintainers --eval --strict --json \
6362 | jq -r '.[]|.github|select(.)' \
6463 | parallel -j5 checkUser
6564
65+# To check some arbitrary users:
6666# parallel -j100 checkUser ::: "eelco" "profpatsch" "Profpatsch" "a"
maintainers/scripts/copy-tarballs.pl+15−1
@@ -165,6 +165,20 @@ elsif (defined $expr) {
165165 my $hash = $fetch->{hash};
166166 my $name = $fetch->{name};
167167
168+ if ($hash =~ /^([a-z0-9]+)-([A-Za-z0-9+\/=]+)$/) {
169+ $algo = $1;
170+ $hash = `nix hash to-base16 $hash` or die;
171+ chomp $hash;
172+ }
173+
174+ next unless $algo =~ /^[a-z0-9]+$/;
175+
176+ # Convert non-SRI base-64 to base-16.
177+ if ($hash =~ /^[A-Za-z0-9+\/=]+$/) {
178+ $hash = `nix hash to-base16 --type '$algo' $hash` or die;
179+ chomp $hash;
180+ }
181+
168182 if (defined $ENV{DEBUG}) {
169183 print "$url $algo $hash\n";
170184 next;
@@ -184,7 +198,7 @@ elsif (defined $expr) {
184198
185199 my $storePath = makeFixedOutputPath(0, $algo, $hash, $name);
186200
187− print STDERR "mirroring $url ($storePath)...\n";
201+ print STDERR "mirroring $url ($storePath, $algo, $hash)...\n";
188202
189203 if ($dryRun) {
190204 $mirrored++;
maintainers/scripts/db-to-md.shnew file+88
@@ -0,0 +1,88 @@
1+#! /usr/bin/env nix-shell
2+#! nix-shell -I nixpkgs=. -i bash -p pandoc
3+
4+# This script is temporarily needed while we transition the manual to
5+# CommonMark. It converts DocBook files into our CommonMark flavour.
6+
7+debug=
8+files=()
9+
10+while [ "$#" -gt 0 ]; do
11+ i="$1"; shift 1
12+ case "$i" in
13+ --debug)
14+ debug=1
15+ ;;
16+ *)
17+ files+=("$i")
18+ ;;
19+ esac
20+done
21+
22+echo "WARNING: This is an experimental script and might not preserve all formatting." > /dev/stderr
23+echo "Please report any issues you discover." > /dev/stderr
24+
25+outExtension="md"
26+if [[ $debug ]]; then
27+ outExtension="json"
28+fi
29+
30+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
31+
32+# NOTE: Keep in sync with Nixpkgs manual (/doc/Makefile).
33+# TODO: Remove raw-attribute when we can get rid of DocBook altogether.
34+pandoc_commonmark_enabled_extensions=+attributes+fenced_divs+footnotes+bracketed_spans+definition_lists+pipe_tables+raw_attribute
35+targetLang="commonmark${pandoc_commonmark_enabled_extensions}+smart"
36+if [[ $debug ]]; then
37+ targetLang=json
38+fi
39+pandoc_flags=(
40+ # Not needed:
41+ # - diagram-generator.lua (we do not support that in NixOS manual to limit dependencies)
42+ # - media extraction (was only required for diagram generator)
43+ # - myst-reader/roles.lua (only relevant for MyST → DocBook)
44+ # - link-unix-man-references.lua (links should only be added to display output)
45+ # - docbook-writer/rst-roles.lua (only relevant for → DocBook)
46+ # - docbook-writer/labelless-link-is-xref.lua (only relevant for → DocBook)
47+ "--lua-filter=$DIR/../../doc/build-aux/pandoc-filters/docbook-reader/citerefentry-to-rst-role.lua"
48+ "--lua-filter=$DIR/../../doc/build-aux/pandoc-filters/myst-writer/roles.lua"
49+ "--lua-filter=$DIR/doc/unknown-code-language.lua"
50+ -f docbook
51+ -t "$targetLang"
52+ --tab-stop=2
53+ --wrap=none
54+)
55+
56+for file in "${files[@]}"; do
57+ if [[ ! -f "$file" ]]; then
58+ echo "db-to-md.sh: $file does not exist" > /dev/stderr
59+ exit 1
60+ else
61+ rootElement=$(xmllint --xpath 'name(//*)' "$file")
62+
63+ if [[ $rootElement = chapter ]]; then
64+ extension=".chapter.$outExtension"
65+ elif [[ $rootElement = section ]]; then
66+ extension=".section.$outExtension"
67+ else
68+ echo "db-to-md.sh: $file contains an unsupported root element $rootElement" > /dev/stderr
69+ exit 1
70+ fi
71+
72+ outFile="${file%".section.xml"}"
73+ outFile="${outFile%".chapter.xml"}"
74+ outFile="${outFile%".xml"}$extension"
75+ temp1=$(mktemp)
76+ $DIR/doc/escape-code-markup.py "$file" "$temp1"
77+ if [[ $debug ]]; then
78+ echo "Converted $file to $temp1" > /dev/stderr
79+ fi
80+ temp2=$(mktemp)
81+ $DIR/doc/replace-xrefs-by-empty-links.py "$temp1" "$temp2"
82+ if [[ $debug ]]; then
83+ echo "Converted $temp1 to $temp2" > /dev/stderr
84+ fi
85+ pandoc "$temp2" -o "$outFile" "${pandoc_flags[@]}"
86+ echo "Converted $file to $outFile" > /dev/stderr
87+ fi
88+done
maintainers/scripts/dep-licenses.sh+1−1
@@ -9,7 +9,7 @@ tmp=$(mktemp --tmpdir -d nixpkgs-dep-license.XXXXXX)
99exitHandler() {
1010 exitCode=$?
1111 rm -rf "$tmp"
12− exit $exitCode
12+ return $exitCode
1313}
1414
1515trap "exitHandler" EXIT
maintainers/scripts/doc/escape-code-markup.pynew file+97
@@ -0,0 +1,97 @@
1+#! /usr/bin/env nix-shell
2+#! nix-shell -I nixpkgs=channel:nixos-unstable -i python3 -p python3 -p python3.pkgs.lxml
3+
4+"""
5+Pandoc will strip any markup within code elements so
6+let’s escape them so that they can be handled manually.
7+"""
8+
9+import lxml.etree as ET
10+import re
11+import sys
12+
13+def replace_element_by_text(el: ET.Element, text: str) -> None:
14+ """
15+ Author: bernulf
16+ Source: https://stackoverflow.com/a/10520552/160386
17+ SPDX-License-Identifier: CC-BY-SA-3.0
18+ """
19+ text = text + (el.tail or "")
20+ parent = el.getparent()
21+ if parent is not None:
22+ previous = el.getprevious()
23+ if previous is not None:
24+ previous.tail = (previous.tail or "") + text
25+ else:
26+ parent.text = (parent.text or "") + text
27+ parent.remove(el)
28+
29+DOCBOOK_NS = "http://docbook.org/ns/docbook"
30+
31+# List of elements that pandoc’s DocBook reader strips markup from.
32+# https://github.com/jgm/pandoc/blob/master/src/Text/Pandoc/Readers/DocBook.hs
33+code_elements = [
34+ # CodeBlock
35+ "literallayout",
36+ "screen",
37+ "programlisting",
38+ # Code (inline)
39+ "classname",
40+ "code",
41+ "filename",
42+ "envar",
43+ "literal",
44+ "computeroutput",
45+ "prompt",
46+ "parameter",
47+ "option",
48+ "markup",
49+ "wordasword",
50+ "command",
51+ "varname",
52+ "function",
53+ "type",
54+ "symbol",
55+ "constant",
56+ "userinput",
57+ "systemitem",
58+]
59+
60+XMLNS_REGEX = re.compile(r'\s+xmlns(?::[^=]+)?="[^"]*"')
61+ROOT_ELEMENT_REGEX = re.compile(r'^\s*<[^>]+>')
62+
63+def remove_xmlns(match: re.Match) -> str:
64+ """
65+ Removes xmlns attributes.
66+
67+ Expects a match containing an opening tag.
68+ """
69+ return XMLNS_REGEX.sub('', match.group(0))
70+
71+if __name__ == '__main__':
72+ assert len(sys.argv) >= 3, "usage: escape-code-markup.py <input> <output>"
73+
74+ tree = ET.parse(sys.argv[1])
75+ name_predicate = " or ".join([f"local-name()='{el}'" for el in code_elements])
76+
77+ for markup in tree.xpath(f"//*[({name_predicate}) and namespace-uri()='{DOCBOOK_NS}']/*"):
78+ text = ET.tostring(markup, encoding=str)
79+
80+ # tostring adds xmlns attributes to the element we want to stringify
81+ # as if it was supposed to be usable standalone.
82+ # We are just converting it to CDATA so we do not care.
83+ # Let’s strip the namespace declarations to keep the code clean.
84+ #
85+ # Note that this removes even namespaces that were potentially
86+ # in the original file. Though, that should be very rare –
87+ # most of the time, we will stringify empty DocBook elements
88+ # like <xref> or <co> or, at worst, <link> with xlink:href attribute.
89+ #
90+ # Also note that the regex expects the root element to be first
91+ # thing in the string. But that should be fine, the tostring method
92+ # does not produce XML declaration or doctype by default.
93+ text = ROOT_ELEMENT_REGEX.sub(remove_xmlns, text)
94+
95+ replace_element_by_text(markup, text)
96+
97+ tree.write(sys.argv[2])
maintainers/scripts/doc/replace-xrefs-by-empty-links.pynew file+32
@@ -0,0 +1,32 @@
1+#! /usr/bin/env nix-shell
2+#! nix-shell -I nixpkgs=channel:nixos-unstable -i python3 -p python3 -p python3.pkgs.lxml
3+
4+"""
5+Pandoc will try to resolve xrefs and replace them with regular links.
6+let’s replace them with links with empty labels which MyST
7+and our pandoc filters recognize as cross-references.
8+"""
9+
10+import lxml.etree as ET
11+import sys
12+
13+XLINK_NS = "http://www.w3.org/1999/xlink"
14+
15+ns = {
16+ "db": "http://docbook.org/ns/docbook",
17+}
18+
19+
20+if __name__ == '__main__':
21+ assert len(sys.argv) >= 3, "usage: replace-xrefs-by-empty-links.py <input> <output>"
22+
23+ tree = ET.parse(sys.argv[1])
24+ for xref in tree.findall(".//db:xref", ns):
25+ text = ET.tostring(xref, encoding=str)
26+ parent = xref.getparent()
27+ link = parent.makeelement('link')
28+ target_name = xref.get("linkend")
29+ link.set(f"{{{XLINK_NS}}}href", f"#{target_name}")
30+ parent.replace(xref, link)
31+
32+ tree.write(sys.argv[2])
maintainers/scripts/doc/unknown-code-language.luanew file+12
@@ -0,0 +1,12 @@
1+--[[
2+Adds “unknown” class to CodeBlock AST nodes without any classes.
3+
4+This will cause Pandoc to use fenced code block, which we prefer.
5+]]
6+
7+function CodeBlock(elem)
8+ if #elem.classes == 0 then
9+ elem.classes:insert('unknown')
10+ return elem
11+ end
12+end
maintainers/scripts/feature-freeze-teams.plnew file+98
@@ -0,0 +1,98 @@
1+#!/usr/bin/env nix-shell
2+#!nix-shell -i perl -p perl -p perlPackages.JSON perlPackages.LWPUserAgent perlPackages.LWPProtocolHttps perlPackages.TermReadKey
3+
4+# This script generates a list of teams to ping for the Feature Freeze announcement on Discourse.
5+# It's intended to be used by Release Managers before creating such posts.
6+#
7+# The script interactively reads a GitHub username and a corresponding GitHub Personal Access token.
8+# This is required to access the GitHub Teams API so the token needs at least the read:org privilege.
9+
10+## no critic (InputOutput::RequireCheckedSyscalls, InputOutput::ProhibitBacktickOperators)
11+use strict;
12+use warnings;
13+use Carp;
14+use Cwd 'abs_path';
15+use File::Basename;
16+use JSON qw(decode_json);
17+use LWP::UserAgent;
18+use Term::ReadKey qw(ReadLine ReadMode);
19+
20+sub github_team_members {
21+ my ($team_name, $username, $token) = @_;
22+ my @ret;
23+
24+ my $req = HTTP::Request->new('GET', "https://api.github.com/orgs/NixOS/teams/$team_name/members", [ 'Accept' => 'application/vnd.github.v3+json' ]);
25+ $req->authorization_basic($username, $token);
26+ my $response = LWP::UserAgent->new->request($req);
27+
28+ if ($response->is_success) {
29+ my $content = decode_json($response->decoded_content);
30+ foreach (@{$content}) {
31+ push @ret, $_->{'login'};
32+ }
33+ } else {
34+ print {*STDERR} "!! Requesting members of GitHub Team '$team_name' failed: $response->status_line";
35+ }
36+
37+ return \@ret;
38+}
39+
40+# Read GitHub credentials
41+print {*STDERR} 'GitHub username: ';
42+my $github_user = ReadLine(0);
43+ReadMode('noecho');
44+print {*STDERR} 'GitHub personal access token (no echo): ';
45+my $github_token = ReadLine(0);
46+ReadMode('restore');
47+print {*STDERR} "\n";
48+chomp $github_user;
49+chomp $github_token;
50+
51+# Read nix output
52+my $nix_version = `nix --version`;
53+my $out;
54+my $lib_path = abs_path(dirname(__FILE__)) . '../../../lib';
55+if ($nix_version =~ m/2[.]3[.]/msx) {
56+ $out = `nix eval --json '(import $lib_path).teams'` || croak 'nix eval failed';
57+} else {
58+ $out = `nix --extra-experimental-features nix-command eval --json --impure --expr '(import $lib_path).teams'` || croak('nix eval failed');
59+}
60+my $data = decode_json($out);
61+
62+# Process teams
63+print {*STDERR} "\n";
64+while (my ($team_nix_key, $team_config) = each %{$data}) {
65+ # Ignore teams that don't want to be or can't be pinged
66+ if (not defined $team_config->{enableFeatureFreezePing} or not $team_config->{enableFeatureFreezePing}) {
67+ next;
68+ }
69+ if (not defined $team_config->{shortName}) {
70+ print {*STDERR} "!! The team with the nix key '$team_nix_key' has no shortName set - ignoring";
71+ next;
72+ }
73+ # Team name
74+ print {*STDERR} "$team_config->{shortName}:";
75+ # GitHub Teams
76+ my @github_members;
77+ if (defined $team_config->{githubTeams}) {
78+ foreach (@{$team_config->{githubTeams}}) {
79+ print {*STDERR} " \@NixOS/${_}";
80+ push @github_members, @{github_team_members($_, $github_user, $github_token)};
81+ }
82+ }
83+ my %github_members = map { $_ => 1 } @github_members;
84+ # Members
85+ if (defined $team_config->{members}) {
86+ foreach (@{$team_config->{members}}) {
87+ my %user = %{$_};
88+ my $github_handle = $user{'github'};
89+ # Ensure we don't ping team members twice (as team member and directly)
90+ if (defined $github_members{$github_handle}) {
91+ next;
92+ }
93+ print {*STDERR} " \@$github_handle";
94+ }
95+ }
96+
97+ print {*STDERR} "\n";
98+}
maintainers/scripts/find-tarballs.nix+1−1
@@ -37,7 +37,7 @@ let
3737 keyDrv = drv: if canEval drv.drvPath then { key = drv.drvPath; value = drv; } else { };
3838
3939 immediateDependenciesOf = drv:
40− concatLists (mapAttrsToList (n: v: derivationsIn v) (removeAttrs drv ["meta" "passthru"]));
40+ concatLists (mapAttrsToList (n: v: derivationsIn v) (removeAttrs drv (["meta" "passthru"] ++ optionals (drv?passthru) (attrNames drv.passthru))));
4141
4242 derivationsIn = x:
4343 if !canEval x then []
maintainers/scripts/haskell/dependencies.nixnew file+10
@@ -0,0 +1,10 @@
1+# Nix script to calculate the Haskell dependencies of every haskellPackage. Used by ./hydra-report.hs.
2+let
3+ pkgs = import ../../.. {};
4+ inherit (pkgs) lib;
5+ getDeps = _: pkg: {
6+ deps = builtins.filter (x: !isNull x) (map (x: x.pname or null) (pkg.propagatedBuildInputs or []));
7+ broken = (pkg.meta.hydraPlatforms or [null]) == [];
8+ };
9+in
10+ lib.mapAttrs getDeps pkgs.haskellPackages
maintainers/scripts/haskell/hydra-report.hs+115−33
@@ -26,6 +26,8 @@ Because step 1) is quite expensive and takes roughly ~5 minutes the result is ca
2626{-# LANGUAGE ScopedTypeVariables #-}
2727{-# LANGUAGE TupleSections #-}
2828{-# OPTIONS_GHC -Wall #-}
29+{-# LANGUAGE ViewPatterns #-}
30+{-# LANGUAGE TupleSections #-}
2931
3032import Control.Monad (forM_, (<=<))
3133import Control.Monad.Trans (MonadIO (liftIO))
@@ -41,7 +43,7 @@ import Data.List.NonEmpty (NonEmpty, nonEmpty)
4143import qualified Data.List.NonEmpty as NonEmpty
4244import Data.Map.Strict (Map)
4345import qualified Data.Map.Strict as Map
44−import Data.Maybe (fromMaybe, mapMaybe)
46+import Data.Maybe (fromMaybe, mapMaybe, isNothing)
4547import Data.Monoid (Sum (Sum, getSum))
4648import Data.Sequence (Seq)
4749import qualified Data.Sequence as Seq
@@ -70,6 +72,12 @@ import System.Directory (XdgDirectory (XdgCache), getXdgDirectory)
7072import System.Environment (getArgs)
7173import System.Process (readProcess)
7274import Prelude hiding (id)
75+import Data.List (sortOn)
76+import Control.Concurrent.Async (concurrently)
77+import Control.Exception (evaluate)
78+import qualified Data.IntMap.Strict as IntMap
79+import qualified Data.IntSet as IntSet
80+import Data.Bifunctor (second)
7381
7482newtype JobsetEvals = JobsetEvals
7583 { evals :: Seq Eval
@@ -134,20 +142,17 @@ hydraEvalCommand = "hydra-eval-jobs"
134142hydraEvalParams :: [String]
135143hydraEvalParams = ["-I", ".", "pkgs/top-level/release-haskell.nix"]
136144
137−handlesCommand :: FilePath
138−handlesCommand = "nix-instantiate"
139−
140−handlesParams :: [String]
141−handlesParams = ["--eval", "--strict", "--json", "-"]
145+nixExprCommand :: FilePath
146+nixExprCommand = "nix-instantiate"
142147
143−handlesExpression :: String
144−handlesExpression = "with import ./. {}; with lib; zipAttrsWith (_: builtins.head) (mapAttrsToList (_: v: if v ? github then { \"${v.email}\" = v.github; } else {}) (import maintainers/maintainer-list.nix))"
148+nixExprParams :: [String]
149+nixExprParams = ["--eval", "--strict", "--json"]
145150
146151-- | This newtype is used to parse a Hydra job output from @hydra-eval-jobs@.
147152-- The only field we are interested in is @maintainers@, which is why this
148153-- is just a newtype.
149154--
150−-- Note that there are occassionally jobs that don't have a maintainers
155+-- Note that there are occasionally jobs that don't have a maintainers
151156-- field, which is why this has to be @Maybe Text@.
152157newtype Maintainers = Maintainers { maintainers :: Maybe Text }
153158 deriving stock (Generic, Show)
@@ -195,13 +200,49 @@ type EmailToGitHubHandles = Map Text Text
195200-- @@
196201type MaintainerMap = Map Text (NonEmpty Text)
197202
198−-- | Generate a mapping of Hydra job names to maintainer GitHub handles.
203+-- | Information about a package which lists its dependencies and whether the
204+-- package is marked broken.
205+data DepInfo = DepInfo {
206+ deps :: Set Text,
207+ broken :: Bool
208+}
209+ deriving stock (Generic, Show)
210+ deriving anyclass (FromJSON, ToJSON)
211+
212+-- | Map from package names to their DepInfo. This is the data we get out of a
213+-- nix call.
214+type DependencyMap = Map Text DepInfo
215+
216+-- | Map from package names to its broken state, number of reverse dependencies (fst) and
217+-- unbroken reverse dependencies (snd).
218+type ReverseDependencyMap = Map Text (Int, Int)
219+
220+-- | Calculate the (unbroken) reverse dependencies of a package by transitively
221+-- going through all packages if it’s a dependency of them.
222+calculateReverseDependencies :: DependencyMap -> ReverseDependencyMap
223+calculateReverseDependencies depMap = Map.fromDistinctAscList $ zip keys (zip (rdepMap False) (rdepMap True))
224+ where
225+ -- This code tries to efficiently invert the dependency map and calculate
226+ -- it’s transitive closure by internally identifying every pkg with it’s index
227+ -- in the package list and then using memoization.
228+ keys = Map.keys depMap
229+ pkgToIndexMap = Map.fromDistinctAscList (zip keys [0..])
230+ intDeps = zip [0..] $ (\DepInfo{broken,deps} -> (broken,mapMaybe (`Map.lookup` pkgToIndexMap) $ Set.toList deps)) <$> Map.elems depMap
231+ rdepMap onlyUnbroken = IntSet.size <$> resultList
232+ where
233+ resultList = go <$> [0..]
234+ oneStepMap = IntMap.fromListWith IntSet.union $ (\(key,(_,deps)) -> (,IntSet.singleton key) <$> deps) <=< filter (\(_, (broken,_)) -> not (broken && onlyUnbroken)) $ intDeps
235+ go pkg = IntSet.unions (oneStep:((resultList !!) <$> IntSet.toList oneStep))
236+ where oneStep = IntMap.findWithDefault mempty pkg oneStepMap
237+
238+-- | Generate a mapping of Hydra job names to maintainer GitHub handles. Calls
239+-- hydra-eval-jobs and the nix script ./maintainer-handles.nix.
199240getMaintainerMap :: IO MaintainerMap
200241getMaintainerMap = do
201242 hydraJobs :: HydraJobs <-
202− readJSONProcess hydraEvalCommand hydraEvalParams "" "Failed to decode hydra-eval-jobs output: "
243+ readJSONProcess hydraEvalCommand hydraEvalParams "Failed to decode hydra-eval-jobs output: "
203244 handlesMap :: EmailToGitHubHandles <-
204− readJSONProcess handlesCommand handlesParams handlesExpression "Failed to decode nix output for lookup of github handles: "
245+ readJSONProcess nixExprCommand ("maintainers/scripts/haskell/maintainer-handles.nix":nixExprParams) "Failed to decode nix output for lookup of github handles: "
205246 pure $ Map.mapMaybe (splitMaintainersToGitHubHandles handlesMap) hydraJobs
206247 where
207248 -- Split a comma-spearated string of Maintainers into a NonEmpty list of
@@ -211,6 +252,12 @@ getMaintainerMap = do
211252 splitMaintainersToGitHubHandles handlesMap (Maintainers maint) =
212253 nonEmpty . mapMaybe (`Map.lookup` handlesMap) . Text.splitOn ", " $ fromMaybe "" maint
213254
255+-- | Get the a map of all dependencies of every package by calling the nix
256+-- script ./dependencies.nix.
257+getDependencyMap :: IO DependencyMap
258+getDependencyMap =
259+ readJSONProcess nixExprCommand ("maintainers/scripts/haskell/dependencies.nix":nixExprParams) "Failed to decode nix output for lookup of dependencies: "
260+
214261-- | Run a process that produces JSON on stdout and and decode the JSON to a
215262-- data type.
216263--
@@ -219,11 +266,10 @@ readJSONProcess
219266 :: FromJSON a
220267 => FilePath -- ^ Filename of executable.
221268 -> [String] -- ^ Arguments
222− -> String -- ^ stdin to pass to the process
223269 -> String -- ^ String to prefix to JSON-decode error.
224270 -> IO a
225−readJSONProcess exe args input err = do
226− output <- readProcess exe args input
271+readJSONProcess exe args err = do
272+ output <- readProcess exe args ""
227273 let eitherDecodedOutput = eitherDecodeStrict' . encodeUtf8 . Text.pack $ output
228274 case eitherDecodedOutput of
229275 Left decodeErr -> error $ err <> decodeErr <> "\nRaw: '" <> take 1000 output <> "'"
@@ -264,7 +310,13 @@ platformIcon (Platform x) = case x of
264310data BuildResult = BuildResult {state :: BuildState, id :: Int} deriving (Show, Eq, Ord)
265311newtype Platform = Platform {platform :: Text} deriving (Show, Eq, Ord)
266312newtype Table row col a = Table (Map (row, col) a)
267−type StatusSummary = Map Text (Table Text Platform BuildResult, Set Text)
313+data SummaryEntry = SummaryEntry {
314+ summaryBuilds :: Table Text Platform BuildResult,
315+ summaryMaintainers :: Set Text,
316+ summaryReverseDeps :: Int,
317+ summaryUnbrokenReverseDeps :: Int
318+}
319+type StatusSummary = Map Text SummaryEntry
268320
269321instance (Ord row, Ord col, Semigroup a) => Semigroup (Table row col a) where
270322 Table l <> Table r = Table (Map.unionWith (<>) l r)
@@ -275,11 +327,11 @@ instance Functor (Table row col) where
275327instance Foldable (Table row col) where
276328 foldMap f (Table a) = foldMap f a
277329
278−buildSummary :: MaintainerMap -> Seq Build -> StatusSummary
279−buildSummary maintainerMap = foldl (Map.unionWith unionSummary) Map.empty . fmap toSummary
330+buildSummary :: MaintainerMap -> ReverseDependencyMap -> Seq Build -> StatusSummary
331+buildSummary maintainerMap reverseDependencyMap = foldl (Map.unionWith unionSummary) Map.empty . fmap toSummary
280332 where
281− unionSummary (Table l, l') (Table r, r') = (Table $ Map.union l r, l' <> r')
282− toSummary Build{finished, buildstatus, job, id, system} = Map.singleton name (Table (Map.singleton (set, Platform system) (BuildResult state id)), maintainers)
333+ unionSummary (SummaryEntry (Table lb) lm lr lu) (SummaryEntry (Table rb) rm rr ru) = SummaryEntry (Table $ Map.union lb rb) (lm <> rm) (max lr rr) (max lu ru)
334+ toSummary Build{finished, buildstatus, job, id, system} = Map.singleton name (SummaryEntry (Table (Map.singleton (set, Platform system) (BuildResult state id))) maintainers reverseDeps unbrokenReverseDeps)
283335 where
284336 state :: BuildState
285337 state = case (finished, buildstatus) of
@@ -297,6 +349,7 @@ buildSummary maintainerMap = foldl (Map.unionWith unionSummary) Map.empty . fmap
297349 name = maybe packageName NonEmpty.last splitted
298350 set = maybe "" (Text.intercalate "." . NonEmpty.init) splitted
299351 maintainers = maybe mempty (Set.fromList . toList) (Map.lookup job maintainerMap)
352+ (reverseDeps, unbrokenReverseDeps) = Map.findWithDefault (0,0) name reverseDependencyMap
300353
301354readBuildReports :: IO (Eval, UTCTime, Seq Build)
302355readBuildReports = do
@@ -339,25 +392,29 @@ makeSearchLink evalId linkLabel query = "[" <> linkLabel <> "](" <> "https://hyd
339392statusToNumSummary :: StatusSummary -> NumSummary
340393statusToNumSummary = fmap getSum . foldMap (fmap Sum . jobTotals)
341394
342−jobTotals :: (Table Text Platform BuildResult, a) -> Table Platform BuildState Int
343−jobTotals (Table mapping, _) = getSum <$> Table (Map.foldMapWithKey (\(_, platform) (BuildResult buildstate _) -> Map.singleton (platform, buildstate) (Sum 1)) mapping)
395+jobTotals :: SummaryEntry -> Table Platform BuildState Int
396+jobTotals (summaryBuilds -> Table mapping) = getSum <$> Table (Map.foldMapWithKey (\(_, platform) (BuildResult buildstate _) -> Map.singleton (platform, buildstate) (Sum 1)) mapping)
344397
345398details :: Text -> [Text] -> [Text]
346399details summary content = ["<details><summary>" <> summary <> " </summary>", ""] <> content <> ["</details>", ""]
347400
348−printBuildSummary :: Eval -> UTCTime -> StatusSummary -> Text
401+printBuildSummary :: Eval -> UTCTime -> StatusSummary -> [(Text, Int)] -> Text
349402printBuildSummary
350403 Eval{id, jobsetevalinputs = JobsetEvalInputs{nixpkgs = Nixpkgs{revision}}}
351404 fetchTime
352− summary =
405+ summary
406+ topBrokenRdeps =
353407 Text.unlines $
354− headline <> totals
408+ headline <> [""] <> tldr <> ((" * "<>) <$> (errors <> warnings)) <> [""]
409+ <> totals
355410 <> optionalList "#### Maintained packages with build failure" (maintainedList fails)
356411 <> optionalList "#### Maintained packages with failed dependency" (maintainedList failedDeps)
357412 <> optionalList "#### Maintained packages with unknown error" (maintainedList unknownErr)
358413 <> optionalHideableList "#### Unmaintained packages with build failure" (unmaintainedList fails)
359414 <> optionalHideableList "#### Unmaintained packages with failed dependency" (unmaintainedList failedDeps)
360415 <> optionalHideableList "#### Unmaintained packages with unknown error" (unmaintainedList unknownErr)
416+ <> optionalHideableList "#### Top 50 broken packages, sorted by number of reverse dependencies" (brokenLine <$> topBrokenRdeps)
417+ <> ["","*:arrow_heading_up:: The number of packages that depend (directly or indirectly) on this package (if any). If two numbers are shown the first (lower) number considers only packages which currently have enabled hydra jobs, i.e. are not marked broken. The second (higher) number considers all packages.*",""]
361418 <> footer
362419 where
363420 footer = ["*Report generated with [maintainers/scripts/haskell/hydra-report.hs](https://github.com/NixOS/nixpkgs/blob/haskell-updates/maintainers/scripts/haskell/hydra-report.sh)*"]
@@ -365,7 +422,7 @@ printBuildSummary
365422 [ "#### Build summary"
366423 , ""
367424 ]
368− <> printTable "Platform" (\x -> makeSearchLink id (platform x <> " " <> platformIcon x) ("." <> platform x)) (\x -> showT x <> " " <> icon x) showT (statusToNumSummary summary)
425+ <> printTable "Platform" (\x -> makeSearchLink id (platform x <> " " <> platformIcon x) ("." <> platform x)) (\x -> showT x <> " " <> icon x) showT numSummary
369426 headline =
370427 [ "### [haskell-updates build report from hydra](https://hydra.nixos.org/jobset/nixpkgs/haskell-updates)"
371428 , "*evaluation ["
@@ -380,24 +437,49 @@ printBuildSummary
380437 <> Text.pack (formatTime defaultTimeLocale "%Y-%m-%d %H:%M UTC" fetchTime)
381438 <> "*"
382439 ]
383− jobsByState predicate = Map.filter (predicate . foldl' min Success . fmap state . fst) summary
440+ brokenLine (name, rdeps) = "[" <> name <> "](https://packdeps.haskellers.com/reverse/" <> name <> ") :arrow_heading_up: " <> Text.pack (show rdeps) <> " "
441+ numSummary = statusToNumSummary summary
442+ jobsByState predicate = Map.filter (predicate . worstState) summary
443+ worstState = foldl' min Success . fmap state . summaryBuilds
384444 fails = jobsByState (== Failed)
385445 failedDeps = jobsByState (== DependencyFailed)
386446 unknownErr = jobsByState (\x -> x > DependencyFailed && x < TimedOut)
387− withMaintainer = Map.mapMaybe (\(x, m) -> (x,) <$> nonEmpty (Set.toList m))
388− withoutMaintainer = Map.mapMaybe (\(x, m) -> if Set.null m then Just x else Nothing)
447+ withMaintainer = Map.mapMaybe (\e -> (summaryBuilds e,) <$> nonEmpty (Set.toList (summaryMaintainers e)))
448+ withoutMaintainer = Map.mapMaybe (\e -> if Set.null (summaryMaintainers e) then Just e else Nothing)
389449 optionalList heading list = if null list then mempty else [heading] <> list
390450 optionalHideableList heading list = if null list then mempty else [heading] <> details (showT (length list) <> " job(s)") list
391451 maintainedList = showMaintainedBuild <=< Map.toList . withMaintainer
392− unmaintainedList = showBuild <=< Map.toList . withoutMaintainer
393− showBuild (name, table) = printJob id name (table, "")
452+ unmaintainedList = showBuild <=< sortOn (\(snd -> x) -> (negate (summaryUnbrokenReverseDeps x), negate (summaryReverseDeps x))) . Map.toList . withoutMaintainer
453+ showBuild (name, entry) = printJob id name (summaryBuilds entry, Text.pack (if summaryReverseDeps entry > 0 then " :arrow_heading_up: " <> show (summaryUnbrokenReverseDeps entry) <>" | "<> show (summaryReverseDeps entry) else ""))
394454 showMaintainedBuild (name, (table, maintainers)) = printJob id name (table, Text.intercalate " " (fmap ("@" <>) (toList maintainers)))
455+ tldr = case (errors, warnings) of
456+ ([],[]) -> [":green_circle: **Ready to merge**"]
457+ ([],_) -> [":yellow_circle: **Potential issues**"]
458+ _ -> [":red_circle: **Branch not mergeable**"]
459+ warnings =
460+ if' (Unfinished > maybe Success worstState maintainedJob) "`maintained` jobset failed." <>
461+ if' (Unfinished == maybe Success worstState mergeableJob) "`mergeable` jobset is not finished." <>
462+ if' (Unfinished == maybe Success worstState maintainedJob) "`maintained` jobset is not finished."
463+ errors =
464+ if' (isNothing mergeableJob) "No `mergeable` job found." <>
465+ if' (isNothing maintainedJob) "No `maintained` job found." <>
466+ if' (Unfinished > maybe Success worstState mergeableJob) "`mergeable` jobset failed." <>
467+ if' (outstandingJobs (Platform "x86_64-linux") > 100) "Too many outstanding jobs on x86_64-linux." <>
468+ if' (outstandingJobs (Platform "aarch64-linux") > 100) "Too many outstanding jobs on aarch64-linux."
469+ if' p e = if p then [e] else mempty
470+ outstandingJobs platform | Table m <- numSummary = Map.findWithDefault 0 (platform, Unfinished) m
471+ maintainedJob = Map.lookup "maintained" summary
472+ mergeableJob = Map.lookup "mergeable" summary
395473
396474printMaintainerPing :: IO ()
397475printMaintainerPing = do
398− maintainerMap <- getMaintainerMap
476+ (maintainerMap, (reverseDependencyMap, topBrokenRdeps)) <- concurrently getMaintainerMap do
477+ depMap <- getDependencyMap
478+ rdepMap <- evaluate . calculateReverseDependencies $ depMap
479+ let tops = take 50 . sortOn (negate . snd) . fmap (second fst) . filter (\x -> maybe False broken $ Map.lookup (fst x) depMap) . Map.toList $ rdepMap
480+ pure (rdepMap, tops)
399481 (eval, fetchTime, buildReport) <- readBuildReports
400− putStrLn (Text.unpack (printBuildSummary eval fetchTime (buildSummary maintainerMap buildReport)))
482+ putStrLn (Text.unpack (printBuildSummary eval fetchTime (buildSummary maintainerMap reverseDependencyMap buildReport) topBrokenRdeps))
401483
402484printMarkBrokenList :: IO ()
403485printMarkBrokenList = do
maintainers/scripts/haskell/maintained-broken-pkgs.nixnew file+22
@@ -0,0 +1,22 @@
1+let
2+ nixpkgs = import ../../..;
3+ inherit (nixpkgs {}) haskellPackages lib;
4+ maintainedPkgs = lib.filterAttrs (
5+ _: v: builtins.length (v.meta.maintainers or []) > 0
6+ ) haskellPackages;
7+ brokenPkgs = lib.filterAttrs (_: v: v.meta.broken) maintainedPkgs;
8+ transitiveBrokenPkgs = lib.filterAttrs
9+ (_: v: !(builtins.tryEval (v.outPath or null)).success && !v.meta.broken)
10+ maintainedPkgs;
11+ infoList = pkgs: lib.concatStringsSep "\n" (lib.mapAttrsToList (name: drv: "${name} ${(builtins.elemAt drv.meta.maintainers 0).github}") pkgs);
12+in {
13+ report = ''
14+ BROKEN:
15+ ${infoList brokenPkgs}
16+
17+ TRANSITIVE BROKEN:
18+ ${infoList transitiveBrokenPkgs}
19+ '';
20+ transitiveErrors =
21+ builtins.attrValues transitiveBrokenPkgs;
22+}
maintainers/scripts/haskell/maintainer-handles.nixnew file+7
@@ -0,0 +1,7 @@
1+# Nix script to lookup maintainer github handles from their email address. Used by ./hydra-report.hs.
2+let
3+ pkgs = import ../../.. {};
4+ maintainers = import ../../maintainer-list.nix;
5+ inherit (pkgs) lib;
6+ mkMailGithubPair = _: maintainer: if maintainer ? github then { "${maintainer.email}" = maintainer.github; } else {};
7+in lib.zipAttrsWith (_: builtins.head) (lib.mapAttrsToList mkMailGithubPair maintainers)
maintainers/scripts/haskell/mark-broken.sh+8−6
@@ -17,9 +17,9 @@ trap "rm ${tmpfile}" 0
1717
1818echo "Remember that you need to manually run 'maintainers/scripts/haskell/hydra-report.hs get-report' sometime before running this script."
1919echo "Generating a list of broken builds and displaying for manual confirmation ..."
20−maintainers/scripts/haskell/hydra-report.hs mark-broken-list | sort -i > $tmpfile
20+maintainers/scripts/haskell/hydra-report.hs mark-broken-list | sort -i > "$tmpfile"
2121
22−$EDITOR $tmpfile
22+$EDITOR "$tmpfile"
2323
2424tail -n +3 "$broken_config" >> "$tmpfile"
2525
@@ -28,17 +28,19 @@ broken-packages:
2828 # These packages don't compile.
2929EOF
3030
31+# clear environment here to avoid things like allowing broken builds in
3132sort -iu "$tmpfile" >> "$broken_config"
32−maintainers/scripts/haskell/regenerate-hackage-packages.sh
33−maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh
34−maintainers/scripts/haskell/regenerate-hackage-packages.sh
33+clear="env -u HOME -u NIXPKGS_CONFIG"
34+$clear maintainers/scripts/haskell/regenerate-hackage-packages.sh
35+$clear maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh
36+$clear maintainers/scripts/haskell/regenerate-hackage-packages.sh
3537
3638if [[ "${1:-}" == "--do-commit" ]]; then
3739git add $broken_config
3840git add pkgs/development/haskell-modules/configuration-hackage2nix/transitive-broken.yaml
3941git add pkgs/development/haskell-modules/hackage-packages.nix
4042git commit -F - << EOF
41−hackage2nix: Mark failing builds broken
43+haskellPackages: mark builds failing on hydra as broken
4244
4345This commit has been generated by maintainers/scripts/haskell/mark-broken.sh
4446EOF
maintainers/scripts/haskell/merge-and-open-pr.shnew file+122
@@ -0,0 +1,122 @@
1+#! /usr/bin/env nix-shell
2+#! nix-shell -i bash -p git gh -I nixpkgs=.
3+#
4+# Script to merge the currently open haskell-updates PR into master, bump the
5+# Stackage version and Hackage versions, and open the next haskell-updates PR.
6+
7+set -eu -o pipefail
8+
9+# exit after printing first argument to this function
10+function die {
11+ # echo the first argument
12+ echo "ERROR: $1"
13+ echo "Aborting!"
14+
15+ exit 1
16+}
17+
18+function help {
19+ echo "Usage: $0 HASKELL_UPDATES_PR_NUM"
20+ echo "Merge the currently open haskell-updates PR into master, and open the next one."
21+ echo
22+ echo " -h, --help print this help"
23+ echo " HASKELL_UPDATES_PR_NUM number of the currently open PR on NixOS/nixpkgs"
24+ echo " for the haskell-updates branch"
25+ echo
26+ echo "Example:"
27+ echo " \$ $0 137340"
28+
29+ exit 1
30+}
31+
32+# Read in the current haskell-updates PR number from the command line.
33+while [[ $# -gt 0 ]]; do
34+ key="$1"
35+
36+ case $key in
37+ -h|--help)
38+ help
39+ ;;
40+ *)
41+ curr_haskell_updates_pr_num="$1"
42+ shift
43+ ;;
44+ esac
45+done
46+
47+if [[ -z "${curr_haskell_updates_pr_num-}" ]] ; then
48+ die "You must pass the current haskell-updates PR number as the first argument to this script."
49+fi
50+
51+# Make sure you have gh authentication setup.
52+if ! gh auth status 2>/dev/null ; then
53+ die "You must setup the \`gh\` command. Run \`gh auth login\`."
54+fi
55+
56+# Fetch nixpkgs to get an up-to-date origin/haskell-updates branch.
57+echo "Fetching origin..."
58+git fetch origin >/dev/null
59+
60+# Make sure we are currently on a local haskell-updates branch.
61+curr_branch="$(git rev-parse --abbrev-ref HEAD)"
62+if [[ "$curr_branch" != "haskell-updates" ]]; then
63+ die "Current branch is not called \"haskell-updates\"."
64+fi
65+
66+# Make sure our local haskell-updates branch is on the same commit as
67+# origin/haskell-updates.
68+curr_branch_commit="$(git rev-parse haskell-updates)"
69+origin_haskell_updates_commit="$(git rev-parse origin/haskell-updates)"
70+if [[ "$curr_branch_commit" != "$origin_haskell_updates_commit" ]]; then
71+ die "Current branch is not at the same commit as origin/haskell-updates"
72+fi
73+
74+# Merge the current open haskell-updates PR.
75+echo "Merging https://github.com/NixOS/nixpkgs/pull/${curr_haskell_updates_pr_num}..."
76+gh pr merge --repo NixOS/nixpkgs --merge "$curr_haskell_updates_pr_num"
77+
78+# Update the list of Haskell package versions in NixOS on Hackage.
79+echo "Updating list of Haskell package versions in NixOS on Hackage..."
80+./maintainers/scripts/haskell/upload-nixos-package-list-to-hackage.sh
81+
82+# Update stackage, Hackage hashes, and regenerate Haskell package set
83+echo "Updating Stackage..."
84+./maintainers/scripts/haskell/update-stackage.sh --do-commit
85+echo "Updating Hackage hashes..."
86+./maintainers/scripts/haskell/update-hackage.sh --do-commit
87+echo "Regenerating Hackage packages..."
88+./maintainers/scripts/haskell/regenerate-hackage-packages.sh --do-commit
89+
90+# Push these new commits to the haskell-updates branch
91+echo "Pushing commits just created to the remote haskell-updates branch..."
92+git push
93+
94+# Open new PR
95+new_pr_body=$(cat <<EOF
96+### This Merge
97+
98+This PR is the regular merge of the \`haskell-updates\` branch into \`master\`.
99+
100+This branch is being continually built and tested by hydra at https://hydra.nixos.org/jobset/nixpkgs/haskell-updates. You may be able to find an up-to-date Hydra build report at [cdepillabout/nix-haskell-updates-status](https://github.com/cdepillabout/nix-haskell-updates-status).
101+
102+We roughly aim to merge these \`haskell-updates\` PRs at least once every two weeks. See the @NixOS/haskell [team calendar](https://cloud.maralorn.de/apps/calendar/p/H6migHmKX7xHoTFa) for who is currently in charge of this branch.
103+
104+### haskellPackages Workflow Summary
105+
106+Our workflow is currently described in [\`pkgs/development/haskell-modules/HACKING.md\`](https://github.com/NixOS/nixpkgs/blob/haskell-updates/pkgs/development/haskell-modules/HACKING.md).
107+
108+The short version is this:
109+* We regularly update the Stackage and Hackage pins on \`haskell-updates\` (normally at the beginning of a merge window).
110+* The community fixes builds of Haskell packages on that branch.
111+* We aim at at least one merge of \`haskell-updates\` into \`master\` every two weeks.
112+* We only do the merge if the [\`mergeable\`](https://hydra.nixos.org/job/nixpkgs/haskell-updates/mergeable) job is succeeding on hydra.
113+* If a [\`maintained\`](https://hydra.nixos.org/job/nixpkgs/haskell-updates/maintained) package is still broken at the time of merge, we will only merge if the maintainer has been pinged 7 days in advance. (If you care about a Haskell package, become a maintainer!)
114+
115+---
116+
117+This is the follow-up to #${curr_haskell_updates_pr_num}. Come to [#haskell:nixos.org](https://matrix.to/#/#haskell:nixos.org) if you have any questions.
118+EOF
119+)
120+
121+echo "Opening a PR for the next haskell-updates merge cycle..."
122+gh pr create --repo NixOS/nixpkgs --base master --head haskell-updates --title "haskellPackages: update stackage and hackage" --body "$new_pr_body"
maintainers/scripts/haskell/regenerate-hackage-packages.sh+2−2
@@ -20,7 +20,7 @@ HACKAGE2NIX="${HACKAGE2NIX:-hackage2nix}"
2020# See: https://github.com/NixOS/nixpkgs/pull/122023
2121export LC_ALL=C.UTF-8
2222
23−extraction_derivation='with import ./. {}; runCommand "unpacked-cabal-hashes" { } "tar xf ${all-cabal-hashes} --strip-components=1 --one-top-level=$out"'
23+extraction_derivation='with import ./. {}; runCommandLocal "unpacked-cabal-hashes" { } "tar xf ${all-cabal-hashes} --strip-components=1 --one-top-level=$out"'
2424unpacked_hackage="$(nix-build -E "$extraction_derivation" --no-out-link)"
2525config_dir=pkgs/development/haskell-modules/configuration-hackage2nix
2626
@@ -37,7 +37,7 @@ echo "Starting hackage2nix to regenerate pkgs/development/haskell-modules/hackag
3737if [[ "${1:-}" == "--do-commit" ]]; then
3838git add pkgs/development/haskell-modules/hackage-packages.nix
3939git commit -F - << EOF
40−hackage-packages.nix: Regenerate based on current config
40+haskellPackages: regenerate package set based on current config
4141
4242This commit has been generated by maintainers/scripts/haskell/regenerate-hackage-packages.sh
4343EOF
maintainers/scripts/haskell/regenerate-transitive-broken-packages.sh+1−1
@@ -12,4 +12,4 @@ dont-distribute-packages:
1212EOF
1313
1414echo "Regenerating list of transitive broken packages ..."
15−echo -e $(nix-instantiate --eval --strict maintainers/scripts/haskell/transitive-broken-packages.nix) | sed 's/\"//' | sort -i >> $config_file
15+echo -e $(nix-instantiate --eval --strict maintainers/scripts/haskell/transitive-broken-packages.nix) | sed 's/\"//' | LC_ALL=C.UTF-8 sort -i >> $config_file
maintainers/scripts/haskell/test-configurations.nixnew file+136
@@ -0,0 +1,136 @@
1+/* Nix expression to test for regressions in the Haskell configuration overlays.
2+
3+ test-configurations.nix determines all attributes touched by given Haskell
4+ configuration overlays (i. e. pkgs/development/haskell-modules/configuration-*.nix)
5+ and builds all derivations (or at least a reasonable subset) affected by
6+ these overrides.
7+
8+ By default, it checks `configuration-{common,nix,ghc-8.10.x}.nix`. You can
9+ invoke it like this:
10+
11+ nix-build maintainers/scripts/haskell/test-configurations.nix --keep-going
12+
13+ It is possible to specify other configurations:
14+
15+ nix-build maintainers/scripts/haskell/test-configurations.nix \
16+ --arg files '[ "configuration-ghc-9.0.x.nix" "configuration-ghc-9.2.x.nix" ]' \
17+ --keep-going
18+
19+ You can also just supply a single string:
20+
21+ nix-build maintainers/scripts/haskell/test-configurations.nix \
22+ --argstr files "configuration-arm.nix" --keep-going
23+
24+ You can even supply full paths which is handy, as it allows for tab-completing
25+ the configurations:
26+
27+ nix-build maintainers/scripts/haskell/test-configurations.nix \
28+ --argstr files pkgs/development/haskell-modules/configuration-arm.nix \
29+ --keep-going
30+
31+ By default, derivation that fail to evaluate are skipped, unless they are
32+ “just” marked as broken. You can check for other eval errors like this:
33+
34+ nix-build maintainers/scripts/haskell/test-configurations.nix \
35+ --arg skipEvalErrors false --keep-going
36+
37+ You can also disable checking broken packages by passing a nixpkgs config:
38+
39+ nix-build maintainers/scripts/haskell/test-configurations.nix \
40+ --arg config '{ allowBroken = false; }' --keep-going
41+
42+ By default the haskell.packages.ghc*Binary sets used for bootstrapping GHC
43+ are _not_ tested. You can change this using:
44+
45+ nix-build maintainers/scripts/haskell/test-configurations.nix \
46+ --arg skipBinaryGHCs false --keep-going
47+
48+*/
49+{ files ? [
50+ "configuration-common.nix"
51+ "configuration-nix.nix"
52+ "configuration-ghc-8.10.x.nix"
53+ ]
54+, nixpkgsPath ? ../../..
55+, config ? { allowBroken = true; }
56+, skipEvalErrors ? true
57+, skipBinaryGHCs ? true
58+}:
59+
60+let
61+ pkgs = import nixpkgsPath { inherit config; };
62+ inherit (pkgs) lib;
63+
64+ # see usage explanation for the input format `files` allows
65+ files' = builtins.map builtins.baseNameOf (
66+ if !builtins.isList files then [ files ] else files
67+ );
68+
69+ setsForFile = fileName:
70+ let
71+ # extract the unique part of the config's file name
72+ configName = builtins.head (
73+ builtins.match "configuration-(.+).nix" fileName
74+ );
75+ # match the major and minor version of the GHC the config is intended for, if any
76+ configVersion = lib.concatStrings (
77+ builtins.match "ghc-([0-9]+).([0-9]+).x" configName
78+ );
79+ # return all package sets under haskell.packages matching the version components
80+ setsForVersion = builtins.map (name: pkgs.haskell.packages.${name}) (
81+ builtins.filter (setName:
82+ lib.hasPrefix "ghc${configVersion}" setName
83+ && (skipBinaryGHCs -> !(lib.hasInfix "Binary" setName))
84+ ) (
85+ builtins.attrNames pkgs.haskell.packages
86+ )
87+ );
88+
89+ defaultSets = [ pkgs.haskellPackages ];
90+ in {
91+ # use plain haskellPackages for the version-agnostic files
92+ # TODO(@sternenseemann): also consider currently selected versioned sets
93+ "common" = defaultSets;
94+ "nix" = defaultSets;
95+ "arm" = defaultSets;
96+ "darwin" = defaultSets;
97+ }.${configName} or setsForVersion;
98+
99+ # attribute set that has all the attributes of haskellPackages set to null
100+ availableHaskellPackages = builtins.listToAttrs (
101+ builtins.map (attr: lib.nameValuePair attr null) (
102+ builtins.attrNames pkgs.haskellPackages
103+ )
104+ );
105+
106+ # evaluate a configuration and only return the attributes changed by it,
107+ # pass availableHaskellPackages as super in case intersectAttrs is used
108+ overriddenAttrs = fileName: builtins.attrNames (
109+ lib.fix (self:
110+ import (nixpkgsPath + "/pkgs/development/haskell-modules/${fileName}") {
111+ haskellLib = pkgs.haskell.lib.compose;
112+ inherit pkgs;
113+ } self availableHaskellPackages
114+ )
115+ );
116+
117+ # list of derivations that are affected by overrides in the given configuration
118+ # overlays. For common, nix, darwin etc. only the derivation from the default
119+ # package set will be emitted.
120+ packages = builtins.filter (v:
121+ lib.warnIf (v.meta.broken or false) "${v.pname} is marked as broken" (
122+ v != null
123+ && (skipEvalErrors -> (builtins.tryEval (v.outPath or v)).success)
124+ )
125+ ) (
126+ lib.concatMap (fileName:
127+ let
128+ sets = setsForFile fileName;
129+ attrs = overriddenAttrs fileName;
130+ in
131+ lib.concatMap (set: builtins.map (attr: set.${attr}) attrs) sets
132+ ) files'
133+ );
134+in
135+
136+packages
maintainers/scripts/haskell/update-stackage.sh+26−24
@@ -1,25 +1,39 @@
11#! /usr/bin/env nix-shell
22#! nix-shell -i bash -p nix curl jq nix-prefetch-github git gnused gnugrep -I nixpkgs=.
3+# shellcheck shell=bash
34
45set -eu -o pipefail
56
6−tmpfile=$(mktemp "update-stackage.XXXXXXX")
7−# shellcheck disable=SC2064
7+# Stackage solver to use, LTS or Nightly
8+# (should be capitalized like the display name)
9+SOLVER=LTS
10+TMP_TEMPLATE=update-stackage.XXXXXXX
11+readonly SOLVER
12+readonly TMP_TEMPLATE
13+
14+toLower() {
15+ printf "%s" "$1" | tr '[:upper:]' '[:lower:]'
16+}
17+
18+tmpfile=$(mktemp "$TMP_TEMPLATE")
19+tmpfile_new=$(mktemp "$TMP_TEMPLATE")
820
921stackage_config="pkgs/development/haskell-modules/configuration-hackage2nix/stackage.yaml"
1022
11−trap "rm ${tmpfile} ${tmpfile}.new" 0
12−touch "$tmpfile" "$tmpfile.new" # Creating files here so that trap creates no errors.
23+trap 'rm "${tmpfile}" "${tmpfile_new}"' 0
24+touch "$tmpfile" "$tmpfile_new" # Creating files here so that trap creates no errors.
1325
14−curl -L -s "https://stackage.org/nightly/cabal.config" >"$tmpfile"
15−old_version=$(grep "# Stackage Nightly" $stackage_config | sed -E 's/.*([0-9]{4}-[0-9]{2}-[0-9]{2}).*/\1/')
16−version=$(sed -rn "s/^--.*http:..(www.)?stackage.org.snapshot.nightly-//p" "$tmpfile")
26+curl -L -s "https://stackage.org/$(toLower "$SOLVER")/cabal.config" >"$tmpfile"
27+old_version=$(grep '^# Stackage' $stackage_config | sed -e 's/.\+ \([A-Za-z]\+ [0-9.-]\+\)$/\1/g')
28+version="$SOLVER $(sed -rn "s/^--.*http:..(www.)?stackage.org.snapshot.$(toLower "$SOLVER")-//p" "$tmpfile")"
1729
1830if [[ "$old_version" == "$version" ]]; then
1931 echo "No new stackage version"
2032 exit 0 # Nothing to do
2133fi
2234
35+echo "Updating Stackage from $old_version to $version."
36+
2337# Create a simple yaml version of the file.
2438sed -r \
2539 -e '/^--/d' \
@@ -28,10 +42,10 @@ sed -r \
2842 -e 's|,$||' \
2943 -e '/installed$/d' \
3044 -e '/^$/d' \
31− < "${tmpfile}" | sort --ignore-case >"${tmpfile}.new"
45+ < "${tmpfile}" | sort --ignore-case >"${tmpfile_new}"
3246
3347cat > $stackage_config << EOF
34−# Stackage Nightly $version
48+# Stackage $version
3549# This file is auto-generated by
3650# maintainers/scripts/haskell/update-stackage.sh
3751default-package-overrides:
@@ -39,29 +53,17 @@ EOF
3953
4054# Drop restrictions on some tools where we always want the latest version.
4155sed -r \
42− -e '/ cabal-install /d' \
4356 -e '/ cabal2nix /d' \
44− -e '/ cabal2spec /d' \
4557 -e '/ distribution-nixpkgs /d' \
46− -e '/ git-annex /d' \
47− -e '/ hindent /d' \
48− -e '/ hledger/d' \
49− -e '/ hlint /d' \
50− -e '/ hoogle /d' \
51− -e '/ hopenssl /d' \
5258 -e '/ jailbreak-cabal /d' \
53− -e '/ json-autotype/d' \
5459 -e '/ language-nix /d' \
55− -e '/ shake /d' \
56− -e '/ ShellCheck /d' \
57− -e '/ stack /d' \
58− -e '/ weeder /d' \
59− < "${tmpfile}.new" >> $stackage_config
60+ -e '/ cabal-install /d' \
61+ < "${tmpfile_new}" >> $stackage_config
6062
6163if [[ "${1:-}" == "--do-commit" ]]; then
6264git add $stackage_config
6365git commit -F - << EOF
64−Stackage Nightly: $old_version -> $version
66+haskellPackages: stackage $old_version -> $version
6567
6668This commit has been generated by maintainers/scripts/haskell/update-stackage.sh
6769EOF
maintainers/scripts/haskell/upload-nixos-package-list-to-hackage.shnew file+22
@@ -0,0 +1,22 @@
1+#! /usr/bin/env nix-shell
2+#! nix-shell -i bash -p nix curl gnused -I nixpkgs=.
3+
4+# On Hackage every package description shows a category "Distributions" which
5+# lists a "NixOS" version.
6+# This script uploads a csv to hackage which will update the displayed versions
7+# based on the current versions in nixpkgs. This happens with a simple http
8+# request.
9+
10+# For authorization you just need to have any valid hackage account. This
11+# script uses the `username` and `password-command` field from your
12+# ~/.cabal/config file.
13+
14+# e.g. username: maralorn
15+# password-command: pass hackage.haskell.org (this can be any command, but not an arbitrary shell expression. Like cabal we only read the first output line and ignore the rest.)
16+# Those fields are specified under `upload` on the `cabal` man page.
17+
18+package_list="$(nix-build -A haskell.package-list)/nixos-hackage-packages.csv"
19+username=$(grep "^username:" ~/.cabal/config | sed "s/^username: //")
20+password_command=$(grep "^password-command:" ~/.cabal/config | sed "s/^password-command: //")
21+curl -u "$username:$($password_command | head -n1)" --digest -H "Content-type: text/csv" -T "$package_list" http://hackage.haskell.org/distro/NixOS/packages.csv
22+echo
maintainers/scripts/luarocks-packages.csv+87−87
@@ -1,87 +1,87 @@
1−# nix name, luarocks name, server, version,luaversion,maintainers
2−alt-getopt,,,,,arobyn
3−ansicolors,,,,,
4−argparse,,,,,
5−basexx,,,,,
6−binaryheap,,,,,vcunat
7−bit32,,,,lua5_1,lblasc
8−busted,,,,,
9−cassowary,,,,,marsam alerque
10−cjson,lua-cjson,,,,
11−compat53,,,,,vcunat
12−cosmo,,,,,marsam
13−coxpcall,,,1.17.0-1,,
14−cqueues,,,,,vcunat
15−cyrussasl,,,,,
16−digestif,,,,lua5_3,
17−dkjson,,,,,
18−fifo,,,,,
19−http,,,,,vcunat
20−inspect,,,,,
21−ldbus,,http://luarocks.org/dev,,,
22−ldoc,,,,,
23−lgi,,,,,
24−linenoise,,,,,
25−ljsyscall,,,,lua5_1,lblasc
26−lpeg,,,,,vyp
27−lpeg_patterns,,,,,
28−lpeglabel,,,,,
29−lpty,,,,,
30−lrexlib-gnu,,,,,
31−lrexlib-pcre,,,,,vyp
32−lrexlib-posix,,,,,
33−ltermbox,,,,,
34−lua-cmsgpack,,,,,
35−lua-iconv,,,,,
36−lua-lsp,,http://luarocks.org/dev,,,
37−lua-messagepack,,,,,
38−lua-resty-http,,,,,
39−lua-resty-jwt,,,,,
40−lua-resty-openidc,,,,,
41−lua-resty-openssl,,,,,
42−lua-resty-session,,,,,
43−lua-term,,,,,
44−lua-toml,,,,,
45−lua-zlib,,,,,koral
46−lua_cliargs,,,,,
47−luabitop,,,,,
48−luacheck,,,,,
49−luacov,,,,,
50−luadbi,,,,,
51−luadbi-mysql,,,,,
52−luadbi-postgresql,,,,,
53−luadbi-sqlite3,,,,,
54−luadoc,,,,,
55−luaepnf,,,,,
56−luaevent,,,,,
57−luaexpat,,,1.3.0-1,,arobyn flosse
58−luaffi,,http://luarocks.org/dev,,,
59−luafilesystem,,,1.7.0-2,,flosse
60−lualogging,,,,,
61−luaossl,,,,lua5_1,
62−luaposix,,,,,vyp lblasc
63−luarepl,,,,,
64−luasec,,,,,flosse
65−luasocket,,,,,
66−luasql-sqlite3,,,,,vyp
67−luassert,,,,,
68−luasystem,,,,,
69−luautf8,,,,,pstn
70−luazip,,,,,
71−lua-yajl,,,,,pstn
72−luuid,,,,,
73−luv,,,,,
74−lyaml,,,,,lblasc
75−markdown,,,,,
76−mediator_lua,,,,,
77−mpack,,,,,
78−moonscript,,,,,arobyn
79−nvim-client,,,,,
80−penlight,,,,,
81−rapidjson,,,,,
82−readline,,,,,
83−say,,,,,
84−std__debug,std._debug,,,,
85−std_normalize,std.normalize,,,,
86−stdlib,,,,,vyp
87−vstruct,,,,,
1+name,src,ref,server,version,luaversion,maintainers
2+alt-getopt,,,,,,arobyn
3+bit32,,,,5.3.0-1,lua5_1,lblasc
4+argparse,https://github.com/luarocks/argparse.git,,,,,
5+basexx,https://github.com/teto/basexx.git,,,,,
6+binaryheap,https://github.com/Tieske/binaryheap.lua,,,,,vcunat
7+busted,,,,,,
8+cassowary,,,,,,marsam alerque
9+compat53,,,,0.7-1,,vcunat
10+cosmo,,,,,,marsam
11+coxpcall,,,,1.17.0-1,,
12+cqueues,,,,,,vcunat
13+cyrussasl,https://github.com/JorjBauer/lua-cyrussasl.git,,,,,
14+digestif,https://github.com/astoff/digestif.git,,,0.2-1,lua5_3,
15+dkjson,,,,,,
16+fifo,,,,,,
17+gitsigns.nvim,https://github.com/lewis6991/gitsigns.nvim.git,,,,lua5_1,
18+http,,,,0.3-0,,vcunat
19+inspect,,,,,,
20+ldbus,,,http://luarocks.org/dev,,,
21+ldoc,https://github.com/stevedonovan/LDoc.git,,,,,
22+lgi,,,,,,
23+linenoise,https://github.com/hoelzro/lua-linenoise.git,,,,,
24+ljsyscall,,,,,lua5_1,lblasc
25+lpeg,,,,,,vyp
26+lpeg_patterns,,,,,,
27+lpeglabel,,,,,,
28+lpty,,,,,,
29+lrexlib-gnu,,,,,,
30+lrexlib-pcre,,,,,,vyp
31+lrexlib-posix,,,,,,
32+lua-cjson,,,,,,
33+lua-cmsgpack,,,,,,
34+lua-iconv,,,,,,
35+lua-lsp,,,,,,
36+lua-messagepack,,,,,,
37+lua-resty-http,,,,,,
38+lua-resty-jwt,,,,,,
39+lua-resty-openidc,,,,,,
40+lua-resty-openssl,,,,,,
41+lua-resty-session,,,,,,
42+lua-term,,,,,,
43+lua-toml,,,,,,
44+lua-zlib,,,,,,koral
45+lua_cliargs,https://github.com/amireh/lua_cliargs.git,,,,,
46+luabitop,https://github.com/teto/luabitop.git,,,,,
47+luacheck,,,,,,
48+luacov,,,,,,
49+luadbi,,,,,,
50+luadbi-mysql,,,,,,
51+luadbi-postgresql,,,,,,
52+luadbi-sqlite3,,,,,,
53+luaepnf,,,,,,
54+luaevent,,,,,,
55+luaexpat,,,,1.4.1-1,,arobyn flosse
56+luaffi,,,http://luarocks.org/dev,,,
57+luafilesystem,,,,1.7.0-2,,flosse
58+lualogging,,,,,,
59+luaossl,,,,,lua5_1,
60+luaposix,,,,34.1.1-1,,vyp lblasc
61+luarepl,,,,,,
62+luasec,,,,,,flosse
63+luasocket,,,,,,
64+luasql-sqlite3,,,,,,vyp
65+luassert,,,,,,
66+luasystem,,,,,,
67+luaunbound,,,,,
68+luautf8,,,,,,pstn
69+luazip,,,,,,
70+lua-yajl,,,,,,pstn
71+luuid,,,,,,
72+luv,,,,1.43.0-0,,
73+lyaml,,,,,,lblasc
74+markdown,,,,,,
75+mediator_lua,,,,,,
76+mpack,,,,,,
77+moonscript,https://github.com/leafo/moonscript.git,dev-1,,,,arobyn
78+nvim-client,https://github.com/neovim/lua-client.git,,,,,
79+penlight,https://github.com/lunarmodules/Penlight.git,,,,,alerque
80+plenary.nvim,https://github.com/nvim-lua/plenary.nvim.git,,,,lua5_1,
81+rapidjson,https://github.com/xpol/lua-rapidjson.git,,,,,
82+readline,,,,,,
83+say,https://github.com/Olivine-Labs/say.git,,,,,
84+std._debug,https://github.com/lua-stdlib/_debug.git,,,,,
85+std.normalize,https://github.com/lua-stdlib/normalize.git,,,,,
86+stdlib,,,,41.2.2,,vyp
87+vstruct,https://github.com/ToxicFrog/vstruct.git,,,,,
maintainers/scripts/pluginupdate.py+358−212
@@ -1,4 +1,4 @@
1−# Used by pkgs/misc/vim-plugins/update.py and pkgs/applications/editors/kakoune/plugins/update.py
1+# Used by pkgs/applications/editors/vim/plugins/update.py and pkgs/applications/editors/kakoune/plugins/update.py
22
33# format:
44# $ nix run nixpkgs.python3Packages.black -c black update.py
@@ -8,6 +8,7 @@
88# $ nix run nixpkgs.python3Packages.flake8 -c flake8 --ignore E501,E265 update.py
99
1010import argparse
11+import csv
1112import functools
1213import http
1314import json
@@ -28,6 +29,7 @@ from pathlib import Path
2829from typing import Dict, List, Optional, Tuple, Union, Any, Callable
2930from urllib.parse import urljoin, urlparse
3031from tempfile import NamedTemporaryFile
32+from dataclasses import dataclass, asdict
3133
3234import git
3335
@@ -41,8 +43,6 @@ LOG_LEVELS = {
4143}
4244
4345log = logging.getLogger()
44−log.addHandler(logging.StreamHandler())
45−
4646
4747def retry(ExceptionToCheck: Any, tries: int = 4, delay: float = 3, backoff: float = 2):
4848 """Retry calling the decorated function using an exponential backoff.
@@ -74,35 +74,103 @@ def retry(ExceptionToCheck: Any, tries: int = 4, delay: float = 3, backoff: floa
7474
7575 return deco_retry
7676
77+@dataclass
78+class FetchConfig:
79+ proc: int
80+ github_token: str
81+
7782
78−def make_request(url: str) -> urllib.request.Request:
79− token = os.getenv("GITHUB_API_TOKEN")
83+def make_request(url: str, token=None) -> urllib.request.Request:
8084 headers = {}
8185 if token is not None:
8286 headers["Authorization"] = f"token {token}"
8387 return urllib.request.Request(url, headers=headers)
8488
8589
90+# a dictionary of plugins and their new repositories
91+Redirects = Dict['PluginDesc', 'Repo']
92+
8693class Repo:
8794 def __init__(
88− self, owner: str, name: str, branch: str, alias: Optional[str]
95+ self, uri: str, branch: str
8996 ) -> None:
90− self.owner = owner
91− self.name = name
92− self.branch = branch
93− self.alias = alias
94− self.redirect: Dict[str, str] = {}
97+ self.uri = uri
98+ '''Url to the repo'''
99+ self._branch = branch
100+ # Redirect is the new Repo to use
101+ self.redirect: Optional['Repo'] = None
102+ self.token = "dummy_token"
95103
96− def url(self, path: str) -> str:
97− return urljoin(f"https://github.com/{self.owner}/{self.name}/", path)
104+ @property
105+ def name(self):
106+ return self.uri.split('/')[-1]
98107
108+ @property
109+ def branch(self):
110+ return self._branch or "HEAD"
111+
112+ def __str__(self) -> str:
113+ return f"{self.uri}"
99114 def __repr__(self) -> str:
100− return f"Repo({self.owner}, {self.name})"
115+ return f"Repo({self.name}, {self.uri})"
116+
117+ @retry(urllib.error.URLError, tries=4, delay=3, backoff=2)
118+ def has_submodules(self) -> bool:
119+ return True
120+
121+ @retry(urllib.error.URLError, tries=4, delay=3, backoff=2)
122+ def latest_commit(self) -> Tuple[str, datetime]:
123+ log.debug("Latest commit")
124+ loaded = self._prefetch(None)
125+ updated = datetime.strptime(loaded['date'], "%Y-%m-%dT%H:%M:%S%z")
126+
127+ return loaded['rev'], updated
128+
129+ def _prefetch(self, ref: Optional[str]):
130+ cmd = ["nix-prefetch-git", "--quiet", "--fetch-submodules", self.uri]
131+ if ref is not None:
132+ cmd.append(ref)
133+ log.debug(cmd)
134+ data = subprocess.check_output(cmd)
135+ loaded = json.loads(data)
136+ return loaded
137+
138+ def prefetch(self, ref: Optional[str]) -> str:
139+ print("Prefetching")
140+ loaded = self._prefetch(ref)
141+ return loaded["sha256"]
142+
143+ def as_nix(self, plugin: "Plugin") -> str:
144+ return f'''fetchgit {{
145+ url = "{self.uri}";
146+ rev = "{plugin.commit}";
147+ sha256 = "{plugin.sha256}";
148+ }}'''
149+
150+
151+class RepoGitHub(Repo):
152+ def __init__(
153+ self, owner: str, repo: str, branch: str
154+ ) -> None:
155+ self.owner = owner
156+ self.repo = repo
157+ self.token = None
158+ '''Url to the repo'''
159+ super().__init__(self.url(""), branch)
160+ log.debug("Instantiating github repo owner=%s and repo=%s", self.owner, self.repo)
161+
162+ @property
163+ def name(self):
164+ return self.repo
165+
166+ def url(self, path: str) -> str:
167+ res = urljoin(f"https://github.com/{self.owner}/{self.repo}/", path)
168+ return res
101169
102170 @retry(urllib.error.URLError, tries=4, delay=3, backoff=2)
103171 def has_submodules(self) -> bool:
104172 try:
105− req = make_request(self.url(f"blob/{self.branch}/.gitmodules"))
173+ req = make_request(self.url(f"blob/{self.branch}/.gitmodules"), self.token)
106174 urllib.request.urlopen(req, timeout=10).close()
107175 except urllib.error.HTTPError as e:
108176 if e.code == 404:
@@ -114,9 +182,10 @@ class Repo:
114182 @retry(urllib.error.URLError, tries=4, delay=3, backoff=2)
115183 def latest_commit(self) -> Tuple[str, datetime]:
116184 commit_url = self.url(f"commits/{self.branch}.atom")
117− commit_req = make_request(commit_url)
185+ log.debug("Sending request to %s", commit_url)
186+ commit_req = make_request(commit_url, self.token)
118187 with urllib.request.urlopen(commit_req, timeout=10) as req:
119− self.check_for_redirect(commit_url, req)
188+ self._check_for_redirect(commit_url, req)
120189 xml = req.read()
121190 root = ET.fromstring(xml)
122191 latest_entry = root.find(ATOM_ENTRY)
@@ -131,46 +200,89 @@ class Repo:
131200 updated = datetime.strptime(updated_tag.text, "%Y-%m-%dT%H:%M:%SZ")
132201 return Path(str(url.path)).name, updated
133202
134− def check_for_redirect(self, url: str, req: http.client.HTTPResponse):
203+ def _check_for_redirect(self, url: str, req: http.client.HTTPResponse):
135204 response_url = req.geturl()
136205 if url != response_url:
137206 new_owner, new_name = (
138207 urllib.parse.urlsplit(response_url).path.strip("/").split("/")[:2]
139208 )
140− end_line = "\n" if self.alias is None else f" as {self.alias}\n"
141− plugin_line = "{owner}/{name}" + end_line
142209
143− old_plugin = plugin_line.format(owner=self.owner, name=self.name)
144− new_plugin = plugin_line.format(owner=new_owner, name=new_name)
145− self.redirect[old_plugin] = new_plugin
210+ new_repo = RepoGitHub(owner=new_owner, repo=new_name, branch=self.branch)
211+ self.redirect = new_repo
146212
147− def prefetch_git(self, ref: str) -> str:
148− data = subprocess.check_output(
149− ["nix-prefetch-git", "--fetch-submodules", self.url(""), ref]
150− )
151− return json.loads(data)["sha256"]
213+
214+ def prefetch(self, commit: str) -> str:
215+ if self.has_submodules():
216+ sha256 = super().prefetch(commit)
217+ else:
218+ sha256 = self.prefetch_github(commit)
219+ return sha256
152220
153221 def prefetch_github(self, ref: str) -> str:
154− data = subprocess.check_output(
155− ["nix-prefetch-url", "--unpack", self.url(f"archive/{ref}.tar.gz")]
156− )
222+ cmd = ["nix-prefetch-url", "--unpack", self.url(f"archive/{ref}.tar.gz")]
223+ log.debug("Running %s", cmd)
224+ data = subprocess.check_output(cmd)
157225 return data.strip().decode("utf-8")
158226
227+ def as_nix(self, plugin: "Plugin") -> str:
228+ if plugin.has_submodules:
229+ submodule_attr = "\n fetchSubmodules = true;"
230+ else:
231+ submodule_attr = ""
232+
233+ return f'''fetchFromGitHub {{
234+ owner = "{self.owner}";
235+ repo = "{self.repo}";
236+ rev = "{plugin.commit}";
237+ sha256 = "{plugin.sha256}";{submodule_attr}
238+ }}'''
159239
240+
241+@dataclass(frozen=True)
242+class PluginDesc:
243+ repo: Repo
244+ branch: str
245+ alias: Optional[str]
246+
247+ @property
248+ def name(self):
249+ if self.alias is None:
250+ return self.repo.name
251+ else:
252+ return self.alias
253+
254+ def __lt__(self, other):
255+ return self.repo.name < other.repo.name
256+
257+ @staticmethod
258+ def load_from_csv(config: FetchConfig, row: Dict[str, str]) -> 'PluginDesc':
259+ branch = row["branch"]
260+ repo = make_repo(row['repo'], branch.strip())
261+ repo.token = config.github_token
262+ return PluginDesc(repo, branch.strip(), row["alias"])
263+
264+
265+ @staticmethod
266+ def load_from_string(config: FetchConfig, line: str) -> 'PluginDesc':
267+ branch = "HEAD"
268+ alias = None
269+ uri = line
270+ if " as " in uri:
271+ uri, alias = uri.split(" as ")
272+ alias = alias.strip()
273+ if "@" in uri:
274+ uri, branch = uri.split("@")
275+ repo = make_repo(uri.strip(), branch.strip())
276+ repo.token = config.github_token
277+ return PluginDesc(repo, branch.strip(), alias)
278+
279+@dataclass
160280class Plugin:
161− def __init__(
162− self,
163− name: str,
164− commit: str,
165− has_submodules: bool,
166− sha256: str,
167− date: Optional[datetime] = None,
168− ) -> None:
169− self.name = name
170− self.commit = commit
171− self.has_submodules = has_submodules
172− self.sha256 = sha256
173− self.date = date
281+ name: str
282+ commit: str
283+ has_submodules: bool
284+ sha256: str
285+ date: Optional[datetime] = None
174286
175287 @property
176288 def normalized_name(self) -> str:
@@ -187,6 +299,28 @@ class Plugin:
187299 return copy
188300
189301
302+def load_plugins_from_csv(config: FetchConfig, input_file: Path,) -> List[PluginDesc]:
303+ log.debug("Load plugins from csv %s", input_file)
304+ plugins = []
305+ with open(input_file, newline='') as csvfile:
306+ log.debug("Writing into %s", input_file)
307+ reader = csv.DictReader(csvfile,)
308+ for line in reader:
309+ plugin = PluginDesc.load_from_csv(config, line)
310+ plugins.append(plugin)
311+
312+ return plugins
313+
314+def run_nix_expr(expr):
315+ with CleanEnvironment():
316+ cmd = ["nix", "eval", "--extra-experimental-features",
317+ "nix-command", "--impure", "--json", "--expr", expr]
318+ log.debug("Running command %s", cmd)
319+ out = subprocess.check_output(cmd)
320+ data = json.loads(out)
321+ return data
322+
323+
190324class Editor:
191325 """The configuration of the update script."""
192326
@@ -195,21 +329,126 @@ class Editor:
195329 name: str,
196330 root: Path,
197331 get_plugins: str,
198− generate_nix: Callable[[List[Tuple[str, str, Plugin]], str], None],
199332 default_in: Optional[Path] = None,
200333 default_out: Optional[Path] = None,
201334 deprecated: Optional[Path] = None,
202335 cache_file: Optional[str] = None,
203336 ):
337+ log.debug("get_plugins:", get_plugins)
204338 self.name = name
205339 self.root = root
206340 self.get_plugins = get_plugins
207− self.generate_nix = generate_nix
208341 self.default_in = default_in or root.joinpath(f"{name}-plugin-names")
209342 self.default_out = default_out or root.joinpath("generated.nix")
210343 self.deprecated = deprecated or root.joinpath("deprecated.json")
211344 self.cache_file = cache_file or f"{name}-plugin-cache.json"
212345
346+ def get_current_plugins(self) -> List[Plugin]:
347+ """To fill the cache"""
348+ data = run_nix_expr(self.get_plugins)
349+ plugins = []
350+ for name, attr in data.items():
351+ print("get_current_plugins: name %s" % name)
352+ p = Plugin(name, attr["rev"], attr["submodules"], attr["sha256"])
353+ plugins.append(p)
354+ return plugins
355+
356+ def load_plugin_spec(self, config: FetchConfig, plugin_file) -> List[PluginDesc]:
357+ '''CSV spec'''
358+ return load_plugins_from_csv(config, plugin_file)
359+
360+ def generate_nix(self, plugins, outfile: str):
361+ '''Returns nothing for now, writes directly to outfile'''
362+ raise NotImplementedError()
363+
364+ def get_update(self, input_file: str, outfile: str, config: FetchConfig):
365+ cache: Cache = Cache(self.get_current_plugins(), self.cache_file)
366+ _prefetch = functools.partial(prefetch, cache=cache)
367+
368+ def update() -> dict:
369+ plugins = self.load_plugin_spec(config, input_file)
370+
371+ try:
372+ pool = Pool(processes=config.proc)
373+ results = pool.map(_prefetch, plugins)
374+ finally:
375+ cache.store()
376+
377+ plugins, redirects = check_results(results)
378+
379+ self.generate_nix(plugins, outfile)
380+
381+ return redirects
382+
383+ return update
384+
385+
386+ @property
387+ def attr_path(self):
388+ return self.name + "Plugins"
389+
390+ def get_drv_name(self, name: str):
391+ return self.attr_path + "." + name
392+
393+ def rewrite_input(self, *args, **kwargs):
394+ return rewrite_input(*args, **kwargs)
395+
396+ def create_parser(self):
397+ parser = argparse.ArgumentParser(
398+ description=(f"""
399+ Updates nix derivations for {self.name} plugins.\n
400+ By default from {self.default_in} to {self.default_out}"""
401+ )
402+ )
403+ parser.add_argument(
404+ "--add",
405+ dest="add_plugins",
406+ default=[],
407+ action="append",
408+ help=f"Plugin to add to {self.attr_path} from Github in the form owner/repo",
409+ )
410+ parser.add_argument(
411+ "--input-names",
412+ "-i",
413+ dest="input_file",
414+ default=self.default_in,
415+ help="A list of plugins in the form owner/repo",
416+ )
417+ parser.add_argument(
418+ "--out",
419+ "-o",
420+ dest="outfile",
421+ default=self.default_out,
422+ help="Filename to save generated nix code",
423+ )
424+ parser.add_argument(
425+ "--proc",
426+ "-p",
427+ dest="proc",
428+ type=int,
429+ default=30,
430+ help="Number of concurrent processes to spawn. Setting --github-token allows higher values.",
431+ )
432+ parser.add_argument(
433+ "--github-token",
434+ "-t",
435+ type=str,
436+ default=os.getenv("GITHUB_API_TOKEN"),
437+ help="""Allows to set --proc to higher values.
438+ Uses GITHUB_API_TOKEN environment variables as the default value.""",
439+ )
440+ parser.add_argument(
441+ "--no-commit", "-n", action="store_true", default=False,
442+ help="Whether to autocommit changes"
443+ )
444+ parser.add_argument(
445+ "--debug", "-d", choices=LOG_LEVELS.keys(),
446+ default=logging.getLevelName(logging.WARN),
447+ help="Adjust log level"
448+ )
449+ return parser
450+
451+
213452
214453class CleanEnvironment(object):
215454 def __enter__(self) -> None:
@@ -226,52 +465,33 @@ class CleanEnvironment(object):
226465 self.empty_config.close()
227466
228467
229−def get_current_plugins(editor: Editor) -> List[Plugin]:
230− with CleanEnvironment():
231− out = subprocess.check_output(["nix", "eval", "--json", editor.get_plugins])
232− data = json.loads(out)
233− plugins = []
234− for name, attr in data.items():
235− p = Plugin(name, attr["rev"], attr["submodules"], attr["sha256"])
236− plugins.append(p)
237− return plugins
238−
239−
240468def prefetch_plugin(
241− user: str,
242− repo_name: str,
243− branch: str,
244− alias: Optional[str],
469+ p: PluginDesc,
245470 cache: "Optional[Cache]" = None,
246−) -> Tuple[Plugin, Dict[str, str]]:
247− log.info("Prefetching plugin %s", repo_name)
248− repo = Repo(user, repo_name, branch, alias)
471+) -> Tuple[Plugin, Optional[Repo]]:
472+ repo, branch, alias = p.repo, p.branch, p.alias
473+ name = alias or p.repo.name
474+ commit = None
475+ log.info(f"Fetching last commit for plugin {name} from {repo.uri}@{branch}")
249476 commit, date = repo.latest_commit()
250− has_submodules = repo.has_submodules()
251477 cached_plugin = cache[commit] if cache else None
252478 if cached_plugin is not None:
253− cached_plugin.name = alias or repo_name
479+ log.debug("Cache hit !")
480+ cached_plugin.name = name
254481 cached_plugin.date = date
255482 return cached_plugin, repo.redirect
256483
257− print(f"prefetch {user}/{repo_name}")
258− if has_submodules:
259− sha256 = repo.prefetch_git(commit)
260− else:
261− sha256 = repo.prefetch_github(commit)
484+ has_submodules = repo.has_submodules()
485+ log.debug(f"prefetch {name}")
486+ sha256 = repo.prefetch(commit)
262487
263488 return (
264− Plugin(alias or repo_name, commit, has_submodules, sha256, date=date),
489+ Plugin(name, commit, has_submodules, sha256, date=date),
265490 repo.redirect,
266491 )
267492
268493
269−def fetch_plugin_from_pluginline(plugin_line: str) -> Plugin:
270− plugin, _ = prefetch_plugin(*parse_plugin_line(plugin_line))
271− return plugin
272−
273−
274−def print_download_error(plugin: str, ex: Exception):
494+def print_download_error(plugin: PluginDesc, ex: Exception):
275495 print(f"{plugin}: {ex}", file=sys.stderr)
276496 ex_traceback = ex.__traceback__
277497 tb_lines = [
@@ -280,19 +500,22 @@ def print_download_error(plugin: str, ex: Exception):
280500 ]
281501 print("\n".join(tb_lines))
282502
283−
284503def check_results(
285− results: List[Tuple[str, str, Union[Exception, Plugin], Dict[str, str]]]
286−) -> Tuple[List[Tuple[str, str, Plugin]], Dict[str, str]]:
287− failures: List[Tuple[str, Exception]] = []
504+ results: List[Tuple[PluginDesc, Union[Exception, Plugin], Optional[Repo]]]
505+) -> Tuple[List[Tuple[PluginDesc, Plugin]], Redirects]:
506+ ''' '''
507+ failures: List[Tuple[PluginDesc, Exception]] = []
288508 plugins = []
289− redirects: Dict[str, str] = {}
290− for (owner, name, result, redirect) in results:
509+ redirects: Redirects = {}
510+ for (pdesc, result, redirect) in results:
291511 if isinstance(result, Exception):
292− failures.append((name, result))
512+ failures.append((pdesc, result))
293513 else:
294− plugins.append((owner, name, result))
295− redirects.update(redirect)
514+ new_pdesc = pdesc
515+ if redirect is not None:
516+ redirects.update({pdesc: redirect})
517+ new_pdesc = PluginDesc(redirect, pdesc.branch, pdesc.alias)
518+ plugins.append((new_pdesc, result))
296519
297520 print(f"{len(results) - len(failures)} plugins were checked", end="")
298521 if len(failures) == 0:
@@ -306,31 +529,16 @@ def check_results(
306529
307530 sys.exit(1)
308531
309−
310−def parse_plugin_line(line: str) -> Tuple[str, str, str, Optional[str]]:
311− branch = "master"
312− alias = None
313− name, repo = line.split("/")
314− if " as " in repo:
315− repo, alias = repo.split(" as ")
316− alias = alias.strip()
317− if "@" in repo:
318− repo, branch = repo.split("@")
319−
320− return (name.strip(), repo.strip(), branch.strip(), alias)
321−
322−
323−def load_plugin_spec(plugin_file: str) -> List[Tuple[str, str, str, Optional[str]]]:
324− plugins = []
325− with open(plugin_file) as f:
326− for line in f:
327− plugin = parse_plugin_line(line)
328− if not plugin[0]:
329− msg = f"Invalid repository {line}, must be in the format owner/repo[ as alias]"
330− print(msg, file=sys.stderr)
331− sys.exit(1)
332− plugins.append(plugin)
333− return plugins
532+def make_repo(uri: str, branch) -> Repo:
533+ '''Instantiate a Repo with the correct specialization depending on server (gitub spec)'''
534+ # dumb check to see if it's of the form owner/repo (=> github) or https://...
535+ res = urlparse(uri)
536+ if res.netloc in [ "github.com", ""]:
537+ res = res.path.strip('/').split('/')
538+ repo = RepoGitHub(res[0], res[1], branch)
539+ else:
540+ repo = Repo(uri.strip(), branch)
541+ return repo
334542
335543
336544def get_cache_path(cache_file_name: str) -> Optional[Path]:
@@ -387,38 +595,38 @@ class Cache:
387595
388596
389597def prefetch(
390− args: Tuple[str, str, str, Optional[str]], cache: Cache
391−) -> Tuple[str, str, Union[Exception, Plugin], dict]:
392− assert len(args) == 4
393− owner, repo, branch, alias = args
598+ pluginDesc: PluginDesc, cache: Cache
599+) -> Tuple[PluginDesc, Union[Exception, Plugin], Optional[Repo]]:
394600 try:
395− plugin, redirect = prefetch_plugin(owner, repo, branch, alias, cache)
601+ plugin, redirect = prefetch_plugin(pluginDesc, cache)
396602 cache[plugin.commit] = plugin
397− return (owner, repo, plugin, redirect)
603+ return (pluginDesc, plugin, redirect)
398604 except Exception as e:
399− return (owner, repo, e, {})
605+ return (pluginDesc, e, None)
606+
400607
401608
402609def rewrite_input(
610+ config: FetchConfig,
403611 input_file: Path,
404612 deprecated: Path,
405− redirects: Dict[str, str] = None,
406− append: Tuple = (),
613+ # old pluginDesc and the new
614+ redirects: Redirects = {},
615+ append: List[PluginDesc] = [],
407616):
408− with open(input_file, "r") as f:
409− lines = f.readlines()
617+ plugins = load_plugins_from_csv(config, input_file,)
410618
411− lines.extend(append)
619+ plugins.extend(append)
412620
413621 if redirects:
414− lines = [redirects.get(line, line) for line in lines]
415622
416623 cur_date_iso = datetime.now().strftime("%Y-%m-%d")
417624 with open(deprecated, "r") as f:
418625 deprecations = json.load(f)
419− for old, new in redirects.items():
420− old_plugin = fetch_plugin_from_pluginline(old)
421− new_plugin = fetch_plugin_from_pluginline(new)
626+ for pdesc, new_repo in redirects.items():
627+ new_pdesc = PluginDesc(new_repo, pdesc.branch, pdesc.alias)
628+ old_plugin, _ = prefetch_plugin(pdesc)
629+ new_plugin, _ = prefetch_plugin(new_pdesc)
422630 if old_plugin.normalized_name != new_plugin.normalized_name:
423631 deprecations[old_plugin.normalized_name] = {
424632 "new": new_plugin.normalized_name,
@@ -428,58 +636,14 @@ def rewrite_input(
428636 json.dump(deprecations, f, indent=4, sort_keys=True)
429637 f.write("\n")
430638
431− lines = sorted(lines, key=str.casefold)
432−
433639 with open(input_file, "w") as f:
434− f.writelines(lines)
435−
436−
437−def parse_args(editor: Editor):
438− parser = argparse.ArgumentParser(
439− description=(
440− f"Updates nix derivations for {editor.name} plugins"
441− f"By default from {editor.default_in} to {editor.default_out}"
442− )
443− )
444− parser.add_argument(
445− "--add",
446− dest="add_plugins",
447− default=[],
448− action="append",
449− help=f"Plugin to add to {editor.name}Plugins from Github in the form owner/repo",
450− )
451− parser.add_argument(
452− "--input-names",
453− "-i",
454− dest="input_file",
455− default=editor.default_in,
456− help="A list of plugins in the form owner/repo",
457− )
458− parser.add_argument(
459− "--out",
460− "-o",
461− dest="outfile",
462− default=editor.default_out,
463− help="Filename to save generated nix code",
464− )
465− parser.add_argument(
466− "--proc",
467− "-p",
468− dest="proc",
469− type=int,
470− default=30,
471− help="Number of concurrent processes to spawn.",
472− )
473− parser.add_argument(
474− "--no-commit", "-n", action="store_true", default=False,
475− help="Whether to autocommit changes"
476− )
477− parser.add_argument(
478− "--debug", "-d", choices=LOG_LEVELS.keys(),
479− default=logging.getLevelName(logging.WARN),
480− help="Adjust log level"
481− )
482− return parser.parse_args()
640+ log.debug("Writing into %s", input_file)
641+ # fields = dataclasses.fields(PluginDesc)
642+ fieldnames = ['repo', 'branch', 'alias']
643+ writer = csv.DictWriter(f, fieldnames, dialect='unix', quoting=csv.QUOTE_NONE)
644+ writer.writeheader()
645+ for plugin in sorted(plugins):
646+ writer.writerow(asdict(plugin))
483647
484648
485649def commit(repo: git.Repo, message: str, files: List[Path]) -> None:
@@ -492,64 +656,46 @@ def commit(repo: git.Repo, message: str, files: List[Path]) -> None:
492656 print("no changes in working tree to commit")
493657
494658
495−def get_update(input_file: str, outfile: str, proc: int, editor: Editor):
496− cache: Cache = Cache(get_current_plugins(editor), editor.cache_file)
497− _prefetch = functools.partial(prefetch, cache=cache)
498−
499− def update() -> dict:
500− plugin_names = load_plugin_spec(input_file)
501−
502− try:
503− pool = Pool(processes=proc)
504− results = pool.map(_prefetch, plugin_names)
505− finally:
506− cache.store()
507−
508− plugins, redirects = check_results(results)
509−
510− editor.generate_nix(plugins, outfile)
511−
512− return redirects
513659
514− return update
515−
516−
517−def update_plugins(editor: Editor):
660+def update_plugins(editor: Editor, args):
518661 """The main entry function of this module. All input arguments are grouped in the `Editor`."""
519662
520− args = parse_args(editor)
521663 log.setLevel(LOG_LEVELS[args.debug])
522−
523664 log.info("Start updating plugins")
524− nixpkgs_repo = git.Repo(editor.root, search_parent_directories=True)
525− update = get_update(args.input_file, args.outfile, args.proc, editor)
665+ fetch_config = FetchConfig(args.proc, args.github_token)
666+ update = editor.get_update(args.input_file, args.outfile, fetch_config)
526667
527668 redirects = update()
528− rewrite_input(args.input_file, editor.deprecated, redirects)
669+ editor.rewrite_input(fetch_config, args.input_file, editor.deprecated, redirects)
529670
530671 autocommit = not args.no_commit
531672
673+ nixpkgs_repo = None
532674 if autocommit:
533− commit(nixpkgs_repo, f"{editor.name}Plugins: update", [args.outfile])
675+ nixpkgs_repo = git.Repo(editor.root, search_parent_directories=True)
676+ commit(nixpkgs_repo, f"{editor.attr_path}: update", [args.outfile])
534677
535678 if redirects:
536679 update()
537680 if autocommit:
538681 commit(
539682 nixpkgs_repo,
540− f"{editor.name}Plugins: resolve github repository redirects",
683+ f"{editor.attr_path}: resolve github repository redirects",
541684 [args.outfile, args.input_file, editor.deprecated],
542685 )
543686
544687 for plugin_line in args.add_plugins:
545− rewrite_input(args.input_file, editor.deprecated, append=(plugin_line + "\n",))
688+ pdesc = PluginDesc.load_from_string(fetch_config, plugin_line)
689+ append = [ pdesc ]
690+ editor.rewrite_input(fetch_config, args.input_file, editor.deprecated, append=append)
546691 update()
547− plugin = fetch_plugin_from_pluginline(plugin_line)
692+ plugin, _ = prefetch_plugin(pdesc, )
548693 if autocommit:
549694 commit(
550695 nixpkgs_repo,
551− "{editor}Plugins.{name}: init at {version}".format(
552− editor=editor.name, name=plugin.normalized_name, version=plugin.version
696+ "{drv_name}: init at {version}".format(
697+ drv_name=editor.get_drv_name(plugin.normalized_name),
698+ version=plugin.version
553699 ),
554700 [args.outfile, args.input_file],
555701 )
maintainers/scripts/rebuild-amount.sh+86−79
@@ -4,123 +4,130 @@ set -e
44# --print: avoid dependency on environment
55optPrint=
66if [ "$1" == "--print" ]; then
7− optPrint=true
8− shift
7+ optPrint=true
8+ shift
99fi
1010
1111if [ "$#" != 1 ] && [ "$#" != 2 ]; then
12− cat <<-EOF
13− Usage: $0 [--print] commit-spec [commit-spec]
14− You need to be in a git-controlled nixpkgs tree.
15− The current state of the tree will be used if the second commit is missing.
16− EOF
17− exit 1
12+ cat <<EOF
13+ Usage: $0 [--print] from-commit-spec [to-commit-spec]
14+ You need to be in a git-controlled nixpkgs tree.
15+ The current state of the tree will be used if the second commit is missing.
16+
17+ Examples:
18+ effect of latest commit:
19+ $ $0 HEAD^
20+ $ $0 --print HEAD^
21+ effect of the whole patch series for 'staging' branch:
22+ $ $0 origin/staging staging
23+EOF
24+ exit 1
1825fi
1926
2027# A slightly hacky way to get the config.
2128parallel="$(echo 'config.rebuild-amount.parallel or false' | nix-repl . 2>/dev/null \
22− | grep -v '^\(nix-repl.*\)\?$' | tail -n 1 || true)"
29+ | grep -v '^\(nix-repl.*\)\?$' | tail -n 1 || true)"
2330
24−echo "Estimating rebuild amount by counting changed Hydra jobs."
31+echo "Estimating rebuild amount by counting changed Hydra jobs (parallel=${parallel:-unset})."
2532
2633toRemove=()
2734
2835cleanup() {
29− rm -rf "${toRemove[@]}"
36+ rm -rf "${toRemove[@]}"
3037}
3138trap cleanup EXIT SIGINT SIGQUIT ERR
3239
3340MKTEMP='mktemp --tmpdir nix-rebuild-amount-XXXXXXXX'
3441
3542nixexpr() {
36− cat <<-EONIX
37− let
38− lib = import $1/lib;
39− hydraJobs = import $1/pkgs/top-level/release.nix
40− # Compromise: accuracy vs. resources needed for evaluation.
41− { supportedSystems = cfg.systems or [ "x86_64-linux" "x86_64-darwin" ]; };
42− cfg = (import $1 {}).config.rebuild-amount or {};
43−
44− recurseIntoAttrs = attrs: attrs // { recurseForDerivations = true; };
45−
46− # hydraJobs leaves recurseForDerivations as empty attrmaps;
47− # that would break nix-env and we also need to recurse everywhere.
48− tweak = lib.mapAttrs
49− (name: val:
50− if name == "recurseForDerivations" then true
51− else if lib.isAttrs val && val.type or null != "derivation"
52− then recurseIntoAttrs (tweak val)
53− else val
54− );
55−
56− # Some of these contain explicit references to platform(s) we want to avoid;
57− # some even (transitively) depend on ~/.nixpkgs/config.nix (!)
58− blacklist = [
59− "tarball" "metrics" "manual"
60− "darwin-tested" "unstable" "stdenvBootstrapTools"
61− "moduleSystem" "lib-tests" # these just confuse the output
62− ];
63−
64− in
65− tweak (builtins.removeAttrs hydraJobs blacklist)
66− EONIX
43+ cat <<EONIX
44+ let
45+ lib = import $1/lib;
46+ hydraJobs = import $1/pkgs/top-level/release.nix
47+ # Compromise: accuracy vs. resources needed for evaluation.
48+ { supportedSystems = cfg.systems or [ "x86_64-linux" "x86_64-darwin" ]; };
49+ cfg = (import $1 {}).config.rebuild-amount or {};
50+
51+ recurseIntoAttrs = attrs: attrs // { recurseForDerivations = true; };
52+
53+ # hydraJobs leaves recurseForDerivations as empty attrmaps;
54+ # that would break nix-env and we also need to recurse everywhere.
55+ tweak = lib.mapAttrs
56+ (name: val:
57+ if name == "recurseForDerivations" then true
58+ else if lib.isAttrs val && val.type or null != "derivation"
59+ then recurseIntoAttrs (tweak val)
60+ else val
61+ );
62+
63+ # Some of these contain explicit references to platform(s) we want to avoid;
64+ # some even (transitively) depend on ~/.nixpkgs/config.nix (!)
65+ blacklist = [
66+ "tarball" "metrics" "manual"
67+ "darwin-tested" "unstable" "stdenvBootstrapTools"
68+ "moduleSystem" "lib-tests" # these just confuse the output
69+ ];
70+
71+ in
72+ tweak (builtins.removeAttrs hydraJobs blacklist)
73+EONIX
6774}
6875
6976# Output packages in tree $2 that weren't in $1.
7077# Changing the output hash or name is taken as a change.
7178# Extra nix-env parameters can be in $3
7279newPkgs() {
73− # We use files instead of pipes, as running multiple nix-env processes
74− # could eat too much memory for a standard 4GiB machine.
75− local -a list
76− for i in 1 2; do
77− local l="$($MKTEMP)"
78− list[$i]="$l"
79− toRemove+=("$l")
80−
81− local expr="$($MKTEMP)"
82− toRemove+=("$expr")
83− nixexpr "${!i}" > "$expr"
84−
85− nix-env -f "$expr" -qaP --no-name --out-path --show-trace $3 \
86− | sort > "${list[$i]}" &
87−
88− if [ "$parallel" != "true" ]; then
89− wait
90− fi
91− done
92−
93− wait
94− comm -13 "${list[@]}"
80+ # We use files instead of pipes, as running multiple nix-env processes
81+ # could eat too much memory for a standard 4GiB machine.
82+ local -a list
83+ for i in 1 2; do
84+ local l="$($MKTEMP)"
85+ list[$i]="$l"
86+ toRemove+=("$l")
87+
88+ local expr="$($MKTEMP)"
89+ toRemove+=("$expr")
90+ nixexpr "${!i}" > "$expr"
91+
92+ nix-env -f "$expr" -qaP --no-name --out-path --show-trace $3 \
93+ | sort > "${list[$i]}" &
94+
95+ if [ "$parallel" != "true" ]; then
96+ wait
97+ fi
98+ done
99+
100+ wait
101+ comm -13 "${list[@]}"
95102}
96103
97104# Prepare nixpkgs trees.
98105declare -a tree
99106for i in 1 2; do
100− if [ -n "${!i}" ]; then # use the given commit
101− dir="$($MKTEMP -d)"
102− tree[$i]="$dir"
103− toRemove+=("$dir")
104−
105− git clone --shared --no-checkout --quiet . "${tree[$i]}"
106− (cd "${tree[$i]}" && git checkout --quiet "${!i}")
107− else #use the current tree
108− tree[$i]="$(pwd)"
109− fi
107+ if [ -n "${!i}" ]; then # use the given commit
108+ dir="$($MKTEMP -d)"
109+ tree[$i]="$dir"
110+ toRemove+=("$dir")
111+
112+ git clone --shared --no-checkout --quiet . "${tree[$i]}"
113+ (cd "${tree[$i]}" && git checkout --quiet "${!i}")
114+ else #use the current tree
115+ tree[$i]="$(pwd)"
116+ fi
110117done
111118
112119newlist="$($MKTEMP)"
113120toRemove+=("$newlist")
114121# Notes:
115−# - the evaluation is done on x86_64-linux, like on Hydra.
116−# - using $newlist file so that newPkgs() isn't in a sub-shell (because of toRemove)
122+# - the evaluation is done on x86_64-linux, like on Hydra.
123+# - using $newlist file so that newPkgs() isn't in a sub-shell (because of toRemove)
117124newPkgs "${tree[1]}" "${tree[2]}" '--argstr system "x86_64-linux"' > "$newlist"
118125
119126# Hacky: keep only the last word of each attribute path and sort.
120127sed -n 's/\([^. ]*\.\)*\([^. ]*\) .*$/\2/p' < "$newlist" \
121− | sort | uniq -c
128+ | sort | uniq -c
122129
123130if [ -n "$optPrint" ]; then
124− echo
125− cat "$newlist"
131+ echo
132+ cat "$newlist"
126133fi
maintainers/scripts/remove-old-aliases.pynew file+211

This diff is too big to show here.

maintainers/scripts/update-luarocks-packages+207−125

This diff is too big to show here.

maintainers/scripts/update-luarocks-shell.nix+4−3

This diff is too big to show here.

maintainers/scripts/update-ruby-packages+4−1

This diff is too big to show here.

maintainers/scripts/update.nix+3−3

This diff is too big to show here.

maintainers/scripts/update.py+5−1

This diff is too big to show here.

maintainers/scripts/vanity.sh+19−19

This diff is too big to show here.

maintainers/team-list.nix+468−5

This diff is too big to show here.

nixos/default.nix+1−24

This diff is too big to show here.

nixos/doc/manual/READMEdeleted−3

This diff is too big to show here.

nixos/doc/manual/README.mdnew file+3

This diff is too big to show here.

nixos/doc/manual/administration/boot-problems.section.mdnew file+41

This diff is too big to show here.

nixos/doc/manual/administration/boot-problems.xmldeleted−126

This diff is too big to show here.

nixos/doc/manual/administration/cleaning-store.chapter.mdnew file+62

This diff is too big to show here.

nixos/doc/manual/administration/cleaning-store.xmldeleted−63

This diff is too big to show here.

nixos/doc/manual/administration/container-networking.section.mdnew file+44

This diff is too big to show here.

nixos/doc/manual/administration/container-networking.xmldeleted−59

This diff is too big to show here.

nixos/doc/manual/administration/containers.chapter.mdnew file+28

This diff is too big to show here.

nixos/doc/manual/administration/containers.xmldeleted−34

This diff is too big to show here.

nixos/doc/manual/administration/control-groups.chapter.mdnew file+59

This diff is too big to show here.

nixos/doc/manual/administration/control-groups.xmldeleted−65

This diff is too big to show here.

nixos/doc/manual/administration/declarative-containers.section.mdnew file+48

This diff is too big to show here.

nixos/doc/manual/administration/declarative-containers.xmldeleted−60

This diff is too big to show here.

nixos/doc/manual/administration/imperative-containers.section.mdnew file+115

This diff is too big to show here.

nixos/doc/manual/administration/imperative-containers.xmldeleted−123

This diff is too big to show here.

nixos/doc/manual/administration/logging.chapter.mdnew file+38

This diff is too big to show here.

nixos/doc/manual/administration/logging.xmldeleted−43

This diff is too big to show here.

nixos/doc/manual/administration/maintenance-mode.section.mdnew file+11

This diff is too big to show here.

nixos/doc/manual/administration/maintenance-mode.xmldeleted−16

This diff is too big to show here.

nixos/doc/manual/administration/network-problems.section.mdnew file+21

This diff is too big to show here.

nixos/doc/manual/administration/network-problems.xmldeleted−27

This diff is too big to show here.

nixos/doc/manual/administration/rebooting.chapter.mdnew file+30

This diff is too big to show here.

nixos/doc/manual/administration/rebooting.xmldeleted−35

This diff is too big to show here.

nixos/doc/manual/administration/rollback.section.mdnew file+38

This diff is too big to show here.

nixos/doc/manual/administration/rollback.xmldeleted−41

This diff is too big to show here.

nixos/doc/manual/administration/running.xml+8−8

This diff is too big to show here.

nixos/doc/manual/administration/service-mgmt.chapter.mdnew file+120

This diff is too big to show here.

nixos/doc/manual/administration/service-mgmt.xmldeleted−140

This diff is too big to show here.

nixos/doc/manual/administration/store-corruption.section.mdnew file+28

This diff is too big to show here.

nixos/doc/manual/administration/store-corruption.xmldeleted−36

This diff is too big to show here.

nixos/doc/manual/administration/troubleshooting.chapter.mdnew file+12

This diff is too big to show here.

nixos/doc/manual/administration/troubleshooting.xmldeleted−16

This diff is too big to show here.

nixos/doc/manual/administration/user-sessions.chapter.mdnew file+43

This diff is too big to show here.

nixos/doc/manual/administration/user-sessions.xmldeleted−45

This diff is too big to show here.

nixos/doc/manual/configuration/ad-hoc-network-config.section.mdnew file+13

This diff is too big to show here.

nixos/doc/manual/configuration/ad-hoc-network-config.xmldeleted−20

This diff is too big to show here.

nixos/doc/manual/configuration/ad-hoc-packages.section.mdnew file+51

This diff is too big to show here.

nixos/doc/manual/configuration/ad-hoc-packages.xmldeleted−61

This diff is too big to show here.

nixos/doc/manual/configuration/adding-custom-packages.section.mdnew file+74

This diff is too big to show here.

nixos/doc/manual/configuration/adding-custom-packages.xmldeleted−73

This diff is too big to show here.

nixos/doc/manual/configuration/config-file.section.mdnew file+175

This diff is too big to show here.

nixos/doc/manual/configuration/config-file.xmldeleted−216

This diff is too big to show here.

nixos/doc/manual/configuration/config-syntax.chapter.mdnew file+19

This diff is too big to show here.

nixos/doc/manual/configuration/config-syntax.xmldeleted−25

This diff is too big to show here.

nixos/doc/manual/configuration/configuration.xml+13−13

This diff is too big to show here.

nixos/doc/manual/configuration/customizing-packages.section.mdnew file+74

This diff is too big to show here.

nixos/doc/manual/configuration/customizing-packages.xmldeleted−86

This diff is too big to show here.

nixos/doc/manual/configuration/declarative-packages.section.mdnew file+46

This diff is too big to show here.

nixos/doc/manual/configuration/declarative-packages.xmldeleted−54

This diff is too big to show here.

nixos/doc/manual/configuration/file-systems.chapter.mdnew file+42

This diff is too big to show here.

nixos/doc/manual/configuration/file-systems.xmldeleted−57

This diff is too big to show here.

nixos/doc/manual/configuration/firewall.section.mdnew file+32

This diff is too big to show here.

nixos/doc/manual/configuration/firewall.xmldeleted−37

This diff is too big to show here.

nixos/doc/manual/configuration/gpu-accel.chapter.mdnew file+204

This diff is too big to show here.

nixos/doc/manual/configuration/gpu-accel.xmldeleted−263

This diff is too big to show here.

nixos/doc/manual/configuration/ipv4-config.section.mdnew file+35

This diff is too big to show here.

nixos/doc/manual/configuration/ipv4-config.xmldeleted−43

This diff is too big to show here.

nixos/doc/manual/configuration/ipv6-config.section.mdnew file+42

This diff is too big to show here.

nixos/doc/manual/configuration/ipv6-config.xmldeleted−54

This diff is too big to show here.

nixos/doc/manual/configuration/kubernetes.chapter.mdnew file+104

This diff is too big to show here.

nixos/doc/manual/configuration/kubernetes.xmldeleted−112

This diff is too big to show here.

nixos/doc/manual/configuration/linux-kernel.chapter.mdnew file+140

This diff is too big to show here.

nixos/doc/manual/configuration/linux-kernel.xmldeleted−138

This diff is too big to show here.

nixos/doc/manual/configuration/luks-file-systems.section.mdnew file+77

This diff is too big to show here.

nixos/doc/manual/configuration/luks-file-systems.xmldeleted−78

This diff is too big to show here.

nixos/doc/manual/configuration/modularity.section.mdnew file+133

This diff is too big to show here.

nixos/doc/manual/configuration/modularity.xmldeleted−146

This diff is too big to show here.

nixos/doc/manual/configuration/network-manager.section.mdnew file+42

This diff is too big to show here.

nixos/doc/manual/configuration/network-manager.xmldeleted−48

This diff is too big to show here.

nixos/doc/manual/configuration/networking.chapter.mdnew file+16

This diff is too big to show here.

nixos/doc/manual/configuration/networking.xmldeleted−20

This diff is too big to show here.

nixos/doc/manual/configuration/package-mgmt.chapter.mdnew file+18

This diff is too big to show here.

nixos/doc/manual/configuration/package-mgmt.xmldeleted−31

This diff is too big to show here.

nixos/doc/manual/configuration/profiles.chapter.mdnew file+34

This diff is too big to show here.

nixos/doc/manual/configuration/profiles.xmldeleted−39

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/all-hardware.section.mdnew file+11

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/all-hardware.xmldeleted−21

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/base.section.mdnew file+7

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/base.xmldeleted−15

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/clone-config.section.mdnew file+11

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/clone-config.xmldeleted−21

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/demo.section.mdnew file+4

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/demo.xmldeleted−14

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/docker-container.section.mdnew file+7

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/docker-container.xmldeleted−16

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/graphical.section.mdnew file+10

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/graphical.xmldeleted−20

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/hardened.section.mdnew file+20

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/hardened.xmldeleted−32

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/headless.section.mdnew file+9

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/headless.xmldeleted−19

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/installation-device.section.mdnew file+24

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/installation-device.xmldeleted−36

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/minimal.section.mdnew file+9

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/minimal.xmldeleted−17

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/qemu-guest.section.mdnew file+7

This diff is too big to show here.

nixos/doc/manual/configuration/profiles/qemu-guest.xmldeleted−17

This diff is too big to show here.

nixos/doc/manual/configuration/renaming-interfaces.section.mdnew file+51

This diff is too big to show here.

nixos/doc/manual/configuration/renaming-interfaces.xmldeleted−67

This diff is too big to show here.

nixos/doc/manual/configuration/ssh.section.mdnew file+19

This diff is too big to show here.

nixos/doc/manual/configuration/ssh.xmldeleted−27

This diff is too big to show here.

nixos/doc/manual/configuration/sshfs-file-systems.section.mdnew file+104

This diff is too big to show here.

nixos/doc/manual/configuration/subversion.chapter.mdnew file+102

This diff is too big to show here.

nixos/doc/manual/configuration/subversion.xmldeleted−140

This diff is too big to show here.

nixos/doc/manual/configuration/summary.section.mdnew file+46

This diff is too big to show here.

nixos/doc/manual/configuration/summary.xmldeleted−227

This diff is too big to show here.

nixos/doc/manual/configuration/user-mgmt.chapter.mdnew file+92

This diff is too big to show here.

nixos/doc/manual/configuration/user-mgmt.xmldeleted−88

This diff is too big to show here.

nixos/doc/manual/configuration/wayland.chapter.mdnew file+27

This diff is too big to show here.

nixos/doc/manual/configuration/wayland.xmldeleted−23

This diff is too big to show here.

nixos/doc/manual/configuration/wireless.section.mdnew file+67

This diff is too big to show here.

nixos/doc/manual/configuration/wireless.xmldeleted−70

This diff is too big to show here.

nixos/doc/manual/configuration/x-windows.chapter.mdnew file+337

This diff is too big to show here.

nixos/doc/manual/configuration/x-windows.xmldeleted−352

This diff is too big to show here.

nixos/doc/manual/configuration/xfce.chapter.mdnew file+52

This diff is too big to show here.

nixos/doc/manual/configuration/xfce.xmldeleted−59

This diff is too big to show here.

nixos/doc/manual/default.nix+19−6

This diff is too big to show here.

nixos/doc/manual/development/activation-script.section.mdnew file+72

This diff is too big to show here.

nixos/doc/manual/development/assertions.section.mdnew file+40

This diff is too big to show here.

nixos/doc/manual/development/assertions.xmldeleted−74

This diff is too big to show here.

nixos/doc/manual/development/building-nixos.chapter.mddeleted−18

This diff is too big to show here.

nixos/doc/manual/development/building-parts.chapter.mdnew file+74

This diff is too big to show here.

nixos/doc/manual/development/building-parts.xmldeleted−121

This diff is too big to show here.

nixos/doc/manual/development/development.xml+7−7

This diff is too big to show here.

nixos/doc/manual/development/freeform-modules.section.mdnew file+79

This diff is too big to show here.

nixos/doc/manual/development/freeform-modules.xmldeleted−68

This diff is too big to show here.

nixos/doc/manual/development/importing-modules.section.mdnew file+46

This diff is too big to show here.

nixos/doc/manual/development/importing-modules.xmldeleted−56

This diff is too big to show here.

nixos/doc/manual/development/linking-nixos-tests-to-packages.section.mdnew file+6

This diff is too big to show here.

nixos/doc/manual/development/meta-attributes.section.mdnew file+66

This diff is too big to show here.

nixos/doc/manual/development/meta-attributes.xmldeleted−63

This diff is too big to show here.

nixos/doc/manual/development/nixos-tests.chapter.mdnew file+13

This diff is too big to show here.

nixos/doc/manual/development/nixos-tests.xmldeleted−19

This diff is too big to show here.

nixos/doc/manual/development/option-declarations.section.mdnew file+221

This diff is too big to show here.

nixos/doc/manual/development/option-declarations.xmldeleted−199

This diff is too big to show here.

nixos/doc/manual/development/option-def.section.mdnew file+91

This diff is too big to show here.

nixos/doc/manual/development/option-def.xmldeleted−99

This diff is too big to show here.

nixos/doc/manual/development/option-types.section.mdnew file+583

This diff is too big to show here.

nixos/doc/manual/development/option-types.xmldeleted−914

This diff is too big to show here.

nixos/doc/manual/development/replace-modules.section.mdnew file+64

This diff is too big to show here.

nixos/doc/manual/development/replace-modules.xmldeleted−79

This diff is too big to show here.

nixos/doc/manual/development/running-nixos-tests-interactively.section.mdnew file+35

This diff is too big to show here.

nixos/doc/manual/development/running-nixos-tests-interactively.xmldeleted−49

This diff is too big to show here.

nixos/doc/manual/development/running-nixos-tests.section.mdnew file+31

This diff is too big to show here.

nixos/doc/manual/development/running-nixos-tests.xmldeleted−36

This diff is too big to show here.

nixos/doc/manual/development/settings-options.section.mdnew file+251

This diff is too big to show here.

nixos/doc/manual/development/settings-options.xmldeleted−226

This diff is too big to show here.

nixos/doc/manual/development/sources.chapter.mdnew file+77

This diff is too big to show here.

nixos/doc/manual/development/sources.xmldeleted−85

This diff is too big to show here.

nixos/doc/manual/development/testing-installer.chapter.mdnew file+18

This diff is too big to show here.

nixos/doc/manual/development/testing-installer.xmldeleted−22

This diff is too big to show here.

nixos/doc/manual/development/unit-handling.section.mdnew file+62

This diff is too big to show here.

nixos/doc/manual/development/what-happens-during-a-system-switch.chapter.mdnew file+53

This diff is too big to show here.

nixos/doc/manual/development/writing-documentation.chapter.mdnew file+93

This diff is too big to show here.

nixos/doc/manual/development/writing-documentation.xmldeleted−150

This diff is too big to show here.

nixos/doc/manual/development/writing-modules.chapter.mdnew file+208

This diff is too big to show here.

nixos/doc/manual/development/writing-modules.xmldeleted−191

This diff is too big to show here.

nixos/doc/manual/development/writing-nixos-tests.section.mdnew file+382

This diff is too big to show here.

nixos/doc/manual/development/writing-nixos-tests.xmldeleted−517

This diff is too big to show here.

nixos/doc/manual/from_md/administration/boot-problems.section.xmlnew file+144

This diff is too big to show here.

nixos/doc/manual/from_md/administration/cleaning-store.chapter.xmlnew file+72

This diff is too big to show here.

nixos/doc/manual/from_md/administration/container-networking.section.xmlnew file+54

This diff is too big to show here.

nixos/doc/manual/from_md/administration/containers.chapter.xmlnew file+31

This diff is too big to show here.

nixos/doc/manual/from_md/administration/control-groups.chapter.xmlnew file+67

This diff is too big to show here.

nixos/doc/manual/from_md/administration/declarative-containers.section.xmlnew file+60

This diff is too big to show here.

nixos/doc/manual/from_md/administration/imperative-containers.section.xmlnew file+132

This diff is too big to show here.

nixos/doc/manual/from_md/administration/logging.chapter.xmlnew file+45

This diff is too big to show here.

nixos/doc/manual/from_md/administration/maintenance-mode.section.xmlnew file+14

This diff is too big to show here.

nixos/doc/manual/from_md/administration/network-problems.section.xmlnew file+25

This diff is too big to show here.

nixos/doc/manual/from_md/administration/rebooting.chapter.xmlnew file+38

This diff is too big to show here.

nixos/doc/manual/from_md/administration/rollback.section.xmlnew file+42

This diff is too big to show here.

nixos/doc/manual/from_md/administration/service-mgmt.chapter.xmlnew file+141

This diff is too big to show here.

nixos/doc/manual/from_md/administration/store-corruption.section.xmlnew file+34

This diff is too big to show here.

nixos/doc/manual/from_md/administration/troubleshooting.chapter.xmlnew file+12

This diff is too big to show here.

nixos/doc/manual/from_md/administration/user-sessions.chapter.xmlnew file+46

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/ad-hoc-network-config.section.xmlnew file+16

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/ad-hoc-packages.section.xmlnew file+59

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/adding-custom-packages.section.xmlnew file+80

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/config-file.section.xmlnew file+231

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/config-syntax.chapter.xmlnew file+21

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/customizing-packages.section.xmlnew file+90

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/declarative-packages.section.xmlnew file+53

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/file-systems.chapter.xmlnew file+55

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/firewall.section.xmlnew file+39

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/gpu-accel.chapter.xmlnew file+239

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/ipv4-config.section.xmlnew file+43

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/ipv6-config.section.xmlnew file+47

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/kubernetes.chapter.xmlnew file+126

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/linux-kernel.chapter.xmlnew file+157

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/luks-file-systems.section.xmlnew file+84

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/modularity.section.xmlnew file+152

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/network-manager.section.xmlnew file+49

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/networking.chapter.xmlnew file+15

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/package-mgmt.chapter.xmlnew file+28

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/profiles.chapter.xmlnew file+38

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/profiles/all-hardware.section.xmlnew file+15

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/profiles/base.section.xmlnew file+10

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/profiles/clone-config.section.xmlnew file+16

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/profiles/demo.section.xmlnew file+10

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/profiles/docker-container.section.xmlnew file+12

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/profiles/graphical.section.xmlnew file+14

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/profiles/hardened.section.xmlnew file+25

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/profiles/headless.section.xmlnew file+15

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/profiles/installation-device.section.xmlnew file+32

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/profiles/minimal.section.xmlnew file+13

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/profiles/qemu-guest.section.xmlnew file+11

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/renaming-interfaces.section.xmlnew file+62

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/ssh.section.xmlnew file+23

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/sshfs-file-systems.section.xmlnew file+139

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/subversion.chapter.xmlnew file+121

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/summary.section.xmlnew file+332

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/user-mgmt.chapter.xmlnew file+105

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/wayland.chapter.xmlnew file+31

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/wireless.section.xmlnew file+73

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/x-windows.chapter.xmlnew file+381

This diff is too big to show here.

nixos/doc/manual/from_md/configuration/xfce.chapter.xmlnew file+62

This diff is too big to show here.

nixos/doc/manual/from_md/development/activation-script.section.xmlnew file+150

This diff is too big to show here.

nixos/doc/manual/from_md/development/assertions.section.xmlnew file+58

This diff is too big to show here.

nixos/doc/manual/from_md/development/building-nixos.chapter.xmldeleted−33

This diff is too big to show here.

nixos/doc/manual/from_md/development/building-parts.chapter.xmlnew file+124

This diff is too big to show here.

nixos/doc/manual/from_md/development/freeform-modules.section.xmlnew file+87

This diff is too big to show here.

nixos/doc/manual/from_md/development/importing-modules.section.xmlnew file+47

This diff is too big to show here.

nixos/doc/manual/from_md/development/linking-nixos-tests-to-packages.section.xmlnew file+10

This diff is too big to show here.

nixos/doc/manual/from_md/development/meta-attributes.section.xmlnew file+95

This diff is too big to show here.

nixos/doc/manual/from_md/development/nixos-tests.chapter.xmlnew file+14

This diff is too big to show here.

nixos/doc/manual/from_md/development/option-declarations.section.xmlnew file+327

This diff is too big to show here.

nixos/doc/manual/from_md/development/option-def.section.xmlnew file+104

This diff is too big to show here.

nixos/doc/manual/from_md/development/option-types.section.xmlnew file+1038

This diff is too big to show here.

nixos/doc/manual/from_md/development/replace-modules.section.xmlnew file+70

This diff is too big to show here.

nixos/doc/manual/from_md/development/running-nixos-tests-interactively.section.xmlnew file+39

This diff is too big to show here.

nixos/doc/manual/from_md/development/running-nixos-tests.section.xmlnew file+34

This diff is too big to show here.

nixos/doc/manual/from_md/development/settings-options.section.xmlnew file+421

This diff is too big to show here.

nixos/doc/manual/from_md/development/sources.chapter.xmlnew file+90

This diff is too big to show here.

nixos/doc/manual/from_md/development/testing-installer.chapter.xmlnew file+22

This diff is too big to show here.

nixos/doc/manual/from_md/development/unit-handling.section.xmlnew file+131

This diff is too big to show here.

nixos/doc/manual/from_md/development/what-happens-during-a-system-switch.chapter.xmlnew file+122

This diff is too big to show here.

nixos/doc/manual/from_md/development/writing-documentation.chapter.xmlnew file+144

This diff is too big to show here.

nixos/doc/manual/from_md/development/writing-modules.chapter.xmlnew file+245

This diff is too big to show here.

nixos/doc/manual/from_md/development/writing-nixos-tests.section.xmlnew file+655

This diff is too big to show here.

nixos/doc/manual/from_md/installation/building-nixos.chapter.xmlnew file+106

This diff is too big to show here.

nixos/doc/manual/from_md/installation/changing-config.chapter.xmlnew file+117

This diff is too big to show here.

nixos/doc/manual/from_md/installation/installing-behind-a-proxy.section.xmlnew file+41

This diff is too big to show here.

nixos/doc/manual/from_md/installation/installing-from-other-distro.section.xmlnew file+388

This diff is too big to show here.

nixos/doc/manual/from_md/installation/installing-pxe.section.xmlnew file+42

This diff is too big to show here.

nixos/doc/manual/from_md/installation/installing-usb.section.xmlnew file+35

This diff is too big to show here.

nixos/doc/manual/from_md/installation/installing-virtualbox-guest.section.xmlnew file+92

This diff is too big to show here.

nixos/doc/manual/from_md/installation/installing.chapter.xmlnew file+645

This diff is too big to show here.

nixos/doc/manual/from_md/installation/obtaining.chapter.xmlnew file+48

This diff is too big to show here.

nixos/doc/manual/from_md/installation/upgrading.chapter.xmlnew file+152

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-1310.section.xmlnew file+6

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-1404.section.xmlnew file+189

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-1412.section.xmlnew file+466

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-1509.section.xmlnew file+776

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-1603.section.xmlnew file+695

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-1609.section.xmlnew file+273

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-1703.section.xmlnew file+818

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-1709.section.xmlnew file+922

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-1803.section.xmlnew file+879

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-1809.section.xmlnew file+941

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-1903.section.xmlnew file+790

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-1909.section.xmlnew file+1197

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-2003.section.xmlnew file+1497

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-2009.section.xmlnew file+2210

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-2105.section.xmlnew file+1567

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-2111.section.xml+2037−27

This diff is too big to show here.

nixos/doc/manual/from_md/release-notes/rl-2205.section.xmlnew file+2470

This diff is too big to show here.

nixos/doc/manual/installation/building-nixos.chapter.mdnew file+77

This diff is too big to show here.

nixos/doc/manual/installation/changing-config.chapter.mdnew file+100

This diff is too big to show here.

nixos/doc/manual/installation/changing-config.xmldeleted−97

This diff is too big to show here.

nixos/doc/manual/installation/installation.xml+5−4

This diff is too big to show here.

nixos/doc/manual/installation/installing-behind-a-proxy.section.mdnew file+29

This diff is too big to show here.

nixos/doc/manual/installation/installing-behind-a-proxy.xmldeleted−48

This diff is too big to show here.

nixos/doc/manual/installation/installing-from-other-distro.section.mdnew file+279

This diff is too big to show here.

nixos/doc/manual/installation/installing-from-other-distro.xmldeleted−364

This diff is too big to show here.

nixos/doc/manual/installation/installing-pxe.section.mdnew file+32

This diff is too big to show here.

nixos/doc/manual/installation/installing-pxe.xmldeleted−50

This diff is too big to show here.

nixos/doc/manual/installation/installing-usb.section.mdnew file+31

This diff is too big to show here.

nixos/doc/manual/installation/installing-usb.xmldeleted−40

This diff is too big to show here.

nixos/doc/manual/installation/installing-virtualbox-guest.section.mdnew file+59

This diff is too big to show here.

nixos/doc/manual/installation/installing-virtualbox-guest.xmldeleted−103

This diff is too big to show here.

nixos/doc/manual/installation/installing.chapter.mdnew file+482

This diff is too big to show here.

nixos/doc/manual/installation/installing.xmldeleted−579

This diff is too big to show here.

nixos/doc/manual/installation/obtaining.chapter.mdnew file+26

This diff is too big to show here.

nixos/doc/manual/installation/obtaining.xmldeleted−54

This diff is too big to show here.

nixos/doc/manual/installation/upgrading.chapter.mdnew file+118

This diff is too big to show here.

nixos/doc/manual/installation/upgrading.xmldeleted−139

This diff is too big to show here.

nixos/doc/manual/man-nixos-install.xml+9−4

This diff is too big to show here.

nixos/doc/manual/man-nixos-rebuild.xml+61−7

This diff is too big to show here.

nixos/doc/manual/man-pages.xml+7−2

This diff is too big to show here.

nixos/doc/manual/md-to-db.sh+28−12

This diff is too big to show here.

nixos/doc/manual/preface.xml+7−6

This diff is too big to show here.

nixos/doc/manual/release-notes/release-notes.xml+16−15

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1310.section.mdnew file+3

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1310.xmldeleted−11

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1404.section.mdnew file+81

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1404.xmldeleted−179

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1412.section.mdnew file+171

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1412.xmldeleted−467

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1509.section.mdnew file+319

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1509.xmldeleted−750

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1603.section.mdnew file+282

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1603.xmldeleted−671

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1609.section.mdnew file+73

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1609.xmldeleted−277

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1703.section.mdnew file+303

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1703.xmldeleted−817

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1709.section.mdnew file+316

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1709.xmldeleted−899

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1803.section.mdnew file+286

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1803.xmldeleted−855

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1809.section.mdnew file+332

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1809.xmldeleted−933

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1903.section.mdnew file+214

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1903.xmldeleted−768

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1909.section.mdnew file+313

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-1909.xmldeleted−902

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-2003.section.mdnew file+507

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-2003.xmldeleted−1252

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-2009.section.mdnew file+747

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-2009.xmldeleted−1838

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-2105.section.mdnew file+428

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-2105.xmldeleted−1266

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-2111.section.md+561−20

This diff is too big to show here.

nixos/doc/manual/release-notes/rl-2205.section.mdnew file+878

This diff is too big to show here.

nixos/lib/build-vms.nix+17−10

This diff is too big to show here.

nixos/lib/default.nixnew file+33

This diff is too big to show here.

nixos/lib/eval-cacheable-options.nixnew file+53

This diff is too big to show here.

nixos/lib/eval-config-minimal.nixnew file+49

This diff is too big to show here.

nixos/lib/eval-config.nix+54−16

This diff is too big to show here.

nixos/lib/make-disk-image.nix+67−24

This diff is too big to show here.

nixos/lib/make-iso9660-image.sh+1

This diff is too big to show here.

nixos/lib/make-multi-disk-zfs-image.nixnew file+333

This diff is too big to show here.

nixos/lib/make-options-doc/default.nix+78−103

This diff is too big to show here.

nixos/lib/make-options-doc/generateAsciiDoc.pynew file+37

This diff is too big to show here.

nixos/lib/make-options-doc/generateCommonMark.pynew file+27

This diff is too big to show here.

nixos/lib/make-options-doc/mergeJSON.pynew file+95

This diff is too big to show here.

nixos/lib/make-options-doc/options-to-docbook.xsl+30−20

This diff is too big to show here.

nixos/lib/make-options-doc/optionsJSONtoXML.nixnew file+6

This diff is too big to show here.

nixos/lib/make-options-doc/sortXML.pynew file+27

This diff is too big to show here.

nixos/lib/make-single-disk-zfs-image.nixnew file+322

This diff is too big to show here.

nixos/lib/make-squashfs.nix+8−1

This diff is too big to show here.

nixos/lib/qemu-common.nixnew file+32

This diff is too big to show here.

nixos/lib/qemu-flags.nixdeleted−32

This diff is too big to show here.

nixos/lib/systemd-lib.nixnew file+426

This diff is too big to show here.

nixos/lib/systemd-types.nixnew file+69

This diff is too big to show here.

nixos/lib/systemd-unit-options.nixnew file+711

This diff is too big to show here.

nixos/lib/test-driver/default.nixnew file+32

This diff is too big to show here.

nixos/lib/test-driver/setup.pynew file+13

This diff is too big to show here.

nixos/lib/test-driver/test-driver.pydeleted−1016

This diff is too big to show here.

nixos/lib/test-driver/test_driver/__init__.pynew file+128

This diff is too big to show here.

nixos/lib/test-driver/test_driver/driver.pynew file+226

This diff is too big to show here.

nixos/lib/test-driver/test_driver/logger.pynew file+105

This diff is too big to show here.

nixos/lib/test-driver/test_driver/machine.pynew file+1023

This diff is too big to show here.

nixos/lib/test-driver/test_driver/polling_condition.pynew file+77

This diff is too big to show here.

nixos/lib/test-driver/test_driver/vlan.pynew file+58

This diff is too big to show here.

nixos/lib/testing-python.nix+176−259

This diff is too big to show here.

nixos/lib/utils.nix+78−6

This diff is too big to show here.

nixos/maintainers/scripts/azure-new/examples/basic/image.nix+1−1

This diff is too big to show here.

nixos/maintainers/scripts/azure-new/examples/basic/system.nix+1−1

This diff is too big to show here.

nixos/maintainers/scripts/ec2/amazon-image-zfs.nixnew file+12

This diff is too big to show here.

nixos/maintainers/scripts/ec2/amazon-image.nix+98−28

This diff is too big to show here.

nixos/maintainers/scripts/ec2/create-amis.sh+83−45

This diff is too big to show here.

nixos/maintainers/scripts/lxd/lxd-image-inner.nixnew file+102

This diff is too big to show here.

nixos/maintainers/scripts/lxd/lxd-image.nixnew file+34

This diff is too big to show here.

nixos/maintainers/scripts/lxd/nix.tplnew file+9

This diff is too big to show here.

nixos/maintainers/scripts/openstack/openstack-image-zfs.nixnew file+101

This diff is too big to show here.

nixos/maintainers/scripts/openstack/openstack-image.nix+9−8

This diff is too big to show here.

nixos/modules/config/console.nix+30−11

This diff is too big to show here.

nixos/modules/config/fonts/fontconfig.nix+1−17

This diff is too big to show here.

nixos/modules/config/fonts/fontdir.nix+2−2

This diff is too big to show here.

nixos/modules/config/fonts/fonts.nix+46−21

This diff is too big to show here.

nixos/modules/config/gtk/gtk-icon-cache.nix+1

This diff is too big to show here.

nixos/modules/config/i18n.nix+7−1

This diff is too big to show here.

nixos/modules/config/krb5/default.nix+8−8

This diff is too big to show here.

nixos/modules/config/ldap.nix+1−1

This diff is too big to show here.

nixos/modules/config/malloc.nix+22−3

This diff is too big to show here.

nixos/modules/config/networking.nix+11−7

This diff is too big to show here.

nixos/modules/config/nsswitch.nix+9−6

This diff is too big to show here.

nixos/modules/config/power-management.nix+2−2

This diff is too big to show here.

nixos/modules/config/pulseaudio.nix+11−11

This diff is too big to show here.

nixos/modules/config/resolvconf.nix+2−4

This diff is too big to show here.

nixos/modules/config/shells-environment.nix+15−5

This diff is too big to show here.

nixos/modules/config/swap.nix+34−7

This diff is too big to show here.

nixos/modules/config/sysctl.nix+1−1

This diff is too big to show here.

nixos/modules/config/system-environment.nix+34−36

This diff is too big to show here.

nixos/modules/config/system-path.nix+19−9

This diff is too big to show here.

nixos/modules/config/terminfo.nix+25−1

This diff is too big to show here.

nixos/modules/config/unix-odbc-drivers.nix+1−1

This diff is too big to show here.

nixos/modules/config/update-users-groups.pl+29−16

This diff is too big to show here.

nixos/modules/config/users-groups.nix+64−27

This diff is too big to show here.

nixos/modules/config/xdg/mime.nix+64−2

This diff is too big to show here.

nixos/modules/config/xdg/portal.nix+23−12

This diff is too big to show here.

nixos/modules/config/xdg/portals/wlr.nixnew file+67

This diff is too big to show here.

nixos/modules/hardware/all-firmware.nix+24−6

This diff is too big to show here.

nixos/modules/hardware/ckb-next.nix+1−1

This diff is too big to show here.

nixos/modules/hardware/corectrl.nixnew file+62

This diff is too big to show here.

nixos/modules/hardware/cpu/intel-sgx.nixnew file+69

This diff is too big to show here.

nixos/modules/hardware/device-tree.nix+5−5

This diff is too big to show here.

nixos/modules/hardware/digitalbitbox.nix+1−1

This diff is too big to show here.

nixos/modules/hardware/flirc.nixnew file+12

This diff is too big to show here.

nixos/modules/hardware/gkraken.nixnew file+18

This diff is too big to show here.

nixos/modules/hardware/gpgsmartcards.nixnew file+37

This diff is too big to show here.

nixos/modules/hardware/hackrf.nixnew file+23

This diff is too big to show here.

nixos/modules/hardware/keyboard/zsa.nix−3

This diff is too big to show here.

nixos/modules/hardware/network/b43.nix−4

This diff is too big to show here.

nixos/modules/hardware/onlykey.udevdeleted−4

This diff is too big to show here.

nixos/modules/hardware/onlykey.nix → nixos/modules/hardware/onlykey/default.nixrenamed

The content is the same.

nixos/modules/hardware/onlykey/onlykey.udevnew file+18

This diff is too big to show here.

nixos/modules/hardware/opengl.nix+2−2

This diff is too big to show here.

nixos/modules/hardware/openrazer.nix+18−5

This diff is too big to show here.

nixos/modules/hardware/opentabletdriver.nix+1−1

This diff is too big to show here.

nixos/modules/hardware/pcmcia.nix+1

This diff is too big to show here.

nixos/modules/hardware/printers.nix+6−11

This diff is too big to show here.

nixos/modules/hardware/raid/hpsa.nix+4−1

This diff is too big to show here.

nixos/modules/hardware/rtl-sdr.nix+8−4

This diff is too big to show here.

nixos/modules/hardware/sata.nix+1−1

This diff is too big to show here.

nixos/modules/hardware/sensor/iio.nix+1−1

This diff is too big to show here.

nixos/modules/hardware/system-76.nix+33−3

This diff is too big to show here.

nixos/modules/hardware/video/amdgpu-pro.nix+25−22

This diff is too big to show here.

nixos/modules/hardware/video/capture/mwprocapture.nix−5

This diff is too big to show here.

nixos/modules/hardware/video/nvidia.nix+59−24

This diff is too big to show here.

nixos/modules/hardware/video/uvcvideo/default.nix+1−1

This diff is too big to show here.

nixos/modules/hardware/video/webcam/facetimehd.nix+14−6

This diff is too big to show here.

nixos/modules/hardware/xone.nixnew file+23

This diff is too big to show here.

nixos/modules/i18n/input-method/fcitx.nix+4−1

This diff is too big to show here.

nixos/modules/i18n/input-method/fcitx5.nix+21−12

This diff is too big to show here.

nixos/modules/i18n/input-method/ibus.nix+5−2

This diff is too big to show here.

nixos/modules/i18n/input-method/kime.nix+4−2

This diff is too big to show here.

nixos/modules/installer/cd-dvd/channel.nix+2−1

This diff is too big to show here.

nixos/modules/installer/cd-dvd/installation-cd-base.nix+16

This diff is too big to show here.

nixos/modules/installer/cd-dvd/installation-cd-graphical-base.nix+14−8

This diff is too big to show here.

nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares-gnome.nixnew file+59

This diff is too big to show here.

nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares-plasma5.nixnew file+49

This diff is too big to show here.

nixos/modules/installer/cd-dvd/installation-cd-graphical-calamares.nixnew file+20

This diff is too big to show here.

nixos/modules/installer/cd-dvd/installation-cd-graphical-gnome.nix+3−5

This diff is too big to show here.

nixos/modules/installer/cd-dvd/installation-cd-graphical-plasma5.nix+1−3

This diff is too big to show here.

nixos/modules/installer/cd-dvd/iso-image.nix+104−72

This diff is too big to show here.

nixos/modules/installer/cd-dvd/system-tarball-fuloong2f.nix+1−1

This diff is too big to show here.

nixos/modules/installer/cd-dvd/system-tarball-pc.nix+1−1

This diff is too big to show here.

nixos/modules/installer/cd-dvd/system-tarball-sheevaplug.nix+4−4

This diff is too big to show here.

nixos/modules/installer/cd-dvd/system-tarball.nix+2−2

This diff is too big to show here.

nixos/modules/installer/kexec/kexec-boot.nixnew file+51

This diff is too big to show here.

nixos/modules/installer/netboot/netboot.nix+14−6

This diff is too big to show here.

nixos/modules/installer/sd-card/sd-image-aarch64.nix+15

This diff is too big to show here.

nixos/modules/installer/sd-card/sd-image-raspberrypi.nix+1−1

This diff is too big to show here.

nixos/modules/installer/sd-card/sd-image-riscv64-qemu-installer.nixnew file+10

This diff is too big to show here.

nixos/modules/installer/sd-card/sd-image-riscv64-qemu.nixnew file+32

This diff is too big to show here.

nixos/modules/installer/sd-card/sd-image-x86_64.nixnew file+27

This diff is too big to show here.

nixos/modules/installer/sd-card/sd-image.nix+22−6

This diff is too big to show here.

nixos/modules/installer/tools/nix-fallback-paths.nix+5−4

This diff is too big to show here.

nixos/modules/installer/tools/nixos-build-vms/build-vms.nix+18−5

This diff is too big to show here.

nixos/modules/installer/tools/nixos-build-vms/nixos-build-vms.sh+4−3

This diff is too big to show here.

nixos/modules/installer/tools/nixos-enter.sh+33−1

This diff is too big to show here.

nixos/modules/installer/tools/nixos-generate-config.pl+24−6

This diff is too big to show here.

nixos/modules/installer/tools/nixos-install.sh+19−18

This diff is too big to show here.

nixos/modules/installer/tools/nixos-option/default.nix+1−11

This diff is too big to show here.

nixos/modules/installer/tools/nixos-version.sh+1

This diff is too big to show here.

nixos/modules/installer/tools/tools.nix+30−6

This diff is too big to show here.

nixos/modules/installer/virtualbox-demo.nix+1−1

This diff is too big to show here.

nixos/modules/misc/crashdump.nix+1−1

This diff is too big to show here.

nixos/modules/misc/documentation.nix+129−53

This diff is too big to show here.

nixos/modules/misc/extra-arguments.nix+2−2

This diff is too big to show here.

nixos/modules/misc/ids.nix+69−56

This diff is too big to show here.

nixos/modules/misc/locate.nix+134−69

This diff is too big to show here.

nixos/modules/misc/man-db.nixnew file+73

This diff is too big to show here.

nixos/modules/misc/mandoc.nixnew file+61

This diff is too big to show here.

nixos/modules/misc/meta.nix+16−1

This diff is too big to show here.

nixos/modules/misc/nixpkgs.nix+18−10

This diff is too big to show here.

nixos/modules/misc/nixpkgs/test.nixnew file+8

This diff is too big to show here.

nixos/modules/misc/version.nix+52−18

This diff is too big to show here.

nixos/modules/misc/wordlist.nixnew file+59

This diff is too big to show here.

nixos/modules/module-list.nix+167−34

This diff is too big to show here.

nixos/modules/profiles/all-hardware.nix+5−2

This diff is too big to show here.

nixos/modules/profiles/base.nix+1

This diff is too big to show here.

nixos/modules/profiles/hardened.nix+1−1

This diff is too big to show here.

nixos/modules/profiles/headless.nix+1−1

This diff is too big to show here.

nixos/modules/profiles/installation-device.nix+10

This diff is too big to show here.

nixos/modules/profiles/minimal.nix+2

This diff is too big to show here.

nixos/modules/profiles/qemu-guest.nix+2−2

This diff is too big to show here.

nixos/modules/programs/_1password-gui.nixnew file+68

This diff is too big to show here.

nixos/modules/programs/_1password.nixnew file+44

This diff is too big to show here.

nixos/modules/programs/adb.nix+1−2

This diff is too big to show here.

nixos/modules/programs/appgate-sdp.nix+5−3

This diff is too big to show here.

nixos/modules/programs/atop.nix+11−4

This diff is too big to show here.

nixos/modules/programs/bandwhich.nix+3−1

This diff is too big to show here.

nixos/modules/programs/bash/bash-completion.nix+1−1

This diff is too big to show here.

nixos/modules/programs/bash/bash.nix+4−4

This diff is too big to show here.

nixos/modules/programs/bcc.nix+3−3

This diff is too big to show here.

nixos/modules/programs/calls.nixnew file+27

This diff is too big to show here.

nixos/modules/programs/captive-browser.nix+45−19

This diff is too big to show here.

nixos/modules/programs/ccache.nix+2

This diff is too big to show here.

nixos/modules/programs/chromium.nix+13−2

This diff is too big to show here.

nixos/modules/programs/cnping.nixnew file+21

This diff is too big to show here.

nixos/modules/programs/command-not-found/command-not-found.nix+6−6

This diff is too big to show here.

nixos/modules/programs/command-not-found/command-not-found.pl+37−12

This diff is too big to show here.

nixos/modules/programs/dconf.nix+1−1

This diff is too big to show here.

nixos/modules/programs/digitalbitbox/default.nix+1−1

This diff is too big to show here.

nixos/modules/programs/dmrconfig.nix+1−1

This diff is too big to show here.

nixos/modules/programs/environment.nix+9−2

This diff is too big to show here.

nixos/modules/programs/evince.nix+13−4

This diff is too big to show here.

nixos/modules/programs/extra-container.nixnew file+17

This diff is too big to show here.

nixos/modules/programs/feedbackd.nix+1

This diff is too big to show here.

nixos/modules/programs/file-roller.nix+13−4

This diff is too big to show here.

nixos/modules/programs/firejail.nix+15−8

This diff is too big to show here.

nixos/modules/programs/flashrom.nixnew file+26

This diff is too big to show here.

nixos/modules/programs/flexoptix-app.nix+1−1

This diff is too big to show here.

nixos/modules/programs/freetds.nix+1−1

This diff is too big to show here.

nixos/modules/programs/gamemode.nix+3−1

This diff is too big to show here.

nixos/modules/programs/git.nixnew file+69

This diff is too big to show here.

nixos/modules/programs/gnupg.nix+4−1

This diff is too big to show here.

nixos/modules/programs/hamster.nix+1−1

This diff is too big to show here.

nixos/modules/programs/htop.nixnew file+58

This diff is too big to show here.

nixos/modules/programs/iftop.nix+3−1

This diff is too big to show here.

nixos/modules/programs/iotop.nix+3−1

This diff is too big to show here.

nixos/modules/programs/java.nix+1−1

This diff is too big to show here.

nixos/modules/programs/k3b.nixnew file+52

This diff is too big to show here.

nixos/modules/programs/k40-whisperer.nixnew file+40

This diff is too big to show here.

nixos/modules/programs/kbdlight.nix+6−1

This diff is too big to show here.

nixos/modules/programs/kclock.nixnew file+13

This diff is too big to show here.

nixos/modules/programs/kdeconnect.nixnew file+35

This diff is too big to show here.

nixos/modules/programs/less.nix+9−6

This diff is too big to show here.

nixos/modules/programs/liboping.nix+3−1

This diff is too big to show here.

nixos/modules/programs/mininet.nix+2−2

This diff is too big to show here.

nixos/modules/programs/mosh.nix+1−1

This diff is too big to show here.

nixos/modules/programs/msmtp.nix+2

This diff is too big to show here.

nixos/modules/programs/mtr.nix+4−1

This diff is too big to show here.

nixos/modules/programs/nbd.nixnew file+19

This diff is too big to show here.

nixos/modules/programs/neovim.nix+29−28

This diff is too big to show here.

nixos/modules/programs/nethoscope.nixnew file+30

This diff is too big to show here.

nixos/modules/programs/nix-ld.nixnew file+12

This diff is too big to show here.

nixos/modules/programs/nncp.nixnew file+101

This diff is too big to show here.

nixos/modules/programs/noisetorch.nix+4−1

This diff is too big to show here.

nixos/modules/programs/npm.nix+3−2

This diff is too big to show here.

nixos/modules/programs/pantheon-tweaks.nixnew file+19

This diff is too big to show here.

nixos/modules/programs/phosh.nix+13−10

This diff is too big to show here.

nixos/modules/programs/plotinus.nix+1−1

This diff is too big to show here.

nixos/modules/programs/proxychains.nix+1−1

This diff is too big to show here.

nixos/modules/programs/qt5ct.nix+1−1

This diff is too big to show here.

nixos/modules/programs/shadow.nix+15−8

This diff is too big to show here.

nixos/modules/programs/singularity.nix+6−1

This diff is too big to show here.

nixos/modules/programs/slock.nix+6−1

This diff is too big to show here.

nixos/modules/programs/spacefm.nix+6−6

This diff is too big to show here.

nixos/modules/programs/ssh.nix+72−18

This diff is too big to show here.

nixos/modules/programs/ssmtp.nixdeleted−187

This diff is too big to show here.

nixos/modules/programs/starship.nixnew file+51

This diff is too big to show here.

nixos/modules/programs/sway.nix+7−5

This diff is too big to show here.

nixos/modules/programs/thefuck.nix+7−6

This diff is too big to show here.

nixos/modules/programs/tilp2.nixdeleted−28

This diff is too big to show here.

nixos/modules/programs/tmux.nix+14−1

This diff is too big to show here.

nixos/modules/programs/traceroute.nix+3−1

This diff is too big to show here.

nixos/modules/programs/tsm-client.nix+8−8

This diff is too big to show here.

nixos/modules/programs/udevil.nix+6−1

This diff is too big to show here.

nixos/modules/programs/vim.nix+2−2

This diff is too big to show here.

nixos/modules/programs/wavemon.nix+3−1

This diff is too big to show here.

nixos/modules/programs/weylus.nixnew file+47

This diff is too big to show here.

nixos/modules/programs/wireshark.nix+1−1

This diff is too big to show here.

nixos/modules/programs/wshowkeys.nix+6−1

This diff is too big to show here.

nixos/modules/programs/xonsh.nix+2−1

This diff is too big to show here.

nixos/modules/programs/xss-lock.nix+2−1

This diff is too big to show here.

nixos/modules/programs/xwayland.nix+13−8

This diff is too big to show here.

nixos/modules/programs/yabar.nix+2−1

This diff is too big to show here.

nixos/modules/programs/zsh/oh-my-zsh.nix+1−1

This diff is too big to show here.

nixos/modules/programs/zsh/zsh-autoenv.nix+1−1

This diff is too big to show here.

nixos/modules/programs/zsh/zsh-autosuggestions.nix+20−11

This diff is too big to show here.

nixos/modules/programs/zsh/zsh-syntax-highlighting.nix+2−2

This diff is too big to show here.

nixos/modules/programs/zsh/zsh.nix+14−6

This diff is too big to show here.

nixos/modules/rename.nix+63−44

This diff is too big to show here.

nixos/modules/security/acme.nixdeleted−770

This diff is too big to show here.

nixos/modules/security/acme.xmldeleted−298

This diff is too big to show here.

nixos/modules/security/acme/default.nixnew file+921

This diff is too big to show here.

nixos/modules/security/acme/doc.xmlnew file+413

This diff is too big to show here.

nixos/modules/security/acme/mk-cert-ownership-assertion.nixnew file+4

This diff is too big to show here.

nixos/modules/security/apparmor/includes.nix+1−1

This diff is too big to show here.

nixos/modules/security/ca.nix+11−12

This diff is too big to show here.

nixos/modules/security/chromium-suid-sandbox.nix+6−1

This diff is too big to show here.

nixos/modules/security/dhparams.nix+5−3

This diff is too big to show here.

nixos/modules/security/doas.nix+8−5

This diff is too big to show here.

nixos/modules/security/duosec.nix+6−1

This diff is too big to show here.

nixos/modules/security/google_oslogin.nix+6−3

This diff is too big to show here.

nixos/modules/security/lock-kernel-modules.nix+19−9

This diff is too big to show here.

nixos/modules/security/misc.nix+2−2

This diff is too big to show here.

nixos/modules/security/pam.nix+435−151

This diff is too big to show here.

nixos/modules/security/pam_mount.nix+102−7

This diff is too big to show here.

nixos/modules/security/pam_usb.nix+12−2

This diff is too big to show here.

nixos/modules/security/polkit.nix+15−7

This diff is too big to show here.

nixos/modules/security/rtkit.nix+4−1

This diff is too big to show here.

nixos/modules/security/sudo.nix+3−3

This diff is too big to show here.

nixos/modules/security/systemd-confinement.nix+7−9

This diff is too big to show here.

nixos/modules/security/tpm2.nix+5−5

This diff is too big to show here.

nixos/modules/security/wrappers/default.nix+189−98

This diff is too big to show here.

nixos/modules/services/admin/meshcentral.nixnew file+53

This diff is too big to show here.

nixos/modules/services/admin/oxidized.nix+2−2

This diff is too big to show here.

nixos/modules/services/admin/pgadmin.nixnew file+127

This diff is too big to show here.

nixos/modules/services/amqp/activemq/default.nix+2−1

This diff is too big to show here.

nixos/modules/services/amqp/rabbitmq.nix+26−9

This diff is too big to show here.

nixos/modules/services/audio/alsa.nix+8−8

This diff is too big to show here.

nixos/modules/services/audio/botamusique.nix+1

This diff is too big to show here.

nixos/modules/services/audio/hqplayerd.nixnew file+142

This diff is too big to show here.

nixos/modules/services/audio/icecast.nix+1

This diff is too big to show here.

nixos/modules/services/audio/jack.nix+7−7

This diff is too big to show here.

nixos/modules/services/audio/jmusicbot.nix+8−1

This diff is too big to show here.

nixos/modules/services/audio/liquidsoap.nix+3−3

This diff is too big to show here.

nixos/modules/services/audio/mopidy.nix+1−1

This diff is too big to show here.

nixos/modules/services/audio/mpd.nix+24−44

This diff is too big to show here.

nixos/modules/services/audio/mpdscribble.nix+12−1

This diff is too big to show here.

nixos/modules/services/audio/navidrome.nixnew file+71

This diff is too big to show here.

nixos/modules/services/audio/networkaudiod.nixnew file+19

This diff is too big to show here.

nixos/modules/services/audio/roon-bridge.nixnew file+76

This diff is too big to show here.

nixos/modules/services/audio/roon-server.nix+9−4

This diff is too big to show here.

nixos/modules/services/audio/slimserver.nix+2−1

This diff is too big to show here.

nixos/modules/services/audio/snapserver.nix+31−23

This diff is too big to show here.

nixos/modules/services/audio/spotifyd.nix+26−1

This diff is too big to show here.

nixos/modules/services/audio/squeezelite.nix+17−21

This diff is too big to show here.

nixos/modules/services/audio/ympd.nix+1−1

This diff is too big to show here.

nixos/modules/services/backup/automysqlbackup.nix+3−2

This diff is too big to show here.

nixos/modules/services/backup/bacula.nix+3

This diff is too big to show here.

nixos/modules/services/backup/borgbackup.nix+77−23

This diff is too big to show here.

nixos/modules/services/backup/btrbk.nixnew file+220

This diff is too big to show here.

nixos/modules/services/backup/duplicati.nix+26−9

This diff is too big to show here.

nixos/modules/services/backup/duplicity.nix+1−1

This diff is too big to show here.

nixos/modules/services/backup/mysql-backup.nix+2−1

This diff is too big to show here.

nixos/modules/services/backup/postgresql-backup.nix+44−9

This diff is too big to show here.

nixos/modules/services/backup/postgresql-wal-receiver.nix+5−5

This diff is too big to show here.

nixos/modules/services/backup/restic-rest-server.nix+5−1

This diff is too big to show here.

nixos/modules/services/backup/restic.nix+17−5

This diff is too big to show here.

nixos/modules/services/backup/sanoid.nix+143−152

This diff is too big to show here.

nixos/modules/services/backup/syncoid.nix+390−185

This diff is too big to show here.

nixos/modules/services/backup/tarsnap.nix+25−18

This diff is too big to show here.

nixos/modules/services/backup/tsm.nix+33−14

This diff is too big to show here.

nixos/modules/services/backup/znapzend.nix+8−8

This diff is too big to show here.

nixos/modules/services/backup/zrepl.nix+3

This diff is too big to show here.

nixos/modules/services/blockchain/ethereum/geth.nix+3−2

This diff is too big to show here.

nixos/modules/services/cluster/corosync/default.nixnew file+112

This diff is too big to show here.

nixos/modules/services/cluster/hadoop/conf.nix+25−12

This diff is too big to show here.

nixos/modules/services/cluster/hadoop/default.nix+175−23

This diff is too big to show here.

nixos/modules/services/cluster/hadoop/hdfs.nix+175−44

This diff is too big to show here.

nixos/modules/services/cluster/hadoop/yarn.nix+155−29

This diff is too big to show here.

nixos/modules/services/cluster/k3s/default.nix+27−13

This diff is too big to show here.

nixos/modules/services/cluster/kubernetes/addon-manager.nix+7−3

This diff is too big to show here.

nixos/modules/services/cluster/kubernetes/addons/dashboard.nixdeleted−332

This diff is too big to show here.

nixos/modules/services/cluster/kubernetes/addons/dns.nix+50−15

This diff is too big to show here.

nixos/modules/services/cluster/kubernetes/apiserver.nix+11−8

This diff is too big to show here.

nixos/modules/services/cluster/kubernetes/controller-manager.nix+10−1

This diff is too big to show here.

nixos/modules/services/cluster/kubernetes/default.nix+31−21

This diff is too big to show here.

nixos/modules/services/cluster/kubernetes/flannel.nix+4−2

This diff is too big to show here.

nixos/modules/services/cluster/kubernetes/kubelet.nix+14−3

This diff is too big to show here.

nixos/modules/services/cluster/kubernetes/pki.nix+5−1

This diff is too big to show here.

nixos/modules/services/cluster/kubernetes/proxy.nix+10−2

This diff is too big to show here.

nixos/modules/services/cluster/kubernetes/scheduler.nix+10−3

This diff is too big to show here.

nixos/modules/services/cluster/pacemaker/default.nixnew file+52

This diff is too big to show here.

nixos/modules/services/cluster/spark/default.nixnew file+162

This diff is too big to show here.

nixos/modules/services/computing/boinc/client.nix+2−2

This diff is too big to show here.

nixos/modules/services/computing/foldingathome/client.nix+1−1

This diff is too big to show here.

nixos/modules/services/computing/slurm/slurm.nix+18−9

This diff is too big to show here.

nixos/modules/services/continuous-integration/buildbot/master.nix+11−8

This diff is too big to show here.

nixos/modules/services/continuous-integration/buildbot/worker.nix+6−4

This diff is too big to show here.

nixos/modules/services/continuous-integration/buildkite-agents.nix+4−3

This diff is too big to show here.

nixos/modules/services/continuous-integration/github-runner.nix+58−37

This diff is too big to show here.

nixos/modules/services/continuous-integration/gitlab-runner.nix+22−9

This diff is too big to show here.

nixos/modules/services/continuous-integration/gocd-agent/default.nix+12−2

This diff is too big to show here.

nixos/modules/services/continuous-integration/gocd-server/default.nix+17−2

This diff is too big to show here.

nixos/modules/services/continuous-integration/hail.nix+1−1

This diff is too big to show here.

nixos/modules/services/continuous-integration/hercules-ci-agent/common.nix+75−19

This diff is too big to show here.

nixos/modules/services/continuous-integration/hercules-ci-agent/default.nix+4−4

This diff is too big to show here.

nixos/modules/services/continuous-integration/hydra/default.nix+18−14

This diff is too big to show here.

nixos/modules/services/continuous-integration/jenkins/default.nix+30−9

This diff is too big to show here.

nixos/modules/services/continuous-integration/jenkins/job-builder.nix+2−2

This diff is too big to show here.

nixos/modules/services/continuous-integration/jenkins/slave.nix+15−1

This diff is too big to show here.

nixos/modules/services/databases/aerospike.nix+1−1

This diff is too big to show here.

nixos/modules/services/databases/cassandra.nix+6−4

This diff is too big to show here.

nixos/modules/services/databases/clickhouse.nix+13−4

This diff is too big to show here.

nixos/modules/services/databases/cockroachdb.nix+38−30

This diff is too big to show here.

nixos/modules/services/databases/couchdb.nix+22−5

This diff is too big to show here.

nixos/modules/services/databases/firebird.nix+3−5

This diff is too big to show here.

nixos/modules/services/databases/hbase.nix+39−17

This diff is too big to show here.

nixos/modules/services/databases/influxdb.nix+4−4

This diff is too big to show here.

nixos/modules/services/databases/influxdb2.nixnew file+66

This diff is too big to show here.

nixos/modules/services/databases/memcached.nix+2

This diff is too big to show here.

nixos/modules/services/databases/monetdb.nix+1−1

This diff is too big to show here.

nixos/modules/services/databases/mongodb.nix+4−2

This diff is too big to show here.

nixos/modules/services/databases/mysql.nix+191−201

This diff is too big to show here.

nixos/modules/services/databases/neo4j.nix+12−2

This diff is too big to show here.

nixos/modules/services/databases/openldap.nix+7−6

This diff is too big to show here.

nixos/modules/services/databases/opentsdb.nix+1−2

This diff is too big to show here.

nixos/modules/services/databases/pgmanage.nix+1−1

This diff is too big to show here.

nixos/modules/services/databases/postgresql.nix+13−10

This diff is too big to show here.

nixos/modules/services/databases/postgresql.xml+54−32

This diff is too big to show here.

nixos/modules/services/databases/redis.nix+275−222

This diff is too big to show here.

nixos/modules/services/databases/riak.nix+1−2

This diff is too big to show here.

nixos/modules/services/databases/victoriametrics.nix+9−1

This diff is too big to show here.

nixos/modules/services/databases/virtuoso.nixdeleted−99

This diff is too big to show here.

nixos/modules/services/desktops/bamf.nix+2−2

This diff is too big to show here.

nixos/modules/services/desktops/cpupower-gui.nixnew file+56

This diff is too big to show here.

nixos/modules/services/desktops/espanso.nix−1

This diff is too big to show here.

nixos/modules/services/desktops/flatpak.nix+2

This diff is too big to show here.

nixos/modules/services/desktops/geoclue2.nix+4−4

This diff is too big to show here.

nixos/modules/services/desktops/gnome/evolution-data-server.nix+1−1

This diff is too big to show here.

nixos/modules/services/desktops/gnome/glib-networking.nix+1−1

This diff is too big to show here.

nixos/modules/services/desktops/gnome/gnome-keyring.nix+3−1

This diff is too big to show here.

nixos/modules/services/desktops/gnome/gnome-settings-daemon.nix+4−18

This diff is too big to show here.

nixos/modules/services/desktops/gnome/tracker-miners.nix+2

This diff is too big to show here.

nixos/modules/services/desktops/gnome/tracker.nix+24−1

This diff is too big to show here.

nixos/modules/services/desktops/gsignond.nix+1−1

This diff is too big to show here.

nixos/modules/services/desktops/gvfs.nix+3−2

This diff is too big to show here.

nixos/modules/services/desktops/pantheon/files.nixdeleted−13

This diff is too big to show here.

nixos/modules/services/desktops/pipewire/client-rt.conf.json → nixos/modules/services/desktops/pipewire/daemon/client-rt.conf.jsonrenamed+1−1

This diff is too big to show here.

nixos/modules/services/desktops/pipewire/client.conf.json → nixos/modules/services/desktops/pipewire/daemon/client.conf.jsonrenamed

The content is the same.

nixos/modules/services/desktops/pipewire/daemon/jack.conf.jsonnew file+38

This diff is too big to show here.

nixos/modules/services/desktops/pipewire/daemon/minimal.conf.jsonnew file+118

This diff is too big to show here.

nixos/modules/services/desktops/pipewire/daemon/pipewire-pulse.conf.jsonnew file+100

This diff is too big to show here.

nixos/modules/services/desktops/pipewire/pipewire.conf.json → nixos/modules/services/desktops/pipewire/daemon/pipewire.conf.jsonrenamed+17−3

This diff is too big to show here.

nixos/modules/services/desktops/pipewire/jack.conf.jsondeleted−28

This diff is too big to show here.

nixos/modules/services/desktops/pipewire/alsa-monitor.conf.json → nixos/modules/services/desktops/pipewire/media-session/alsa-monitor.conf.jsonrenamed

The content is the same.

nixos/modules/services/desktops/pipewire/bluez-monitor.conf.json → nixos/modules/services/desktops/pipewire/media-session/bluez-monitor.conf.jsonrenamed

The content is the same.

nixos/modules/services/desktops/pipewire/media-session.conf.json → nixos/modules/services/desktops/pipewire/media-session/media-session.conf.jsonrenamed+1

This diff is too big to show here.

nixos/modules/services/desktops/pipewire/v4l2-monitor.conf.json → nixos/modules/services/desktops/pipewire/media-session/v4l2-monitor.conf.jsonrenamed

The content is the same.

nixos/modules/services/desktops/pipewire/pipewire-media-session.nix+29−17

This diff is too big to show here.

nixos/modules/services/desktops/pipewire/pipewire-pulse.conf.jsondeleted−41

This diff is too big to show here.

nixos/modules/services/desktops/pipewire/pipewire.nix+73−13

This diff is too big to show here.

nixos/modules/services/desktops/pipewire/wireplumber.nixnew file+54

This diff is too big to show here.

nixos/modules/services/desktops/tumbler.nix+2−2

This diff is too big to show here.

nixos/modules/services/desktops/zeitgeist.nix+2−2

This diff is too big to show here.

nixos/modules/services/development/blackfire.nix+4−9

This diff is too big to show here.

nixos/modules/services/development/blackfire.xml+2−1

This diff is too big to show here.

nixos/modules/services/development/distccd.nixnew file+155

This diff is too big to show here.

nixos/modules/services/development/hoogle.nix+5−4

This diff is too big to show here.

nixos/modules/services/development/jupyter/default.nix+4−5

This diff is too big to show here.

nixos/modules/services/development/jupyter/kernel-options.nix+4−4

This diff is too big to show here.

nixos/modules/services/development/jupyterhub/default.nix+20−8

This diff is too big to show here.

nixos/modules/services/development/lorri.nix+1−2

This diff is too big to show here.

nixos/modules/services/development/rstudio-server/default.nixnew file+107

This diff is too big to show here.

nixos/modules/services/development/zammad.nixnew file+323

This diff is too big to show here.

nixos/modules/services/display-managers/greetd.nix+9−4

This diff is too big to show here.

nixos/modules/services/editors/emacs.nix+1−1

This diff is too big to show here.

nixos/modules/services/editors/haste.nixnew file+86

This diff is too big to show here.

nixos/modules/services/editors/infinoted.nix+2−2

This diff is too big to show here.

nixos/modules/services/finance/odoo.nixnew file+122

This diff is too big to show here.

nixos/modules/services/games/asf.nixnew file+236

This diff is too big to show here.

nixos/modules/services/games/crossfire-server.nixnew file+179

This diff is too big to show here.

nixos/modules/services/games/deliantra-server.nixnew file+172

This diff is too big to show here.

nixos/modules/services/games/factorio.nix+14−5

This diff is too big to show here.

nixos/modules/services/games/minecraft-server.nix+29−6

This diff is too big to show here.

nixos/modules/services/games/quake3-server.nix+1

This diff is too big to show here.

nixos/modules/services/games/terraria.nix+5−4

This diff is too big to show here.

nixos/modules/services/hardware/acpid.nix+1−1

This diff is too big to show here.

nixos/modules/services/hardware/actkbd.nix+2−2

This diff is too big to show here.

nixos/modules/services/hardware/auto-cpufreq.nix+8−2

This diff is too big to show here.

nixos/modules/services/hardware/bluetooth.nix+3−7

This diff is too big to show here.

nixos/modules/services/hardware/ddccontrol.nixnew file+39

This diff is too big to show here.

nixos/modules/services/hardware/fancontrol.nix+1

This diff is too big to show here.

nixos/modules/services/hardware/freefall.nix+1−1

This diff is too big to show here.

nixos/modules/services/hardware/fwupd.nix+2−1

This diff is too big to show here.

nixos/modules/services/hardware/interception-tools.nix+1

This diff is too big to show here.

nixos/modules/services/hardware/joycond.nixnew file+36

This diff is too big to show here.

nixos/modules/services/hardware/lirc.nix+1−1

This diff is too big to show here.

nixos/modules/services/hardware/pcscd.nix+2−2

This diff is too big to show here.

nixos/modules/services/hardware/power-profiles-daemon.nix+2

This diff is too big to show here.

nixos/modules/services/hardware/rasdaemon.nixnew file+170

This diff is too big to show here.

nixos/modules/services/hardware/sane.nix+28−2

This diff is too big to show here.

nixos/modules/services/hardware/sane_extra_backends/brscan4.nix+4−4

This diff is too big to show here.

nixos/modules/services/hardware/sane_extra_backends/brscan4_etc_files.nix+1−2

This diff is too big to show here.

nixos/modules/services/hardware/sane_extra_backends/brscan5.nix+4−4

This diff is too big to show here.

nixos/modules/services/hardware/spacenavd.nix−1

This diff is too big to show here.

nixos/modules/services/hardware/tcsd.nix+7−5

This diff is too big to show here.

nixos/modules/services/hardware/thermald.nix+4−2

This diff is too big to show here.

nixos/modules/services/hardware/thinkfan.nix+2−2

This diff is too big to show here.

nixos/modules/services/hardware/triggerhappy.nix+2−2

This diff is too big to show here.

nixos/modules/services/hardware/udev.nix+127−24

This diff is too big to show here.

nixos/modules/services/hardware/udisks2.nix+41

This diff is too big to show here.

nixos/modules/services/hardware/undervolt.nix+2−4

This diff is too big to show here.

nixos/modules/services/hardware/upower.nix+7−8

This diff is too big to show here.

nixos/modules/services/hardware/usbrelayd.nixnew file+44

This diff is too big to show here.

nixos/modules/services/hardware/vdr.nix+2−2

This diff is too big to show here.

nixos/modules/services/home-automation/home-assistant.nixnew file+552

This diff is too big to show here.

nixos/modules/services/misc/zigbee2mqtt.nix → nixos/modules/services/home-automation/zigbee2mqtt.nixrenamed+6−9

This diff is too big to show here.

nixos/modules/services/logging/SystemdJournal2Gelf.nix+1

This diff is too big to show here.

nixos/modules/services/logging/awstats.nix+4−4

This diff is too big to show here.

nixos/modules/services/logging/filebeat.nixnew file+253

This diff is too big to show here.

nixos/modules/services/logging/fluentd.nix+1−1

This diff is too big to show here.

nixos/modules/services/logging/graylog.nix+5−4

This diff is too big to show here.

nixos/modules/services/logging/journalbeat.nix+4−17

This diff is too big to show here.

nixos/modules/services/logging/journalwatch.nix+1

This diff is too big to show here.

nixos/modules/services/logging/klogd.nix+6−34

This diff is too big to show here.

nixos/modules/services/logging/logcheck.nix+6−2

This diff is too big to show here.

nixos/modules/services/logging/logrotate.nix+267−33

This diff is too big to show here.

nixos/modules/services/logging/logstash.nix+23−9

This diff is too big to show here.

nixos/modules/services/logging/promtail.nix+5−1

This diff is too big to show here.

nixos/modules/services/logging/syslog-ng.nix+2−2

This diff is too big to show here.

nixos/modules/services/mail/davmail.nix+1−1

This diff is too big to show here.

nixos/modules/services/mail/dovecot.nix+19−48

This diff is too big to show here.

nixos/modules/services/mail/exim.nix+8−3

This diff is too big to show here.

nixos/modules/services/mail/maddy.nixnew file+273

This diff is too big to show here.

nixos/modules/services/mail/mail.nix+2−1

This diff is too big to show here.

nixos/modules/services/mail/mailman.nix+16−9

This diff is too big to show here.

nixos/modules/services/mail/nullmailer.nix+1−1

This diff is too big to show here.

nixos/modules/services/mail/offlineimap.nix+2−2

This diff is too big to show here.

nixos/modules/services/mail/opendkim.nix+1

This diff is too big to show here.

nixos/modules/services/mail/opensmtpd.nix+5−2

This diff is too big to show here.

nixos/modules/services/mail/postfix.nix+32−22

This diff is too big to show here.

nixos/modules/services/mail/postfixadmin.nixnew file+199

This diff is too big to show here.

nixos/modules/services/mail/roundcube.nix+5−4

This diff is too big to show here.

nixos/modules/services/mail/rspamd.nix+9−11

This diff is too big to show here.

nixos/modules/services/mail/sympa.nix+4−4

This diff is too big to show here.

nixos/modules/services/misc/matrix-synapse-log_config.yaml → nixos/modules/services/matrix/matrix-synapse-log_config.yamlrenamed

The content is the same.

nixos/modules/services/matrix/matrix-synapse.nixnew file+773

This diff is too big to show here.

nixos/modules/services/misc/matrix-synapse.xml → nixos/modules/services/matrix/matrix-synapse.xmlrenamed+18−17

This diff is too big to show here.

nixos/modules/services/matrix/mjolnir.nixnew file+242

This diff is too big to show here.

nixos/modules/services/matrix/mjolnir.xmlnew file+134

This diff is too big to show here.

nixos/modules/services/matrix/pantalaimon-options.nixnew file+70

This diff is too big to show here.

nixos/modules/services/matrix/pantalaimon.nixnew file+70

This diff is too big to show here.

nixos/modules/services/misc/airsonic.nix+32−8

This diff is too big to show here.

nixos/modules/services/misc/ananicy.nixnew file+107

This diff is too big to show here.

nixos/modules/services/misc/ankisyncd.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/apache-kafka.nix+5−3

This diff is too big to show here.

nixos/modules/services/misc/autofs.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/autorandr.nix+309−2

This diff is too big to show here.

nixos/modules/services/misc/bees.nix+44−35

This diff is too big to show here.

nixos/modules/services/misc/cfdyndns.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/cgminer.nix+7−3

This diff is too big to show here.

nixos/modules/services/misc/clipcat.nixnew file+31

This diff is too big to show here.

nixos/modules/services/misc/clipmenu.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/confd.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/couchpotato.nixdeleted−42

This diff is too big to show here.

nixos/modules/services/misc/dendrite.nix+100−8

This diff is too big to show here.

nixos/modules/services/misc/dictd.nix+2−2

This diff is too big to show here.

nixos/modules/services/misc/disnix.nix+1−2

This diff is too big to show here.

nixos/modules/services/misc/docker-registry.nix+3−1

This diff is too big to show here.

nixos/modules/services/misc/dwm-status.nix+2−2

This diff is too big to show here.

nixos/modules/services/misc/dysnomia.nix+6

This diff is too big to show here.

nixos/modules/services/misc/etcd.nix+14−4

This diff is too big to show here.

nixos/modules/services/misc/etebase-server.nix+4−4

This diff is too big to show here.

nixos/modules/services/misc/ethminer.nix+4−4

This diff is too big to show here.

nixos/modules/services/misc/exhibitor.nix+4−1

This diff is too big to show here.

nixos/modules/services/misc/felix.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/freeswitch.nix+4−5

This diff is too big to show here.

nixos/modules/services/misc/gammu-smsd.nix+2−2

This diff is too big to show here.

nixos/modules/services/misc/geoipupdate.nix+46−4

This diff is too big to show here.

nixos/modules/services/misc/gitea.nix+52−36

This diff is too big to show here.

nixos/modules/services/misc/gitit.nix+27−27

This diff is too big to show here.

nixos/modules/services/misc/gitlab.nix+101−36

This diff is too big to show here.

nixos/modules/services/misc/gitolite.nix+7−5

This diff is too big to show here.

nixos/modules/services/misc/gitweb.nix+1

This diff is too big to show here.

nixos/modules/services/misc/gogs.nix+4−1

This diff is too big to show here.

nixos/modules/services/misc/gollum.nix+1

This diff is too big to show here.

nixos/modules/services/misc/gpsd.nix+2−1

This diff is too big to show here.

nixos/modules/services/misc/greenclip.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/headphones.nix+3−1

This diff is too big to show here.

nixos/modules/services/misc/heisenbridge.nixnew file+222

This diff is too big to show here.

nixos/modules/services/misc/home-assistant.nixdeleted−350

This diff is too big to show here.

nixos/modules/services/misc/ihaskell.nix+4−3

This diff is too big to show here.

nixos/modules/services/misc/input-remapper.nixnew file+30

This diff is too big to show here.

nixos/modules/services/misc/jackett.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/jellyfin.nix+6−4

This diff is too big to show here.

nixos/modules/services/misc/klipper.nix+70−12

This diff is too big to show here.

nixos/modules/services/misc/leaps.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/libreddit.nixnew file+66

This diff is too big to show here.

nixos/modules/services/misc/lidarr.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/mame.nix+3−1

This diff is too big to show here.

nixos/modules/services/misc/matrix-appservice-discord.nix+7−2

This diff is too big to show here.

nixos/modules/services/misc/matrix-appservice-irc.nix+4−1

This diff is too big to show here.

nixos/modules/services/misc/matrix-conduit.nixnew file+149

This diff is too big to show here.

nixos/modules/services/misc/matrix-synapse.nixdeleted−766

This diff is too big to show here.

nixos/modules/services/misc/mautrix-facebook.nixnew file+195

This diff is too big to show here.

nixos/modules/services/misc/mautrix-telegram.nix+6−3

This diff is too big to show here.

nixos/modules/services/misc/mbpfan.nix+59−61

This diff is too big to show here.

nixos/modules/services/misc/mediatomb.nix+10−7

This diff is too big to show here.

nixos/modules/services/misc/moonraker.nixnew file+178

This diff is too big to show here.

nixos/modules/services/misc/mwlib.nixdeleted−258

This diff is too big to show here.

nixos/modules/services/misc/mx-puppet-discord.nixnew file+122

This diff is too big to show here.

nixos/modules/services/misc/n8n.nix+2−1

This diff is too big to show here.

nixos/modules/services/misc/nitter.nixnew file+358

This diff is too big to show here.

nixos/modules/services/misc/nix-daemon.nix+509−283

This diff is too big to show here.

nixos/modules/services/misc/nix-gc.nix+9−3

This diff is too big to show here.

nixos/modules/services/misc/nix-optimise.nix+8−2

This diff is too big to show here.

nixos/modules/services/misc/nix-ssh-serve.nix+10−2

This diff is too big to show here.

nixos/modules/services/misc/nzbget.nix+36−18

This diff is too big to show here.

nixos/modules/services/misc/nzbhydra2.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/octoprint.nix+6−3

This diff is too big to show here.

nixos/modules/services/misc/owncast.nixnew file+98

This diff is too big to show here.

nixos/modules/services/misc/packagekit.nix+4−2

This diff is too big to show here.

nixos/modules/services/misc/paperless.nix+204−67

This diff is too big to show here.

nixos/modules/services/misc/plex.nix+43−14

This diff is too big to show here.

nixos/modules/services/misc/prowlarr.nixnew file+41

This diff is too big to show here.

nixos/modules/services/misc/redmine.nix+10−9

This diff is too big to show here.

nixos/modules/services/misc/ripple-data-api.nix+3−1

This diff is too big to show here.

nixos/modules/services/misc/rippled.nix+11−5

This diff is too big to show here.

nixos/modules/services/misc/rmfakecloud.nixnew file+147

This diff is too big to show here.

nixos/modules/services/misc/safeeyes.nix+4

This diff is too big to show here.

nixos/modules/services/misc/sickbeard.nix+6−3

This diff is too big to show here.

nixos/modules/services/misc/signald.nixnew file+105

This diff is too big to show here.

nixos/modules/services/misc/snapper.nix+42−19

This diff is too big to show here.

nixos/modules/services/misc/sourcehut/builds.nix+22−6

This diff is too big to show here.

nixos/modules/services/misc/sourcehut/default.nix+1321−133

This diff is too big to show here.

nixos/modules/services/misc/sourcehut/dispatch.nix+3−1

This diff is too big to show here.

nixos/modules/services/misc/sourcehut/git.nix+6−3

This diff is too big to show here.

nixos/modules/services/misc/sourcehut/hg.nix+3−1

This diff is too big to show here.

nixos/modules/services/misc/sourcehut/hub.nix+3−1

This diff is too big to show here.

nixos/modules/services/misc/sourcehut/lists.nix+3−1

This diff is too big to show here.

nixos/modules/services/misc/sourcehut/man.nix+3−1

This diff is too big to show here.

nixos/modules/services/misc/sourcehut/meta.nix+3−1

This diff is too big to show here.

nixos/modules/services/misc/sourcehut/paste.nix+3−1

This diff is too big to show here.

nixos/modules/services/misc/sourcehut/service.nix+370−61

This diff is too big to show here.

nixos/modules/services/misc/sourcehut/sourcehut.xml+14−10

This diff is too big to show here.

nixos/modules/services/misc/sourcehut/todo.nix+3−1

This diff is too big to show here.

nixos/modules/services/misc/ssm-agent.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/subsonic.nix+10−6

This diff is too big to show here.

nixos/modules/services/misc/synergy.nix+21−1

This diff is too big to show here.

nixos/modules/services/misc/taskserver/default.nix+15−10

This diff is too big to show here.

nixos/modules/services/misc/taskserver/doc.xml+1−1

This diff is too big to show here.

nixos/modules/services/misc/taskserver/helper-tool.py+5−5

This diff is too big to show here.

nixos/modules/services/misc/tautulli.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/tp-auto-kbbl.nixnew file+58

This diff is too big to show here.

nixos/modules/services/misc/uhub.nix+85−153

This diff is too big to show here.

nixos/modules/services/misc/weechat.nix+9−5

This diff is too big to show here.

nixos/modules/services/misc/xmr-stak.nix+1−1

This diff is too big to show here.

nixos/modules/services/misc/xmrig.nixnew file+76

This diff is too big to show here.

nixos/modules/services/misc/zoneminder.nix+4−4

This diff is too big to show here.

nixos/modules/services/misc/zookeeper.nix+12−3

This diff is too big to show here.

nixos/modules/services/monitoring/alerta.nix−4

This diff is too big to show here.

nixos/modules/services/monitoring/arbtt.nix+1−2

This diff is too big to show here.

nixos/modules/services/monitoring/bosun.nix+1−2

This diff is too big to show here.

nixos/modules/services/monitoring/cadvisor.nix+2

This diff is too big to show here.

nixos/modules/services/monitoring/collectd.nix+56−28

This diff is too big to show here.

nixos/modules/services/monitoring/datadog-agent.nix+9−7

This diff is too big to show here.

nixos/modules/services/monitoring/grafana-reporter.nix+3−2

This diff is too big to show here.

nixos/modules/services/monitoring/grafana.nix+41−5

This diff is too big to show here.

nixos/modules/services/monitoring/graphite.nix+16−4

This diff is too big to show here.

nixos/modules/services/monitoring/heapster.nix+4−2

This diff is too big to show here.

nixos/modules/services/monitoring/incron.nix+7−2

This diff is too big to show here.

nixos/modules/services/monitoring/kapacitor.nix+1−4

This diff is too big to show here.

nixos/modules/services/monitoring/loki.nix+2−2

This diff is too big to show here.

nixos/modules/services/monitoring/mackerel-agent.nix−1

This diff is too big to show here.

nixos/modules/services/monitoring/metricbeat.nix+3−4

This diff is too big to show here.

nixos/modules/services/monitoring/mimir.nixnew file+63

This diff is too big to show here.

nixos/modules/services/monitoring/munin.nix+7−5

This diff is too big to show here.

nixos/modules/services/monitoring/nagios.nix+7−6

This diff is too big to show here.

nixos/modules/services/monitoring/netdata.nix+82−42

This diff is too big to show here.

nixos/modules/services/monitoring/parsedmarc.mdnew file+113

This diff is too big to show here.

nixos/modules/services/monitoring/parsedmarc.nixnew file+542

This diff is too big to show here.

nixos/modules/services/monitoring/parsedmarc.xmlnew file+125

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/alertmanager.nix+1−1

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/default.nix+1263−386

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters.nix+32−4

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters.xml+21

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/bird.nix+5−1

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/buildkite-agent.nixnew file+64

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/dmarc.nixnew file+117

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/dovecot.nix+4

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/fastly.nixnew file+41

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/flow.nix+1−1

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/influxdb.nixnew file+34

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/kea.nix+10−1

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/knot.nix+5−1

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/mail.nix+1−1

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/mikrotik.nix+2−2

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/modemmanager.nix+4

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/nginx.nix+5−5

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/node.nix+11−2

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/pihole.nix+2−2

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/postfix.nix+3

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/postgres.nix+4

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/process.nix+6−8

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/pve.nixnew file+118

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/rspamd.nix+2−2

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/rtl_433.nix+5

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/script.nix+1−1

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/smartctl.nixnew file+75

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/smokeping.nix+1

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/snmp.nix+7−9

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/sql.nix+4

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/systemd.nix+5−1

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/unbound.nix+4

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/varnish.nix+3−2

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/exporters/wireguard.nix+5

This diff is too big to show here.

nixos/modules/services/monitoring/prometheus/pushgateway.nix+1−1

This diff is too big to show here.

nixos/modules/services/monitoring/scollector.nix+2−3

This diff is too big to show here.

nixos/modules/services/monitoring/smartd.nix+6−1

This diff is too big to show here.

nixos/modules/services/monitoring/teamviewer.nix+6−3

This diff is too big to show here.

nixos/modules/services/monitoring/telegraf.nix+9−6

This diff is too big to show here.

nixos/modules/services/monitoring/thanos.nix+8−5

This diff is too big to show here.

nixos/modules/services/monitoring/tuptime.nix+1

This diff is too big to show here.

nixos/modules/services/monitoring/unifi-poller.nix+80−4

This diff is too big to show here.

nixos/modules/services/monitoring/uptime.nix+7−3

This diff is too big to show here.

nixos/modules/services/monitoring/zabbix-agent.nix+9−6

This diff is too big to show here.

nixos/modules/services/monitoring/zabbix-proxy.nix+18−7

This diff is too big to show here.

nixos/modules/services/monitoring/zabbix-server.nix+17−6

This diff is too big to show here.

nixos/modules/services/network-filesystems/ceph.nix+12−22

This diff is too big to show here.

nixos/modules/services/network-filesystems/drbd.nix+5−7

This diff is too big to show here.

nixos/modules/services/network-filesystems/glusterfs.nix+1−4

This diff is too big to show here.

nixos/modules/services/network-filesystems/ipfs.nix+100−62

This diff is too big to show here.

nixos/modules/services/network-filesystems/litestream/default.nixnew file+100

This diff is too big to show here.

nixos/modules/services/network-filesystems/litestream/litestream.xmlnew file+65

This diff is too big to show here.

nixos/modules/services/network-filesystems/moosefs.nixnew file+249

This diff is too big to show here.

nixos/modules/services/network-filesystems/openafs/client.nix+7−8

This diff is too big to show here.

nixos/modules/services/network-filesystems/openafs/server.nix+3−3

This diff is too big to show here.

nixos/modules/services/network-filesystems/orangefs/client.nix−1

This diff is too big to show here.

nixos/modules/services/network-filesystems/orangefs/server.nix+9−9

This diff is too big to show here.

nixos/modules/services/network-filesystems/rsyncd.nix+1−1

This diff is too big to show here.

nixos/modules/services/network-filesystems/samba.nix+17−6

This diff is too big to show here.

nixos/modules/services/network-filesystems/tahoe.nix+2−4

This diff is too big to show here.

nixos/modules/services/network-filesystems/webdav-server-rs.nixnew file+144

This diff is too big to show here.

nixos/modules/services/network-filesystems/webdav.nixnew file+107

This diff is too big to show here.

nixos/modules/services/network-filesystems/xtreemfs.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/3proxy.nix+3−16

This diff is too big to show here.

nixos/modules/services/networking/adguardhome.nix+67−5

This diff is too big to show here.

nixos/modules/services/networking/amuled.nix+6−2

This diff is too big to show here.

nixos/modules/services/networking/antennas.nixnew file+80

This diff is too big to show here.

nixos/modules/services/networking/asterisk.nix+13−45

This diff is too big to show here.

nixos/modules/services/networking/atftpd.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/autossh.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/avahi-daemon.nix+5−5

This diff is too big to show here.

nixos/modules/services/networking/babeld.nix+7−1

This diff is too big to show here.

nixos/modules/services/networking/bee.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/biboumi.nix+1

This diff is too big to show here.

nixos/modules/services/networking/bind.nix+38−8

This diff is too big to show here.

nixos/modules/services/networking/bird.nix+90−75

This diff is too big to show here.

nixos/modules/services/networking/bitcoind.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/bitlbee.nix+8−16

This diff is too big to show here.

nixos/modules/services/networking/blockbook-frontend.nix+6−9

This diff is too big to show here.

nixos/modules/services/networking/blocky.nixnew file+40

This diff is too big to show here.

nixos/modules/services/networking/charybdis.nix+8−1

This diff is too big to show here.

nixos/modules/services/networking/cjdns.nix+3−3

This diff is too big to show here.

nixos/modules/services/networking/cloudflare-dyndns.nixnew file+93

This diff is too big to show here.

nixos/modules/services/networking/connman.nix+6−4

This diff is too big to show here.

nixos/modules/services/networking/consul.nix+40−10

This diff is too big to show here.

nixos/modules/services/networking/coredns.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/corerad.nix+4−4

This diff is too big to show here.

nixos/modules/services/networking/coturn.nix+68−37

This diff is too big to show here.

nixos/modules/services/networking/create_ap.nixnew file+50

This diff is too big to show here.

nixos/modules/services/networking/croc.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/ddclient.nix+54−24

This diff is too big to show here.

nixos/modules/services/networking/dhcpcd.nix+22−1

This diff is too big to show here.

nixos/modules/services/networking/dhcpd.nix+49−50

This diff is too big to show here.

nixos/modules/services/networking/dnscache.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/dnscrypt-proxy2.nix+6−3

This diff is too big to show here.

nixos/modules/services/networking/dnscrypt-wrapper.nix+2

This diff is too big to show here.

nixos/modules/services/networking/dnsmasq.nix+3−1

This diff is too big to show here.

nixos/modules/services/networking/doh-proxy-rust.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/ejabberd.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/envoy.nixnew file+84

This diff is too big to show here.

nixos/modules/services/networking/epmd.nix+17−3

This diff is too big to show here.

nixos/modules/services/networking/ergo.nix+4−2

This diff is too big to show here.

nixos/modules/services/networking/ergochat.nixnew file+155

This diff is too big to show here.

nixos/modules/services/networking/eternal-terminal.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/ferm.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/firefox/sync-server.nixdeleted−183

This diff is too big to show here.

nixos/modules/services/networking/firewall.nix+8−9

This diff is too big to show here.

nixos/modules/services/networking/flannel.nix+5−2

This diff is too big to show here.

nixos/modules/services/networking/freeradius.nix+2

This diff is too big to show here.

nixos/modules/services/networking/frr.nixnew file+211

This diff is too big to show here.

nixos/modules/services/networking/gale.nixdeleted−181

This diff is too big to show here.

nixos/modules/services/networking/ghostunnel.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/git-daemon.nix+2−1

This diff is too big to show here.

nixos/modules/services/networking/globalprotect-vpn.nixnew file+43

This diff is too big to show here.

nixos/modules/services/networking/gnunet.nix+15−11

This diff is too big to show here.

nixos/modules/services/networking/go-neb.nix+30−4

This diff is too big to show here.

nixos/modules/services/networking/gobgpd.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/gogoclient.nixdeleted−87

This diff is too big to show here.

nixos/modules/services/networking/hans.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/headscale.nixnew file+490

This diff is too big to show here.

nixos/modules/services/networking/https-dns-proxy.nixnew file+128

This diff is too big to show here.

nixos/modules/services/networking/hylafax/options.nix+11−13

This diff is too big to show here.

nixos/modules/services/networking/i2pd.nix+19−12

This diff is too big to show here.

nixos/modules/services/networking/icecream/daemon.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/icecream/scheduler.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/inspircd.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/iodine.nix+2−1

This diff is too big to show here.

nixos/modules/services/networking/ircd-hybrid/default.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/iscsi/initiator.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/iscsi/root-initiator.nix+9

This diff is too big to show here.

nixos/modules/services/networking/iwd.nix+43−6

This diff is too big to show here.

nixos/modules/services/networking/jibri/default.nixnew file+417

This diff is too big to show here.

nixos/modules/services/networking/jibri/logging.properties-journalnew file+32

This diff is too big to show here.

nixos/modules/services/networking/jicofo.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/jitsi-videobridge.nix+5−3

This diff is too big to show here.

nixos/modules/services/networking/kea.nixnew file+449

This diff is too big to show here.

nixos/modules/services/networking/keepalived/vrrp-instance-options.nix+1−3

This diff is too big to show here.

nixos/modules/services/networking/keepalived/vrrp-script-options.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/kippo.nixdeleted−117

This diff is too big to show here.

nixos/modules/services/networking/knot.nix+43−8

This diff is too big to show here.

nixos/modules/services/networking/kresd.nix+7−6

This diff is too big to show here.

nixos/modules/services/networking/lambdabot.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/libreswan.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/lxd-image-server.nixnew file+133

This diff is too big to show here.

nixos/modules/services/networking/mailpile.nixdeleted−74

This diff is too big to show here.

nixos/modules/services/networking/matterbridge.nix+3−3

This diff is too big to show here.

nixos/modules/services/networking/minidlna.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/miredo.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/monero.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/morty.nix+4−5

This diff is too big to show here.

nixos/modules/services/networking/mosquitto.mdnew file+102

This diff is too big to show here.

nixos/modules/services/networking/mosquitto.nix+541−175

This diff is too big to show here.

nixos/modules/services/networking/mosquitto.xmlnew file+147

This diff is too big to show here.

nixos/modules/services/networking/mozillavpn.nixnew file+19

This diff is too big to show here.

nixos/modules/services/networking/mtr-exporter.nixnew file+87

This diff is too big to show here.

nixos/modules/services/networking/mullvad-vpn.nix+5−1

This diff is too big to show here.

nixos/modules/services/networking/multipath.nixnew file+557

This diff is too big to show here.

nixos/modules/services/networking/murmur.nix+4−4

This diff is too big to show here.

nixos/modules/services/networking/mxisd.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/namecoind.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/nar-serve.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/nat.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/nats.nixnew file+158

This diff is too big to show here.

nixos/modules/services/networking/nbd.nixnew file+159

This diff is too big to show here.

nixos/modules/services/networking/ncdns.nix+6−3

This diff is too big to show here.

nixos/modules/services/networking/ndppd.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/nebula.nix+6−8

This diff is too big to show here.

nixos/modules/services/networking/networkmanager.nix+86−61

This diff is too big to show here.

nixos/modules/services/networking/nftables.nix+7−12

This diff is too big to show here.

nixos/modules/services/networking/ngircd.nix+5−2

This diff is too big to show here.

nixos/modules/services/networking/nix-serve.nix+20−10

This diff is too big to show here.

nixos/modules/services/networking/nixops-dns.nix−1

This diff is too big to show here.

nixos/modules/services/networking/nntp-proxy.nix+18−18

This diff is too big to show here.

nixos/modules/services/networking/nomad.nix+20−7

This diff is too big to show here.

nixos/modules/services/networking/nsd.nix+11−16

This diff is too big to show here.

nixos/modules/services/networking/ntopng.nix+57−13

This diff is too big to show here.

nixos/modules/services/networking/ntp/chrony.nix+22−12

This diff is too big to show here.

nixos/modules/services/networking/ntp/ntpd.nix+8−7

This diff is too big to show here.

nixos/modules/services/networking/ntp/openntpd.nix+4−1

This diff is too big to show here.

nixos/modules/services/networking/nylon.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/ofono.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/onedrive.nix+1−2

This diff is too big to show here.

nixos/modules/services/networking/openconnect.nixnew file+137

This diff is too big to show here.

nixos/modules/services/networking/openfire.nixdeleted−56

This diff is too big to show here.

nixos/modules/services/networking/openvpn.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/ostinato.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/pdns-recursor.nix+13−8

This diff is too big to show here.

nixos/modules/services/networking/pleroma.nix+12−4

This diff is too big to show here.

nixos/modules/services/networking/pleroma.xml+177−121

This diff is too big to show here.

nixos/modules/services/networking/powerdns.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/pppd.nix+23−5

This diff is too big to show here.

nixos/modules/services/networking/privoxy.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/prosody.nix+3−2

This diff is too big to show here.

nixos/modules/services/networking/prosody.xml+1−1

This diff is too big to show here.

nixos/modules/services/networking/quassel.nix+6−3

This diff is too big to show here.

nixos/modules/services/networking/quicktun.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/quorum.nix+5−3

This diff is too big to show here.

nixos/modules/services/networking/racoon.nixdeleted−45

This diff is too big to show here.

nixos/modules/services/networking/radicale.nix+9−5

This diff is too big to show here.

nixos/modules/services/networking/radvd.nix+4−1

This diff is too big to show here.

nixos/modules/services/networking/rdnssd.nix+3−1

This diff is too big to show here.

nixos/modules/services/networking/resilio.nix+1

This diff is too big to show here.

nixos/modules/services/networking/sabnzbd.nix+8−1

This diff is too big to show here.

nixos/modules/services/networking/seafile.nixnew file+287

This diff is too big to show here.

nixos/modules/services/networking/searx.nix+3−4

This diff is too big to show here.

nixos/modules/services/networking/shadowsocks.nix+4−6

This diff is too big to show here.

nixos/modules/services/networking/shairport-sync.nix+29−2

This diff is too big to show here.

nixos/modules/services/networking/shellhub-agent.nix+26−17

This diff is too big to show here.

nixos/modules/services/networking/shorewall.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/shorewall6.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/shout.nix+4−2

This diff is too big to show here.

nixos/modules/services/networking/skydns.nix+2−1

This diff is too big to show here.

nixos/modules/services/networking/smartdns.nix+2−1

This diff is too big to show here.

nixos/modules/services/networking/smokeping.nix+61−21

This diff is too big to show here.

nixos/modules/services/networking/sniproxy.nix+6−17

This diff is too big to show here.

nixos/modules/services/networking/snowflake-proxy.nixnew file+81

This diff is too big to show here.

nixos/modules/services/networking/softether.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/soju.nixnew file+114

This diff is too big to show here.

nixos/modules/services/networking/solanum.nix+10−2

This diff is too big to show here.

nixos/modules/services/networking/spacecookie.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/spiped.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/squid.nix+23−4

This diff is too big to show here.

nixos/modules/services/networking/ssh/sshd.nix+33−22

This diff is too big to show here.

nixos/modules/services/networking/strongswan-swanctl/module.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/strongswan-swanctl/swanctl-params.nix+10

This diff is too big to show here.

nixos/modules/services/networking/strongswan.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/stubby.nix+46−174

This diff is too big to show here.

nixos/modules/services/networking/stunnel.nix+3−2

This diff is too big to show here.

nixos/modules/services/networking/supplicant.nix+3−3

This diff is too big to show here.

nixos/modules/services/networking/supybot.nix+4−3

This diff is too big to show here.

nixos/modules/services/networking/syncplay.nix+19−3

This diff is too big to show here.

nixos/modules/services/networking/syncthing.nix+372−308

This diff is too big to show here.

nixos/modules/services/networking/tailscale.nix+20−3

This diff is too big to show here.

nixos/modules/services/networking/teamspeak3.nix+20−2

This diff is too big to show here.

nixos/modules/services/networking/tedicross.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/teleport.nixnew file+99

This diff is too big to show here.

nixos/modules/services/networking/tetrd.nixnew file+96

This diff is too big to show here.

nixos/modules/services/networking/thelounge.nix+39−8

This diff is too big to show here.

nixos/modules/services/networking/tinc.nix+11−8

This diff is too big to show here.

nixos/modules/services/networking/tinydns.nix+5−1

This diff is too big to show here.

nixos/modules/services/networking/tox-bootstrapd.nix+8−13

This diff is too big to show here.

nixos/modules/services/networking/tox-node.nix+1−6

This diff is too big to show here.

nixos/modules/services/networking/toxvpn.nix+4−2

This diff is too big to show here.

nixos/modules/services/networking/trickster.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/tvheadend.nix+3−1

This diff is too big to show here.

nixos/modules/services/networking/ucarp.nixnew file+183

This diff is too big to show here.

nixos/modules/services/networking/unbound.nix+13−3

This diff is too big to show here.

nixos/modules/services/networking/unifi.nix+80−60

This diff is too big to show here.

nixos/modules/services/networking/v2ray.nix+15−7

This diff is too big to show here.

nixos/modules/services/networking/vsftpd.nix+5−2

This diff is too big to show here.

nixos/modules/services/networking/wakeonlan.nixdeleted−56

This diff is too big to show here.

nixos/modules/services/networking/wasabibackend.nix+4−2

This diff is too big to show here.

nixos/modules/services/networking/websockify.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/wg-netmanager.nixnew file+42

This diff is too big to show here.

nixos/modules/services/networking/wg-quick.nix+12−13

This diff is too big to show here.

nixos/modules/services/networking/wicd.nixdeleted−40

This diff is too big to show here.

nixos/modules/services/networking/wireguard.nix+7−7

This diff is too big to show here.

nixos/modules/services/networking/wpa_supplicant.nix+343−102

This diff is too big to show here.

nixos/modules/programs/x2goserver.nix → nixos/modules/services/networking/x2goserver.nixrenamed+24−9

This diff is too big to show here.

nixos/modules/services/networking/xandikos.nix+2−2

This diff is too big to show here.

nixos/modules/services/networking/xrdp.nix+17−3

This diff is too big to show here.

nixos/modules/services/networking/yggdrasil.nix+1−1

This diff is too big to show here.

nixos/modules/services/networking/yggdrasil.xml−1

This diff is too big to show here.

nixos/modules/services/networking/zeronet.nix+5−7

This diff is too big to show here.

nixos/modules/services/networking/zerotierone.nix+1−2

This diff is too big to show here.

nixos/modules/services/networking/znc/default.nix+5−5

This diff is too big to show here.

nixos/modules/services/networking/znc/options.nix+6−6

This diff is too big to show here.

nixos/modules/services/printing/cupsd.nix+1−1

This diff is too big to show here.

nixos/modules/services/scheduling/atd.nix+3−1

This diff is too big to show here.

nixos/modules/services/scheduling/cron.nix+7−2

This diff is too big to show here.

nixos/modules/services/scheduling/fcron.nix+3

This diff is too big to show here.

nixos/modules/services/search/elasticsearch.nix+43−12

This diff is too big to show here.

nixos/modules/services/search/hound.nix+13−11

This diff is too big to show here.

nixos/modules/services/search/kibana.nix+9−4

This diff is too big to show here.

nixos/modules/services/search/meilisearch.mdnew file+39

This diff is too big to show here.

nixos/modules/services/search/meilisearch.nixnew file+132

This diff is too big to show here.

nixos/modules/services/search/meilisearch.xmlnew file+85

This diff is too big to show here.

nixos/modules/services/search/solr.nix+1−1

This diff is too big to show here.

nixos/modules/services/security/aesmd.nixnew file+236

This diff is too big to show here.

nixos/modules/services/security/bitwarden_rs/default.nixdeleted−161

This diff is too big to show here.

nixos/modules/services/security/certmgr.nix+2−2

This diff is too big to show here.

nixos/modules/services/security/cfssl.nix+56−43

This diff is too big to show here.

nixos/modules/services/security/clamav.nix+4−5

This diff is too big to show here.

nixos/modules/services/security/fail2ban.nix+24−6

This diff is too big to show here.

nixos/modules/services/security/fprintd.nix+2−2

This diff is too big to show here.

nixos/modules/services/security/fprot.nixdeleted−82

This diff is too big to show here.

nixos/modules/services/security/haka.nix+1−1

This diff is too big to show here.

nixos/modules/services/security/haveged.nix+39−29

This diff is too big to show here.

nixos/modules/services/security/hockeypuck.nixnew file+106

This diff is too big to show here.

nixos/modules/services/security/nginx-sso.nix+2−2

This diff is too big to show here.

nixos/modules/services/security/oauth2_proxy.nix+10−5

This diff is too big to show here.

nixos/modules/services/security/oauth2_proxy_nginx.nix+1

This diff is too big to show here.

nixos/modules/services/security/opensnitch.nixnew file+125

This diff is too big to show here.

nixos/modules/services/security/physlock.nix+6−4

This diff is too big to show here.

nixos/modules/services/security/privacyidea.nix+12−8

This diff is too big to show here.

nixos/modules/services/security/shibboleth-sp.nix+1−1

This diff is too big to show here.

nixos/modules/services/security/sks.nix+2−2

This diff is too big to show here.

nixos/modules/services/security/sslmate-agent.nixnew file+32

This diff is too big to show here.

nixos/modules/services/security/step-ca.nix+13−1

This diff is too big to show here.

nixos/modules/services/security/tor.nix+28−7

This diff is too big to show here.

nixos/modules/services/security/torsocks.nix+1

This diff is too big to show here.

nixos/modules/services/security/usbguard.nix+1−1

This diff is too big to show here.

nixos/modules/services/security/vault.nix+8−2

This diff is too big to show here.

nixos/modules/services/security/bitwarden_rs/backup.sh → nixos/modules/services/security/vaultwarden/backup.shrenamed+1−1

This diff is too big to show here.

nixos/modules/services/security/vaultwarden/default.nixnew file+185

This diff is too big to show here.

nixos/modules/services/security/yubikey-agent.nix+8−2

This diff is too big to show here.

nixos/modules/services/system/cachix-agent/default.nixnew file+57

This diff is too big to show here.

nixos/modules/services/system/cloud-init.nix+15−1

This diff is too big to show here.

nixos/modules/services/system/earlyoom.nix+134−97

This diff is too big to show here.

nixos/modules/services/system/kerberos/heimdal.nix+1−1

This diff is too big to show here.

nixos/modules/services/system/localtime.nix+2

This diff is too big to show here.

nixos/modules/services/system/nscd.nix+20−9

This diff is too big to show here.

nixos/modules/services/system/saslauthd.nix+1−1

This diff is too big to show here.

nixos/modules/services/system/self-deploy.nix+3−2

This diff is too big to show here.

nixos/modules/services/system/systembus-notify.nixnew file+27

This diff is too big to show here.

nixos/modules/services/system/uptimed.nix+7−3

This diff is too big to show here.

nixos/modules/services/torrent/deluge.nix+9−2

This diff is too big to show here.

nixos/modules/services/torrent/flexget.nix+1−1

This diff is too big to show here.

nixos/modules/services/torrent/magnetico.nix+3−1

This diff is too big to show here.

nixos/modules/services/torrent/opentracker.nix+1−1

This diff is too big to show here.

nixos/modules/services/torrent/peerflix.nix+8−2

This diff is too big to show here.

nixos/modules/services/torrent/rtorrent.nix+4−2

This diff is too big to show here.

nixos/modules/services/torrent/transmission.nix+225−135

This diff is too big to show here.

nixos/modules/services/ttys/getty.nix+20−14

This diff is too big to show here.

nixos/modules/services/ttys/kmscon.nix+24−5

This diff is too big to show here.

nixos/modules/services/video/epgstation/default.nix+192−153

This diff is too big to show here.

nixos/modules/services/video/epgstation/streaming.json+129−108

This diff is too big to show here.

nixos/modules/services/video/mirakurun.nix+5−5

This diff is too big to show here.

nixos/modules/services/video/replay-sorcery.nixnew file+72

This diff is too big to show here.

nixos/modules/services/video/rtsp-simple-server.nixnew file+80

This diff is too big to show here.

nixos/modules/services/video/unifi-video.nixnew file+271

This diff is too big to show here.

nixos/modules/services/wayland/cage.nix+7−2

This diff is too big to show here.

nixos/modules/services/web-apps/atlassian/confluence.nix+2−2

This diff is too big to show here.

nixos/modules/services/web-apps/atlassian/crowd.nix+2−2

This diff is too big to show here.

nixos/modules/services/web-apps/atlassian/jira.nix+3−2

This diff is too big to show here.

nixos/modules/services/web-apps/baget.nixnew file+170

This diff is too big to show here.

nixos/modules/services/web-apps/bookstack.nix+154−73

This diff is too big to show here.

nixos/modules/services/web-apps/code-server.nixnew file+139

This diff is too big to show here.

nixos/modules/services/web-apps/cryptpad.nix+2−2

This diff is too big to show here.

nixos/modules/services/web-apps/dex.nixnew file+118

This diff is too big to show here.

nixos/modules/services/web-apps/discourse.nix+69−44

This diff is too big to show here.

nixos/modules/services/web-apps/discourse.xml+44−12

This diff is too big to show here.

nixos/modules/services/web-apps/documize.nix+1

This diff is too big to show here.

nixos/modules/services/web-apps/dokuwiki.nix+325−274

This diff is too big to show here.

nixos/modules/services/web-apps/engelsystem.nix+2−2

This diff is too big to show here.

nixos/modules/services/web-apps/ethercalc.nixnew file+62

This diff is too big to show here.

nixos/modules/services/web-apps/fluidd.nixnew file+66

This diff is too big to show here.

nixos/modules/services/web-apps/galene.nix+36−2

This diff is too big to show here.

nixos/modules/services/web-apps/gerrit.nix+4−1

This diff is too big to show here.

nixos/modules/services/web-apps/hedgedoc.nix+72−8

This diff is too big to show here.

nixos/modules/services/web-apps/hledger-web.nix+2−2

This diff is too big to show here.

nixos/modules/services/web-apps/icingaweb2/icingaweb2.nix+19−1

This diff is too big to show here.

nixos/modules/services/web-apps/ihatemoney/default.nix+17−2

This diff is too big to show here.

nixos/modules/services/web-apps/invidious.nixnew file+264

This diff is too big to show here.

nixos/modules/services/web-apps/invoiceplane.nixnew file+305

This diff is too big to show here.

nixos/modules/services/web-apps/isso.nixnew file+69

This diff is too big to show here.

nixos/modules/services/web-apps/jirafeau.nix+10−6

This diff is too big to show here.

nixos/modules/services/web-apps/jitsi-meet.nix+130−12

This diff is too big to show here.

nixos/modules/services/web-apps/jitsi-meet.xml+2−2

This diff is too big to show here.

nixos/modules/services/web-apps/keycloak.nix+546−599

This diff is too big to show here.

nixos/modules/services/web-apps/keycloak.xml+65−69

This diff is too big to show here.

nixos/modules/services/web-apps/lemmy.mdnew file+34

This diff is too big to show here.

nixos/modules/services/web-apps/lemmy.nixnew file+236

This diff is too big to show here.

nixos/modules/services/web-apps/lemmy.xmlnew file+56

This diff is too big to show here.

nixos/modules/services/web-apps/limesurvey.nix+5−5

This diff is too big to show here.

nixos/modules/services/web-apps/mastodon.nix+50−11

This diff is too big to show here.

nixos/modules/services/web-apps/matomo.nix+44−15

This diff is too big to show here.

nixos/modules/services/web-apps/mattermost.nix+145−37

This diff is too big to show here.

nixos/modules/services/web-apps/mediawiki.nix+6−5

This diff is too big to show here.

nixos/modules/services/web-apps/miniflux.nix+49−29

This diff is too big to show here.

nixos/modules/services/web-apps/moinmoin.nixdeleted−304

This diff is too big to show here.

nixos/modules/services/web-apps/moodle.nix+7−7

This diff is too big to show here.

nixos/modules/services/web-apps/netbox.nixnew file+265

This diff is too big to show here.

nixos/modules/services/web-apps/nextcloud.nix+376−101

This diff is too big to show here.

nixos/modules/services/web-apps/nextcloud.xml+92−40

This diff is too big to show here.

nixos/modules/services/web-apps/nexus.nix+22

This diff is too big to show here.

nixos/modules/services/web-apps/nifi.nixnew file+318

This diff is too big to show here.

nixos/modules/services/web-apps/node-red.nixnew file+149

This diff is too big to show here.

nixos/modules/services/web-apps/openwebrx.nixnew file+34

This diff is too big to show here.

nixos/modules/services/web-apps/peertube.nixnew file+475

This diff is too big to show here.

nixos/modules/services/web-apps/pgpkeyserver-lite.nix+5−2

This diff is too big to show here.

nixos/modules/services/web-apps/pict-rs.mdnew file+88

This diff is too big to show here.

nixos/modules/services/web-apps/pict-rs.nixnew file+50

This diff is too big to show here.

nixos/modules/services/web-apps/pict-rs.xmlnew file+162

This diff is too big to show here.

nixos/modules/services/web-apps/plantuml-server.nix+21−4

This diff is too big to show here.

nixos/modules/services/web-apps/plausible.nix+54−35

This diff is too big to show here.

nixos/modules/services/web-apps/powerdns-admin.nixnew file+152

This diff is too big to show here.

nixos/modules/services/web-apps/prosody-filer.nixnew file+86

This diff is too big to show here.

nixos/modules/services/web-apps/restya-board.nix+1−4

This diff is too big to show here.

nixos/modules/services/web-apps/rss-bridge.nix+2−4

This diff is too big to show here.

nixos/modules/services/web-apps/selfoss.nix−1

This diff is too big to show here.

nixos/modules/services/web-apps/shiori.nix+1−1

This diff is too big to show here.

nixos/modules/services/web-apps/timetagger.nixnew file+80

This diff is too big to show here.

nixos/modules/services/web-apps/trac.nixdeleted−79

This diff is too big to show here.

nixos/modules/services/web-apps/tt-rss.nix+96−87

This diff is too big to show here.

nixos/modules/services/web-apps/vikunja.nixnew file+145

This diff is too big to show here.

nixos/modules/services/web-apps/whitebophir.nix+1−1

This diff is too big to show here.

nixos/modules/services/web-apps/wordpress.nix+172−60

This diff is too big to show here.

nixos/modules/services/web-apps/youtrack.nix+3−2

This diff is too big to show here.

nixos/modules/services/web-apps/zabbix.nix+12−5

This diff is too big to show here.

nixos/modules/services/web-servers/agate.nixnew file+148

This diff is too big to show here.

nixos/modules/services/web-servers/apache-httpd/default.nix+46−30

This diff is too big to show here.

nixos/modules/services/web-servers/apache-httpd/vhost-options.nix+26−6

This diff is too big to show here.

nixos/modules/services/web-servers/caddy.nixdeleted−171

This diff is too big to show here.

nixos/modules/services/web-servers/caddy/default.nixnew file+339

This diff is too big to show here.

nixos/modules/services/web-servers/caddy/vhost-options.nixnew file+79

This diff is too big to show here.

nixos/modules/services/web-servers/darkhttpd.nix+1−1

This diff is too big to show here.

nixos/modules/services/web-servers/hydron.nix+1−1

This diff is too big to show here.

nixos/modules/services/web-servers/lighttpd/cgit.nix+7−5

This diff is too big to show here.

nixos/modules/services/web-servers/lighttpd/collectd.nix+5−1

This diff is too big to show here.

nixos/modules/services/web-servers/lighttpd/default.nix+14−2

This diff is too big to show here.

nixos/modules/services/web-servers/minio.nix+30−7

This diff is too big to show here.

nixos/modules/services/web-servers/molly-brown.nix+1−1

This diff is too big to show here.

nixos/modules/services/web-servers/nginx/default.nix+110−31

This diff is too big to show here.

nixos/modules/services/web-servers/nginx/gitweb.nix+1−1

This diff is too big to show here.

nixos/modules/services/web-servers/nginx/location-options.nix+2−2

This diff is too big to show here.

nixos/modules/services/web-servers/nginx/vhost-options.nix+50−10

This diff is too big to show here.

nixos/modules/services/web-servers/phpfpm/default.nix+5−5

This diff is too big to show here.

nixos/modules/services/web-servers/pomerium.nix+7−3

This diff is too big to show here.

nixos/modules/services/web-servers/shellinabox.nixdeleted−122

This diff is too big to show here.

nixos/modules/services/web-servers/tomcat.nix+6−5

This diff is too big to show here.

nixos/modules/services/web-servers/traefik.nix+3−3

This diff is too big to show here.

nixos/modules/services/web-servers/trafficserver.nixdeleted−318

This diff is too big to show here.

nixos/modules/services/web-servers/trafficserver/default.nixnew file+310

This diff is too big to show here.

nixos/modules/services/web-servers/trafficserver/ip_allow.jsonnew file+36

This diff is too big to show here.

nixos/modules/services/web-servers/trafficserver/logging.jsonnew file+37

This diff is too big to show here.

nixos/modules/services/web-servers/ttyd.nix+2−2

This diff is too big to show here.

nixos/modules/services/web-servers/unit/default.nix+2−2

This diff is too big to show here.

nixos/modules/services/web-servers/uwsgi.nix+10−12

This diff is too big to show here.

nixos/modules/services/web-servers/varnish/default.nix+9−7

This diff is too big to show here.

nixos/modules/services/web-servers/zope2.nix+6−2

This diff is too big to show here.

nixos/modules/services/x11/clight.nix+8

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/cde.nix+4−3

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/cinnamon.nix+15−7

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/default.nix+1−1

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/enlightenment.nix+24−3

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/gnome.nix+69−77

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/gnome.xml−24

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/kodi.nix+2−2

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/lumina.nix+4

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/lxqt.nix+12−3

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/mate.nix+10−38

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/none.nix+44−5

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/pantheon.nix+37−22

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/pantheon.xml+11−5

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/plasma5.nix+330−130

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/retroarch.nixnew file+40

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/surf-display.nix+2−1

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/xfce.nix+10−3

This diff is too big to show here.

nixos/modules/services/x11/desktop-managers/xterm.nix+2−2

This diff is too big to show here.

nixos/modules/services/x11/display-managers/account-service-util.nix+1−1

This diff is too big to show here.

nixos/modules/services/x11/display-managers/default.nix+16−12

This diff is too big to show here.

nixos/modules/services/x11/display-managers/gdm.nix+45−56

This diff is too big to show here.

nixos/modules/services/x11/display-managers/lightdm-greeters/enso-os.nix+3−3

This diff is too big to show here.

nixos/modules/services/x11/display-managers/lightdm-greeters/gtk.nix+3−3

This diff is too big to show here.

nixos/modules/services/x11/display-managers/lightdm-greeters/pantheon.nix+2−2

This diff is too big to show here.

nixos/modules/services/x11/display-managers/lightdm.nix+8−6

This diff is too big to show here.

nixos/modules/services/x11/display-managers/sddm.nix+10−9

This diff is too big to show here.

nixos/modules/services/x11/display-managers/set-session.py+3

This diff is too big to show here.

nixos/modules/services/x11/display-managers/startx.nix−3

This diff is too big to show here.

nixos/modules/services/x11/display-managers/sx.nixnew file+34

This diff is too big to show here.

nixos/modules/services/x11/extra-layouts.nix+9−48

This diff is too big to show here.

nixos/modules/services/x11/hardware/libinput.nix+41−25

This diff is too big to show here.

nixos/modules/services/x11/hardware/synaptics.nix+6−1

This diff is too big to show here.

nixos/modules/services/x11/imwheel.nix+11−9

This diff is too big to show here.

nixos/modules/services/x11/picom.nix+13−3

This diff is too big to show here.

nixos/modules/services/x11/redshift.nix+1−1

This diff is too big to show here.

nixos/modules/services/x11/touchegg.nixnew file+38

This diff is too big to show here.

nixos/modules/services/x11/unclutter-xfixes.nix+1−1

This diff is too big to show here.

nixos/modules/services/x11/unclutter.nix+1−1

This diff is too big to show here.

nixos/modules/services/x11/urxvtd.nix+1−1

This diff is too big to show here.

nixos/modules/services/x11/window-managers/awesome.nix+1−1

This diff is too big to show here.

nixos/modules/services/x11/window-managers/bspwm.nix+6−6

This diff is too big to show here.

nixos/modules/services/x11/window-managers/clfswm.nix+13−3

This diff is too big to show here.

nixos/modules/services/x11/window-managers/default.nix+1

This diff is too big to show here.

nixos/modules/services/x11/window-managers/exwm.nix+4−3

This diff is too big to show here.

nixos/modules/services/x11/window-managers/fvwm.nix+1−1

This diff is too big to show here.

nixos/modules/services/x11/window-managers/herbstluftwm.nix+1−1

This diff is too big to show here.

nixos/modules/services/x11/window-managers/i3.nix+3−3

This diff is too big to show here.

nixos/modules/services/x11/window-managers/mlvwm.nixnew file+41

This diff is too big to show here.

nixos/modules/services/x11/window-managers/qtile.nix+11−4

This diff is too big to show here.

nixos/modules/services/x11/window-managers/wmderland.nix+1−1

This diff is too big to show here.

nixos/modules/services/x11/window-managers/xmonad.nix+51−15

This diff is too big to show here.

nixos/modules/services/x11/xautolock.nix+4−3

This diff is too big to show here.

nixos/modules/services/x11/xserver.nix+77−40

This diff is too big to show here.

nixos/modules/system/activation/activation-script.nix+77−46

This diff is too big to show here.

nixos/modules/system/activation/switch-to-configuration.plmode 100644 → 100755+697−254

This diff is too big to show here.

nixos/modules/system/activation/top-level.nix+100−35

This diff is too big to show here.

nixos/modules/system/boot/binfmt.nix+52−10

This diff is too big to show here.

nixos/modules/system/boot/initrd-openvpn.nix+1−1

This diff is too big to show here.

nixos/modules/system/boot/initrd-ssh.nix+1−1

This diff is too big to show here.

nixos/modules/system/boot/kernel.nix+16−13

This diff is too big to show here.

nixos/modules/system/boot/kernel_config.nix+1−1

This diff is too big to show here.

nixos/modules/system/boot/kexec.nix+3−3

This diff is too big to show here.

nixos/modules/system/boot/loader/generic-extlinux-compatible/default.nix+18−1

This diff is too big to show here.

nixos/modules/system/boot/loader/generic-extlinux-compatible/extlinux-conf-builder.sh+9−3

This diff is too big to show here.

nixos/modules/system/boot/loader/grub/grub.nix+36−7

This diff is too big to show here.

nixos/modules/system/boot/loader/grub/install-grub.pl+115−86

This diff is too big to show here.

nixos/modules/system/boot/loader/grub/ipxe.nix+1−1

This diff is too big to show here.

nixos/modules/system/boot/loader/systemd-boot/systemd-boot-builder.py+102−60

This diff is too big to show here.

nixos/modules/system/boot/loader/systemd-boot/systemd-boot.nix+152−3

This diff is too big to show here.

nixos/modules/system/boot/luksroot.nix+77−9

This diff is too big to show here.

nixos/modules/system/boot/modprobe.nix+2

This diff is too big to show here.

nixos/modules/system/boot/networkd.nix+328−14

This diff is too big to show here.

nixos/modules/system/boot/plymouth.nix+9−2

This diff is too big to show here.

nixos/modules/system/boot/resolved.nix+3−1

This diff is too big to show here.

nixos/modules/system/boot/stage-1-init.sh+41−40

This diff is too big to show here.

nixos/modules/system/boot/stage-1.nix+92−23

This diff is too big to show here.

nixos/modules/system/boot/stage-2-init.shmode 100644 → 100755+71−100

This diff is too big to show here.

nixos/modules/system/boot/stage-2.nix+2−39

This diff is too big to show here.

nixos/modules/system/boot/systemd-lib.nixdeleted−237

This diff is too big to show here.

nixos/modules/system/boot/systemd-nspawn.nixdeleted−133

This diff is too big to show here.

nixos/modules/system/boot/systemd-unit-options.nixdeleted−536

This diff is too big to show here.

nixos/modules/system/boot/systemd.nix+87−673

This diff is too big to show here.

nixos/modules/system/boot/systemd/coredump.nixnew file+57

This diff is too big to show here.

nixos/modules/system/boot/systemd/initrd-secrets.nixnew file+36

This diff is too big to show here.

nixos/modules/system/boot/systemd/initrd.nixnew file+502

This diff is too big to show here.

nixos/modules/system/boot/systemd/journald.nixnew file+131

This diff is too big to show here.

nixos/modules/system/boot/systemd/logind.nixnew file+114

This diff is too big to show here.

nixos/modules/system/boot/systemd/nspawn.nixnew file+131

This diff is too big to show here.

nixos/modules/system/boot/systemd/shutdown.nixnew file+58

This diff is too big to show here.

nixos/modules/system/boot/systemd/tmpfiles.nixnew file+120

This diff is too big to show here.

nixos/modules/system/boot/systemd/user.nixnew file+153

This diff is too big to show here.

nixos/modules/system/boot/timesyncd.nix+19−5

This diff is too big to show here.

nixos/modules/system/boot/tmp.nix+20−2

This diff is too big to show here.

nixos/modules/system/build.nixnew file+21

This diff is too big to show here.

nixos/modules/system/etc/etc-activation.nixnew file+12

This diff is too big to show here.

nixos/modules/system/etc/etc.nix+60−21

This diff is too big to show here.

nixos/modules/system/etc/make-etc.shdeleted−45

This diff is too big to show here.

nixos/modules/system/etc/setup-etc.pl+6

This diff is too big to show here.

nixos/modules/system/etc/test.nixnew file+70

This diff is too big to show here.

nixos/modules/tasks/auto-upgrade.nix+105−20

This diff is too big to show here.

nixos/modules/tasks/bcache.nix+16−6

This diff is too big to show here.

nixos/modules/tasks/encrypted-devices.nix+1−1

This diff is too big to show here.

nixos/modules/tasks/filesystems.nix+72−17

This diff is too big to show here.

nixos/modules/tasks/filesystems/apfs.nixnew file+22

This diff is too big to show here.

nixos/modules/tasks/filesystems/btrfs.nix+14−5

This diff is too big to show here.

nixos/modules/tasks/filesystems/cifs.nix+1−1

This diff is too big to show here.

nixos/modules/tasks/filesystems/ecryptfs.nix+12−2

This diff is too big to show here.

nixos/modules/tasks/filesystems/exfat.nix+5−3

This diff is too big to show here.

nixos/modules/tasks/filesystems/ext.nix+10−4

This diff is too big to show here.

nixos/modules/tasks/filesystems/f2fs.nix+1−1

This diff is too big to show here.

nixos/modules/tasks/filesystems/jfs.nix+1−1

This diff is too big to show here.

nixos/modules/tasks/filesystems/nfs.nix+1−1

This diff is too big to show here.

nixos/modules/tasks/filesystems/reiserfs.nix+1−1

This diff is too big to show here.

nixos/modules/tasks/filesystems/unionfs-fuse.nix+13−2

This diff is too big to show here.

nixos/modules/tasks/filesystems/vfat.nix+1−1

This diff is too big to show here.

nixos/modules/tasks/filesystems/xfs.nix+2−2

This diff is too big to show here.

nixos/modules/tasks/filesystems/zfs.nix+85−7

This diff is too big to show here.

nixos/modules/tasks/lvm.nix+73−14

This diff is too big to show here.

nixos/modules/tasks/network-interfaces-scripted.nix+71

This diff is too big to show here.

nixos/modules/tasks/network-interfaces-systemd.nix+115−5

This diff is too big to show here.

nixos/modules/tasks/network-interfaces.nix+251−34

This diff is too big to show here.

nixos/modules/tasks/snapraid.nixnew file+230

This diff is too big to show here.

nixos/modules/tasks/swraid.nix+35−9

This diff is too big to show here.

nixos/modules/tasks/trackpoint.nix+5−4

This diff is too big to show here.

nixos/modules/testing/test-instrumentation.nix+32−32

This diff is too big to show here.

nixos/modules/virtualisation/amazon-ec2-amis.nixnew file+444

This diff is too big to show here.

nixos/modules/virtualisation/amazon-image.nix+33−10

This diff is too big to show here.

nixos/modules/virtualisation/amazon-options.nix+54−1

This diff is too big to show here.

nixos/modules/virtualisation/anbox.nix+1−1

This diff is too big to show here.

nixos/modules/virtualisation/azure-agent.nix+6−10

This diff is too big to show here.

nixos/modules/virtualisation/azure-common.nix+5−1

This diff is too big to show here.

nixos/modules/virtualisation/build-vm.nixnew file+58

This diff is too big to show here.

nixos/modules/virtualisation/container-config.nix+1−1

This diff is too big to show here.

nixos/modules/virtualisation/containerd.nix+7−2

This diff is too big to show here.

nixos/modules/virtualisation/containers.nix+4−4

This diff is too big to show here.

nixos/modules/virtualisation/cri-o.nix+52−33

This diff is too big to show here.

nixos/modules/virtualisation/digital-ocean-init.nix+1−1

This diff is too big to show here.

nixos/modules/virtualisation/docker-rootless.nixnew file+102

This diff is too big to show here.

nixos/modules/virtualisation/docker.nix+32−8

This diff is too big to show here.

nixos/modules/virtualisation/ec2-amis.nix+9−371

This diff is too big to show here.

nixos/modules/virtualisation/ecs-agent.nix+1−1

This diff is too big to show here.

nixos/modules/virtualisation/fetch-instance-ssh-keys.bashdeleted−36

This diff is too big to show here.

nixos/modules/virtualisation/google-compute-config.nix+32−103

This diff is too big to show here.

nixos/modules/virtualisation/google-compute-image.nix+10−1

This diff is too big to show here.

nixos/modules/virtualisation/hyperv-guest.nix+1−1

This diff is too big to show here.

nixos/modules/virtualisation/kubevirt.nixnew file+30

This diff is too big to show here.

nixos/modules/virtualisation/kvmgt.nix+1−1

This diff is too big to show here.

nixos/modules/virtualisation/libvirtd.nix+166−67

This diff is too big to show here.

nixos/modules/virtualisation/lxc-container.nix+161−13

This diff is too big to show here.

nixos/modules/virtualisation/lxd.nix+5−5

This diff is too big to show here.

nixos/modules/virtualisation/nixos-containers.nix+31−16

This diff is too big to show here.

nixos/modules/virtualisation/oci-containers.nix+48−20

This diff is too big to show here.

nixos/modules/virtualisation/openstack-config.nix+39−7

This diff is too big to show here.

nixos/modules/virtualisation/openstack-metadata-fetcher.nix+5−4

This diff is too big to show here.

nixos/modules/virtualisation/openstack-options.nixnew file+71

This diff is too big to show here.

nixos/modules/virtualisation/openvswitch.nix+9−54

This diff is too big to show here.

nixos/modules/virtualisation/parallels-guest.nix+1−2

This diff is too big to show here.

nixos/modules/virtualisation/podman-network-socket.nixdeleted−91

This diff is too big to show here.

nixos/modules/virtualisation/podman.nixdeleted−184

This diff is too big to show here.

nixos/modules/virtualisation/podman/default.nixnew file+187

This diff is too big to show here.

nixos/modules/virtualisation/podman-dnsname.nix → nixos/modules/virtualisation/podman/dnsname.nixrenamed

The content is the same.

nixos/modules/virtualisation/podman-network-socket-ghostunnel.nix → nixos/modules/virtualisation/podman/network-socket-ghostunnel.nixrenamed

The content is the same.

nixos/modules/virtualisation/podman/network-socket.nixnew file+95

This diff is too big to show here.

nixos/modules/virtualisation/proxmox-image.nixnew file+169

This diff is too big to show here.

nixos/modules/virtualisation/proxmox-lxc.nixnew file+64

This diff is too big to show here.

nixos/modules/virtualisation/qemu-guest-agent.nix+2−1

This diff is too big to show here.

nixos/modules/virtualisation/qemu-vm.nix+366−89

This diff is too big to show here.

nixos/modules/virtualisation/railcar.nix+3−4

This diff is too big to show here.

nixos/modules/virtualisation/spice-usb-redirection.nix+4−2

This diff is too big to show here.

nixos/modules/virtualisation/virtualbox-guest.nix+2−2

This diff is too big to show here.

nixos/modules/virtualisation/virtualbox-host.nix+10−2

This diff is too big to show here.

nixos/modules/virtualisation/virtualbox-image.nix+22−2

This diff is too big to show here.

nixos/modules/virtualisation/vmware-guest.nix+27−1

This diff is too big to show here.

nixos/modules/virtualisation/vmware-host.nixnew file+166

This diff is too big to show here.

nixos/modules/virtualisation/waydroid.nixnew file+75

This diff is too big to show here.

nixos/modules/virtualisation/xen-dom0.nix+4−5

This diff is too big to show here.

nixos/release-combined.nix+4−2

This diff is too big to show here.

nixos/release-small.nix+4−2

This diff is too big to show here.

nixos/release.nix+47−2

This diff is too big to show here.

nixos/tests/acme.nix+372−206

This diff is too big to show here.

nixos/tests/adguardhome.nixnew file+57

This diff is too big to show here.

nixos/tests/aesmd.nixnew file+62

This diff is too big to show here.

nixos/tests/agda.nix+2−5

This diff is too big to show here.

nixos/tests/airsonic.nix+1−5

This diff is too big to show here.

nixos/tests/all-terminfo.nixnew file+31

This diff is too big to show here.

nixos/tests/all-tests.nix+184−38

This diff is too big to show here.

nixos/tests/amazon-init-shell.nix+1−1

This diff is too big to show here.

nixos/tests/ammonite.nixdeleted−20

This diff is too big to show here.

nixos/tests/apfs.nixnew file+54

This diff is too big to show here.

nixos/tests/apparmor.nix+1−1

This diff is too big to show here.

nixos/tests/atd.nix+1−1

This diff is too big to show here.

nixos/tests/atop.nix+6−16

This diff is too big to show here.

nixos/tests/avahi.nix+1−1

This diff is too big to show here.

nixos/tests/awscli.nixdeleted−17

This diff is too big to show here.

nixos/tests/bat.nixdeleted−12

This diff is too big to show here.

nixos/tests/bazarr.nix+1−1

This diff is too big to show here.

nixos/tests/bcachefs.nix+8−9

This diff is too big to show here.

nixos/tests/beanstalkd.nix+1−1

This diff is too big to show here.

nixos/tests/bees.nix+1−1

This diff is too big to show here.

nixos/tests/bind.nix+1−1

This diff is too big to show here.

nixos/tests/bird.nixnew file+129

This diff is too big to show here.

nixos/tests/bitcoind.nix+1−1

This diff is too big to show here.

nixos/tests/bittorrent.nix+1−1

This diff is too big to show here.

nixos/tests/bitwarden.nixdeleted−189

This diff is too big to show here.

nixos/tests/blockbook-frontend.nix+1−1

This diff is too big to show here.

nixos/tests/blocky.nixnew file+34

This diff is too big to show here.

nixos/tests/boot-stage1.nix+3−1

This diff is too big to show here.

nixos/tests/boot.nix+61−18

This diff is too big to show here.

nixos/tests/borgbackup.nix+34−1

This diff is too big to show here.

nixos/tests/botamusique.nix+4

This diff is too big to show here.

nixos/tests/bpf.nixnew file+29

This diff is too big to show here.

nixos/tests/breitbandmessung.nixnew file+33

This diff is too big to show here.

nixos/tests/brscan5.nix+2−1

This diff is too big to show here.

nixos/tests/btrbk.nixnew file+110

This diff is too big to show here.

nixos/tests/buildkite-agents.nix+1−1

This diff is too big to show here.

nixos/tests/caddy.nix+56−40

This diff is too big to show here.

nixos/tests/cage.nix+1−2

This diff is too big to show here.

nixos/tests/cagebreak.nix+1−2

This diff is too big to show here.

nixos/tests/calibre-web.nix−10

This diff is too big to show here.

nixos/tests/cassandra.nix−1

This diff is too big to show here.

nixos/tests/ceph-multi-node.nix+1−2

This diff is too big to show here.

nixos/tests/ceph-single-node-bluestore.nix−1

This diff is too big to show here.

nixos/tests/ceph-single-node.nix−1

This diff is too big to show here.

nixos/tests/cfssl.nix+1−1

This diff is too big to show here.

nixos/tests/chromium.nix+80−78

This diff is too big to show here.

nixos/tests/cifs-utils.nixdeleted−12

This diff is too big to show here.

nixos/tests/clickhouse.nix+1−1

This diff is too big to show here.

nixos/tests/cloud-init.nix+27−2

This diff is too big to show here.

nixos/tests/cntr.nixnew file+75

This diff is too big to show here.

nixos/tests/collectd.nixnew file+38

This diff is too big to show here.

nixos/tests/common/acme/client/default.nix+4−2

This diff is too big to show here.

nixos/tests/common/acme/server/default.nix+5

This diff is too big to show here.

nixos/tests/common/ec2.nix+1

This diff is too big to show here.

nixos/tests/common/lxd/config.yamlnew file+24

This diff is too big to show here.

nixos/tests/common/wayland-cage.nixnew file+13

This diff is too big to show here.

nixos/tests/containers-bridge.nix+2−3

This diff is too big to show here.

nixos/tests/containers-custom-pkgs.nix+1−1

This diff is too big to show here.

nixos/tests/containers-ephemeral.nix+4−5

This diff is too big to show here.

nixos/tests/containers-extra_veth.nix+2−3

This diff is too big to show here.

nixos/tests/containers-hosts.nix+1−2

This diff is too big to show here.

nixos/tests/containers-imperative.nix+11−12

This diff is too big to show here.

nixos/tests/containers-ip.nix+2−3

This diff is too big to show here.

nixos/tests/containers-macvlans.nix−2

This diff is too big to show here.

nixos/tests/containers-names.nix+1−1

This diff is too big to show here.

nixos/tests/containers-nested.nix+1−1

This diff is too big to show here.

nixos/tests/containers-physical_interfaces.nix−4

This diff is too big to show here.

nixos/tests/containers-portforward.nix+2−3

This diff is too big to show here.

nixos/tests/containers-tmpfs.nix+7−8

This diff is too big to show here.

nixos/tests/coturn.nixnew file+29

This diff is too big to show here.

nixos/tests/couchdb.nix+3

This diff is too big to show here.

nixos/tests/cri-o.nix+1−1

This diff is too big to show here.

nixos/tests/croc.nix+1−1

This diff is too big to show here.

nixos/tests/cryptpad.nixnew file+18

This diff is too big to show here.

nixos/tests/custom-ca.nix+104−79

This diff is too big to show here.

nixos/tests/deluge.nix+11−57

This diff is too big to show here.

nixos/tests/dex-oidc.nixnew file+78

This diff is too big to show here.

nixos/tests/disable-installer-tools.nixnew file+29

This diff is too big to show here.

nixos/tests/discourse.nix+4−2

This diff is too big to show here.

nixos/tests/dnsdist.nixnew file+48

This diff is too big to show here.

nixos/tests/doas.nix+16−1

This diff is too big to show here.

nixos/tests/docker-rootless.nixnew file+41

This diff is too big to show here.

nixos/tests/docker-tools-cross.nix+2−2

This diff is too big to show here.

nixos/tests/docker-tools.nix+47−6

This diff is too big to show here.

nixos/tests/documize.nix+1−1

This diff is too big to show here.

nixos/tests/doh-proxy-rust.nix+1−1

This diff is too big to show here.

nixos/tests/dokuwiki.nix+60−25

This diff is too big to show here.

nixos/tests/domination.nixnew file+26

This diff is too big to show here.

nixos/tests/dovecot.nix+1−1

This diff is too big to show here.

nixos/tests/drbd.nixnew file+87

This diff is too big to show here.

nixos/tests/earlyoom.nixnew file+16

This diff is too big to show here.

nixos/tests/ec2.nix+5

This diff is too big to show here.

nixos/tests/ecryptfs.nix+1−1

This diff is too big to show here.

nixos/tests/elk.nix+98−45

This diff is too big to show here.

nixos/tests/emacs-daemon.nix+2−2

This diff is too big to show here.

nixos/tests/empty-filenew file

No changes to the content.

nixos/tests/enlightenment.nix+4−5

This diff is too big to show here.

nixos/tests/env.nix+1−1

This diff is too big to show here.

nixos/tests/envoy.nixnew file+33

This diff is too big to show here.

nixos/tests/ergochat.nixnew file+97

This diff is too big to show here.

nixos/tests/etebase-server.nix+1−1

This diff is too big to show here.

nixos/tests/etesync-dav.nix+2−2

This diff is too big to show here.

nixos/tests/fancontrol.nix+1−1

This diff is too big to show here.

nixos/tests/fcitx/default.nix+1−2

This diff is too big to show here.

nixos/tests/fenics.nix+1−2

This diff is too big to show here.

nixos/tests/firefox.nix+9−11

This diff is too big to show here.

nixos/tests/fish.nix+1−1

This diff is too big to show here.

nixos/tests/fluentd.nix+1−1

This diff is too big to show here.

nixos/tests/fluidd.nixnew file+21

This diff is too big to show here.

nixos/tests/fontconfig-default-fonts.nix+1−1

This diff is too big to show here.

nixos/tests/frr.nixnew file+104

This diff is too big to show here.

nixos/tests/fsck.nix+1−1

This diff is too big to show here.

nixos/tests/ft2-clone.nix+2−2

This diff is too big to show here.

nixos/tests/gerrit.nix−1

This diff is too big to show here.

nixos/tests/geth.nix+2−2

This diff is too big to show here.

nixos/tests/ghostunnel.nix+2−3

This diff is too big to show here.

nixos/tests/gitlab.nix+311−27

This diff is too big to show here.

nixos/tests/gitolite-fcgiwrap.nix+2−2

This diff is too big to show here.

nixos/tests/gnome-xorg.nix+17−2

This diff is too big to show here.

nixos/tests/gnome.nix+17−2

This diff is too big to show here.

nixos/tests/go-neb.nix+6−6

This diff is too big to show here.

nixos/tests/google-oslogin/default.nix+2−2

This diff is too big to show here.

nixos/tests/google-oslogin/server.nix+2−4

This diff is too big to show here.

nixos/tests/google-oslogin/server.pymode 100644 → 100755

Only the mode changed.

nixos/tests/gotify-server.nix+1−1

This diff is too big to show here.

nixos/tests/graphite.nix−1

This diff is too big to show here.

nixos/tests/graylog.nix+2−2

This diff is too big to show here.

nixos/tests/grocy.nix+2−2

This diff is too big to show here.

nixos/tests/grub.nix+1−1

This diff is too big to show here.

nixos/tests/hadoop/default.nixnew file+7

This diff is too big to show here.

nixos/tests/hadoop/hadoop.nixnew file+255

This diff is too big to show here.

nixos/tests/hadoop/hdfs.nix+57−27

This diff is too big to show here.

nixos/tests/hadoop/yarn.nix+22−23

This diff is too big to show here.

nixos/tests/handbrake.nixdeleted−31

This diff is too big to show here.

nixos/tests/haproxy.nix−1

This diff is too big to show here.

nixos/tests/hardened.nix+6−31

This diff is too big to show here.

nixos/tests/haste-server.nixnew file+23

This diff is too big to show here.

nixos/tests/hbase.nixnew file+30

This diff is too big to show here.

nixos/tests/herbstluftwm.nix+1−2

This diff is too big to show here.

nixos/tests/hibernate.nix+21−8

This diff is too big to show here.

nixos/tests/hitch/default.nix+1−1

This diff is too big to show here.

nixos/tests/hocker-fetchdocker/default.nix+1−1

This diff is too big to show here.

nixos/tests/hockeypuck.nixnew file+63

This diff is too big to show here.

nixos/tests/home-assistant.nix+85−34

This diff is too big to show here.

nixos/tests/hostname.nix+1−1

This diff is too big to show here.

nixos/tests/hound.nix+1−1

This diff is too big to show here.

nixos/tests/hydra/common.nix+1−1

This diff is too big to show here.

nixos/tests/hydra/default.nix+2−2

This diff is too big to show here.

nixos/tests/i3wm.nix+1−1

This diff is too big to show here.

nixos/tests/ihatemoney.nixdeleted−62

This diff is too big to show here.

nixos/tests/ihatemoney/default.nixnew file+78

This diff is too big to show here.

nixos/tests/ihatemoney/rates.jsonnew file+39

This diff is too big to show here.

nixos/tests/ihatemoney/server.crtnew file+28

This diff is too big to show here.

nixos/tests/ihatemoney/server.keynew file+52

This diff is too big to show here.

nixos/tests/incron.nix+1−1

This diff is too big to show here.

nixos/tests/initrd-network.nix+1−1

This diff is too big to show here.

nixos/tests/initrd-secrets.nix+9−3

This diff is too big to show here.

nixos/tests/input-remapper.nixnew file+52

This diff is too big to show here.

nixos/tests/installed-tests/appstream-qt.nixnew file+9

This diff is too big to show here.

nixos/tests/installed-tests/appstream.nixnew file+9

This diff is too big to show here.

nixos/tests/installed-tests/default.nix+4−1

This diff is too big to show here.

nixos/tests/installed-tests/flatpak.nix+1

This diff is too big to show here.

nixos/tests/installed-tests/fwupd.nix−1

This diff is too big to show here.

nixos/tests/installed-tests/gjs.nix+6

This diff is too big to show here.

nixos/tests/installed-tests/power-profiles-daemon.nixnew file+9

This diff is too big to show here.

nixos/tests/installer-systemd-stage-1.nixnew file+33

This diff is too big to show here.

nixos/tests/installer.nix+44−37

This diff is too big to show here.

nixos/tests/invidious.nixnew file+81

This diff is too big to show here.

nixos/tests/invoiceplane.nixnew file+82

This diff is too big to show here.

nixos/tests/ipfs.nix+5

This diff is too big to show here.

nixos/tests/iscsi-multipath-root.nixnew file+267

This diff is too big to show here.

nixos/tests/iscsi-root.nix+5−5

This diff is too big to show here.

nixos/tests/isso.nixnew file+30

This diff is too big to show here.

nixos/tests/jellyfin.nix+1−1

This diff is too big to show here.

nixos/tests/jenkins-cli.nixnew file+30

This diff is too big to show here.

nixos/tests/jenkins.nix+85−2

This diff is too big to show here.

nixos/tests/jibri.nixnew file+69

This diff is too big to show here.

nixos/tests/jitsi-meet.nix+2−8

This diff is too big to show here.

nixos/tests/k3s-single-node-docker.nixnew file+84

This diff is too big to show here.

nixos/tests/k3s-single-node.nixnew file+82

This diff is too big to show here.

nixos/tests/k3s.nixdeleted−78

This diff is too big to show here.

nixos/tests/kafka.nix+2−4

This diff is too big to show here.

nixos/tests/kbd-setfont-decompress.nixnew file+21

This diff is too big to show here.

nixos/tests/kbd-update-search-paths-patch.nixnew file+19

This diff is too big to show here.

nixos/tests/kea.nixnew file+73

This diff is too big to show here.

nixos/tests/keepassxc.nix+43−9

This diff is too big to show here.

nixos/tests/kerberos/heimdal.nix+2−2

This diff is too big to show here.

nixos/tests/kerberos/mit.nix+1−1

This diff is too big to show here.

nixos/tests/kernel-generic.nix+18−15

This diff is too big to show here.

nixos/tests/kernel-latest-ath-user-regd.nix+1−1

This diff is too big to show here.

nixos/tests/kexec.nix+44−19

This diff is too big to show here.

nixos/tests/keycloak.nix+33−14

This diff is too big to show here.

nixos/tests/keymap.nix+1−1

This diff is too big to show here.

nixos/tests/knot.nix+6

This diff is too big to show here.

nixos/tests/krb5/deprecated-config.nix+1−1

This diff is too big to show here.

nixos/tests/krb5/example-config.nix+1−1

This diff is too big to show here.

nixos/tests/ksm.nix+1−1

This diff is too big to show here.

nixos/tests/kubernetes/base.nix+3−4

This diff is too big to show here.

nixos/tests/kubernetes/default.nix+13−5

This diff is too big to show here.

nixos/tests/kubernetes/dns.nix+3−3

This diff is too big to show here.

nixos/tests/kubernetes/e2e.nix+1−1

This diff is too big to show here.

nixos/tests/kubernetes/rbac.nix+9−9

This diff is too big to show here.

nixos/tests/libinput.nixnew file+38

This diff is too big to show here.

nixos/tests/libreddit.nixnew file+19

This diff is too big to show here.

nixos/tests/libresprite.nixnew file+30

This diff is too big to show here.

nixos/tests/libreswan.nix+1−1

This diff is too big to show here.

nixos/tests/lightdm.nix+1−1

This diff is too big to show here.

nixos/tests/limesurvey.nix+1−1

This diff is too big to show here.

nixos/tests/litestream.nixnew file+93

This diff is too big to show here.

nixos/tests/login.nix+1−1

This diff is too big to show here.

nixos/tests/logrotate.nixnew file+152

This diff is too big to show here.

nixos/tests/loki.nix+1−1

This diff is too big to show here.

nixos/tests/lorri/default.nix+1−1

This diff is too big to show here.

nixos/tests/lsd.nixdeleted−12

This diff is too big to show here.

nixos/tests/lvm2/default.nixnew file+45

This diff is too big to show here.

nixos/tests/lvm2/systemd-stage-1.nixnew file+104

This diff is too big to show here.

nixos/tests/lvm2/thinpool.nixnew file+32

This diff is too big to show here.

nixos/tests/lvm2/vdo.nixnew file+27

This diff is too big to show here.

nixos/tests/lxd-image-server.nixnew file+94

This diff is too big to show here.

nixos/tests/lxd-nftables.nix+1−1

This diff is too big to show here.

nixos/tests/lxd.nix+41−68

This diff is too big to show here.

nixos/tests/maddy.nixnew file+58

This diff is too big to show here.

nixos/tests/maestral.nixnew file+72

This diff is too big to show here.

nixos/tests/magic-wormhole-mailbox-server.nix+1−1

This diff is too big to show here.

nixos/tests/magnetico.nix+1−1

This diff is too big to show here.

nixos/tests/mailcatcher.nix+8−3

This diff is too big to show here.

nixos/tests/mailhog.nix+1−1

This diff is too big to show here.

nixos/tests/man.nixnew file+100

This diff is too big to show here.

nixos/tests/matomo.nix+1−1

This diff is too big to show here.

nixos/tests/matrix-appservice-irc.nix+125−63

This diff is too big to show here.

nixos/tests/matrix-conduit.nixnew file+95

This diff is too big to show here.

nixos/tests/matrix-synapse.nix+140−9

This diff is too big to show here.

nixos/tests/matrix/mjolnir.nixnew file+170

This diff is too big to show here.

nixos/tests/matrix/pantalaimon.nixnew file+88

This diff is too big to show here.

nixos/tests/mattermost.nixnew file+124

This diff is too big to show here.

nixos/tests/mediawiki.nix+1−1

This diff is too big to show here.

nixos/tests/meilisearch.nixnew file+60

This diff is too big to show here.

nixos/tests/memcached.nix+1−1

This diff is too big to show here.

nixos/tests/metabase.nix−1

This diff is too big to show here.

nixos/tests/minecraft.nix+1−1

This diff is too big to show here.

nixos/tests/minidlna.nix+4−2

This diff is too big to show here.

nixos/tests/miniflux.nix+19−7

This diff is too big to show here.

nixos/tests/minio.nix+4−1

This diff is too big to show here.

nixos/tests/misc.nix+7−6

This diff is too big to show here.

nixos/tests/mod_perl.nixnew file+53

This diff is too big to show here.

nixos/tests/moinmoin.nixdeleted−28

This diff is too big to show here.

nixos/tests/mongodb.nix+4

This diff is too big to show here.

nixos/tests/moodle.nix+1−1

This diff is too big to show here.

nixos/tests/moonraker.nixnew file+45

This diff is too big to show here.

nixos/tests/moosefs.nixnew file+89

This diff is too big to show here.

nixos/tests/mosquitto.nix+166−51

This diff is too big to show here.

nixos/tests/mpd.nix+1−1

This diff is too big to show here.

nixos/tests/mpv.nixnew file+28

This diff is too big to show here.

nixos/tests/mtp.nixnew file+109

This diff is too big to show here.

nixos/tests/mumble.nix+2−2

This diff is too big to show here.

nixos/tests/musescore.nix+2−2

This diff is too big to show here.

nixos/tests/mutable-users.nix+28

This diff is too big to show here.

nixos/tests/mysql/common.nixnew file+10

This diff is too big to show here.

nixos/tests/mysql/mariadb-galera-mariabackup.nixdeleted−223

This diff is too big to show here.

nixos/tests/mysql/mariadb-galera-rsync.nixdeleted−216

This diff is too big to show here.

nixos/tests/mysql/mariadb-galera.nixnew file+250

This diff is too big to show here.

nixos/tests/mysql/mysql-autobackup.nix+48−33

This diff is too big to show here.

nixos/tests/mysql/mysql-backup.nix+60−44

This diff is too big to show here.

nixos/tests/mysql/mysql-replication.nix+84−74

This diff is too big to show here.

nixos/tests/mysql/mysql.nix+134−174

This diff is too big to show here.

nixos/tests/nagios.nix+1−1

This diff is too big to show here.

nixos/tests/nano.nixdeleted−44

This diff is too big to show here.

nixos/tests/nar-serve.nix+1−1

This diff is too big to show here.

nixos/tests/nats.nixnew file+63

This diff is too big to show here.

nixos/tests/navidrome.nixnew file+12

This diff is too big to show here.

nixos/tests/nbd.nixnew file+103

This diff is too big to show here.

nixos/tests/ncdns.nix+6−9

This diff is too big to show here.

nixos/tests/networking-proxy.nix−1

This diff is too big to show here.

nixos/tests/networking.nix+223−14

This diff is too big to show here.

nixos/tests/nextcloud/basic.nix+13−3

This diff is too big to show here.

nixos/tests/nextcloud/default.nix+20−8

This diff is too big to show here.

nixos/tests/nextcloud/with-mysql-and-memcached.nix+8−18

This diff is too big to show here.

nixos/tests/nextcloud/with-postgresql-and-redis.nix+5−2

This diff is too big to show here.

nixos/tests/nexus.nix+1−1

This diff is too big to show here.

nixos/tests/nfs/simple.nix+1−1

This diff is too big to show here.

nixos/tests/nginx-etag.nix+1−2

This diff is too big to show here.

nixos/tests/nginx-modsecurity.nixnew file+39

This diff is too big to show here.

nixos/tests/nginx-pubhtml.nix+1−1

This diff is too big to show here.

nixos/tests/nginx-sandbox.nix+1−1

This diff is too big to show here.

nixos/tests/nginx-sso.nix+1−1

This diff is too big to show here.

nixos/tests/nginx-variants.nix+2−2

This diff is too big to show here.

nixos/tests/nitter.nixnew file+18

This diff is too big to show here.

nixos/tests/nix-ld.nixnew file+20

This diff is too big to show here.

nixos/tests/nix-serve-ssh.nixnew file+45

This diff is too big to show here.

nixos/tests/nix-serve.nixnew file+22

This diff is too big to show here.

nixos/tests/nix-ssh-serve.nixdeleted−45

This diff is too big to show here.

nixos/tests/nixops/default.nixnew file+114

This diff is too big to show here.

nixos/tests/nixops/legacy/base-configuration.nixnew file+31

This diff is too big to show here.

nixos/tests/nixops/legacy/nixops.nixnew file+15

This diff is too big to show here.

nixos/tests/nixos-generate-config.nix+1−1

This diff is too big to show here.

nixos/tests/node-red.nixnew file+31

This diff is too big to show here.

nixos/tests/noto-fonts.nixnew file+44

This diff is too big to show here.

nixos/tests/novacomd.nix+1−1

This diff is too big to show here.

nixos/tests/nsd.nix+1

This diff is too big to show here.

nixos/tests/nzbget.nix+17−1

This diff is too big to show here.

nixos/tests/odoo.nixnew file+27

This diff is too big to show here.

nixos/tests/oh-my-zsh.nix+1−1

This diff is too big to show here.

nixos/tests/openarena.nix+2−2

This diff is too big to show here.

nixos/tests/openldap.nix+3−3

This diff is too big to show here.

nixos/tests/openresty-lua.nixnew file+55

This diff is too big to show here.

nixos/tests/opensmtpd-rspamd.nix−1

This diff is too big to show here.

nixos/tests/openssh.nix+12−6

This diff is too big to show here.

nixos/tests/opentabletdriver.nix+1−1

This diff is too big to show here.

nixos/tests/os-prober.nix+10−10

This diff is too big to show here.

nixos/tests/osrm-backend.nix+1−1

This diff is too big to show here.

nixos/tests/overlayfs.nix+28−31

This diff is too big to show here.

nixos/tests/owncast.nixnew file+42

This diff is too big to show here.

nixos/tests/pacemaker.nixnew file+110

This diff is too big to show here.

nixos/tests/packagekit.nix+1−1

This diff is too big to show here.

nixos/tests/pam/pam-file-contents.nixnew file+25

This diff is too big to show here.

nixos/tests/pam-oath-login.nix → nixos/tests/pam/pam-oath-login.nixrenamed+3−3

This diff is too big to show here.

nixos/tests/pam-u2f.nix → nixos/tests/pam/pam-u2f.nixrenamed+2−2

This diff is too big to show here.

nixos/tests/pam/pam-ussh.nixnew file+70

This diff is too big to show here.

nixos/tests/pam/test_chfn.pynew file+27

This diff is too big to show here.

nixos/tests/pantheon.nix+7−8

This diff is too big to show here.

nixos/tests/paperless.nix+25−17

This diff is too big to show here.

nixos/tests/parsedmarc/default.nixnew file+235

This diff is too big to show here.

nixos/tests/pdns-recursor.nix+4−1

This diff is too big to show here.

nixos/tests/pgadmin4-standalone.nixnew file+43

This diff is too big to show here.

nixos/tests/pgadmin4.nixnew file+132

This diff is too big to show here.

nixos/tests/php/default.nix+3−2

This diff is too big to show here.

nixos/tests/php/fpm.nix+18−16

This diff is too big to show here.

nixos/tests/php/httpd.nix+11−9

This diff is too big to show here.

nixos/tests/php/pcre.nix+12−10

This diff is too big to show here.

nixos/tests/pict-rs.nixnew file+17

This diff is too big to show here.

nixos/tests/plasma5-systemd-start.nixnew file+42

This diff is too big to show here.

nixos/tests/plasma5.nix+5−6

This diff is too big to show here.

nixos/tests/plausible.nix+4−1

This diff is too big to show here.

nixos/tests/pleroma.nix+4−20

This diff is too big to show here.

nixos/tests/plikd.nix+1−1

This diff is too big to show here.

nixos/tests/plotinus.nix+2−2

This diff is too big to show here.

nixos/tests/podman-dnsname.nixdeleted−42

This diff is too big to show here.

nixos/tests/podman-tls-ghostunnel.nixdeleted−150

This diff is too big to show here.

nixos/tests/podman.nixdeleted−144

This diff is too big to show here.

nixos/tests/podman/default.nixnew file+144

This diff is too big to show here.

nixos/tests/podman/dnsname.nixnew file+42

This diff is too big to show here.

nixos/tests/podman/tls-ghostunnel.nixnew file+150

This diff is too big to show here.

nixos/tests/postfix-raise-smtpd-tls-security-level.nix+1−1

This diff is too big to show here.

nixos/tests/postfix.nix+1−1

This diff is too big to show here.

nixos/tests/postfixadmin.nixnew file+31

This diff is too big to show here.

nixos/tests/postgresql-wal-receiver.nix+1−1

This diff is too big to show here.

nixos/tests/postgresql.nix+50−3

This diff is too big to show here.

nixos/tests/power-profiles-daemon.nix+1−1

This diff is too big to show here.

nixos/tests/powerdns-admin.nixnew file+117

This diff is too big to show here.

nixos/tests/powerdns.nix+1

This diff is too big to show here.

nixos/tests/predictable-interface-names.nix+1−1

This diff is too big to show here.

nixos/tests/printing.nix+2−10

This diff is too big to show here.

nixos/tests/privacyidea.nix+1−2

This diff is too big to show here.

nixos/tests/privoxy.nix+1−1

This diff is too big to show here.

nixos/tests/prometheus-exporters.nix+141−43

This diff is too big to show here.

nixos/tests/prometheus.nix+91−1

This diff is too big to show here.

nixos/tests/prowlarr.nixnew file+18

This diff is too big to show here.

nixos/tests/pt2-clone.nix+2−2

This diff is too big to show here.

nixos/tests/pulseaudio.nixnew file+71

This diff is too big to show here.

nixos/tests/qboot.nix+1−1

This diff is too big to show here.

nixos/tests/quorum.nix+32−9

This diff is too big to show here.

nixos/tests/rabbitmq.nix+8−2

This diff is too big to show here.

nixos/tests/radicale.nix+1−1

This diff is too big to show here.

nixos/tests/rasdaemon.nixnew file+34

This diff is too big to show here.

nixos/tests/redis.nix+19−17

This diff is too big to show here.

nixos/tests/redmine.nix+1−1

This diff is too big to show here.

nixos/tests/restart-by-activation-script.nixnew file+73

This diff is too big to show here.

nixos/tests/retroarch.nixnew file+49

This diff is too big to show here.

nixos/tests/riak.nix+1−1

This diff is too big to show here.

nixos/tests/rspamd.nix+5−10

This diff is too big to show here.

nixos/tests/rstudio-server.nixnew file+24

This diff is too big to show here.

nixos/tests/rsyslogd.nix+2−2

This diff is too big to show here.

nixos/tests/run-in-machine.nixdeleted−23

This diff is too big to show here.

nixos/tests/sabnzbd.nixnew file+22

This diff is too big to show here.

nixos/tests/samba-wsdd.nix+1−1

This diff is too big to show here.

nixos/tests/samba.nix+1−2

This diff is too big to show here.

nixos/tests/sanoid.nix+16−3

This diff is too big to show here.

nixos/tests/sddm.nix+2−2

This diff is too big to show here.

nixos/tests/seafile.nixnew file+121

This diff is too big to show here.

nixos/tests/service-runner.nix+1−1

This diff is too big to show here.

nixos/tests/sfxr-qt.nixnew file+32

This diff is too big to show here.

nixos/tests/shattered-pixel-dungeon.nix+3−2

This diff is too big to show here.

nixos/tests/shiori.nix+1−2

This diff is too big to show here.

nixos/tests/signal-desktop.nix+23−8

This diff is too big to show here.

nixos/tests/simple.nix+1−1

This diff is too big to show here.

nixos/tests/slurm.nix+1−1

This diff is too big to show here.

nixos/tests/snapcast.nix+9

This diff is too big to show here.

nixos/tests/snapper.nix+1−1

This diff is too big to show here.

nixos/tests/soapui.nixnew file+24

This diff is too big to show here.

nixos/tests/solanum.nix+8

This diff is too big to show here.

nixos/tests/solr.nix+1−1

This diff is too big to show here.

nixos/tests/sourcehut.nix+193−10

This diff is too big to show here.

nixos/tests/spark/default.nixnew file+27

This diff is too big to show here.

nixos/tests/spark/spark_sample.pynew file+40

This diff is too big to show here.

nixos/tests/spike.nixdeleted−22

This diff is too big to show here.

nixos/tests/ssh-keys.nix+1−1

This diff is too big to show here.

nixos/tests/sssd-ldap.nix+79−81

This diff is too big to show here.

nixos/tests/sssd.nix+1−1

This diff is too big to show here.

nixos/tests/starship.nixnew file+42

This diff is too big to show here.

nixos/tests/step-ca.nix+77

This diff is too big to show here.

nixos/tests/sudo.nix+5−1

This diff is too big to show here.

nixos/tests/sway.nix+54−22

This diff is too big to show here.

nixos/tests/switch-test.nix+1016−6

This diff is too big to show here.

nixos/tests/sympa.nix+1−2

This diff is too big to show here.

nixos/tests/syncthing-init.nix+9−9

This diff is too big to show here.

nixos/tests/syncthing-relay.nix+1−1

This diff is too big to show here.

nixos/tests/syncthing.nix+2−2

This diff is too big to show here.

nixos/tests/systemd-analyze.nix+1−1

This diff is too big to show here.

nixos/tests/systemd-binfmt.nix+86−20

This diff is too big to show here.

nixos/tests/systemd-boot.nix+169−5

This diff is too big to show here.

nixos/tests/systemd-confinement.nix+45−24

This diff is too big to show here.

nixos/tests/systemd-cryptenroll.nix+54

This diff is too big to show here.

nixos/tests/systemd-escaping.nix+45

This diff is too big to show here.

nixos/tests/systemd-initrd-btrfs-raid.nix+45

This diff is too big to show here.

nixos/tests/systemd-initrd-luks-keyfile.nix+53

This diff is too big to show here.

nixos/tests/systemd-initrd-luks-password.nix+48

This diff is too big to show here.

nixos/tests/systemd-initrd-simple.nix+44

This diff is too big to show here.

nixos/tests/systemd-initrd-swraid.nix+50

This diff is too big to show here.

nixos/tests/systemd-journal.nix+1−1

This diff is too big to show here.

nixos/tests/systemd-machinectl.nix+85

This diff is too big to show here.

nixos/tests/systemd-misc.nix+62

This diff is too big to show here.

nixos/tests/systemd-networkd-dhcpserver-static-leases.nix+81

This diff is too big to show here.

nixos/tests/systemd-networkd-ipv6-prefix-delegation.nix+5−12

This diff is too big to show here.

nixos/tests/systemd-networkd-vrf.nix+2

This diff is too big to show here.

nixos/tests/systemd-networkd.nix+10

This diff is too big to show here.

nixos/tests/systemd-shutdown.nix+26

This diff is too big to show here.

nixos/tests/systemd-unit-path.nix−47

This diff is too big to show here.

nixos/tests/systemd.nix+17−2

This diff is too big to show here.

nixos/tests/taskserver.nix+1

This diff is too big to show here.

nixos/tests/teeworlds.nix+2−2

This diff is too big to show here.

nixos/tests/telegraf.nix+1−1

This diff is too big to show here.

nixos/tests/teleport.nix+99

This diff is too big to show here.

nixos/tests/terminal-emulators.nix+207

This diff is too big to show here.

nixos/tests/thelounge.nix+29

This diff is too big to show here.

nixos/tests/tigervnc.nix+53

This diff is too big to show here.

nixos/tests/tinydns.nix+15−1

This diff is too big to show here.

nixos/tests/tinywl.nix+57

This diff is too big to show here.

nixos/tests/tomcat.nix+21

This diff is too big to show here.

nixos/tests/tor.nix+10−15

This diff is too big to show here.

nixos/tests/trac.nix−19

This diff is too big to show here.

nixos/tests/traefik.nix+2

This diff is too big to show here.

nixos/tests/trafficserver.nix+1

This diff is too big to show here.

nixos/tests/transmission.nix+1−1

This diff is too big to show here.

nixos/tests/tsm-client-gui.nix+57

This diff is too big to show here.

nixos/tests/tuptime.nix+1−1

This diff is too big to show here.

nixos/tests/turbovnc-headless-server.nix+5−4

This diff is too big to show here.

nixos/tests/tuxguitar.nix+24

This diff is too big to show here.

nixos/tests/txredisapi.nix+29

This diff is too big to show here.

nixos/tests/ucarp.nix+66

This diff is too big to show here.

nixos/tests/ucg.nix−18

This diff is too big to show here.

nixos/tests/udisks2.nix+2−2

This diff is too big to show here.

nixos/tests/unbound.nix+11−2

This diff is too big to show here.

nixos/tests/unifi.nix+36

This diff is too big to show here.

nixos/tests/usbguard.nix+2−2

This diff is too big to show here.

nixos/tests/user-activation-scripts.nix+33

This diff is too big to show here.

nixos/tests/uwsgi.nix+1−1

This diff is too big to show here.

nixos/tests/v2ray.nix+1−1

This diff is too big to show here.

nixos/tests/vault-postgresql.nix+2−3

This diff is too big to show here.

nixos/tests/vault.nix+4−3

This diff is too big to show here.

nixos/tests/vaultwarden.nix+187

This diff is too big to show here.

nixos/tests/vector.nix+1−1

This diff is too big to show here.

nixos/tests/vengi-tools.nix+29

This diff is too big to show here.

nixos/tests/vikunja.nix+65

This diff is too big to show here.

nixos/tests/virtualbox.nix+2−2

This diff is too big to show here.

nixos/tests/vscodium.nix+66−35

This diff is too big to show here.

nixos/tests/vsftpd.nix+42

This diff is too big to show here.

nixos/tests/wasabibackend.nix+1−1

This diff is too big to show here.

nixos/tests/web-apps/mastodon.nix+170

This diff is too big to show here.

nixos/tests/web-apps/netbox.nix+30

This diff is too big to show here.

nixos/tests/web-apps/nifi.nix+30

This diff is too big to show here.

nixos/tests/web-apps/peertube.nix+131

This diff is too big to show here.

nixos/tests/web-servers/agate.nix+29

This diff is too big to show here.

nixos/tests/web-servers/unit-php.nix+1−1

This diff is too big to show here.

nixos/tests/wiki-js.nix+1−1

This diff is too big to show here.

nixos/tests/wine.nix+48

This diff is too big to show here.

nixos/tests/wireguard/wg-quick.nix+1−1

This diff is too big to show here.

nixos/tests/without-nix.nix+32

This diff is too big to show here.

nixos/tests/wmderland.nix+1−1

This diff is too big to show here.

nixos/tests/wordpress.nix+56−23

This diff is too big to show here.

nixos/tests/wpa_supplicant.nix+96

This diff is too big to show here.

nixos/tests/xautolock.nix+1−1

This diff is too big to show here.

nixos/tests/xfce.nix+2−3

This diff is too big to show here.

nixos/tests/xmonad-xdg-autostart.nix+35

This diff is too big to show here.

nixos/tests/xmonad.nix+84−17

This diff is too big to show here.

nixos/tests/xmpp/prosody-mysql.nix+65−33

This diff is too big to show here.

nixos/tests/xmpp/prosody.nix+3−2

This diff is too big to show here.

nixos/tests/xmpp/xmpp-sendmessage.nix+1−4

This diff is too big to show here.

nixos/tests/xrdp.nix+2−2

This diff is too big to show here.

nixos/tests/xss-lock.nix+1−1

This diff is too big to show here.

nixos/tests/xterm.nix+2−2

This diff is too big to show here.

nixos/tests/xxh.nix+67

This diff is too big to show here.

nixos/tests/yabar.nix+2−2

This diff is too big to show here.

nixos/tests/yggdrasil.nix+7−11

This diff is too big to show here.

nixos/tests/yq.nix−12

This diff is too big to show here.

nixos/tests/zammad.nix+60

This diff is too big to show here.

nixos/tests/zfs.nix+74−1

This diff is too big to show here.

nixos/tests/zigbee2mqtt.nix+1−1

This diff is too big to show here.

nixos/tests/zoneminder.nix+1−1

This diff is too big to show here.

nixos/tests/zrepl.nix+66

This diff is too big to show here.

nixos/tests/zsh-history.nix+1−1

This diff is too big to show here.

pkgs/applications/accessibility/contrast/default.nix+14−14

This diff is too big to show here.

pkgs/applications/accessibility/espeakup/default.nix+46

This diff is too big to show here.

pkgs/applications/accessibility/squeekboard/default.nix+9−6

This diff is too big to show here.

pkgs/applications/accessibility/svkbd/default.nix+2−2

This diff is too big to show here.

pkgs/applications/accessibility/wvkbd/default.nix+36

This diff is too big to show here.

pkgs/applications/audio/CHOWTapeModel/default.nix+41−33

This diff is too big to show here.

pkgs/applications/audio/ChowCentaur/default.nix+53

This diff is too big to show here.

pkgs/applications/audio/ChowKick/default.nix+106

This diff is too big to show here.

pkgs/applications/audio/ChowPhaser/default.nix+76

This diff is too big to show here.

pkgs/applications/audio/LibreArp/default.nix+53

This diff is too big to show here.

pkgs/applications/audio/LibreArp/lv2.nix+53

This diff is too big to show here.

pkgs/applications/audio/MMA/default.nix+6−6

This diff is too big to show here.

pkgs/applications/audio/a2jmidid/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/aacgain/default.nix+3−2

This diff is too big to show here.

pkgs/applications/audio/adlplug/default.nix+76−14

This diff is too big to show here.

pkgs/applications/audio/aeolus/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/aether-lv2/default.nix+33

This diff is too big to show here.

pkgs/applications/audio/airwave/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/aj-snapshot/default.nix+4−5

This diff is too big to show here.

pkgs/applications/audio/amberol/default.nix+75

This diff is too big to show here.

pkgs/applications/audio/ams/default.nix+3−3

This diff is too big to show here.

pkgs/applications/audio/ardour/5.nix−161

This diff is too big to show here.

pkgs/applications/audio/ardour/default.nix+5−5

This diff is too big to show here.

pkgs/applications/audio/ashuffle/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/audacious/default.nix+10−8

This diff is too big to show here.

pkgs/applications/audio/audacity/default.nix+99−52

This diff is too big to show here.

pkgs/applications/audio/audio-recorder/default.nix+1−1

This diff is too big to show here.

pkgs/applications/audio/aumix/default.nix+28−13

This diff is too big to show here.

pkgs/applications/audio/axoloti/libusb1.nix+7−6

This diff is too big to show here.

pkgs/applications/audio/bambootracker/default.nix+9−21

This diff is too big to show here.

pkgs/applications/audio/bchoppr/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/bespokesynth/default.nix+148

This diff is too big to show here.

pkgs/applications/audio/bitwig-studio/bitwig-studio1.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/bitwig-studio/bitwig-studio2.nix+1−1

This diff is too big to show here.

pkgs/applications/audio/bitwig-studio/bitwig-studio3.nix+7−3

This diff is too big to show here.

pkgs/applications/audio/bitwig-studio/bitwig-studio4.nix+80

This diff is too big to show here.

pkgs/applications/audio/bjumblr/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/blanket/default.nix+69

This diff is too big to show here.

pkgs/applications/audio/boops/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/bristol/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/bschaffl/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/bsequencer/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/bucklespring/default.nix+3−3

This diff is too big to show here.

pkgs/applications/audio/cadence/default.nix+48−38

This diff is too big to show here.

pkgs/applications/audio/callaudiod/default.nix+7−5

This diff is too big to show here.

pkgs/applications/audio/cantata/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/cardinal/default.nix+67

This diff is too big to show here.

pkgs/applications/audio/carla/default.nix+13−5

This diff is too big to show here.

pkgs/applications/audio/caudec/default.nix+6−10

This diff is too big to show here.

pkgs/applications/audio/cava/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/cdparanoia/default.nix+16−6

This diff is too big to show here.

pkgs/applications/audio/chuck/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/cider/default.nix+30

This diff is too big to show here.

pkgs/applications/audio/clementine/default.nix+5−12

This diff is too big to show here.

pkgs/applications/audio/clerk/default.nix+33−10

This diff is too big to show here.

pkgs/applications/audio/cmt/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/cmus/default.nix+6−6

This diff is too big to show here.

pkgs/applications/audio/cmusfm/default.nix+16−10

This diff is too big to show here.

pkgs/applications/audio/cozy-audiobooks/default.nix−87

This diff is too big to show here.

pkgs/applications/audio/cozy/default.nix+92

This diff is too big to show here.

pkgs/applications/audio/crip/default.nix+3−2

This diff is too big to show here.

pkgs/applications/audio/csound/default.nix+6−9

This diff is too big to show here.

pkgs/applications/audio/cyanrip/default.nix+34

This diff is too big to show here.

pkgs/applications/audio/deadbeef/default.nix+3−4

This diff is too big to show here.

pkgs/applications/audio/deadbeef/plugins/statusnotifier.nix+39

This diff is too big to show here.

pkgs/applications/audio/denemo/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/dfasma/default.nix+1−3

This diff is too big to show here.

pkgs/applications/audio/diopser/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/dirt/default.nix+2−1

This diff is too big to show here.

pkgs/applications/audio/distrho/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/dragonfly-reverb/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/drumgizmo/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/drumkv1/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/easyeffects/default.nix+113

This diff is too big to show here.

pkgs/applications/audio/ecasound/default.nix+13−2

This diff is too big to show here.

pkgs/applications/audio/eflite/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/ensemble-chorus/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/espeak-ng/default.nix+10

This diff is too big to show here.

pkgs/applications/audio/espeak/default.nix+3−2

This diff is too big to show here.

pkgs/applications/audio/espeak/edit.nix+3−2

This diff is too big to show here.

pkgs/applications/audio/eteroj.lv2/default.nix−23

This diff is too big to show here.

pkgs/applications/audio/exaile/default.nix+107

This diff is too big to show here.

pkgs/applications/audio/faust/faust2.nix+11−3

This diff is too big to show here.

pkgs/applications/audio/faust/faust2alqt.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/faust/faust2alsa.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/faust/faust2jack.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/faust/faust2jaqt.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/faust/faustlive.nix+11−14

This diff is too big to show here.

pkgs/applications/audio/faustPhysicalModeling/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/flac/default.nix+2−10

This diff is too big to show here.

pkgs/applications/audio/fluidsynth/default.nix+9−25

This diff is too big to show here.

pkgs/applications/audio/fmit/default.nix+3−5

This diff is too big to show here.

pkgs/applications/audio/fomp/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/foo-yc20/default.nix−29

This diff is too big to show here.

pkgs/applications/audio/freac/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/freewheeling/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/freqtweak/default.nix+1−1

This diff is too big to show here.

pkgs/applications/audio/friture/default.nix+21−8

This diff is too big to show here.

pkgs/applications/audio/friture/factorial.patch−13

This diff is too big to show here.

pkgs/applications/audio/friture/unlock_constraints.patch−34

This diff is too big to show here.

pkgs/applications/audio/ft2-clone/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/furnace/default.nix+100

This diff is too big to show here.

pkgs/applications/audio/game-music-emu/default.nix+1−1

This diff is too big to show here.

pkgs/applications/audio/gbsplay/default.nix+17−13

This diff is too big to show here.

pkgs/applications/audio/geonkick/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/giada/default.nix+40−26

This diff is too big to show here.

pkgs/applications/audio/gigedit/default.nix+20−3

This diff is too big to show here.

pkgs/applications/audio/gmu/default.nix+22−3

This diff is too big to show here.

pkgs/applications/audio/gnome-podcasts/default.nix+15−3

This diff is too big to show here.

pkgs/applications/audio/goattracker/default.nix+2−3

This diff is too big to show here.

pkgs/applications/audio/google-play-music-desktop-player/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/gpodder/default.nix+15−5

This diff is too big to show here.

pkgs/applications/audio/gpodder/disable-autoupdate.patch+8−29

This diff is too big to show here.

pkgs/applications/audio/grandorgue/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/greg/default.nix+3−3

This diff is too big to show here.

pkgs/applications/audio/gspeech/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/gtklick/default.nix−34

This diff is too big to show here.

pkgs/applications/audio/gtkpod/default.nix+5−4

This diff is too big to show here.

pkgs/applications/audio/guitarix/default.nix+4−2

This diff is too big to show here.

pkgs/applications/audio/gwc/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/helio-workstation/default.nix+7−7

This diff is too big to show here.

pkgs/applications/audio/helm/default.nix+7−12

This diff is too big to show here.

pkgs/applications/audio/helvum/default.nix+36−23

This diff is too big to show here.

pkgs/applications/audio/hivelytracker/default.nix+1−1

This diff is too big to show here.

pkgs/applications/audio/hqplayer-desktop/default.nix+92

This diff is too big to show here.

pkgs/applications/audio/hushboard/default.nix+73

This diff is too big to show here.

pkgs/applications/audio/hybridreverb2/default.nix+45−10

This diff is too big to show here.

pkgs/applications/audio/hydrogen/0.nix+28−6

This diff is too big to show here.

pkgs/applications/audio/hydrogen/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/iannix/default.nix+2−4

This diff is too big to show here.

pkgs/applications/audio/in-formant/default.nix+45

This diff is too big to show here.

pkgs/applications/audio/indicator-sound-switcher/default.nix+62

This diff is too big to show here.

pkgs/applications/audio/industrializer/default.nix+3−5

This diff is too big to show here.

pkgs/applications/audio/jaaa/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/jack-rack/default.nix+5−4

This diff is too big to show here.

pkgs/applications/audio/jackmeter/default.nix+3−2

This diff is too big to show here.

pkgs/applications/audio/jackmix/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/jacktrip/default.nix+61

This diff is too big to show here.

pkgs/applications/audio/jamesdsp/default.nix+95

This diff is too big to show here.

pkgs/applications/audio/jamin/default.nix+1−1

This diff is too big to show here.

pkgs/applications/audio/jamulus/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/japa/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/jconvolver/default.nix+114

This diff is too big to show here.

pkgs/applications/audio/jellycli/default.nix+33

This diff is too big to show here.

pkgs/applications/audio/jellycli/fix-test-dir.patch+13

This diff is too big to show here.

pkgs/applications/audio/jmusicbot/default.nix+3−3

This diff is too big to show here.

pkgs/applications/audio/kapitonov-plugins-pack/default.nix+1−1

This diff is too big to show here.

pkgs/applications/audio/kid3/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/kmetronome/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/ladspa-plugins/default.nix+17−7

This diff is too big to show here.

pkgs/applications/audio/lash/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/lastfmsubmitd/default.nix−21

This diff is too big to show here.

pkgs/applications/audio/librespot/cargo-lock.patch−3817

This diff is too big to show here.

pkgs/applications/audio/librespot/default.nix+13−19

This diff is too big to show here.

pkgs/applications/audio/lingot/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/linuxband/default.nix−37

This diff is too big to show here.

pkgs/applications/audio/linuxsampler/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/lmms/default.nix+5−5

This diff is too big to show here.

pkgs/applications/audio/lollypop/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/losslessaudiochecker/default.nix+29

This diff is too big to show here.

pkgs/applications/audio/lsp-plugins/default.nix+10−3

This diff is too big to show here.

pkgs/applications/audio/lv2lint/default.nix+22

This diff is too big to show here.

pkgs/applications/audio/lyrebird/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/magnetophonDSP/faustCompressors/default.nix+1−1

This diff is too big to show here.

pkgs/applications/audio/mamba/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/mbrola/default.nix+3

This diff is too big to show here.

pkgs/applications/audio/meters_lv2/default.nix+43−36

This diff is too big to show here.

pkgs/applications/audio/mhwaveedit/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/mi2ly/default.nix+16−25

This diff is too big to show here.

pkgs/applications/audio/mi2ly/default.upstream−3

This diff is too big to show here.

pkgs/applications/audio/mid2key/default.nix+8−5

This diff is too big to show here.

pkgs/applications/audio/midas/generic.nix+6−7

This diff is too big to show here.

pkgs/applications/audio/midi-visualizer/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/mikmod/default.nix+3−2

This diff is too big to show here.

pkgs/applications/audio/milkytracker/default.nix+10−4

This diff is too big to show here.

pkgs/applications/audio/mimic/default.nix+15−7

This diff is too big to show here.

pkgs/applications/audio/mimms/default.nix−31

This diff is too big to show here.

pkgs/applications/audio/miniaudicle/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/mixxx/default.nix+118−34

This diff is too big to show here.

pkgs/applications/audio/mmtc/default.nix+6−7

This diff is too big to show here.

pkgs/applications/audio/moc/default.nix+6−4

This diff is too big to show here.

pkgs/applications/audio/mod-arpeggiator-lv2/default.nix+26

This diff is too big to show here.

pkgs/applications/audio/mod-distortion/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/molot-lite/default.nix+5−4

This diff is too big to show here.

pkgs/applications/audio/mopidy/default.nix+6

This diff is too big to show here.

pkgs/applications/audio/mopidy/iris.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/mopidy/jellyfin.nix+25

This diff is too big to show here.

pkgs/applications/audio/mopidy/mopidy.nix+3−3

This diff is too big to show here.

pkgs/applications/audio/mopidy/mpd.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/mopidy/mpris.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/mopidy/muse.nix+29

This diff is too big to show here.

pkgs/applications/audio/mopidy/spotify.nix+9−7

This diff is too big to show here.

pkgs/applications/audio/mopidy/youtube.nix+43−15

This diff is too big to show here.

pkgs/applications/audio/mopidy/ytmusic.nix+35

This diff is too big to show here.

pkgs/applications/audio/mousai/default.nix+12−2

This diff is too big to show here.

pkgs/applications/audio/mousai/paths.patch+13

This diff is too big to show here.

pkgs/applications/audio/mp3blaster/default.nix+11−1

This diff is too big to show here.

pkgs/applications/audio/mp3gain/default.nix+4−3

This diff is too big to show here.

pkgs/applications/audio/mp3info/default.nix+3−2

This diff is too big to show here.

pkgs/applications/audio/mpc/default.nix+41−13

This diff is too big to show here.

pkgs/applications/audio/mpdevil/default.nix+4−3

This diff is too big to show here.

pkgs/applications/audio/mpg123/default.nix+36−13

This diff is too big to show here.

pkgs/applications/audio/mpg321/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/munt/default.nix−38

This diff is too big to show here.

pkgs/applications/audio/munt/libmt32emu.nix+38

This diff is too big to show here.

pkgs/applications/audio/munt/mt32emu-qt.nix+75

This diff is too big to show here.

pkgs/applications/audio/munt/mt32emu-smf2wav.nix+50

This diff is too big to show here.

pkgs/applications/audio/muse/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/musescore/darwin.nix−1

This diff is too big to show here.

pkgs/applications/audio/musescore/default.nix+8−7

This diff is too big to show here.

pkgs/applications/audio/musikcube/default.nix+21−6

This diff is too big to show here.

pkgs/applications/audio/mympd/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/ncmpc/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/ncspot/default.nix+15−17

This diff is too big to show here.

pkgs/applications/audio/netease-cloud-music-gtk/cargo-lock.patch+2007

This diff is too big to show here.

pkgs/applications/audio/netease-cloud-music-gtk/default.nix+60

This diff is too big to show here.

pkgs/applications/audio/netease-cloud-music-gtk/update-cargo-lock.sh+20

This diff is too big to show here.

pkgs/applications/audio/netease-music-tui/default.nix+5−5

This diff is too big to show here.

pkgs/applications/audio/new-session-manager/default.nix+3−3

This diff is too big to show here.

pkgs/applications/audio/noise-repellent/default.nix+11−9

This diff is too big to show here.

pkgs/applications/audio/noisetorch/default.nix+11−18

This diff is too big to show here.

pkgs/applications/audio/noisetorch/version.patch−37

This diff is too big to show here.

pkgs/applications/audio/non/default.nix+7−7

This diff is too big to show here.

pkgs/applications/audio/nootka/default.nix+5−4

This diff is too big to show here.

pkgs/applications/audio/nootka/unstable.nix+25−7

This diff is too big to show here.

pkgs/applications/audio/ocenaudio/default.nix+5−5

This diff is too big to show here.

pkgs/applications/audio/odin2/default.nix+79

This diff is too big to show here.

pkgs/applications/audio/open-music-kontrollers/eteroj.nix+10

This diff is too big to show here.

pkgs/applications/audio/open-music-kontrollers/generic.nix+37

This diff is too big to show here.

pkgs/applications/audio/open-music-kontrollers/jit.nix+12

This diff is too big to show here.

pkgs/applications/audio/open-music-kontrollers/mephisto.nix+17

This diff is too big to show here.

pkgs/applications/audio/open-music-kontrollers/midi_matrix.nix+10

This diff is too big to show here.

pkgs/applications/audio/open-music-kontrollers/moony.nix+13

This diff is too big to show here.

pkgs/applications/audio/open-music-kontrollers/orbit.nix+12

This diff is too big to show here.

pkgs/applications/audio/open-music-kontrollers/patchmatrix.nix+13

This diff is too big to show here.

pkgs/applications/audio/open-music-kontrollers/router.nix+11

This diff is too big to show here.

pkgs/applications/audio/open-music-kontrollers/sherlock.nix+12

This diff is too big to show here.

pkgs/applications/audio/open-music-kontrollers/synthpod.nix+13

This diff is too big to show here.

pkgs/applications/audio/open-music-kontrollers/vm.nix+10

This diff is too big to show here.

pkgs/applications/audio/openmpt123/default.nix−31

This diff is too big to show here.

pkgs/applications/audio/opus-tools/default.nix+4−2

This diff is too big to show here.

pkgs/applications/audio/orca-c/default.nix+5−2

This diff is too big to show here.

pkgs/applications/audio/osdlyrics/default.nix+87

This diff is too big to show here.

pkgs/applications/audio/osmid/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/oxefmsynth/default.nix+1−1

This diff is too big to show here.

pkgs/applications/audio/padthv1/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/pamix/default.nix+15−1

This diff is too big to show here.

pkgs/applications/audio/pamixer/default.nix+6−6

This diff is too big to show here.

pkgs/applications/audio/paprefs/default.nix+6−4

This diff is too big to show here.

pkgs/applications/audio/parlatype/default.nix−68

This diff is too big to show here.

pkgs/applications/audio/patchage/default.nix+33−11

This diff is too big to show here.

pkgs/applications/audio/pavucontrol/default.nix+24−15

This diff is too big to show here.

pkgs/applications/audio/pd-plugins/zexy/default.nix+2−1

This diff is too big to show here.

pkgs/applications/audio/petrifoo/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/pianobar/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/pianobooster/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/pianoteq/default.nix+200

This diff is too big to show here.

pkgs/applications/audio/picard/default.nix+6−3

This diff is too big to show here.

pkgs/applications/audio/picoloop/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/pifi/Gemfile−2

This diff is too big to show here.

pkgs/applications/audio/pifi/Gemfile.lock−39

This diff is too big to show here.

pkgs/applications/audio/pifi/default.nix−18

This diff is too big to show here.

pkgs/applications/audio/pifi/gemset.nix−137

This diff is too big to show here.

pkgs/applications/audio/pipecontrol/default.nix+50

This diff is too big to show here.

pkgs/applications/audio/pithos/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/plexamp/default.nix+6−7

This diff is too big to show here.

pkgs/applications/audio/plujain-ramp/default.nix+1−1

This diff is too big to show here.

pkgs/applications/audio/pmidi/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/pocket-casts/default.nix+55

This diff is too big to show here.

pkgs/applications/audio/polyphone/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/praat/default.nix+17−13

This diff is too big to show here.

pkgs/applications/audio/psst/default.nix+39

This diff is too big to show here.

pkgs/applications/audio/pt2-clone/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/ptcollab/default.nix+15−10

This diff is too big to show here.

pkgs/applications/audio/puddletag/default.nix+46−9

This diff is too big to show here.

pkgs/applications/audio/pulseaudio-ctl/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/pulseaudio-dlna/0001-setup.py-remove-dbus-python-from-list.patch+25

This diff is too big to show here.

pkgs/applications/audio/pulseaudio-dlna/default.nix+54−33

This diff is too big to show here.

pkgs/applications/audio/pulseaudio-modules-bt/default.nix−91

This diff is too big to show here.

pkgs/applications/audio/pulseaudio-modules-bt/fix-install-path.patch−11

This diff is too big to show here.

pkgs/applications/audio/pulseeffects/default.nix−127

This diff is too big to show here.

pkgs/applications/audio/puredata/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/pyradio/default.nix+30

This diff is too big to show here.

pkgs/applications/audio/qjackctl/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/qmidiarp/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/qmidinet/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/qmidiroute/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/qmmp/default.nix+5−5

This diff is too big to show here.

pkgs/applications/audio/qpwgraph/default.nix+34

This diff is too big to show here.

pkgs/applications/audio/qsynth/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/qtractor/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/quodlibet/default.nix+1−1

This diff is too big to show here.

pkgs/applications/audio/r128gain/default.nix+2−8

This diff is too big to show here.

pkgs/applications/audio/radiotray-ng/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/rakarrack/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/reaper/default.nix+10−7

This diff is too big to show here.

pkgs/applications/audio/redux/default.nix+49

This diff is too big to show here.

pkgs/applications/audio/renoise/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/rhvoice/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/rhythmbox/default.nix+50−5

This diff is too big to show here.

pkgs/applications/audio/rofi-pulse-select/default.nix+40

This diff is too big to show here.

pkgs/applications/audio/roomeqwizard/default.nix+118

This diff is too big to show here.

pkgs/applications/audio/rosegarden/default.nix+28−10

This diff is too big to show here.

pkgs/applications/audio/rubyripper/default.nix+23−11

This diff is too big to show here.

pkgs/applications/audio/rymcast/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/samplv1/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/sayonara/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/sc68/default.nix+3−3

This diff is too big to show here.

pkgs/applications/audio/schismtracker/default.nix+8−6

This diff is too big to show here.

pkgs/applications/audio/scream/default.nix+7−4

This diff is too big to show here.

pkgs/applications/audio/seq24/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/seq66/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/setbfree/default.nix+8−6

This diff is too big to show here.

pkgs/applications/audio/sfizz/default.nix+15−12

This diff is too big to show here.

pkgs/applications/audio/sfxr-qt/default.nix+29−3

This diff is too big to show here.

pkgs/applications/audio/sfxr-qt/test-export-square-wave/default.nix+6

This diff is too big to show here.

pkgs/applications/audio/sfxr-qt/test-export-square-wave/input.sfxj+29

This diff is too big to show here.

pkgs/applications/audio/shortwave/default.nix+13−15

This diff is too big to show here.

pkgs/applications/audio/sidplayfp/default.nix+11−4

This diff is too big to show here.

pkgs/applications/audio/sisco.lv2/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/snapcast/default.nix+8−5

This diff is too big to show here.

pkgs/applications/audio/snd/default.nix+7−4

This diff is too big to show here.

pkgs/applications/audio/sndpeek/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/songrec/default.nix+10−5

This diff is too big to show here.

pkgs/applications/audio/sonic-lineup/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/sonic-pi/default.nix+62−39

This diff is too big to show here.

pkgs/applications/audio/sonic-visualiser/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/sonixd/default.nix+27

This diff is too big to show here.

pkgs/applications/audio/sony-headphones-client/default.nix+44

This diff is too big to show here.

pkgs/applications/audio/sooperlooper/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/sorcer/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/sound-juicer/default.nix+10

This diff is too big to show here.

pkgs/applications/audio/soundconverter/default.nix+85

This diff is too big to show here.

pkgs/applications/audio/soundkonverter/default.nix+1−1

This diff is too big to show here.

pkgs/applications/audio/soundscape-renderer/default.nix+13−11

This diff is too big to show here.

pkgs/applications/audio/soundtracker/default.nix+29−11

This diff is too big to show here.

pkgs/applications/audio/soundwireserver/default.nix+40

This diff is too big to show here.

pkgs/applications/audio/spectmorph/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/split2flac/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/spot/default.nix+14−9

This diff is too big to show here.

pkgs/applications/audio/spotify-qt/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/spotify-tui/default.nix+4−3

This diff is too big to show here.

pkgs/applications/audio/spotify/default.nix+17−12

This diff is too big to show here.

pkgs/applications/audio/spotifyd/default.nix+12−11

This diff is too big to show here.

pkgs/applications/audio/sptlrx/default.nix+24

This diff is too big to show here.

pkgs/applications/audio/squeezelite/default.nix+48−30

This diff is too big to show here.

pkgs/applications/audio/squishyball/default.nix+21−11

This diff is too big to show here.

pkgs/applications/audio/stochas/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/strawberry/default.nix+29−20

This diff is too big to show here.

pkgs/applications/audio/sublime-music/default.nix+14−7

This diff is too big to show here.

pkgs/applications/audio/sunvox/default.nix+5−5

This diff is too big to show here.

pkgs/applications/audio/surge-XT/default.nix+93

This diff is too big to show here.

pkgs/applications/audio/swh-lv2/default.nix+6−4

This diff is too big to show here.

pkgs/applications/audio/synaesthesia/default.nix+33

This diff is too big to show here.

pkgs/applications/audio/synthv1/default.nix+4−4

This diff is too big to show here.

pkgs/applications/audio/tageditor/default.nix−2

This diff is too big to show here.

pkgs/applications/audio/tagutil/default.nix+45

This diff is too big to show here.

pkgs/applications/audio/tauon/default.nix+122

This diff is too big to show here.

pkgs/applications/audio/tenacity/default.nix+148

This diff is too big to show here.

pkgs/applications/audio/termusic/default.nix+28

This diff is too big to show here.

pkgs/applications/audio/timemachine/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/tonelib-gfx/default.nix+58

This diff is too big to show here.

pkgs/applications/audio/tonelib-jam/default.nix+61

This diff is too big to show here.

pkgs/applications/audio/tonelib-metal/default.nix+60

This diff is too big to show here.

pkgs/applications/audio/tonelib-zoom/default.nix+63

This diff is too big to show here.

pkgs/applications/audio/tony/default.nix+5−4

This diff is too big to show here.

pkgs/applications/audio/transcode/default.nix+3−2

This diff is too big to show here.

pkgs/applications/audio/transcribe/default.nix+50−13

This diff is too big to show here.

pkgs/applications/audio/traverso/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/tunefish/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/uade123/default.nix+62−13

This diff is too big to show here.

pkgs/applications/audio/vcv-rack/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/vgmstream/default.nix+42

This diff is too big to show here.

pkgs/applications/audio/vgmstream/update.sh+77

This diff is too big to show here.

pkgs/applications/audio/vimpc/default.nix+11

This diff is too big to show here.

pkgs/applications/audio/viper4linux-gui/default.nix+82

This diff is too big to show here.

pkgs/applications/audio/viper4linux/default.nix+61

This diff is too big to show here.

pkgs/applications/audio/virtual-ans/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/vkeybd/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/vmpk/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/vocal/default.nix+9−2

This diff is too big to show here.

pkgs/applications/audio/wavegain/default.nix+15−2

This diff is too big to show here.

pkgs/applications/audio/whipper/default.nix+19−1

This diff is too big to show here.

pkgs/applications/audio/x42-avldrums/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/x42-plugins/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/xmp/default.nix+5−4

This diff is too big to show here.

pkgs/applications/audio/xsynth-dssi/default.nix+3−2

This diff is too big to show here.

pkgs/applications/audio/yoshimi/default.nix+49−18

This diff is too big to show here.

pkgs/applications/audio/zam-plugins/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/zita-ajbridge/default.nix+5−4

This diff is too big to show here.

pkgs/applications/audio/zita-at1/default.nix+3−2

This diff is too big to show here.

pkgs/applications/audio/zita-njbridge/default.nix+2−2

This diff is too big to show here.

pkgs/applications/audio/zrythm/default.nix+174

This diff is too big to show here.

pkgs/applications/audio/zynaddsubfx/default.nix+16−3

This diff is too big to show here.

pkgs/applications/backup/areca/default.nix+6−3

This diff is too big to show here.

pkgs/applications/backup/deja-dup/default.nix+12−12

This diff is too big to show here.

pkgs/applications/backup/deja-dup/fix-paths.patch+3−3

This diff is too big to show here.

pkgs/applications/backup/pika-backup/default.nix+12−3

This diff is too big to show here.

pkgs/applications/backup/restique/default.nix+41

This diff is too big to show here.

pkgs/applications/backup/urbackup-client/default.nix+23

This diff is too big to show here.

pkgs/applications/backup/vorta/default.nix+59−13

This diff is too big to show here.

pkgs/applications/blockchains/aeon/default.nix+2−2

This diff is too big to show here.

pkgs/applications/blockchains/alfis/default.nix+56

This diff is too big to show here.

pkgs/applications/blockchains/besu/default.nix+29

This diff is too big to show here.

pkgs/applications/blockchains/bisq-desktop/default.nix+101

This diff is too big to show here.

pkgs/applications/blockchains/bisq-desktop/update.sh+22

This diff is too big to show here.

pkgs/applications/blockchains/bitcoin-abc.nix−50

This diff is too big to show here.

pkgs/applications/blockchains/bitcoin-abc/default.nix+76

This diff is too big to show here.

pkgs/applications/blockchains/bitcoin-abc/fix-bitcoin-qt-build.patch

This diff is too big to show here.

pkgs/applications/blockchains/bitcoin-classic.nix−56

This diff is too big to show here.

pkgs/applications/blockchains/bitcoin-classic/default.nix+76

This diff is too big to show here.

pkgs/applications/blockchains/bitcoin-gold/default.nix

This diff is too big to show here.

pkgs/applications/blockchains/bitcoin-knots.nix−41

This diff is too big to show here.

pkgs/applications/blockchains/bitcoin-knots/default.nix+83

This diff is too big to show here.

pkgs/applications/blockchains/bitcoin-unlimited.nix−66

This diff is too big to show here.

pkgs/applications/blockchains/bitcoin-unlimited/default.nix+66

This diff is too big to show here.

pkgs/applications/blockchains/bitcoin.nix−104

This diff is too big to show here.

pkgs/applications/blockchains/bitcoin/default.nix+108

This diff is too big to show here.

pkgs/applications/blockchains/btcpayserver/default.nix+14−38

This diff is too big to show here.

pkgs/applications/blockchains/btcpayserver/deps.nix+687−602

This diff is too big to show here.

pkgs/applications/blockchains/btcpayserver/update.sh+2−1

This diff is too big to show here.

pkgs/applications/blockchains/cgminer/default.nix+2−2

This diff is too big to show here.

pkgs/applications/blockchains/charge-lnd/default.nix+2−2

This diff is too big to show here.

pkgs/applications/blockchains/chia-plotter/default.nix+72

This diff is too big to show here.

pkgs/applications/blockchains/chia-plotter/dont_fetch_dependencies.patch+63

This diff is too big to show here.

pkgs/applications/blockchains/chia/default.nix+37−12

This diff is too big to show here.

pkgs/applications/blockchains/chia/dependencies.patch−13

This diff is too big to show here.

pkgs/applications/blockchains/clightning.nix−63

This diff is too big to show here.

pkgs/applications/blockchains/clightning/default.nix+71

This diff is too big to show here.

pkgs/applications/blockchains/crypto-org-wallet.nix−33

This diff is too big to show here.

pkgs/applications/blockchains/crypto-org-wallet/default.nix+33

This diff is too big to show here.

pkgs/applications/blockchains/cryptop/default.nix+2−2

This diff is too big to show here.

pkgs/applications/blockchains/dashpay.nix−44

This diff is too big to show here.

pkgs/applications/blockchains/dashpay/default.nix+44

This diff is too big to show here.

pkgs/applications/blockchains/dcrd/default.nix

This diff is too big to show here.

pkgs/applications/blockchains/dcrwallet/default.nix

This diff is too big to show here.

pkgs/applications/blockchains/dero.nix−25

This diff is too big to show here.

pkgs/applications/blockchains/digibyte/default.nix

This diff is too big to show here.

pkgs/applications/blockchains/dogecoin.nix−41

This diff is too big to show here.

pkgs/applications/blockchains/dogecoin/default.nix+41

This diff is too big to show here.

pkgs/applications/blockchains/eclair/default.nix+38

This diff is too big to show here.

pkgs/applications/blockchains/electrs.nix−30

This diff is too big to show here.

pkgs/applications/blockchains/electrs/default.nix+42

This diff is too big to show here.

pkgs/applications/blockchains/electrs/update.sh+40

This diff is too big to show here.

pkgs/applications/blockchains/elements/default.nix+84

This diff is too big to show here.

pkgs/applications/blockchains/ergo/default.nix+2−2

This diff is too big to show here.

pkgs/applications/blockchains/erigon.nix+34

This diff is too big to show here.

pkgs/applications/blockchains/ethabi/default.nix−1

This diff is too big to show here.

pkgs/applications/blockchains/exodus/default.nix+6−5

This diff is too big to show here.

pkgs/applications/blockchains/faraday/default.nix+4−4

This diff is too big to show here.

pkgs/applications/blockchains/fulcrum/default.nix+36

This diff is too big to show here.

pkgs/applications/blockchains/go-ethereum.nix−59

This diff is too big to show here.

pkgs/applications/blockchains/go-ethereum/default.nix+61

This diff is too big to show here.

pkgs/applications/blockchains/groestlcoin/default.nix+93

This diff is too big to show here.

pkgs/applications/blockchains/ledger-live-desktop/default.nix+18−5

This diff is too big to show here.

pkgs/applications/blockchains/ledger-live-desktop/systemd.patch+14

This diff is too big to show here.

pkgs/applications/blockchains/lightning-loop/default.nix+27

This diff is too big to show here.

pkgs/applications/blockchains/lightning-pool/default.nix+27

This diff is too big to show here.

pkgs/applications/blockchains/lightwalletd/default.nix+37

This diff is too big to show here.

pkgs/applications/blockchains/litecoin.nix−55

This diff is too big to show here.

pkgs/applications/blockchains/litecoin/default.nix+54

This diff is too big to show here.

pkgs/applications/blockchains/lnd.nix−40

This diff is too big to show here.

pkgs/applications/blockchains/lnd/default.nix+40

This diff is too big to show here.

pkgs/applications/blockchains/lndconnect/default.nix+1−1

This diff is too big to show here.

pkgs/applications/blockchains/lndmanage.nix−44

This diff is too big to show here.

pkgs/applications/blockchains/lndmanage/default.nix+44

This diff is too big to show here.

pkgs/applications/blockchains/masari/default.nix

This diff is too big to show here.

pkgs/applications/blockchains/monero-cli/default.nix+60

This diff is too big to show here.

pkgs/applications/blockchains/monero-cli/use-system-libraries.patch+52

This diff is too big to show here.

pkgs/applications/blockchains/monero-gui/default.nix+14−19

This diff is too big to show here.

pkgs/applications/blockchains/monero/default.nix−68

This diff is too big to show here.

pkgs/applications/blockchains/monero/use-system-libraries.patch−69

This diff is too big to show here.

pkgs/applications/blockchains/mycrypto/default.nix+4−4

This diff is too big to show here.

pkgs/applications/blockchains/namecoin.nix−48

This diff is too big to show here.

pkgs/applications/blockchains/namecoin/default.nix+47

This diff is too big to show here.

pkgs/applications/blockchains/nano-wallet/default.nix+4−3

This diff is too big to show here.

pkgs/applications/blockchains/nbxplorer/default.nix+12−36

This diff is too big to show here.

pkgs/applications/blockchains/nbxplorer/deps.nix+263−243

This diff is too big to show here.

pkgs/applications/blockchains/nbxplorer/update.sh+1−1

This diff is too big to show here.

pkgs/applications/blockchains/nbxplorer/util/create-deps.sh+4−3

This diff is too big to show here.

pkgs/applications/blockchains/nbxplorer/util/update-common.sh+5−4

This diff is too big to show here.

pkgs/applications/blockchains/nearcore/default.nix+42

This diff is too big to show here.

pkgs/applications/blockchains/openethereum/default.nix+6−6

This diff is too big to show here.

pkgs/applications/blockchains/oxen/default.nix+68

This diff is too big to show here.

pkgs/applications/blockchains/parity-ui/default.nix−48

This diff is too big to show here.

pkgs/applications/blockchains/parity-ui/env.nix−19

This diff is too big to show here.

pkgs/applications/blockchains/particl-core/default.nix+56

This diff is too big to show here.

pkgs/applications/blockchains/particl/particl-core.nix−53

This diff is too big to show here.

pkgs/applications/blockchains/pivx.nix−59

This diff is too big to show here.

pkgs/applications/blockchains/pivx/default.nix+78

This diff is too big to show here.

pkgs/applications/blockchains/polkadot/default.nix+27−4

This diff is too big to show here.

pkgs/applications/blockchains/quorum/default.nix

This diff is too big to show here.

pkgs/applications/blockchains/snarkos/default.nix+61

This diff is too big to show here.

pkgs/applications/blockchains/solana/default.nix+61

This diff is too big to show here.

pkgs/applications/blockchains/solana/pin.json+5

This diff is too big to show here.

pkgs/applications/blockchains/solana/update.sh+33

This diff is too big to show here.

pkgs/applications/blockchains/stellar-core.nix−46

This diff is too big to show here.

pkgs/applications/blockchains/stellar-core/default.nix+50

This diff is too big to show here.

pkgs/applications/blockchains/sumokoin/default.nix

This diff is too big to show here.

pkgs/applications/blockchains/tessera/default.nix

This diff is too big to show here.

pkgs/applications/blockchains/trezor-suite/default.nix+6−6

This diff is too big to show here.

pkgs/applications/blockchains/turbo-geth.nix−30

This diff is too big to show here.

pkgs/applications/blockchains/vertcoin/default.nix

This diff is too big to show here.

pkgs/applications/blockchains/wasabibackend/create_deps.sh−98

This diff is too big to show here.

pkgs/applications/blockchains/wasabibackend/default.nix+22−72

This diff is too big to show here.

pkgs/applications/blockchains/wasabibackend/deps.nix+202−955

This diff is too big to show here.

pkgs/applications/blockchains/wasabiwallet/default.nix+6−5

This diff is too big to show here.

pkgs/applications/blockchains/whirlpool-gui/default.nix−104

This diff is too big to show here.

pkgs/applications/blockchains/wownero.nix−60

This diff is too big to show here.

pkgs/applications/blockchains/wownero/default.nix+61

This diff is too big to show here.

pkgs/applications/blockchains/zcash/default.nix+6−6

This diff is too big to show here.

pkgs/applications/display-managers/lightdm-enso-os-greeter/default.nix+8−7

This diff is too big to show here.

pkgs/applications/display-managers/lightdm/default.nix+1−1

This diff is too big to show here.

pkgs/applications/display-managers/ly/default.nix+1−1

This diff is too big to show here.

pkgs/applications/display-managers/sddm/default.nix+7

This diff is too big to show here.

pkgs/applications/display-managers/sddm/sddm-default-session.patch+71

This diff is too big to show here.

pkgs/applications/editors/aewan/default.nix+12−1

This diff is too big to show here.

pkgs/applications/editors/android-studio/common.nix+23−18

This diff is too big to show here.

pkgs/applications/editors/android-studio/default.nix+8−8

This diff is too big to show here.

pkgs/applications/editors/apostrophe/default.nix+14−8

This diff is too big to show here.

pkgs/applications/editors/aseprite/skia.nix+10−1

This diff is too big to show here.

pkgs/applications/editors/atom/default.nix+4−4

This diff is too big to show here.

pkgs/applications/editors/atom/env.nix+5−4

This diff is too big to show here.

pkgs/applications/editors/bless/default.nix+12−6

This diff is too big to show here.

pkgs/applications/editors/bluefish/default.nix+25−8

This diff is too big to show here.

pkgs/applications/editors/bluej/default.nix+37−10

This diff is too big to show here.

pkgs/applications/editors/bonzomatic/default.nix+5−5

This diff is too big to show here.

pkgs/applications/editors/bviplus/default.nix+13−1

This diff is too big to show here.

pkgs/applications/editors/code-browser/default.nix+31−20

This diff is too big to show here.

pkgs/applications/editors/cpeditor/default.nix+40

This diff is too big to show here.

pkgs/applications/editors/cudatext/default.nix+5−3

This diff is too big to show here.

pkgs/applications/editors/cudatext/deps.json+22−22

This diff is too big to show here.

pkgs/applications/editors/cudatext/update.sh+23

This diff is too big to show here.

pkgs/applications/editors/deadpixi-sam/default.nix+9−7

This diff is too big to show here.

pkgs/applications/editors/eclipse/build-eclipse.nix+7−7

This diff is too big to show here.

pkgs/applications/editors/eclipse/default.nix+18−14

This diff is too big to show here.

pkgs/applications/editors/eclipse/plugins.nix+98−3

This diff is too big to show here.

pkgs/applications/editors/ed/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/elvis/default.nix+10−7

This diff is too big to show here.

pkgs/applications/editors/em/default.nix+29

This diff is too big to show here.

pkgs/applications/editors/emacs/27.nix−7

This diff is too big to show here.

pkgs/applications/editors/emacs/28.nix+5

This diff is too big to show here.

pkgs/applications/editors/emacs/at-fdcwd.patch−15

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/agda-input/default.nix+18

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/agda2-mode/default.nix+27

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/apheleia/default.nix+23−25

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/bqn-mode/default.nix+22

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/cedet/default.nix−51

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/cedille/default.nix+12−9

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/color-theme-solarized/default.nix+22−17

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/control-lock/default.nix+23

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/ebuild-mode/default.nix+17

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/elpa-generated.nix+1006−227

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/elpa-packages.nix+52−5

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/emacs2nix.nix+5−4

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/emacspeak/default.nix+30−12

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/ement/default.nix+44

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/ement/handle-nil-images.patch+28

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/ess-R-object-popup/default.nix+21−13

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/evil-markdown/default.nix+19−31

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/fetchelpa.nix+21

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/font-lock-plus/default.nix+16−13

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/git-undo/default.nix+13−23

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/header-file-mode/default.nix+30

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/helm-words/default.nix+20−15

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/ido-ubiquitous/default.nix−27

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/isearch-plus/default.nix+14−25

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/isearch-prop/default.nix+14−24

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/jam-mode/default.nix+10−3

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/libgenerated.nix+5−3

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/llvm-mode/default.nix+17

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/manual-packages.nix+88−117

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/melpa-packages.nix+89−67

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/mu4e-patch/default.nix−38

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/nano-theme/default.nix+5−12

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/nongnu-generated.nix+2393

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/nongnu-packages.nix+37

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/org-generated.nix−33

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/org-mac-link/default.nix−31

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/org-packages.nix−32

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/ott-mode/default.nix+19

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/perl-completion/default.nix+1−1

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/plz/default.nix+31

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/power-mode/default.nix+4−11

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/prolog/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/railgun/default.nix−22

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/recipes-archive-melpa.json+13180−8659

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/rect-mark/default.nix+19−25

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/session-management-for-emacs/default.nix+11−9

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/sunrise-commander/default.nix+5−18

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/sv-kalender/default.nix+2−5

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/tramp/default.nix−28

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/tree-sitter-langs/default-grammars.json+32

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/tree-sitter-langs/default.nix+44

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/tree-sitter-langs/update-defaults.py+74

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/tsc/default.nix+89

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/tsc/src.json+10

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/tsc/update.py+122

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/update+10

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/update-from-overlay−4

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/update-manual+7

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/update-manual.nix+11

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/update-nongnu+4

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/update-org−4

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/urweb-mode/default.nix+27

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/youtube-dl/default.nix+13−21

This diff is too big to show here.

pkgs/applications/editors/emacs/elisp-packages/zeitgeist/default.nix−25

This diff is too big to show here.

pkgs/applications/editors/emacs/generic.nix+41−15

This diff is too big to show here.

pkgs/applications/editors/emacs/macport.nix+5−4

This diff is too big to show here.

pkgs/applications/editors/emacs/tramp-detect-wrapped-gvfsd-26.patch−14

This diff is too big to show here.

pkgs/applications/editors/emacs/tramp-detect-wrapped-gvfsd.patch−11

This diff is too big to show here.

pkgs/applications/editors/featherpad/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/focuswriter/default.nix−2

This diff is too big to show here.

pkgs/applications/editors/fte/default.nix+2−1

This diff is too big to show here.

pkgs/applications/editors/geany/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/ghostwriter/default.nix+19−3

This diff is too big to show here.

pkgs/applications/editors/glow/default.nix+1−1

This diff is too big to show here.

pkgs/applications/editors/gnome-builder/default.nix+24−21

This diff is too big to show here.

pkgs/applications/editors/gobby/default.nix+1−1

This diff is too big to show here.

pkgs/applications/editors/gophernotes/default.nix+3−3

This diff is too big to show here.

pkgs/applications/editors/greenfoot/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/helix/default.nix+37

This diff is too big to show here.

pkgs/applications/editors/heme/default.nix−29

This diff is too big to show here.

pkgs/applications/editors/hexcurse/default.nix+16

This diff is too big to show here.

pkgs/applications/editors/hexdino/default.nix+6−6

This diff is too big to show here.

pkgs/applications/editors/jetbrains/common.nix−91

This diff is too big to show here.

pkgs/applications/editors/jetbrains/darwin.nix+36

This diff is too big to show here.

pkgs/applications/editors/jetbrains/default.nix+132−114

This diff is too big to show here.

pkgs/applications/editors/jetbrains/linux.nix+93

This diff is too big to show here.

pkgs/applications/editors/jetbrains/update.pl−92

This diff is too big to show here.

pkgs/applications/editors/jetbrains/update.py+100

This diff is too big to show here.

pkgs/applications/editors/jetbrains/versions.json+296

This diff is too big to show here.

pkgs/applications/editors/jove/default.nix+2−1

This diff is too big to show here.

pkgs/applications/editors/jucipp/default.nix+3−4

This diff is too big to show here.

pkgs/applications/editors/jupyter-kernels/clojupyter/default.nix+73

This diff is too big to show here.

pkgs/applications/editors/jupyter-kernels/clojupyter/deps.edn+1

This diff is too big to show here.

pkgs/applications/editors/jupyter-kernels/clojupyter/deps.nix+1107

This diff is too big to show here.

pkgs/applications/editors/jupyter-kernels/clojupyter/update.sh+16

This diff is too big to show here.

pkgs/applications/editors/jupyter-kernels/octave/default.nix+61

This diff is too big to show here.

pkgs/applications/editors/jupyter-kernels/octave/kernel.nix+28

This diff is too big to show here.

pkgs/applications/editors/jupyter-kernels/wolfram/default.nix+22

This diff is too big to show here.

pkgs/applications/editors/jupyter-kernels/wolfram/kernel.nix+32

This diff is too big to show here.

pkgs/applications/editors/kakoune/default.nix+5−12

This diff is too big to show here.

pkgs/applications/editors/kakoune/plugins/aliases.nix+1−1

This diff is too big to show here.

pkgs/applications/editors/kakoune/plugins/build-kakoune-plugin.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/kakoune/plugins/default.nix+1−1

This diff is too big to show here.

pkgs/applications/editors/kakoune/plugins/kakoune-plugin-names+20−19

This diff is too big to show here.

pkgs/applications/editors/kakoune/plugins/update-shell.nix+15

This diff is too big to show here.

pkgs/applications/editors/kakoune/plugins/update.py+44−39

This diff is too big to show here.

pkgs/applications/editors/kdevelop5/kdev-php.nix+3−3

This diff is too big to show here.

pkgs/applications/editors/kdevelop5/kdev-python.nix+3−3

This diff is too big to show here.

pkgs/applications/editors/kdevelop5/kdevelop.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/kile/default.nix+3−2

This diff is too big to show here.

pkgs/applications/editors/kodestudio/default.nix+3−3

This diff is too big to show here.

pkgs/applications/editors/lapce/default.nix+99

This diff is too big to show here.

pkgs/applications/editors/leo-editor/default.nix+6−7

This diff is too big to show here.

pkgs/applications/editors/libresprite/default.nix+111

This diff is too big to show here.

pkgs/applications/editors/lifeograph/default.nix+40

This diff is too big to show here.

pkgs/applications/editors/lighttable/default.nix+4−4

This diff is too big to show here.

pkgs/applications/editors/lite-xl/0001-replace-unpack-with-table-unpack.patch+91

This diff is too big to show here.

pkgs/applications/editors/lite-xl/default.nix+52

This diff is too big to show here.

pkgs/applications/editors/manuskript/default.nix+3−3

This diff is too big to show here.

pkgs/applications/editors/marker/default.nix+6−3

This diff is too big to show here.

pkgs/applications/editors/mg/default.nix+7−3

This diff is too big to show here.

pkgs/applications/editors/micro/default.nix+7−5

This diff is too big to show here.

pkgs/applications/editors/micro/test-with-expect.nix+30

This diff is too big to show here.

pkgs/applications/editors/mindforger/default.nix+31−8

This diff is too big to show here.

pkgs/applications/editors/mindforger/paths.patch

This diff is too big to show here.

pkgs/applications/editors/mle/default.nix+11−1

This diff is too big to show here.

pkgs/applications/editors/moe/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/monodevelop/default.nix−81

This diff is too big to show here.

pkgs/applications/editors/monodevelop/git-revert-12d610fb3f6dce121df538e36f21d8c2eeb0a6e3.patch−57

This diff is too big to show here.

pkgs/applications/editors/music/tuxguitar/default.nix+7−7

This diff is too big to show here.

pkgs/applications/editors/nano/default.nix+6−4

This diff is too big to show here.

pkgs/applications/editors/nano/nanorc/default.nix−2

This diff is too big to show here.

pkgs/applications/editors/nano/test-with-expect.nix+35

This diff is too big to show here.

pkgs/applications/editors/ne/default.nix+3−3

This diff is too big to show here.

pkgs/applications/editors/neovim/default.nix+20−22

This diff is too big to show here.

pkgs/applications/editors/neovim/neovide/Cargo.lock−3292

This diff is too big to show here.

pkgs/applications/editors/neovim/neovide/default.nix+63−44

This diff is too big to show here.

pkgs/applications/editors/neovim/neovide/skia-externals.json+10−10

This diff is too big to show here.

pkgs/applications/editors/neovim/neovim-override.vim

This diff is too big to show here.

pkgs/applications/editors/neovim/neovim-qt.nix+2−1

This diff is too big to show here.

pkgs/applications/editors/neovim/neovim-remote.nix+2−3

This diff is too big to show here.

pkgs/applications/editors/neovim/ruby_provider/Gemfile.lock+3−3

This diff is too big to show here.

pkgs/applications/editors/neovim/ruby_provider/gemset.nix+12−6

This diff is too big to show here.

pkgs/applications/editors/neovim/tests.nix+174

This diff is too big to show here.

pkgs/applications/editors/neovim/utils.nix+11−1

This diff is too big to show here.

pkgs/applications/editors/neovim/wrapper.nix+7−3

This diff is too big to show here.

pkgs/applications/editors/netbeans/default.nix+5−5

This diff is too big to show here.

pkgs/applications/editors/nvi/default.nix+1

This diff is too big to show here.

pkgs/applications/editors/nvpy/default.nix+11−7

This diff is too big to show here.

pkgs/applications/editors/oed/default.nix+32

This diff is too big to show here.

pkgs/applications/editors/okteta/default.nix+4−2

This diff is too big to show here.

pkgs/applications/editors/oni2/common.nix+251

This diff is too big to show here.

pkgs/applications/editors/oni2/default.nix+16

This diff is too big to show here.

pkgs/applications/editors/oni2/esy_skia_use_nixpkgs.patch+13

This diff is too big to show here.

pkgs/applications/editors/oni2/extensions.lock+497

This diff is too big to show here.

pkgs/applications/editors/oni2/extensions.nix+629

This diff is too big to show here.

pkgs/applications/editors/oni2/node.lock+376

This diff is too big to show here.

pkgs/applications/editors/oni2/node.nix+453

This diff is too big to show here.

pkgs/applications/editors/pinegrow/default.nix+80

This diff is too big to show here.

pkgs/applications/editors/poke/default.nix+27−7

This diff is too big to show here.

pkgs/applications/editors/quartus-prime/default.nix+9−101

This diff is too big to show here.

pkgs/applications/editors/quartus-prime/quartus.nix+97

This diff is too big to show here.

pkgs/applications/editors/quilter/default.nix−55

This diff is too big to show here.

pkgs/applications/editors/qxmledit/default.nix+1−1

This diff is too big to show here.

pkgs/applications/editors/rednotebook/default.nix+4−3

This diff is too big to show here.

pkgs/applications/editors/rehex/default.nix+27−14

This diff is too big to show here.

pkgs/applications/editors/retext/default.nix+37−16

This diff is too big to show here.

pkgs/applications/editors/rstudio/clang-location.patch+51−15

This diff is too big to show here.

pkgs/applications/editors/rstudio/default.nix+202−104

This diff is too big to show here.

pkgs/applications/editors/rstudio/package.json+83

This diff is too big to show here.

pkgs/applications/editors/rstudio/r-location.patch+20−15

This diff is too big to show here.

pkgs/applications/editors/rstudio/yarn.lock+3835

This diff is too big to show here.

pkgs/applications/editors/rstudio/yarndeps.nix+4373

This diff is too big to show here.

pkgs/applications/editors/setzer/default.nix+3−2

This diff is too big to show here.

pkgs/applications/editors/sigil/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/spacevim/default.nix+19−7

This diff is too big to show here.

pkgs/applications/editors/standardnotes/default.nix+9−8

This diff is too big to show here.

pkgs/applications/editors/sublime/2/default.nix+11−9

This diff is too big to show here.

pkgs/applications/editors/sublime/3/common.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/sublime/4/common.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/sublime/4/packages.nix+6−6

This diff is too big to show here.

pkgs/applications/editors/supertux-editor/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/texmacs/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/texmaker/default.nix+4−6

This diff is too big to show here.

pkgs/applications/editors/texstudio/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/texworks/default.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/thiefmd/default.nix+48

This diff is too big to show here.

pkgs/applications/editors/thonny/default.nix+18−3

This diff is too big to show here.

pkgs/applications/editors/tiled/default.nix+4−6

This diff is too big to show here.

pkgs/applications/editors/typora/default.nix−72

This diff is too big to show here.

pkgs/applications/editors/uivonim/yarn.nix+1−1

This diff is too big to show here.

pkgs/applications/editors/vim/common.nix+2−2

This diff is too big to show here.

pkgs/applications/editors/vim/configurable.nix+19−35

This diff is too big to show here.

pkgs/applications/editors/vim/default.nix+1−3

This diff is too big to show here.

pkgs/applications/editors/vim/macvim.nix+3−3

This diff is too big to show here.

pkgs/applications/editors/vim/macvim.patch+32−34

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/aliases.nix+143

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/build-vim-plugin.nix+54

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/default.nix+52

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/deprecated.json+42

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/generated.nix+12184

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/markdown-preview-nvim/fix-node-paths.patch+46

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/markdown-preview-nvim/package.json+17

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/overrides.nix+1160

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/patches/fruzzy/get_version.patch

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/patches/lens-vim/remove_duplicate_g_lens_animate.patch

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/patches/sniprun/fix-paths.patch+36

This diff is too big to show here.

pkgs/applications/editors/vim/plugins/patches/vim-grammarous/set_default_languagetool.patch

This diff is too big to show here.