From 1bc1e2755c91336284b6aff295fe95bf953cfa14 Mon Sep 17 00:00:00 2001 From: Pamplemousse Date: Mon, 11 Aug 2025 21:04:23 +0200 Subject: [PATCH 01/77] remarkable-mouse: add missing dependency --- pkgs/applications/misc/remarkable/remarkable-mouse/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/pkgs/applications/misc/remarkable/remarkable-mouse/default.nix b/pkgs/applications/misc/remarkable/remarkable-mouse/default.nix index ec12849f5547..efba16ebe805 100644 --- a/pkgs/applications/misc/remarkable/remarkable-mouse/default.nix +++ b/pkgs/applications/misc/remarkable/remarkable-mouse/default.nix @@ -23,6 +23,7 @@ buildPythonApplication rec { paramiko pynput libevdev + tkinter ]; # no tests From af6aee18fe1d9aab5ad522acb24cc0eab92d0986 Mon Sep 17 00:00:00 2001 From: Pamplemousse Date: Mon, 11 Aug 2025 21:27:56 +0200 Subject: [PATCH 02/77] remarkable-mouse: 7.1.1 -> unstable-2024-02-23 --- .../remarkable/remarkable-mouse/default.nix | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/pkgs/applications/misc/remarkable/remarkable-mouse/default.nix b/pkgs/applications/misc/remarkable/remarkable-mouse/default.nix index efba16ebe805..cf0997461f30 100644 --- a/pkgs/applications/misc/remarkable/remarkable-mouse/default.nix +++ b/pkgs/applications/misc/remarkable/remarkable-mouse/default.nix @@ -1,23 +1,29 @@ { lib, buildPythonApplication, - fetchPypi, + fetchFromGitHub, libevdev, paramiko, pynput, + setuptools, screeninfo, + tkinter, }: -buildPythonApplication rec { +buildPythonApplication { pname = "remarkable-mouse"; - version = "7.1.1"; - format = "setuptools"; + version = "unstable-2024-02-23"; - src = fetchPypi { - inherit pname version; - hash = "sha256-82P9tE3jiUlKBGZCiWDoL+9VJ06Bc+If+aMfcEEU90U="; + src = fetchFromGitHub { + owner = "Evidlo"; + repo = "remarkable_mouse"; + rev = "05142ef37a8b3f9e350156a14c2dec6844ed0ea8"; + hash = "sha256-0X/7SIfSnlEL98fxJBAYrHAkRmdtymqA7xBmVoa5VIw="; }; + pyproject = true; + build-system = [ setuptools ]; + propagatedBuildInputs = [ screeninfo paramiko From c3f34fb1c57c334ced95675574fb16cf284cf95a Mon Sep 17 00:00:00 2001 From: Stefan Frijters Date: Mon, 9 Mar 2026 14:33:04 +0100 Subject: [PATCH 03/77] google-cloud-sdk: use structuredAttrs instead of passAsFile --- pkgs/by-name/go/google-cloud-sdk/components.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/by-name/go/google-cloud-sdk/components.nix b/pkgs/by-name/go/google-cloud-sdk/components.nix index 970ff88433aa..45a2e619cb7f 100644 --- a/pkgs/by-name/go/google-cloud-sdk/components.nix +++ b/pkgs/by-name/go/google-cloud-sdk/components.nix @@ -168,7 +168,7 @@ let fi # Write the snapshot file to the `.install` folder - cp $snapshotPath $out/google-cloud-sdk/.install/${pname}.snapshot.json + printf "%s" "$snapshot" > $out/google-cloud-sdk/.install/${pname}.snapshot.json ''; nativeBuildInputs = [ python3 @@ -185,7 +185,7 @@ let passthru = { dependencies = filterForSystem dependencies; }; - passAsFile = [ "snapshot" ]; + __structuredAttrs = true; meta = { inherit description platforms; }; From 545ed3952541dc60b9afe8af2ba6bf9b1771b1f5 Mon Sep 17 00:00:00 2001 From: OPNA2608 Date: Mon, 16 Mar 2026 16:55:26 +0100 Subject: [PATCH 04/77] release-cross: Add fd to common To test rust cross infra (as opposed to cross of rustc & cargo). --- pkgs/top-level/release-cross.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/pkgs/top-level/release-cross.nix b/pkgs/top-level/release-cross.nix index 29ad442a54b7..b938abeb9678 100644 --- a/pkgs/top-level/release-cross.nix +++ b/pkgs/top-level/release-cross.nix @@ -84,6 +84,7 @@ let mesa = nativePlatforms; rustc = nativePlatforms; cargo = nativePlatforms; + fd = nativePlatforms; }; gnuCommon = recursiveUpdate common { From 7081de57d8ff197336e5b23bcf114ec6996d7a9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9ana=20=E6=B1=9F?= Date: Wed, 18 Mar 2026 10:56:24 +0100 Subject: [PATCH 05/77] gource: 0.55 -> 0.56 --- pkgs/by-name/go/gource/package.nix | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/pkgs/by-name/go/gource/package.nix b/pkgs/by-name/go/gource/package.nix index 55e9b4704602..66ab89b8889d 100644 --- a/pkgs/by-name/go/gource/package.nix +++ b/pkgs/by-name/go/gource/package.nix @@ -22,21 +22,16 @@ stdenv.mkDerivation (finalAttrs: { pname = "gource"; - version = "0.55"; + version = "0.56"; src = fetchurl { url = "https://github.com/acaudwell/Gource/releases/download/gource-${finalAttrs.version}/gource-${finalAttrs.version}.tar.gz"; - hash = "sha256-yCOSEtKLB1CNnkd2GZdoAmgWKPwl6z4E9mcRdwE8AUI="; + hash = "sha256-My2Jual5sXQX+84O3XKxmRTxQJ/RJqE9EXh9DhXcDXk="; }; postPatch = '' # remove bundled library rm -r src/tinyxml - - # Fix build with boost 1.89 - rm m4/ax_boost_system.m4 - substituteInPlace configure.ac \ - --replace-fail "AX_BOOST_SYSTEM" "" ''; nativeBuildInputs = [ From 5c68545421329eb51fb30b784c7fc53feec3af2f Mon Sep 17 00:00:00 2001 From: PRESFIL Date: Tue, 24 Mar 2026 19:14:05 +0000 Subject: [PATCH 06/77] czkawka: Add Krokiet .desktop, icon and metainfo --- pkgs/by-name/cz/czkawka/package.nix | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkgs/by-name/cz/czkawka/package.nix b/pkgs/by-name/cz/czkawka/package.nix index 2c7743971002..40ac61c8f8b5 100644 --- a/pkgs/by-name/cz/czkawka/package.nix +++ b/pkgs/by-name/cz/czkawka/package.nix @@ -71,10 +71,16 @@ let # Desktop items, icons and metainfo are not installed automatically postInstall = '' + # Czkawka install -Dm444 -t $out/share/applications data/com.github.qarmin.czkawka.desktop install -Dm444 -t $out/share/icons/hicolor/scalable/apps data/icons/com.github.qarmin.czkawka.svg install -Dm444 -t $out/share/icons/hicolor/scalable/apps data/icons/com.github.qarmin.czkawka-symbolic.svg install -Dm444 -t $out/share/metainfo data/com.github.qarmin.czkawka.metainfo.xml + + # Krokiet + install -Dm444 -t $out/share/applications data/io.github.qarmin.krokiet.desktop + install -Dm444 -t $out/share/icons/hicolor/scalable/apps data/icons/io.github.qarmin.krokiet.svg + install -Dm444 -t $out/share/metainfo data/io.github.qarmin.krokiet.metainfo.xml ''; dontWrapGApps = true; From a01d719cdc6e2b39e40c78514a3b08f6ed7c806c Mon Sep 17 00:00:00 2001 From: Hythera <87016780+Hythera@users.noreply.github.com> Date: Sat, 4 Apr 2026 12:55:35 +0200 Subject: [PATCH 07/77] maintainers: remove hqurve --- maintainers/maintainer-list.nix | 6 ------ pkgs/applications/misc/openbangla-keyboard/default.nix | 5 +---- pkgs/applications/science/math/labplot/default.nix | 2 +- pkgs/by-name/cu/cubiomes-viewer/package.nix | 2 +- pkgs/by-name/ja/java-language-server/package.nix | 2 +- pkgs/by-name/ju/junction/package.nix | 1 - pkgs/by-name/lo/lorien/package.nix | 2 +- pkgs/by-name/pd/pdfchain/package.nix | 2 +- pkgs/by-name/sp/space-cadet-pinball/package.nix | 5 +---- 9 files changed, 7 insertions(+), 20 deletions(-) diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index 25a9eb1f0272..d0745d1d8729 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -10856,12 +10856,6 @@ githubId = 44043764; name = "Liam Hupfer"; }; - hqurve = { - email = "hqurve@outlook.com"; - github = "hqurve"; - githubId = 53281855; - name = "hqurve"; - }; hraban = { email = "hraban@0brg.net"; github = "hraban"; diff --git a/pkgs/applications/misc/openbangla-keyboard/default.nix b/pkgs/applications/misc/openbangla-keyboard/default.nix index 510402f40417..005345179886 100644 --- a/pkgs/applications/misc/openbangla-keyboard/default.nix +++ b/pkgs/applications/misc/openbangla-keyboard/default.nix @@ -73,10 +73,7 @@ stdenv.mkDerivation (finalAttrs: { mainProgram = "openbangla-gui"; homepage = "https://openbangla.github.io/"; license = lib.licenses.gpl3Plus; - maintainers = with lib.maintainers; [ - hqurve - johnrtitor - ]; + maintainers = with lib.maintainers; [ johnrtitor ]; platforms = lib.platforms.linux; # never built on aarch64-linux since first introduction in nixpkgs broken = stdenv.hostPlatform.isLinux && stdenv.hostPlatform.isAarch64; diff --git a/pkgs/applications/science/math/labplot/default.nix b/pkgs/applications/science/math/labplot/default.nix index f1f07f250b81..9e01f7107d78 100644 --- a/pkgs/applications/science/math/labplot/default.nix +++ b/pkgs/applications/science/math/labplot/default.nix @@ -121,7 +121,7 @@ stdenv.mkDerivation rec { lgpl3Plus mit ]; - maintainers = with lib.maintainers; [ hqurve ]; + maintainers = [ ]; mainProgram = "labplot2"; platforms = lib.platforms.unix; }; diff --git a/pkgs/by-name/cu/cubiomes-viewer/package.nix b/pkgs/by-name/cu/cubiomes-viewer/package.nix index 1978424fedf1..ba3d71172f1f 100644 --- a/pkgs/by-name/cu/cubiomes-viewer/package.nix +++ b/pkgs/by-name/cu/cubiomes-viewer/package.nix @@ -71,6 +71,6 @@ stdenv.mkDerivation (finalAttrs: { ''; platforms = lib.platforms.all; license = lib.licenses.gpl3Plus; - maintainers = with lib.maintainers; [ hqurve ]; + maintainers = [ ]; }; }) diff --git a/pkgs/by-name/ja/java-language-server/package.nix b/pkgs/by-name/ja/java-language-server/package.nix index afcf58970e4e..234270d9cb12 100644 --- a/pkgs/by-name/ja/java-language-server/package.nix +++ b/pkgs/by-name/ja/java-language-server/package.nix @@ -71,6 +71,6 @@ maven.buildMavenPackage { mainProgram = "java-language-server"; homepage = "https://github.com/georgewfraser/java-language-server"; license = lib.licenses.mit; - maintainers = with lib.maintainers; [ hqurve ]; + maintainers = [ ]; }; } diff --git a/pkgs/by-name/ju/junction/package.nix b/pkgs/by-name/ju/junction/package.nix index c6e995abf3f9..531b7a91d4b5 100644 --- a/pkgs/by-name/ju/junction/package.nix +++ b/pkgs/by-name/ju/junction/package.nix @@ -73,7 +73,6 @@ stdenv.mkDerivation (finalAttrs: { description = "Choose the application to open files and links"; homepage = "https://apps.gnome.org/Junction/"; license = lib.licenses.gpl3Only; - maintainers = with lib.maintainers; [ hqurve ]; teams = [ lib.teams.gnome-circle ]; platforms = lib.platforms.linux; }; diff --git a/pkgs/by-name/lo/lorien/package.nix b/pkgs/by-name/lo/lorien/package.nix index 0bebd281ef00..ad69944d35d6 100644 --- a/pkgs/by-name/lo/lorien/package.nix +++ b/pkgs/by-name/lo/lorien/package.nix @@ -135,7 +135,7 @@ stdenv.mkDerivation rec { ''; license = lib.licenses.mit; platforms = lib.platforms.unix; - maintainers = with lib.maintainers; [ hqurve ]; + maintainers = [ ]; mainProgram = "lorien"; }; } diff --git a/pkgs/by-name/pd/pdfchain/package.nix b/pkgs/by-name/pd/pdfchain/package.nix index 0041dc48f548..e755f2331169 100644 --- a/pkgs/by-name/pd/pdfchain/package.nix +++ b/pkgs/by-name/pd/pdfchain/package.nix @@ -70,7 +70,7 @@ stdenv.mkDerivation rec { description = "Graphical user interface for the PDF Toolkit (PDFtk)"; homepage = "https://pdfchain.sourceforge.io"; license = lib.licenses.gpl3Plus; - maintainers = with lib.maintainers; [ hqurve ]; + maintainers = [ ]; platforms = lib.platforms.unix; mainProgram = "pdfchain"; }; diff --git a/pkgs/by-name/sp/space-cadet-pinball/package.nix b/pkgs/by-name/sp/space-cadet-pinball/package.nix index 32777f439b80..d10ad63b21a7 100644 --- a/pkgs/by-name/sp/space-cadet-pinball/package.nix +++ b/pkgs/by-name/sp/space-cadet-pinball/package.nix @@ -76,10 +76,7 @@ stdenv.mkDerivation rec { unfree mit ]; - maintainers = with lib.maintainers; [ - hqurve - nadiaholmquist - ]; + maintainers = with lib.maintainers; [ nadiaholmquist ]; platforms = lib.platforms.all; mainProgram = "SpaceCadetPinball"; }; From 3576826ca1b68f4c04d2bace5ae06bba85e2f696 Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sat, 4 Apr 2026 12:39:33 +0000 Subject: [PATCH 08/77] log4cxx: 1.6.1 -> 1.7.0 --- pkgs/by-name/lo/log4cxx/package.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/by-name/lo/log4cxx/package.nix b/pkgs/by-name/lo/log4cxx/package.nix index 3db873cfcb7b..ea9531070b12 100644 --- a/pkgs/by-name/lo/log4cxx/package.nix +++ b/pkgs/by-name/lo/log4cxx/package.nix @@ -15,11 +15,11 @@ stdenv.mkDerivation (finalAttrs: { pname = "log4cxx"; - version = "1.6.1"; + version = "1.7.0"; src = fetchurl { url = "mirror://apache/logging/log4cxx/${finalAttrs.version}/apache-log4cxx-${finalAttrs.version}.tar.gz"; - hash = "sha256-GHyFg29bLyf7Ho13x/Hyk5cl8fZJi3QrDdVpujCWX9I="; + hash = "sha256-uUP/FwOT5M44GrTEkUOWEnv01E+4vR8OXvhFPzxNNkw="; }; postPatch = '' From b163ec7789cb859016a0dfc6cbd7da6eb1ce4cc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9ana=20=E6=B1=9F?= Date: Wed, 31 Dec 2025 11:52:55 +0100 Subject: [PATCH 09/77] fcitx5: fix updateScript --- pkgs/tools/inputmethods/fcitx5/update.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pkgs/tools/inputmethods/fcitx5/update.py b/pkgs/tools/inputmethods/fcitx5/update.py index 5da7d34a51a6..74c0a8311603 100755 --- a/pkgs/tools/inputmethods/fcitx5/update.py +++ b/pkgs/tools/inputmethods/fcitx5/update.py @@ -23,21 +23,26 @@ REPOS = [ ( "fcitx", "fcitx5-table-extra" ), ( "fcitx", "fcitx5-table-other" ), ( "fcitx", "fcitx5-unikey" ), - ( "fcitx", "fcitx5-unikey" ) + ( "fcitx", "fcitx5-unikey" ), ( "ray2501", "fcitx5-array" ) ] -OWNER = "fcitx" +QT_REPOS = [ + "fcitx5-chinese-addons", + "fcitx5-configtool", + "fcitx5-qt", + "fcitx5-unikey", + ] -def get_latest_tag(repo, owner=OWNER): +def get_latest_tag(repo, owner): r = requests.get('https://api.github.com/repos/{}/{}/tags'.format(owner,repo)) return r.json()[0].get("name") def main(): for (owner, repo) in REPOS: rev = get_latest_tag(repo, owner) - if repo == "fcitx5-qt": + if repo in QT_REPOS: subprocess.run(["nix-update", "--commit", "--version", rev, "qt6Packages.{}".format(repo)]) else: subprocess.run(["nix-update", "--commit", "--version", rev, repo]) From 9935801fb0e5dfea1139a04829e0bf96295610da Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 8 Apr 2026 12:42:02 +0200 Subject: [PATCH 10/77] python3Packages.lupa: 2.6 -> 2.7 Changelog: https://github.com/scoder/lupa/blob/lupa-2.7/CHANGES.rst --- pkgs/development/python-modules/lupa/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/python-modules/lupa/default.nix b/pkgs/development/python-modules/lupa/default.nix index 5c392c494642..95040a53ff96 100644 --- a/pkgs/development/python-modules/lupa/default.nix +++ b/pkgs/development/python-modules/lupa/default.nix @@ -8,12 +8,12 @@ buildPythonPackage rec { pname = "lupa"; - version = "2.6"; + version = "2.7"; pyproject = true; src = fetchPypi { inherit pname version; - hash = "sha256-mncKbolXa+NEdmjXztMSzW/UHTwTwkYsncLCq1cORdk="; + hash = "sha256-c6ZM5dyM2Vt1ozDBUT5G4JjUD87tP+pRbAn2WV6t6Ik="; }; build-system = [ From e10ee240a967a69ee009f45330b2d8593c066da3 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 8 Apr 2026 12:47:08 +0200 Subject: [PATCH 11/77] pythpn3Packages.lupa: migrate to finalAttrs --- pkgs/development/python-modules/lupa/default.nix | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pkgs/development/python-modules/lupa/default.nix b/pkgs/development/python-modules/lupa/default.nix index 95040a53ff96..0a0b6c217452 100644 --- a/pkgs/development/python-modules/lupa/default.nix +++ b/pkgs/development/python-modules/lupa/default.nix @@ -6,13 +6,13 @@ setuptools, }: -buildPythonPackage rec { +buildPythonPackage (finalAttrs: { pname = "lupa"; version = "2.7"; pyproject = true; src = fetchPypi { - inherit pname version; + inherit (finalAttrs) pname version; hash = "sha256-c6ZM5dyM2Vt1ozDBUT5G4JjUD87tP+pRbAn2WV6t6Ik="; }; @@ -26,8 +26,8 @@ buildPythonPackage rec { meta = { description = "Lua in Python"; homepage = "https://github.com/scoder/lupa"; - changelog = "https://github.com/scoder/lupa/blob/lupa-${version}/CHANGES.rst"; + changelog = "https://github.com/scoder/lupa/blob/lupa-${finalAttrs.version}/CHANGES.rst"; license = lib.licenses.mit; maintainers = with lib.maintainers; [ fab ]; }; -} +}) From 537e567dddc7dea43053e0f0f4a5ed81194f8af6 Mon Sep 17 00:00:00 2001 From: kataokatsuki Date: Wed, 8 Apr 2026 21:05:08 +0900 Subject: [PATCH 12/77] peco: 0.5.11 -> 0.6.0 Also install the man page added in v0.6.0. --- pkgs/by-name/pe/peco/package.nix | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pkgs/by-name/pe/peco/package.nix b/pkgs/by-name/pe/peco/package.nix index f76bac4813eb..45c2904c194d 100644 --- a/pkgs/by-name/pe/peco/package.nix +++ b/pkgs/by-name/pe/peco/package.nix @@ -2,11 +2,12 @@ lib, buildGoModule, fetchFromGitHub, + installShellFiles, }: buildGoModule (finalAttrs: { pname = "peco"; - version = "0.5.11"; + version = "0.6.0"; subPackages = [ "cmd/peco" ]; @@ -14,10 +15,16 @@ buildGoModule (finalAttrs: { owner = "peco"; repo = "peco"; rev = "v${finalAttrs.version}"; - sha256 = "sha256-OVUfeNpnmuJsgD//JTn6n9n4oOBxep69LhIpHX+ru2w="; + sha256 = "sha256-jvjqk1t2mTxkcGFWpynf3/J5VR3G1lhOBpIFqh6OoS0="; }; - vendorHash = "sha256-+HQz7UUgATdgSWlI1dg2DdQRUSke9MyAtXgLikFhF90="; + vendorHash = "sha256-EvLi1v3c1Myx9GVvenXiZb2V5foloQzPc35VVjVLuiU="; + + nativeBuildInputs = [ installShellFiles ]; + + postInstall = '' + installManPage contrib/man/peco.1 + ''; meta = { description = "Simplistic interactive filtering tool"; From 606195baa7e650c19e05d73c9d6440de61a79e07 Mon Sep 17 00:00:00 2001 From: kataokatsuki Date: Wed, 8 Apr 2026 23:51:41 +0900 Subject: [PATCH 13/77] peco: modernize fetchFromGitHub attrs (rev->tag, sha256->hash) --- pkgs/by-name/pe/peco/package.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/by-name/pe/peco/package.nix b/pkgs/by-name/pe/peco/package.nix index 45c2904c194d..837925628d92 100644 --- a/pkgs/by-name/pe/peco/package.nix +++ b/pkgs/by-name/pe/peco/package.nix @@ -14,8 +14,8 @@ buildGoModule (finalAttrs: { src = fetchFromGitHub { owner = "peco"; repo = "peco"; - rev = "v${finalAttrs.version}"; - sha256 = "sha256-jvjqk1t2mTxkcGFWpynf3/J5VR3G1lhOBpIFqh6OoS0="; + tag = "v${finalAttrs.version}"; + hash = "sha256-jvjqk1t2mTxkcGFWpynf3/J5VR3G1lhOBpIFqh6OoS0="; }; vendorHash = "sha256-EvLi1v3c1Myx9GVvenXiZb2V5foloQzPc35VVjVLuiU="; From e01a584a0ff478d4353107588d3a7562d60025bf Mon Sep 17 00:00:00 2001 From: Jamie Magee Date: Wed, 8 Apr 2026 21:31:18 -0700 Subject: [PATCH 14/77] platformio-chrootenv: add cmake, ninja, wheel, virtualenv esp-idf and Zephyr create Python venvs during builds and need these tools. Without them, framework builds fail with 'No module named pip'. Fixes: https://github.com/NixOS/nixpkgs/issues/133185 --- pkgs/by-name/pl/platformio-chrootenv/package.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkgs/by-name/pl/platformio-chrootenv/package.nix b/pkgs/by-name/pl/platformio-chrootenv/package.nix index edec21cc2322..6e9b2710320c 100644 --- a/pkgs/by-name/pl/platformio-chrootenv/package.nix +++ b/pkgs/by-name/pl/platformio-chrootenv/package.nix @@ -17,11 +17,18 @@ let xdg-user-dirs ncurses udev + # Required for esp-idf and other frameworks that manage their own + # Python virtual environments during the build process. + # See: https://github.com/NixOS/nixpkgs/issues/133185 + cmake + ninja ]) ++ (with python.pkgs; [ python setuptools pip + wheel + virtualenv bottle ]); From 7064303eb16b8e170bca56db51e1cae7460178e9 Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Fri, 10 Apr 2026 03:36:04 +0000 Subject: [PATCH 15/77] pay-respects: 0.7.13 -> 0.8.5 --- pkgs/by-name/pa/pay-respects/package.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/by-name/pa/pay-respects/package.nix b/pkgs/by-name/pa/pay-respects/package.nix index 03ac629334c5..6b2a37269dda 100644 --- a/pkgs/by-name/pa/pay-respects/package.nix +++ b/pkgs/by-name/pa/pay-respects/package.nix @@ -6,16 +6,16 @@ }: rustPlatform.buildRustPackage (finalAttrs: { pname = "pay-respects"; - version = "0.7.13"; + version = "0.8.5"; src = fetchFromCodeberg { owner = "iff"; repo = "pay-respects"; tag = "v${finalAttrs.version}"; - hash = "sha256-jKK8wc+M5U8L7D4z8aQT/VJdZE1q2Z2BTRrtw+UWoeo="; + hash = "sha256-rI4cikbZ+J6SSs5l2WroM6862yDe8IFDqpmAV4Od5ng="; }; - cargoHash = "sha256-w9BJ0S6q13udi2JWHtbCCXDjgUYo59/FRjxQGuM5r8c="; + cargoHash = "sha256-IQMB5bYvP/1u6FItZ34GYkMBe1fVao5CK2OPGaikIbk="; env = { _DEF_PR_AI_API_KEY = ""; From db20a03bd0c0d4f4dbf2a48bc7d7ff7730930ae9 Mon Sep 17 00:00:00 2001 From: Andrew Benbow Date: Fri, 10 Apr 2026 15:42:50 -0400 Subject: [PATCH 16/77] nixos/drupal: change state directory modules and themes symlinks --- nixos/modules/services/web-apps/drupal.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nixos/modules/services/web-apps/drupal.nix b/nixos/modules/services/web-apps/drupal.nix index dff3450553be..3b307327a6d7 100644 --- a/nixos/modules/services/web-apps/drupal.nix +++ b/nixos/modules/services/web-apps/drupal.nix @@ -66,8 +66,8 @@ let postInstall = '' ln -s ${cfg.stateDir}/sites $out/share/php/${cfg.package.pname}${cfg.webRoot} - ln -s ${cfg.modulesDir} $out/share/php/${cfg.package.pname}/modules - ln -s ${cfg.themesDir} $out/share/php/${cfg.package.pname}/themes + ln -s ${cfg.modulesDir} $out/share/php/${cfg.package.pname}${cfg.webRoot}/modules/nixos-modules + ln -s ${cfg.themesDir} $out/share/php/${cfg.package.pname}${cfg.webRoot}/themes/nixos-themes ''; }); From b5aeef311689873efc7b4cfedb3ae4847cdb9e20 Mon Sep 17 00:00:00 2001 From: Katalin Rebhan Date: Mon, 30 Mar 2026 18:19:05 +0200 Subject: [PATCH 17/77] dovecot{,_pigeonhole}: make 2.4 the default version --- doc/release-notes/rl-2605.section.md | 2 ++ pkgs/by-name/do/dovecot/2.3.nix | 18 ++++++++++++++++++ pkgs/by-name/do/dovecot/2.4.nix | 8 -------- pkgs/by-name/do/dovecot/generic.nix | 3 +-- pkgs/by-name/do/dovecot/package.nix | 16 +++------------- pkgs/by-name/do/dovecot_pigeonhole/0.5.nix | 10 ++++++++++ pkgs/by-name/do/dovecot_pigeonhole/2.4.nix | 17 ----------------- pkgs/by-name/do/dovecot_pigeonhole/generic.nix | 3 +-- pkgs/by-name/do/dovecot_pigeonhole/package.nix | 13 ++++++++++--- pkgs/top-level/all-packages.nix | 12 ++++++------ 10 files changed, 51 insertions(+), 51 deletions(-) create mode 100644 pkgs/by-name/do/dovecot/2.3.nix delete mode 100644 pkgs/by-name/do/dovecot/2.4.nix create mode 100644 pkgs/by-name/do/dovecot_pigeonhole/0.5.nix delete mode 100644 pkgs/by-name/do/dovecot_pigeonhole/2.4.nix diff --git a/doc/release-notes/rl-2605.section.md b/doc/release-notes/rl-2605.section.md index ed1f18a3c3bb..b1023b71f107 100644 --- a/doc/release-notes/rl-2605.section.md +++ b/doc/release-notes/rl-2605.section.md @@ -228,6 +228,8 @@ - All Xfce packages have been moved to top level (e.g. if you previously added `pkgs.xfce.xfce4-whiskermenu-plugin` to `environment.systemPackages`, you will need to change it to `pkgs.xfce4-whiskermenu-plugin`). The `xfce` scope will be removed in NixOS 26.11. +- The Dovecot IMAP server has been updated to version 2.4, with the `dovecot` attribute now referring to this backwards-incompatible version. The attribute `dovecot_2_3` refers to the previous version. The Pigeonhole plugin has been similarly updated to 2.4, with the version compatible with Dovecot 2.3 being at `dovecot_pigeonhole_0_5`. See for more information on how to upgrade. + - `spacefm` was removed because it appeared to be unmaintained upstream. - `vimPlugins.nvim-treesitter` has been updated to `main` branch, which is a full and incompatible rewrite. If you can't or don't want to update, you should use `vimPlugins.nvim-treesitter-legacy`. diff --git a/pkgs/by-name/do/dovecot/2.3.nix b/pkgs/by-name/do/dovecot/2.3.nix new file mode 100644 index 000000000000..3b8ad371034e --- /dev/null +++ b/pkgs/by-name/do/dovecot/2.3.nix @@ -0,0 +1,18 @@ +import ./generic.nix { + version = "2.3.21.1"; + hash = "sha256-1THBB401r6AnZbnHGhIq+o+nR8v94O0mIX68Pv0miiE="; + patches = fetchpatch: [ + # Fix loading extended modules. + ./load-extended-modules.patch + # fix openssl 3.0 compatibility + (fetchpatch { + url = "https://salsa.debian.org/debian/dovecot/-/raw/debian/1%252.3.19.1+dfsg1-2/debian/patches/Support-openssl-3.0.patch"; + hash = "sha256-PbBB1jIY3jIC8Js1NY93zkV0gISGUq7Nc67Ul5tN7sw="; + }) + (fetchpatch { + name = "dovecot-test-data-stack-drop-bogus-assertion.patch"; + url = "https://github.com/dovecot/core/commit/9f642dd868db6e7401f24e4fb4031b5bdca8aae7.patch"; + hash = "sha256-dAX80dRqOba9Fkzl11ChYJ6vqcgfkaw/o+TOQKCnnns="; + }) + ]; +} diff --git a/pkgs/by-name/do/dovecot/2.4.nix b/pkgs/by-name/do/dovecot/2.4.nix deleted file mode 100644 index 7421368e2a3e..000000000000 --- a/pkgs/by-name/do/dovecot/2.4.nix +++ /dev/null @@ -1,8 +0,0 @@ -import ./generic.nix { - version = "2.4.3"; - hash = "sha256-NTtQMHK/IzAYHKb1lxClUUJkyJpeLo7mKRCAR1GaUTo="; - patches = _: [ - # Fix loading extended modules. - ./load-extended-modules.patch - ]; -} diff --git a/pkgs/by-name/do/dovecot/generic.nix b/pkgs/by-name/do/dovecot/generic.nix index 49d809e6fae5..fbdfcef9557a 100644 --- a/pkgs/by-name/do/dovecot/generic.nix +++ b/pkgs/by-name/do/dovecot/generic.nix @@ -33,8 +33,7 @@ fetchpatch, rpcsvc-proto, libtirpc, - dovecot_pigeonhole_0_5, - dovecot_pigeonhole ? dovecot_pigeonhole_0_5, + dovecot_pigeonhole, withApparmor ? false, libapparmor, withLDAP ? true, diff --git a/pkgs/by-name/do/dovecot/package.nix b/pkgs/by-name/do/dovecot/package.nix index 3b8ad371034e..7421368e2a3e 100644 --- a/pkgs/by-name/do/dovecot/package.nix +++ b/pkgs/by-name/do/dovecot/package.nix @@ -1,18 +1,8 @@ import ./generic.nix { - version = "2.3.21.1"; - hash = "sha256-1THBB401r6AnZbnHGhIq+o+nR8v94O0mIX68Pv0miiE="; - patches = fetchpatch: [ + version = "2.4.3"; + hash = "sha256-NTtQMHK/IzAYHKb1lxClUUJkyJpeLo7mKRCAR1GaUTo="; + patches = _: [ # Fix loading extended modules. ./load-extended-modules.patch - # fix openssl 3.0 compatibility - (fetchpatch { - url = "https://salsa.debian.org/debian/dovecot/-/raw/debian/1%252.3.19.1+dfsg1-2/debian/patches/Support-openssl-3.0.patch"; - hash = "sha256-PbBB1jIY3jIC8Js1NY93zkV0gISGUq7Nc67Ul5tN7sw="; - }) - (fetchpatch { - name = "dovecot-test-data-stack-drop-bogus-assertion.patch"; - url = "https://github.com/dovecot/core/commit/9f642dd868db6e7401f24e4fb4031b5bdca8aae7.patch"; - hash = "sha256-dAX80dRqOba9Fkzl11ChYJ6vqcgfkaw/o+TOQKCnnns="; - }) ]; } diff --git a/pkgs/by-name/do/dovecot_pigeonhole/0.5.nix b/pkgs/by-name/do/dovecot_pigeonhole/0.5.nix new file mode 100644 index 000000000000..4de2e7419269 --- /dev/null +++ b/pkgs/by-name/do/dovecot_pigeonhole/0.5.nix @@ -0,0 +1,10 @@ +import ./generic.nix { + version = "0.5.21.1"; + url = + { + version, + dovecotMajorMinor, + }: + "https://pigeonhole.dovecot.org/releases/${dovecotMajorMinor}/dovecot-${dovecotMajorMinor}-pigeonhole-${version}.tar.gz"; + hash = "sha256-andOWZmgWYIPATEk0V+mHmReL+quG81azwPkBMoo9OE="; +} diff --git a/pkgs/by-name/do/dovecot_pigeonhole/2.4.nix b/pkgs/by-name/do/dovecot_pigeonhole/2.4.nix deleted file mode 100644 index ca18eaa2d271..000000000000 --- a/pkgs/by-name/do/dovecot_pigeonhole/2.4.nix +++ /dev/null @@ -1,17 +0,0 @@ -import ./generic.nix { - version = "2.4.3"; - url = - { - version, - dovecotMajorMinor, - }: - "https://pigeonhole.dovecot.org/releases/${dovecotMajorMinor}/dovecot-pigeonhole-${version}.tar.gz"; - hash = "sha256-LQNhqYnBVICabluj8F07UOZR5frt6bd9JSyuHJDS6hc="; - patches = fetchpatch: [ - # https://github.com/NixOS/nixpkgs/pull/388463#issuecomment-3066016707 - (fetchpatch { - url = "https://github.com/dovecot/pigeonhole/commit/517d74aa1d98b853b72608ce722bc58009c0f4a9.patch"; - hash = "sha256-BLBz9ZhOGEIIitnXG0uM6bZBRNnQBy4K2IJlh1+Un50="; - }) - ]; -} diff --git a/pkgs/by-name/do/dovecot_pigeonhole/generic.nix b/pkgs/by-name/do/dovecot_pigeonhole/generic.nix index 5f11b695efa1..fca1f17172ec 100644 --- a/pkgs/by-name/do/dovecot_pigeonhole/generic.nix +++ b/pkgs/by-name/do/dovecot_pigeonhole/generic.nix @@ -9,8 +9,7 @@ stdenv, fetchpatch, fetchzip, - dovecot_2_3, - dovecot ? dovecot_2_3, + dovecot, openssl, libstemmer, perl, diff --git a/pkgs/by-name/do/dovecot_pigeonhole/package.nix b/pkgs/by-name/do/dovecot_pigeonhole/package.nix index 4de2e7419269..ca18eaa2d271 100644 --- a/pkgs/by-name/do/dovecot_pigeonhole/package.nix +++ b/pkgs/by-name/do/dovecot_pigeonhole/package.nix @@ -1,10 +1,17 @@ import ./generic.nix { - version = "0.5.21.1"; + version = "2.4.3"; url = { version, dovecotMajorMinor, }: - "https://pigeonhole.dovecot.org/releases/${dovecotMajorMinor}/dovecot-${dovecotMajorMinor}-pigeonhole-${version}.tar.gz"; - hash = "sha256-andOWZmgWYIPATEk0V+mHmReL+quG81azwPkBMoo9OE="; + "https://pigeonhole.dovecot.org/releases/${dovecotMajorMinor}/dovecot-pigeonhole-${version}.tar.gz"; + hash = "sha256-LQNhqYnBVICabluj8F07UOZR5frt6bd9JSyuHJDS6hc="; + patches = fetchpatch: [ + # https://github.com/NixOS/nixpkgs/pull/388463#issuecomment-3066016707 + (fetchpatch { + url = "https://github.com/dovecot/pigeonhole/commit/517d74aa1d98b853b72608ce722bc58009c0f4a9.patch"; + hash = "sha256-BLBz9ZhOGEIIitnXG0uM6bZBRNnQBy4K2IJlh1+Un50="; + }) + ]; } diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 305ece210f28..3ffabf922308 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -8070,15 +8070,15 @@ with pkgs; dodgy = with python3Packages; toPythonApplication dodgy; - dovecot_2_3 = dovecot; - dovecot_2_4 = callPackage ../by-name/do/dovecot/2.4.nix { - dovecot_pigeonhole = dovecot_pigeonhole_2_4; + dovecot_2_3 = callPackage ../by-name/do/dovecot/2.3.nix { + dovecot_pigeonhole = dovecot_pigeonhole_0_5; }; + dovecot_2_4 = dovecot; - dovecot_pigeonhole_0_5 = dovecot_pigeonhole; - dovecot_pigeonhole_2_4 = callPackage ../by-name/do/dovecot_pigeonhole/2.4.nix { - dovecot = dovecot_2_4; + dovecot_pigeonhole_0_5 = callPackage ../by-name/do/dovecot_pigeonhole/0.5.nix { + dovecot = dovecot_2_3; }; + dovecot_pigeonhole_2_4 = dovecot_pigeonhole; inherit (callPackages ../servers/firebird { }) firebird_4 From ad56a1d988b448518aaad2bc5577b3059c8dfd12 Mon Sep 17 00:00:00 2001 From: Jappie3 Date: Sat, 20 Dec 2025 16:16:52 +0100 Subject: [PATCH 18/77] nixos/dovecot: add settings option (RFC42) Co-authored-by: Katalin Rebhan --- nixos/modules/services/mail/dovecot.nix | 695 +++++++++++------------- nixos/tests/dovecot.nix | 14 +- 2 files changed, 336 insertions(+), 373 deletions(-) diff --git a/nixos/modules/services/mail/dovecot.nix b/nixos/modules/services/mail/dovecot.nix index af91440c6a3f..c4e71daff438 100644 --- a/nixos/modules/services/mail/dovecot.nix +++ b/nixos/modules/services/mail/dovecot.nix @@ -7,33 +7,45 @@ let inherit (lib) - attrValues + all + attrsToList concatMapStringsSep - concatStrings concatStringsSep + elemAt + filter flatten imap1 + isAttrs + isBool + isDerivation + isInt + isList + isPath + isString + listToAttrs literalExpression + mapAttrs' mapAttrsToList + mkDefault mkEnableOption mkIf + mkMerge mkOption + mkPackageOption mkRemovedOptionModule + mkRenamedOptionModule + nameValuePair optional optionalAttrs optionalString + optionals singleton + splitString + traceSeq types - mkRenamedOptionModule - nameValuePair - mapAttrs' - listToAttrs - filter ; - inherit (lib.strings) match; cfg = config.services.dovecot2; - dovecotPkg = pkgs.dovecot; baseDir = "/run/dovecot2"; stateDir = "/var/lib/dovecot"; @@ -69,35 +81,6 @@ let ) ); - mkExtraConfigCollisionWarning = term: '' - You referred to ${term} in `services.dovecot2.extraConfig`. - - Due to gradual transition to structured configuration for plugin configuration, it is possible - this will cause your plugin configuration to be ignored. - - Consider setting `services.dovecot2.pluginSettings.${term}` instead. - ''; - - # Those settings are automatically set based on other parts - # of this module. - automaticallySetPluginSettings = [ - "sieve_plugins" - "sieve_extensions" - "sieve_global_extensions" - "sieve_pipe_bin_dir" - ] - ++ (builtins.attrNames sieveScriptSettings) - ++ (builtins.attrNames imapSieveMailboxSettings); - - # The idea is to match everything that looks like `$term =` - # but not `# $term something something` - # or `# $term = some value` because those are comments. - configContainsSetting = lines: term: (match "[[:blank:]]*${term}[[:blank:]]*=.*" lines) != null; - - warnAboutExtraConfigCollisions = map mkExtraConfigCollisionWarning ( - filter (configContainsSetting cfg.extraConfig) automaticallySetPluginSettings - ); - sievePipeBinScriptDirectory = pkgs.linkFarm "sieve-pipe-bins" ( map (el: { name = builtins.unsafeDiscardStringContext (baseNameOf el); @@ -105,200 +88,263 @@ let }) cfg.sieve.pipeBins ); - dovecotConf = concatStrings [ - '' - base_dir = ${baseDir} - protocols = ${concatStringsSep " " cfg.protocols} - sendmail_path = /run/wrappers/bin/sendmail - mail_plugin_dir = /run/current-system/sw/lib/dovecot/modules - # defining mail_plugins must be done before the first protocol {} filter because of https://doc.dovecot.org/configuration_manual/config_file/config_file_syntax/#variable-expansion - mail_plugins = $mail_plugins ${concatStringsSep " " cfg.mailPlugins.globally.enable} - '' - - (concatStringsSep "\n" ( - mapAttrsToList (protocol: plugins: '' - protocol ${protocol} { - mail_plugins = $mail_plugins ${concatStringsSep " " plugins.enable} - } - '') cfg.mailPlugins.perProtocol - )) - - ( - if cfg.sslServerCert == null then - '' - ssl = no - disable_plaintext_auth = no - '' - else - '' - ssl_cert = <${cfg.sslServerCert} - ssl_key = <${cfg.sslServerKey} - ${optionalString (cfg.sslCACert != null) ("ssl_ca = <" + cfg.sslCACert)} - ${optionalString cfg.enableDHE "ssl_dh = <${config.security.dhparams.params.dovecot2.path}"} - disable_plaintext_auth = yes - '' - ) - - '' - default_internal_user = ${cfg.user} - default_internal_group = ${cfg.group} - ${optionalString (cfg.mailUser != null) "mail_uid = ${cfg.mailUser}"} - ${optionalString (cfg.mailGroup != null) "mail_gid = ${cfg.mailGroup}"} - - mail_location = ${cfg.mailLocation} - - maildir_copy_with_hardlinks = yes - pop3_uidl_format = %08Xv%08Xu - - auth_mechanisms = plain login - - service auth { - user = root - } - '' - - (optionalString cfg.enablePAM '' - userdb { - driver = passwd - } - - passdb { - driver = pam - args = ${optionalString cfg.showPAMFailure "failure_show_msg=yes"} dovecot2 - } - '') - - (optionalString (cfg.mailboxes != { }) '' - namespace inbox { - inbox=yes - ${concatStringsSep "\n" (map mailboxConfig (attrValues cfg.mailboxes))} - } - '') - - (optionalString cfg.enableQuota '' - service quota-status { - executable = ${dovecotPkg}/libexec/dovecot/quota-status -p postfix - inet_listener { - port = ${cfg.quotaPort} - } - client_limit = 1 - } - - plugin { - quota_rule = *:storage=${cfg.quotaGlobalPerUser} - quota = count:User quota # per virtual mail user quota - quota_status_success = DUNNO - quota_status_nouser = DUNNO - quota_status_overquota = "552 5.2.2 Mailbox is full" - quota_grace = 10%% - quota_vsizes = yes - } - '') - - # General plugin settings: - # - sieve is mostly generated here, refer to `pluginSettings` to follow - # the control flow. - '' - plugin { - ${concatStringsSep "\n" (mapAttrsToList (key: value: " ${key} = ${value}") cfg.pluginSettings)} - } - '' - - cfg.extraConfig + allSieveSettings = mkMerge [ + imapSieveMailboxSettings + sieveScriptSettings + { + sieve_plugins = + mkIf (cfg.sieve.plugins != [ ]) # . + (concatStringsSep " " cfg.sieve.plugins); + sieve_extensions = + mkIf (cfg.sieve.extensions != [ ]) # . + (concatMapStringsSep " " (el: "+${el}") cfg.sieve.extensions); + sieve_global_extensions = + mkIf (cfg.sieve.globalExtensions != [ ]) # . + (concatMapStringsSep " " (el: "+${el}") cfg.sieve.globalExtensions); + sieve_pipe_bin_dir = + mkIf (cfg.sieve.pipeBins != [ ]) # . + sievePipeBinScriptDirectory; + } ]; - mailboxConfig = - mailbox: - '' - mailbox "${mailbox.name}" { - auto = ${toString mailbox.auto} - '' - + optionalString (mailbox.autoexpunge != null) '' - autoexpunge = ${mailbox.autoexpunge} - '' - + optionalString (mailbox.specialUse != null) '' - special_use = \${toString mailbox.specialUse} - '' - + "}"; + yesOrNo = v: if v then "yes" else "no"; - mailboxes = - { name, ... }: - { - options = { - name = mkOption { - type = types.strMatching ''[^"]+''; - example = "Spam"; - default = name; - readOnly = true; - description = "The name of the mailbox."; - }; - auto = mkOption { - type = types.enum [ - "no" - "create" - "subscribe" - ]; - default = "no"; - example = "subscribe"; - description = "Whether to automatically create or create and subscribe to the mailbox or not."; - }; - specialUse = mkOption { - type = types.nullOr ( - types.enum [ - "All" - "Archive" - "Drafts" - "Flagged" - "Junk" - "Sent" - "Trash" - ] - ); - default = null; - example = "Junk"; - description = "Null if no special use flag is set. Other than that every use flag mentioned in the RFC is valid."; - }; - autoexpunge = mkOption { - type = types.nullOr types.str; - default = null; - example = "60d"; - description = '' - To automatically remove all email from the mailbox which is older than the - specified time. - ''; - }; - }; - }; + toOption = + i: n: v: + "${i}${toString n} = ${v}"; + + formatKeyValue = + indent: n: v: + if (v == null) then + "" + else if isInt v then + toOption indent n (toString v) + else if isBool v then + toOption indent n (yesOrNo v) + else if isString v then + toOption indent n v + else if isList v then + if all isString v then + toOption indent n (concatStringsSep " " v) + else + map (formatKeyValue indent n) v + else if isPath v || isDerivation v then + # paths -> copy to store + # derivations -> just use output path instead of looping over the attrs + toOption indent n "${v}" + else if isAttrs v then + let + sectionType = v._section.type; + sectionName = v._section.name; + sectionTitle = concatStringsSep " " ( + filter (s: s != null) [ + sectionType + sectionName + ] + ); + in + concatStringsSep "\n" ( + [ + "${indent}${sectionTitle} {" + ] + ++ (mapAttrsToList (formatKeyValue "${indent} ") (removeAttrs v [ "_section" ])) + ++ [ "${indent}}" ] + ) + else + throw (traceSeq v "services.dovecot2.settings: unexpected type"); + + doveConf = concatStringsSep "\n" ( + optionals (cfg.includeFiles != [ ]) (map (f: "!include ${f}") cfg.includeFiles) + ++ flatten (mapAttrsToList (formatKeyValue "") cfg.settings) + ); in { imports = [ - (mkRemovedOptionModule [ "services" "dovecot2" "package" ] "") (mkRemovedOptionModule [ "services" "dovecot2" "modules" ] "Now need to use `environment.systemPackages` to load additional Dovecot modules") + (mkRemovedOptionModule [ + "services" + "dovecot2" + "enablePop3" + ] "Set 'services.dovecot2.settings.protocols.pop3 = true/false;' instead.") + (mkRemovedOptionModule [ + "services" + "dovecot2" + "enableImap" + ] "Set 'services.dovecot2.settings.protocols.imap = true/false;' instead.") + (mkRemovedOptionModule [ + "services" + "dovecot2" + "enableLmtp" + ] "Set 'services.dovecot2.settings.protocols.lmtp = true/false;' instead.") (mkRenamedOptionModule [ "services" "dovecot2" "sieveScripts" ] [ "services" "dovecot2" "sieve" "scripts" ] ) - ]; + (mkRenamedOptionModule + [ "services" "dovecot2" "mailUser" ] + [ "services" "dovecot2" "settings" "mail_uid" ] + ) + (mkRenamedOptionModule + [ "services" "dovecot2" "mailGroup" ] + [ "services" "dovecot2" "settings" "mail_gid" ] + ) + (mkRenamedOptionModule + [ "services" "dovecot2" "protocols" ] + [ "services" "dovecot2" "settings" "protocols" ] + ) + ] + ++ ( + let + basePath = [ + "services" + "dovecot2" + ]; + mkRemovedOptions = + list: + map ( + name: mkRemovedOptionModule (basePath ++ name) "Please use services.dovecot2.settings instead." + ) list; + in + mkRemovedOptions [ + [ "extraConfig" ] + [ "mailboxes" ] + [ "pluginSettings" ] + [ "enableQuota" ] + [ "quotaPort" ] + [ "quotaGlobalPerUser" ] + ] + ); options.services.dovecot2 = { enable = mkEnableOption "the dovecot 2.x POP3/IMAP server"; - enablePop3 = mkEnableOption "starting the POP3 listener (when Dovecot is enabled)"; - - enableImap = mkEnableOption "starting the IMAP listener (when Dovecot is enabled)" // { - default = true; + package = mkPackageOption pkgs "dovecot" { } // { }; - enableLmtp = mkEnableOption "starting the LMTP listener (when Dovecot is enabled)"; + settings = mkOption { + default = { }; + type = + let + inherit (lib.types) + attrsOf + path + bool + int + nonEmptyListOf + nonEmptyStr + nullOr + oneOf + str + submodule + ; + inherit (lib.lists) last dropEnd; - protocols = mkOption { - type = types.listOf types.str; - default = [ ]; - description = "Additional listeners to start when Dovecot is enabled."; + section = submodule ( + { name, options, ... }: + let + # if the current name is a list (matches '[definition .*]') -> get + # name' from _module.args.loc & use it for {type,name}Default + name' = + if (builtins.match "[[]definition .*].*" name) == null then + name + else + last (dropEnd 3 options._module.args.loc); + + # split name' on the first space + splits = builtins.match "([^ ]+) (.+)" name'; + typeDefault = if splits == null then name' else builtins.elemAt splits 0; + nameDefault = if splits == null then null else builtins.elemAt splits 1; + in + { + options = { + _section = { + type = mkOption { + description = "Section type, mandatory for every section."; + type = nonEmptyStr; + default = typeDefault; + }; + name = mkOption { + description = "Section name, comes after section type & is optional in some cases."; + type = nullOr nonEmptyStr; + default = nameDefault; + }; + }; + }; + + freeformType = attrsOf valueType; + } + ); + + primitiveType = oneOf [ + int + str + bool + # path must order before section, otherwise the latter will + # interpret path literals as a module path to load + path + section + ]; + + valueType = + nullOr (oneOf [ + primitiveType + (nonEmptyListOf primitiveType) + ]) + // { + description = "Dovecot config value"; + }; + in + attrsOf valueType; + description = '' + Dovecot configuration, see + for all available options. + + For information on the configuration structure, see . + + ::: {.warning} + Explicit settings in [{option}`services.dovecot2.settings`](#opt-services.dovecot2.settings) can silently override values set by other `services.dovecot2.*` options. + ::: + ''; + example = { + protocols = { + imap = true; + submission = true; + lmtp = true; + }; + mail_driver = "maildir"; + "namespace inbox" = { + inbox = true; + separator = "/"; + }; + service = [ + { + _section.name = "imap"; + process_min_avail = 1; + client_limit = 100; + "inet_listener imap".port = 31143; + "inet_listener imaps".port = 31993; + } + { + _section.name = "lmtp"; + user = "dovemail"; + "unix_listener lmtp" = { + mode = "0660"; + user = "postfix"; + }; + } + ]; + "protocol imap".mail_plugins = { + imap_sieve = true; + imap_filter_sieve = true; + }; + mail_attribute."dict file" = { + path = "%{home}/dovecot-attributes"; + }; + }; }; user = mkOption { @@ -313,13 +359,6 @@ in description = "Dovecot group name."; }; - extraConfig = mkOption { - type = types.lines; - default = ""; - example = "mail_debug = yes"; - description = "Additional entries to put verbatim into Dovecot's config file."; - }; - mailPlugins = let plugins = @@ -374,129 +413,31 @@ in type = types.nullOr types.path; default = null; description = "Config file used for the whole dovecot configuration."; - apply = v: if v != null then v else pkgs.writeText "dovecot.conf" dovecotConf; + apply = v: if v != null then v else pkgs.writeText "dovecot.conf" doveConf; }; - mailLocation = mkOption { - type = types.str; - default = "maildir:/var/spool/mail/%u"; # Same as inbox, as postfix - example = "maildir:~/mail:INBOX=/var/spool/mail/%u"; - description = '' - Location that dovecot will use for mail folders. Dovecot mail_location option. - ''; - }; - - mailUser = mkOption { - type = types.nullOr types.str; - default = null; - description = "Default user to store mail for virtual users."; - }; - - mailGroup = mkOption { - type = types.nullOr types.str; - default = null; - description = "Default group to store mail for virtual users."; + includeFiles = mkOption { + type = types.listOf types.path; + default = [ ]; + description = "Files to include in the Dovecot config file using !include directives."; + example = [ "/foo/bar/extraDovecotConfig.conf" ]; }; createMailUser = mkEnableOption '' automatically creating the user - given in {option}`services.dovecot.user` and the group - given in {option}`services.dovecot.group`'' + given in {option}`services.dovecot2.settings.mail_uid` and the group + given in {option}`services.dovecot2.settings.mail_gid`'' // { default = true; }; - sslCACert = mkOption { - type = types.nullOr types.str; - default = null; - description = "Path to the server's CA certificate key."; - }; - - sslServerCert = mkOption { - type = types.nullOr types.str; - default = null; - description = "Path to the server's public key."; - }; - - sslServerKey = mkOption { - type = types.nullOr types.str; - default = null; - description = "Path to the server's private key."; - }; - enablePAM = mkEnableOption "creating a own Dovecot PAM service and configure PAM user logins" // { default = true; }; - enableDHE = mkEnableOption "ssl_dh and generation of primes for the key exchange" // { - default = true; - }; - showPAMFailure = mkEnableOption "showing the PAM failure message on authentication error (useful for OTPW)"; - mailboxes = mkOption { - type = - with types; - coercedTo (listOf unspecified) ( - list: - listToAttrs ( - map (entry: { - name = entry.name; - value = removeAttrs entry [ "name" ]; - }) list - ) - ) (attrsOf (submodule mailboxes)); - default = { }; - example = literalExpression '' - { - Spam = { specialUse = "Junk"; auto = "create"; }; - } - ''; - description = "Configure mailboxes and auto create or subscribe them."; - }; - - enableQuota = mkEnableOption "the dovecot quota service"; - - quotaPort = mkOption { - type = types.str; - default = "12340"; - description = '' - The Port the dovecot quota service binds to. - If using postfix, add check_policy_service inet:localhost:12340 to your smtpd_recipient_restrictions in your postfix config. - ''; - }; - quotaGlobalPerUser = mkOption { - type = types.str; - default = "100G"; - example = "10G"; - description = "Quota limit for the user in bytes. Supports suffixes b, k, M, G, T and %."; - }; - - pluginSettings = mkOption { - # types.str does not coerce from packages, like `sievePipeBinScriptDirectory`. - type = types.attrsOf ( - types.oneOf [ - types.str - types.package - ] - ); - default = { }; - example = literalExpression '' - { - sieve = "file:~/sieve;active=~/.dovecot.sieve"; - } - ''; - description = '' - Plugin settings for dovecot in general, e.g. `sieve`, `sieve_default`, etc. - - Some of the other knobs of this module will influence by default the plugin settings, but you - can still override any plugin settings. - - If you override a plugin setting, its value is cleared and you have to copy over the defaults. - ''; - }; - imapsieve.mailbox = mkOption { default = [ ]; description = "Configure Sieve filtering rules on IMAP actions"; @@ -624,36 +565,56 @@ in config = mkIf cfg.enable { security.pam.services.dovecot2 = mkIf cfg.enablePAM { }; - security.dhparams = mkIf (cfg.sslServerCert != null && cfg.enableDHE) { - enable = true; - params.dovecot2 = { }; - }; - services.dovecot2 = { - protocols = - optional cfg.enableImap "imap" ++ optional cfg.enablePop3 "pop3" ++ optional cfg.enableLmtp "lmtp"; - - mailPlugins = mkIf cfg.enableQuota { - globally.enable = [ "quota" ]; - perProtocol.imap.enable = [ "imap_quota" ]; - }; - sieve.plugins = optional (cfg.imapsieve.mailbox != [ ]) "sieve_imapsieve" ++ optional (cfg.sieve.pipeBins != [ ]) "sieve_extprograms"; sieve.globalExtensions = optional (cfg.sieve.pipeBins != [ ]) "vnd.dovecot.pipe"; - pluginSettings = lib.mapAttrs (n: lib.mkDefault) ( + settings = mkMerge [ { - sieve_plugins = concatStringsSep " " cfg.sieve.plugins; - sieve_extensions = concatStringsSep " " (map (el: "+${el}") cfg.sieve.extensions); - sieve_global_extensions = concatStringsSep " " (map (el: "+${el}") cfg.sieve.globalExtensions); - sieve_pipe_bin_dir = sievePipeBinScriptDirectory; + base_dir = mkDefault baseDir; + sendmail_path = mkDefault "/run/wrappers/bin/sendmail"; + mail_plugin_dir = mkDefault "/run/current-system/sw/lib/dovecot/modules"; + + default_internal_user = mkDefault cfg.user; + default_internal_group = mkDefault cfg.group; + + maildir_copy_with_hardlinks = mkDefault true; + pop3_uidl_format = mkDefault "%08Xv%08Xu"; + + auth_mechanisms = mkDefault "plain login"; + "service auth" = { + user = "root"; + }; + + mail_location = mkDefault "maildir:/var/spool/mail/%u"; + + passdb = mkIf cfg.enablePAM (mkDefault { + driver = "pam"; + args = "${optionalString cfg.showPAMFailure "failure_show_msg=yes"} dovecot2"; + }); + + userdb = mkIf cfg.enablePAM (mkDefault { + driver = "passwd"; + }); + + mail_plugins = mkDefault "$mail_plugins ${concatStringsSep " " cfg.mailPlugins.globally.enable}"; + + plugin = allSieveSettings; } - // sieveScriptSettings - // imapSieveMailboxSettings - ); + (mkIf (cfg.mailPlugins.perProtocol != { } || cfg.mailPlugins.globally.enable != [ ]) ( + listToAttrs ( + map (m: { + name = "protocol ${elemAt (splitString "." m.name) 0}"; + value.mail_plugins = "$mail_plugins ${ + concatStringsSep " " (m.value.enable ++ cfg.mailPlugins.globally.enable) + }"; + }) (attrsToList cfg.mailPlugins.perProtocol) + ) + )) + ]; }; users.users = { @@ -670,12 +631,14 @@ in group = cfg.group; }; } - // optionalAttrs (cfg.createMailUser && cfg.mailUser != null) { - ${cfg.mailUser} = { + // optionalAttrs (cfg.settings.mail_uid or null != null && cfg.createMailUser) { + ${cfg.settings.mail_uid} = { description = "Virtual Mail User"; isSystemUser = true; } - // optionalAttrs (cfg.mailGroup != null) { group = cfg.mailGroup; }; + // optionalAttrs (cfg.settings.mail_gid or null != null) { + group = cfg.settings.mail_gid; + }; }; users.groups = { @@ -684,8 +647,8 @@ in // optionalAttrs (cfg.group == "dovecot2") { dovecot2.gid = config.ids.gids.dovecot2; } - // optionalAttrs (cfg.createMailUser && cfg.mailGroup != null) { - ${cfg.mailGroup} = { }; + // optionalAttrs (cfg.settings.mail_gid or null != null && cfg.createMailUser) { + ${cfg.settings.mail_gid} = { }; }; environment.etc."dovecot/dovecot.conf".source = cfg.configFile; @@ -704,8 +667,8 @@ in startLimitIntervalSec = 60; # 1 min serviceConfig = { Type = "notify"; - ExecStart = "${dovecotPkg}/sbin/dovecot -F"; - ExecReload = "${dovecotPkg}/sbin/doveadm reload"; + ExecStart = "${lib.getExe cfg.package} -F"; + ExecReload = "${lib.getExe' cfg.package "doveadm"} reload"; CapabilityBoundingSet = [ "CAP_CHOWN" @@ -773,7 +736,9 @@ in ${pkgs.dovecot_pigeonhole}/bin/sievec '${stateDir}/sieve/${to}' '') cfg.sieve.scripts )} - chown -R '${cfg.mailUser}:${cfg.mailGroup}' '${stateDir}/sieve' + ${optionalString ( + cfg.settings ? mail_uid && cfg.settings.mail_uid != null && cfg.settings.mail_gid != null + ) "chown -R '${cfg.settings.mail_uid}:${cfg.settings.mail_gid}' '${stateDir}/sieve'"} '' + optionalString (cfg.imapsieve.mailbox != [ ]) '' mkdir -p ${stateDir}/imapsieve/{before,after} @@ -791,29 +756,22 @@ in ) cfg.imapsieve.mailbox} ${optionalString ( - cfg.mailUser != null && cfg.mailGroup != null - ) "chown -R '${cfg.mailUser}:${cfg.mailGroup}' '${stateDir}/imapsieve'"} + cfg.settings ? mail_uid && cfg.settings.mail_uid != null && cfg.settings.mail_gid != null + ) "chown -R '${cfg.settings.mail_uid}:${cfg.settings.mail_gid}' '${stateDir}/imapsieve'"} ''; }; - environment.systemPackages = [ dovecotPkg ]; - - warnings = warnAboutExtraConfigCollisions; + environment.systemPackages = [ cfg.package ]; assertions = [ - { - assertion = - (cfg.sslServerCert == null) == (cfg.sslServerKey == null) - && (cfg.sslCACert != null -> !(cfg.sslServerCert == null || cfg.sslServerKey == null)); - message = "dovecot needs both sslServerCert and sslServerKey defined for working crypto"; - } { assertion = cfg.showPAMFailure -> cfg.enablePAM; message = "dovecot is configured with showPAMFailure while enablePAM is disabled"; } { - assertion = cfg.sieve.scripts != { } -> (cfg.mailUser != null && cfg.mailGroup != null); - message = "dovecot requires mailUser and mailGroup to be set when `sieve.scripts` is set"; + assertion = + cfg.sieve.scripts != { } -> (cfg.settings.mail_uid != null && cfg.settings.mail_gid != null); + message = "dovecot requires settings.mail_uid and settings.mail_gid to be set when `sieve.scripts` is set"; } { assertion = config.systemd.services ? dovecot2 == false; @@ -822,8 +780,11 @@ in ''; } ]; - }; - meta.maintainers = [ lib.maintainers.dblsaiko ]; + meta.maintainers = with lib.maintainers; [ + dblsaiko + jappie3 + prince213 + ]; } diff --git a/nixos/tests/dovecot.nix b/nixos/tests/dovecot.nix index 83b3781c773d..b7291114ccee 100644 --- a/nixos/tests/dovecot.nix +++ b/nixos/tests/dovecot.nix @@ -8,12 +8,14 @@ services.postfix.enable = true; services.dovecot2 = { enable = true; - protocols = [ - "imap" - "pop3" - ]; - mailUser = "vmail"; - mailGroup = "vmail"; + settings = { + protocols = [ + "imap" + "pop3" + ]; + mail_uid = "vmail"; + mail_gid = "vmail"; + }; }; environment.systemPackages = let From d49db5bd9653c04dab56e3b2255e518c381f3b1d Mon Sep 17 00:00:00 2001 From: Jappie3 Date: Sat, 20 Dec 2025 16:16:52 +0100 Subject: [PATCH 19/77] nixos/dovecot: add compatibility for Dovecot 2.4 Co-authored-by: Katalin Rebhan --- nixos/modules/services/mail/dovecot.nix | 190 +++++++++++++++++++++--- 1 file changed, 170 insertions(+), 20 deletions(-) diff --git a/nixos/modules/services/mail/dovecot.nix b/nixos/modules/services/mail/dovecot.nix index c4e71daff438..db183d26382d 100644 --- a/nixos/modules/services/mail/dovecot.nix +++ b/nixos/modules/services/mail/dovecot.nix @@ -43,6 +43,8 @@ let splitString traceSeq types + versionAtLeast + versionOlder ; cfg = config.services.dovecot2; @@ -50,6 +52,8 @@ let baseDir = "/run/dovecot2"; stateDir = "/var/lib/dovecot"; + sievec = lib.getExe' cfg.package.passthru.dovecot_pigeonhole "sievec"; + sieveScriptSettings = mapAttrs' ( to: _: nameValuePair "sieve_${to}" "${stateDir}/sieve/${to}" ) cfg.sieve.scripts; @@ -89,9 +93,14 @@ let ); allSieveSettings = mkMerge [ - imapSieveMailboxSettings sieveScriptSettings { + sieve_pipe_bin_dir = + mkIf (cfg.sieve.pipeBins != [ ]) # . + sievePipeBinScriptDirectory; + } + (mkIf isPre24 imapSieveMailboxSettings) + (mkIf isPre24 { sieve_plugins = mkIf (cfg.sieve.plugins != [ ]) # . (concatStringsSep " " cfg.sieve.plugins); @@ -101,10 +110,7 @@ let sieve_global_extensions = mkIf (cfg.sieve.globalExtensions != [ ]) # . (concatMapStringsSep " " (el: "+${el}") cfg.sieve.globalExtensions); - sieve_pipe_bin_dir = - mkIf (cfg.sieve.pipeBins != [ ]) # . - sievePipeBinScriptDirectory; - } + }) ]; yesOrNo = v: if v then "yes" else "no"; @@ -153,10 +159,23 @@ let else throw (traceSeq v "services.dovecot2.settings: unexpected type"); - doveConf = concatStringsSep "\n" ( - optionals (cfg.includeFiles != [ ]) (map (f: "!include ${f}") cfg.includeFiles) - ++ flatten (mapAttrsToList (formatKeyValue "") cfg.settings) - ); + doveConf = + let + configVersion = cfg.settings.dovecot_config_version or null; + storageVersion = cfg.settings.dovecot_storage_version or null; + remainingSettings = builtins.removeAttrs cfg.settings [ + "dovecot_config_version" + "dovecot_storage_version" + ]; + in + concatStringsSep "\n" ( + optional (configVersion != null) (formatKeyValue "" "dovecot_config_version" configVersion) + ++ optional (storageVersion != null) (formatKeyValue "" "dovecot_storage_version" storageVersion) + ++ optionals (cfg.includeFiles != [ ]) (map (f: "!include ${f}") cfg.includeFiles) + ++ flatten (mapAttrsToList (formatKeyValue "") remainingSettings) + ); + + isPre24 = versionOlder cfg.package.version "2.4"; in { imports = [ @@ -180,6 +199,31 @@ in "dovecot2" "enableLmtp" ] "Set 'services.dovecot2.settings.protocols.lmtp = true/false;' instead.") + (mkRemovedOptionModule [ + "services" + "dovecot2" + "sslServerCert" + ] "Use `settings.ssl_cert` for Dovecot 2.3, `settings.ssl_server_cert_file` for 2.4.") + (mkRemovedOptionModule [ + "services" + "dovecot2" + "sslServerKey" + ] "Use `settings.ssl_key` for Dovecot 2.3, `settings.ssl_server_key_file` for 2.4.") + (mkRemovedOptionModule [ + "services" + "dovecot2" + "sslCACert" + ] "Use `settings.ssl_ca` for Dovecot 2.3, `settings.ssl_server_ca_file` for 2.4.") + (mkRemovedOptionModule [ + "services" + "dovecot2" + "mailLocation" + ] "Use `settings.mail_location` for Dovecot 2.3, `settings.mail_path` for 2.4.") + (mkRemovedOptionModule [ + "services" + "dovecot2" + "enableDHE" + ] "Use ECDHE instead, or use recommended parameters from RFC7919.") (mkRenamedOptionModule [ "services" "dovecot2" "sieveScripts" ] [ "services" "dovecot2" "sieve" "scripts" ] @@ -223,6 +267,9 @@ in enable = mkEnableOption "the dovecot 2.x POP3/IMAP server"; package = mkPackageOption pkgs "dovecot" { } // { + default = + if versionAtLeast config.system.stateVersion "26.05" then pkgs.dovecot else pkgs.dovecot_2_3; + defaultText = lib.literalExpression ''if versionAtLeast config.system.stateVersion "26.05" then pkgs.dovecot else pkgs.dovecot_2_3''; }; settings = mkOption { @@ -440,7 +487,13 @@ in imapsieve.mailbox = mkOption { default = [ ]; - description = "Configure Sieve filtering rules on IMAP actions"; + description = '' + Configure Sieve filtering rules on IMAP actions + + ::: {.note} + This option is no longer used starting from Dovecot version 2.4. + ::: + ''; type = types.listOf ( types.submodule ( { config, ... }: @@ -566,13 +619,15 @@ in security.pam.services.dovecot2 = mkIf cfg.enablePAM { }; services.dovecot2 = { - sieve.plugins = + sieve.plugins = mkIf isPre24 ( optional (cfg.imapsieve.mailbox != [ ]) "sieve_imapsieve" - ++ optional (cfg.sieve.pipeBins != [ ]) "sieve_extprograms"; + ++ optional (cfg.sieve.pipeBins != [ ]) "sieve_extprograms" + ); - sieve.globalExtensions = optional (cfg.sieve.pipeBins != [ ]) "vnd.dovecot.pipe"; + sieve.globalExtensions = mkIf isPre24 (optional (cfg.sieve.pipeBins != [ ]) "vnd.dovecot.pipe"); settings = mkMerge [ + # options shared between 2.3 and 2.4 { base_dir = mkDefault baseDir; sendmail_path = mkDefault "/run/wrappers/bin/sendmail"; @@ -582,13 +637,16 @@ in default_internal_group = mkDefault cfg.group; maildir_copy_with_hardlinks = mkDefault true; - pop3_uidl_format = mkDefault "%08Xv%08Xu"; + pop3_uidl_format = if !isPre24 then mkDefault "%{uidvalidity}%{uid}" else mkDefault "%08Xv%08Xu"; auth_mechanisms = mkDefault "plain login"; "service auth" = { user = "root"; }; - + } + # these options differ quite a bit between 2.3 and 2.4, which is why they were split up here + # for pre-2.4: + (mkIf isPre24 { mail_location = mkDefault "maildir:/var/spool/mail/%u"; passdb = mkIf cfg.enablePAM (mkDefault { @@ -603,8 +661,8 @@ in mail_plugins = mkDefault "$mail_plugins ${concatStringsSep " " cfg.mailPlugins.globally.enable}"; plugin = allSieveSettings; - } - (mkIf (cfg.mailPlugins.perProtocol != { } || cfg.mailPlugins.globally.enable != [ ]) ( + }) + (mkIf (isPre24 && cfg.mailPlugins.perProtocol != { } || cfg.mailPlugins.globally.enable != [ ]) ( listToAttrs ( map (m: { name = "protocol ${elemAt (splitString "." m.name) 0}"; @@ -614,6 +672,32 @@ in }) (attrsToList cfg.mailPlugins.perProtocol) ) )) + # for 2.4: + (mkIf (!isPre24) { + mail_driver = mkDefault "maildir"; + mail_path = mkDefault "/var/spool/mail/%{user}"; + + sieve_script_bin_path = "/tmp/dovecot-%{user|username|lower}"; + + "passdb pam" = mkIf cfg.enablePAM (mkDefault { + driver = "pam"; + service_name = "dovecot2"; + failure_show_msg = mkIf cfg.showPAMFailure true; + }); + + "userdb passwd" = mkIf cfg.enablePAM (mkDefault { + driver = "passwd"; + }); + + sieve_plugins = mkIf (cfg.sieve.pipeBins != [ ]) { + "sieve_extprograms" = true; + }; + + sieve_global_extensions = mkIf (cfg.sieve.pipeBins != [ ]) { + "vnd.dovecot.pipe" = true; + }; + }) + (mkIf (!isPre24) allSieveSettings) ]; }; @@ -733,7 +817,7 @@ in else cp -p '${from}' '${stateDir}/sieve/${to}' fi - ${pkgs.dovecot_pigeonhole}/bin/sievec '${stateDir}/sieve/${to}' + ${sievec} '${stateDir}/sieve/${to}' '') cfg.sieve.scripts )} ${optionalString ( @@ -747,11 +831,11 @@ in el: optionalString (el.before != null) '' cp -p ${el.before} ${stateDir}/imapsieve/before/${baseNameOf el.before} - ${pkgs.dovecot_pigeonhole}/bin/sievec '${stateDir}/imapsieve/before/${baseNameOf el.before}' + ${sievec} '${stateDir}/imapsieve/before/${baseNameOf el.before}' '' + optionalString (el.after != null) '' cp -p ${el.after} ${stateDir}/imapsieve/after/${baseNameOf el.after} - ${pkgs.dovecot_pigeonhole}/bin/sievec '${stateDir}/imapsieve/after/${baseNameOf el.after}' + ${sievec} '${stateDir}/imapsieve/after/${baseNameOf el.after}' '' ) cfg.imapsieve.mailbox} @@ -763,7 +847,73 @@ in environment.systemPackages = [ cfg.package ]; + warnings = optional isPre24 '' + While Dovecot 2.3 is not yet deprecated or EOL, + there is a newer version available in Nixpkgs (Dovecot 2.4). + Check https://doc.dovecot.org/latest/installation/upgrade/2.3-to-2.4.html + before upgrading. + ''; + assertions = [ + { + assertion = isPre24 || cfg.settings.dovecot_config_version != null; + message = '' + services.dovecot2: Since Dovecot 2.4, the option 'services.dovecot2.settings.dovecot_config_version' must be explicitly set. + To retain compatibility with future updates, set the following and manually update as needed. + + services.dovecot2.settings.dovecot_config_version = "${cfg.package.version}"; + + Alternatively, you can automatically update to newer versions of the configuration format, which might break compatibility with future updates. + + services.dovecot2.settings.dovecot_config_version = config.services.dovecot2.package.version; + + See . + ''; + } + { + assertion = isPre24 || cfg.settings.dovecot_storage_version != null; + message = '' + services.dovecot2: Since Dovecot 2.4, the option 'services.dovecot2.settings.dovecot_storage_version' must be explicitly set. + Set it to the oldest version the storage should stay compatible with, for example the following for the currently selected version. + + services.dovecot2.settings.dovecot_storage_version = "${cfg.package.version}"; + + See . + ''; + } + { + assertion = isPre24 || cfg.imapsieve.mailbox == [ ]; + message = "since Dovecot 2.4, the `imapsieve.mailbox` option is no longer used in the NixOS module, please use the `settings` option instead."; + } + { + assertion = isPre24 || cfg.sieve.extensions == [ ]; + message = '' + services.dovecot2: Since Dovecot 2.4, the option 'services.dovecot2.sieve.extensions' is no longer valid, but it is set. + Set 'services.dovecot2.settings.sieve_extensions' instead. + See . + ''; + } + { + assertion = isPre24 || cfg.sieve.globalExtensions == [ ]; + message = '' + services.dovecot2: Since Dovecot 2.4, the option 'services.dovecot2.sieve.globalExtensions' is no longer valid, but it is set. + Set 'services.dovecot2.settings.sieve_global_extensions' instead. + See . + ''; + } + { + assertion = + isPre24 + || + # this is the default value for cfg.mailPlugins + cfg.mailPlugins == { + globally = { + enable = [ ]; + }; + perProtocol = { }; + }; + message = "since Dovecot 2.4, the `mailPlugins` option is no longer used in the NixOS module, please use the `settings` option instead."; + } { assertion = cfg.showPAMFailure -> cfg.enablePAM; message = "dovecot is configured with showPAMFailure while enablePAM is disabled"; From 8df2a9cbab64ed655a04dacceaeacbac022984f1 Mon Sep 17 00:00:00 2001 From: Katalin Rebhan Date: Wed, 25 Mar 2026 11:34:42 +0100 Subject: [PATCH 20/77] nixos/dovecot: define module defaults as options --- nixos/modules/services/mail/dovecot.nix | 501 +++++++++++++++++++----- 1 file changed, 406 insertions(+), 95 deletions(-) diff --git a/nixos/modules/services/mail/dovecot.nix b/nixos/modules/services/mail/dovecot.nix index db183d26382d..9de696b3045b 100644 --- a/nixos/modules/services/mail/dovecot.nix +++ b/nixos/modules/services/mail/dovecot.nix @@ -92,27 +92,6 @@ let }) cfg.sieve.pipeBins ); - allSieveSettings = mkMerge [ - sieveScriptSettings - { - sieve_pipe_bin_dir = - mkIf (cfg.sieve.pipeBins != [ ]) # . - sievePipeBinScriptDirectory; - } - (mkIf isPre24 imapSieveMailboxSettings) - (mkIf isPre24 { - sieve_plugins = - mkIf (cfg.sieve.plugins != [ ]) # . - (concatStringsSep " " cfg.sieve.plugins); - sieve_extensions = - mkIf (cfg.sieve.extensions != [ ]) # . - (concatMapStringsSep " " (el: "+${el}") cfg.sieve.extensions); - sieve_global_extensions = - mkIf (cfg.sieve.globalExtensions != [ ]) # . - (concatMapStringsSep " " (el: "+${el}") cfg.sieve.globalExtensions); - }) - ]; - yesOrNo = v: if v then "yes" else "no"; toOption = @@ -138,7 +117,7 @@ let # paths -> copy to store # derivations -> just use output path instead of looping over the attrs toOption indent n "${v}" - else if isAttrs v then + else if isAttrs v && v ? _section then let sectionType = v._section.type; sectionName = v._section.name; @@ -156,6 +135,14 @@ let ++ (mapAttrsToList (formatKeyValue "${indent} ") (removeAttrs v [ "_section" ])) ++ [ "${indent}}" ] ) + else if isAttrs v then + concatStringsSep "\n" ( + [ + "${indent}${n} {" + ] + ++ (mapAttrsToList (formatKeyValue "${indent} ") v) + ++ [ "${indent}}" ] + ) else throw (traceSeq v "services.dovecot2.settings: unexpected type"); @@ -228,6 +215,12 @@ in [ "services" "dovecot2" "sieveScripts" ] [ "services" "dovecot2" "sieve" "scripts" ] ) + (mkRemovedOptionModule [ + "services" + "dovecot2" + "sieve" + "plugins" + ] "Set 'services.dovecot2.settings.plugin.sieve_plugins' instead.") (mkRenamedOptionModule [ "services" "dovecot2" "mailUser" ] [ "services" "dovecot2" "settings" "mail_uid" ] @@ -281,6 +274,7 @@ in path bool int + listOf nonEmptyListOf nonEmptyStr nullOr @@ -290,7 +284,8 @@ in ; inherit (lib.lists) last dropEnd; - section = submodule ( + sectionBase = + fixed: { name, options, ... }: let # if the current name is a list (matches '[definition .*]') -> get @@ -313,18 +308,30 @@ in description = "Section type, mandatory for every section."; type = nonEmptyStr; default = typeDefault; + + readOnly = fixed; + internal = fixed; }; name = mkOption { description = "Section name, comes after section type & is optional in some cases."; type = nullOr nonEmptyStr; default = nameDefault; + + readOnly = fixed; + internal = fixed; }; }; }; freeformType = attrsOf valueType; - } - ); + }; + section = submodule (sectionBase false); + fixedSectionWith = + extraModule: + submodule [ + (sectionBase true) + extraModule + ]; primitiveType = oneOf [ int @@ -344,8 +351,342 @@ in // { description = "Dovecot config value"; }; + + booleanList = oneOf [ + (attrsOf bool) + (listOf str) + ]; + + toplevel = submodule { + options = { + base_dir = mkOption { + default = baseDir; + description = '' + The base directory in which Dovecot should store runtime data. + + See . + ''; + type = path; + }; + + sendmail_path = mkOption { + default = "/run/wrappers/bin/sendmail"; + description = '' + The binary to use for sending email. + + See . + ''; + type = path; + }; + + mail_plugin_dir = mkOption { + default = "/run/current-system/sw/lib/dovecot/modules"; + description = '' + The directory in which to search for Dovecot mail plugins. + + See . + ''; + type = path; + }; + + default_internal_user = mkOption { + default = "dovecot2"; + description = '' + Define the default internal user. + + See . + ''; + type = str; + }; + + default_internal_group = mkOption { + default = "dovecot2"; + description = '' + Define the default internal group. + + See . + ''; + type = str; + }; + + maildir_copy_with_hardlinks = mkOption { + default = true; + description = '' + If enabled, copying of a message is done with hard links whenever possible. + + See . + ''; + type = bool; + }; + + auth_mechanisms = mkOption { + default = [ + "plain" + "login" + ]; + description = '' + Here you can supply a space-separated list of the authentication mechanisms you wish to use. + + See . + ''; + type = booleanList; + }; + + "passdb pam" = mkOption { + default = null; + description = '' + Configuration for the PAM password database. + + See . + ''; + type = nullOr (fixedSectionWith { + options = { + driver = mkOption { + default = if isPre24 then "pam" else null; + defaultText = literalExpression ''if isPre24 then "pam" else null''; + description = '' + The driver used for this password database. + + See . + ''; + type = nullOr str; + }; + + args = mkOption { + # set below in config + default = null; + defaultText = ''if isPre24 then [ "dovecot2" ] else null''; + description = '' + Arguments for the passdb backend. + + This option is exclusive to Dovecot 2.3. + + See . + ''; + type = nullOr (listOf str); + }; + + service_name = mkOption { + default = if isPre24 then null else "dovecot2"; + defaultText = literalExpression ''if isPre24 then null else "dovecot2"''; + description = '' + The PAM service name to be used with the pam passdb. + + This option is exclusive to Dovecot 2.4. + + See . + ''; + type = nullOr str; + }; + + failure_show_msg = mkOption { + default = if isPre24 then null else cfg.showPAMFailure; + defaultText = literalExpression "if isPre24 then null else config.services.dovecot2.showPAMFailure"; + description = '' + Replace the default "Authentication failed" reply with PAM's failure. + + This option is exclusive to Dovecot 2.4. + + See . + ''; + type = nullOr bool; + }; + }; + }); + }; + + "userdb passwd" = mkOption { + default = null; + description = '' + Configuration for the Passwd user database. + + See . + ''; + type = nullOr (fixedSectionWith { + options = { + driver = mkOption { + default = if isPre24 then "passwd" else null; + defaultText = literalExpression ''if isPre24 then "passwd" else null''; + description = '' + The driver used for this user database. + + See . + ''; + type = nullOr str; + }; + }; + }); + }; + + # 2.3-only options + + mail_location = mkOption { + default = if isPre24 then "maildir:/var/spool/mail/%u" else null; + defaultText = literalExpression '' + if isPre24 + then "maildir:/var/spool/mail/%u" + else null + ''; + description = '' + This setting indicates the location for users’ mailboxes. + + This option is exclusive to Dovecot 2.3. + + See . + ''; + type = nullOr str; + }; + + plugin = mkOption { + default = null; + description = "Plugin settings. This option is exclusive to Dovecot 2.3."; + type = nullOr (fixedSectionWith { + options = { + sieve_pipe_bin_dir = mkOption { + default = null; + description = '' + Points to a directory where the plugin looks for programs (shell scripts) to execute directly and pipe messages to for the *vnd.dovecot.pipe* extension. + + This option is exclusive to Dovecot 2.3. + + See . + ''; + type = nullOr path; + }; + + sieve_plugins = mkOption { + default = null; + description = '' + List of Sieve plugins to load. + + This option is exclusive to Dovecot 2.3. + + See . + ''; + type = nullOr (listOf str); + }; + + sieve_extensions = mkOption { + default = null; + description = '' + The Sieve language extensions available to users. + + This option is exclusive to Dovecot 2.3. + + See . + ''; + type = nullOr (listOf str); + }; + + sieve_global_extensions = mkOption { + default = null; + description = '' + Which Sieve language extensions are **only** available in global scripts. + + This option is exclusive to Dovecot 2.3. + + See . + ''; + type = nullOr (listOf str); + }; + }; + }); + }; + + # 2.4-only options + + mail_driver = mkOption { + default = if isPre24 then null else "maildir"; + defaultText = literalExpression '' + if isPre24 + then null + else "maildir" + ''; + description = '' + One of the mailbox formats described at [Mailbox Formats](https://doc.dovecot.org/latest/core/config/mailbox_formats/overview.html#mailbox-formats). + + This option is exclusive to Dovecot 2.4. + + See . + ''; + type = nullOr str; + }; + + mail_path = mkOption { + default = if isPre24 then null else "/var/spool/mail/%{user}"; + defaultText = literalExpression '' + if isPre24 + then null + else "/var/spool/mail/%{user}" + ''; + description = '' + Path to a directory where the mail is stored. + + This option is exclusive to Dovecot 2.4. + + See . + ''; + type = nullOr str; + }; + + sieve_script_bin_path = mkOption { + default = if isPre24 then null else "/tmp/dovecot-%{user|username|lower}"; + defaultText = literalExpression '' + if isPre24 + then null + else "/tmp/dovecot-%{user|username|lower}" + ''; + description = '' + Points to the directory where the compiled binaries for this script location are stored. This directory is created automatically if possible. + + This option is exclusive to Dovecot 2.4. + + See . + ''; + type = nullOr str; + }; + + sieve_pipe_bin_dir = mkOption { + default = null; + description = '' + Points to a directory where the plugin looks for programs (shell scripts) to execute directly and pipe messages to for the *vnd.dovecot.pipe* extension. + + This option is exclusive to Dovecot 2.4. + + See . + ''; + type = nullOr path; + }; + + sieve_plugins = mkOption { + default = null; + description = '' + List of Sieve plugins to load. + + This option is exclusive to Dovecot 2.4. + + See . + ''; + type = nullOr booleanList; + }; + + sieve_global_extensions = mkOption { + default = null; + description = '' + Which Sieve language extensions are **only** available in global scripts. + + This option is exclusive to Dovecot 2.4. + + See . + ''; + type = nullOr booleanList; + }; + }; + + freeformType = attrsOf valueType; + }; in - attrsOf valueType; + toplevel; description = '' Dovecot configuration, see for all available options. @@ -394,18 +735,6 @@ in }; }; - user = mkOption { - type = types.str; - default = "dovecot2"; - description = "Dovecot user name."; - }; - - group = mkOption { - type = types.str; - default = "dovecot2"; - description = "Dovecot group name."; - }; - mailPlugins = let plugins = @@ -570,13 +899,6 @@ in }; sieve = { - plugins = mkOption { - default = [ ]; - example = [ "sieve_extprograms" ]; - description = "Sieve plugins to load"; - type = types.listOf types.str; - }; - extensions = mkOption { default = [ ]; description = "Sieve extensions for use in user scripts"; @@ -619,48 +941,41 @@ in security.pam.services.dovecot2 = mkIf cfg.enablePAM { }; services.dovecot2 = { - sieve.plugins = mkIf isPre24 ( - optional (cfg.imapsieve.mailbox != [ ]) "sieve_imapsieve" - ++ optional (cfg.sieve.pipeBins != [ ]) "sieve_extprograms" - ); - sieve.globalExtensions = mkIf isPre24 (optional (cfg.sieve.pipeBins != [ ]) "vnd.dovecot.pipe"); settings = mkMerge [ - # options shared between 2.3 and 2.4 - { - base_dir = mkDefault baseDir; - sendmail_path = mkDefault "/run/wrappers/bin/sendmail"; - mail_plugin_dir = mkDefault "/run/current-system/sw/lib/dovecot/modules"; - - default_internal_user = mkDefault cfg.user; - default_internal_group = mkDefault cfg.group; - - maildir_copy_with_hardlinks = mkDefault true; - pop3_uidl_format = if !isPre24 then mkDefault "%{uidvalidity}%{uid}" else mkDefault "%08Xv%08Xu"; - - auth_mechanisms = mkDefault "plain login"; - "service auth" = { - user = "root"; - }; - } # these options differ quite a bit between 2.3 and 2.4, which is why they were split up here # for pre-2.4: (mkIf isPre24 { - mail_location = mkDefault "maildir:/var/spool/mail/%u"; + "passdb pam" = mkIf cfg.enablePAM { + args = mkMerge ( + optional cfg.showPAMFailure "failure_show_msg=yes" ++ singleton (lib.mkAfter [ "dovecot2" ]) + ); + }; - passdb = mkIf cfg.enablePAM (mkDefault { - driver = "pam"; - args = "${optionalString cfg.showPAMFailure "failure_show_msg=yes"} dovecot2"; - }); - - userdb = mkIf cfg.enablePAM (mkDefault { - driver = "passwd"; - }); + "userdb passwd" = mkIf cfg.enablePAM { }; mail_plugins = mkDefault "$mail_plugins ${concatStringsSep " " cfg.mailPlugins.globally.enable}"; - plugin = allSieveSettings; + plugin = mkMerge [ + sieveScriptSettings + imapSieveMailboxSettings + { + sieve_plugins = mkMerge [ + (mkIf (cfg.imapsieve.mailbox != [ ]) [ "sieve_imapsieve" ]) + (mkIf (cfg.sieve.pipeBins != [ ]) [ "sieve_extprograms" ]) + ]; + sieve_pipe_bin_dir = + mkIf (cfg.sieve.pipeBins != [ ]) # . + sievePipeBinScriptDirectory; + sieve_extensions = + mkIf (cfg.sieve.extensions != [ ]) # . + (map (el: "+${el}") cfg.sieve.extensions); + sieve_global_extensions = + mkIf (cfg.sieve.globalExtensions != [ ]) # . + (map (el: "+${el}") cfg.sieve.globalExtensions); + } + ]; }) (mkIf (isPre24 && cfg.mailPlugins.perProtocol != { } || cfg.mailPlugins.globally.enable != [ ]) ( listToAttrs ( @@ -674,20 +989,8 @@ in )) # for 2.4: (mkIf (!isPre24) { - mail_driver = mkDefault "maildir"; - mail_path = mkDefault "/var/spool/mail/%{user}"; - - sieve_script_bin_path = "/tmp/dovecot-%{user|username|lower}"; - - "passdb pam" = mkIf cfg.enablePAM (mkDefault { - driver = "pam"; - service_name = "dovecot2"; - failure_show_msg = mkIf cfg.showPAMFailure true; - }); - - "userdb passwd" = mkIf cfg.enablePAM (mkDefault { - driver = "passwd"; - }); + "passdb pam" = mkIf cfg.enablePAM { }; + "userdb passwd" = mkIf cfg.enablePAM { }; sieve_plugins = mkIf (cfg.sieve.pipeBins != [ ]) { "sieve_extprograms" = true; @@ -696,8 +999,9 @@ in sieve_global_extensions = mkIf (cfg.sieve.pipeBins != [ ]) { "vnd.dovecot.pipe" = true; }; + + sieve_pipe_bin_dir = mkIf (cfg.sieve.pipeBins != [ ]) sievePipeBinScriptDirectory; }) - (mkIf (!isPre24) allSieveSettings) ]; }; @@ -708,11 +1012,11 @@ in group = "dovenull"; }; } - // optionalAttrs (cfg.user == "dovecot2") { + // optionalAttrs (cfg.settings.default_internal_user == "dovecot2") { dovecot2 = { uid = config.ids.uids.dovecot2; description = "Dovecot user"; - group = cfg.group; + group = cfg.settings.default_internal_group; }; } // optionalAttrs (cfg.settings.mail_uid or null != null && cfg.createMailUser) { @@ -728,7 +1032,7 @@ in users.groups = { dovenull.gid = config.ids.gids.dovenull2; } - // optionalAttrs (cfg.group == "dovecot2") { + // optionalAttrs (cfg.settings.default_internal_group == "dovecot2") { dovecot2.gid = config.ids.gids.dovecot2; } // optionalAttrs (cfg.settings.mail_gid or null != null && cfg.createMailUser) { @@ -885,6 +1189,13 @@ in assertion = isPre24 || cfg.imapsieve.mailbox == [ ]; message = "since Dovecot 2.4, the `imapsieve.mailbox` option is no longer used in the NixOS module, please use the `settings` option instead."; } + { + assertion = isPre24 || cfg.sieve.scripts == { }; + message = '' + services.dovecot2: Since Dovecot 2.4, the option 'services.dovecot2.sieve.scripts' is no longer valid, but it is set. + See . + ''; + } { assertion = isPre24 || cfg.sieve.extensions == [ ]; message = '' From 0ad86118b7b977437d136d104fe3b5e6f1a906e4 Mon Sep 17 00:00:00 2001 From: Sizhe Zhao Date: Mon, 9 Feb 2026 18:26:18 +0800 Subject: [PATCH 21/77] nixosTests.dovecot: use matching dovecot_pigeonhole --- nixos/tests/dovecot.nix | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/nixos/tests/dovecot.nix b/nixos/tests/dovecot.nix index b7291114ccee..2d1e481a7f38 100644 --- a/nixos/tests/dovecot.nix +++ b/nixos/tests/dovecot.nix @@ -2,7 +2,10 @@ name = "dovecot"; nodes.machine = - { pkgs, ... }: + { config, pkgs, ... }: + let + dovecot = config.services.dovecot2.package; + in { imports = [ common/user-account.nix ]; services.postfix.enable = true; @@ -33,7 +36,7 @@ sendTestMailViaDeliveryAgent = pkgs.writeScriptBin "send-lda" '' #!${pkgs.runtimeShell} - exec ${pkgs.dovecot}/libexec/dovecot/deliver -d bob < Date: Fri, 27 Mar 2026 10:12:25 +0100 Subject: [PATCH 22/77] nixosTests.dovecot: set dovecot_{config,storage}_version --- nixos/tests/dovecot.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nixos/tests/dovecot.nix b/nixos/tests/dovecot.nix index 2d1e481a7f38..e85512602f20 100644 --- a/nixos/tests/dovecot.nix +++ b/nixos/tests/dovecot.nix @@ -12,6 +12,8 @@ services.dovecot2 = { enable = true; settings = { + dovecot_config_version = dovecot.version; + dovecot_storage_version = dovecot.version; protocols = [ "imap" "pop3" From 400aecc29b905b717b4a608bd37406451b74de99 Mon Sep 17 00:00:00 2001 From: Katalin Rebhan Date: Tue, 7 Apr 2026 15:12:17 +0200 Subject: [PATCH 23/77] nixos/dovecot: remove defaults for PAM and mail driver/path --- nixos/modules/services/mail/dovecot.nix | 59 +++---------------------- nixos/tests/dovecot.nix | 3 ++ 2 files changed, 8 insertions(+), 54 deletions(-) diff --git a/nixos/modules/services/mail/dovecot.nix b/nixos/modules/services/mail/dovecot.nix index 9de696b3045b..a9dd9531fadf 100644 --- a/nixos/modules/services/mail/dovecot.nix +++ b/nixos/modules/services/mail/dovecot.nix @@ -520,23 +520,6 @@ in # 2.3-only options - mail_location = mkOption { - default = if isPre24 then "maildir:/var/spool/mail/%u" else null; - defaultText = literalExpression '' - if isPre24 - then "maildir:/var/spool/mail/%u" - else null - ''; - description = '' - This setting indicates the location for users’ mailboxes. - - This option is exclusive to Dovecot 2.3. - - See . - ''; - type = nullOr str; - }; - plugin = mkOption { default = null; description = "Plugin settings. This option is exclusive to Dovecot 2.3."; @@ -595,40 +578,6 @@ in # 2.4-only options - mail_driver = mkOption { - default = if isPre24 then null else "maildir"; - defaultText = literalExpression '' - if isPre24 - then null - else "maildir" - ''; - description = '' - One of the mailbox formats described at [Mailbox Formats](https://doc.dovecot.org/latest/core/config/mailbox_formats/overview.html#mailbox-formats). - - This option is exclusive to Dovecot 2.4. - - See . - ''; - type = nullOr str; - }; - - mail_path = mkOption { - default = if isPre24 then null else "/var/spool/mail/%{user}"; - defaultText = literalExpression '' - if isPre24 - then null - else "/var/spool/mail/%{user}" - ''; - description = '' - Path to a directory where the mail is stored. - - This option is exclusive to Dovecot 2.4. - - See . - ''; - type = nullOr str; - }; - sieve_script_bin_path = mkOption { default = if isPre24 then null else "/tmp/dovecot-%{user|username|lower}"; defaultText = literalExpression '' @@ -703,7 +652,11 @@ in submission = true; lmtp = true; }; + mail_driver = "maildir"; + mail_home = "/var/vmail/%{user | domain}/%{user | username}"; + mail_path = "~/mail"; + "namespace inbox" = { inbox = true; separator = "/"; @@ -808,9 +761,7 @@ in default = true; }; - enablePAM = mkEnableOption "creating a own Dovecot PAM service and configure PAM user logins" // { - default = true; - }; + enablePAM = mkEnableOption "creating a own Dovecot PAM service and configure PAM user logins"; showPAMFailure = mkEnableOption "showing the PAM failure message on authentication error (useful for OTPW)"; diff --git a/nixos/tests/dovecot.nix b/nixos/tests/dovecot.nix index e85512602f20..ddc8b6632acc 100644 --- a/nixos/tests/dovecot.nix +++ b/nixos/tests/dovecot.nix @@ -11,9 +11,12 @@ services.postfix.enable = true; services.dovecot2 = { enable = true; + enablePAM = true; settings = { dovecot_config_version = dovecot.version; dovecot_storage_version = dovecot.version; + mail_driver = "maildir"; + mail_path = "${config.services.postfix.settings.main.mail_spool_directory}/%{user}"; protocols = [ "imap" "pop3" From 3fe307bd52b9b8b8f6f4e61b41fe7c66f795fb78 Mon Sep 17 00:00:00 2001 From: Katalin Rebhan Date: Tue, 17 Mar 2026 17:18:14 +0100 Subject: [PATCH 24/77] nixos/dovecot: add release notes --- nixos/doc/manual/release-notes/rl-2605.section.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nixos/doc/manual/release-notes/rl-2605.section.md b/nixos/doc/manual/release-notes/rl-2605.section.md index 5220d49e71e2..54ba0bc43817 100644 --- a/nixos/doc/manual/release-notes/rl-2605.section.md +++ b/nixos/doc/manual/release-notes/rl-2605.section.md @@ -276,6 +276,10 @@ See . - For shortlived certificates with a total validty below 10 days renewal will happen after half of the total lifetime has passed +- The module for the Dovecot IMAP server, *services.dovecot*, now uses RFC-42-style settings, exposing a structured interface to write the configuration file. + + Also see the list of available settings for [Dovecot 2.3](https://doc.dovecot.org/2.3/settings/core/) or [2.4](https://doc.dovecot.org/2.4.2/core/summaries/settings.html). + - Cinnamon has been updated to 6.6, please check the [upstream announcement](https://www.linuxmint.com/rel_zena_whatsnew.php) for more details. - Budgie has been updated to 10.10, please check the [upstream announcement](https://buddiesofbudgie.org/blog/budgie-10-10-released) for more details. From 513dfd22b818dade5ee0ba800a198c199fe55ee4 Mon Sep 17 00:00:00 2001 From: Anna Aurora Date: Sat, 11 Apr 2026 14:48:15 +0200 Subject: [PATCH 25/77] peazip: add ProxyVT as maintainer See https://github.com/NixOS/nixpkgs/issues/435120. TL;DR: I'm not using the program anymore so I won't spot bugs fast. The source code is quite a burden for one person. --- pkgs/by-name/pe/peazip/package.nix | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkgs/by-name/pe/peazip/package.nix b/pkgs/by-name/pe/peazip/package.nix index b4661eceab1f..764670abb4dd 100644 --- a/pkgs/by-name/pe/peazip/package.nix +++ b/pkgs/by-name/pe/peazip/package.nix @@ -135,7 +135,10 @@ stdenv.mkDerivation (finalAttrs: { license = lib.licenses.gpl3Only; homepage = "https://peazip.github.io"; platforms = lib.platforms.linux; - maintainers = with lib.maintainers; [ annaaurora ]; + maintainers = with lib.maintainers; [ + annaaurora + ProxyVT + ]; mainProgram = "peazip"; }; }) From d3d6e2f38b510bc41e98bf386e34429af6accd2a Mon Sep 17 00:00:00 2001 From: Stefan Frijters Date: Mon, 9 Mar 2026 13:56:43 +0100 Subject: [PATCH 26/77] bats: use writeText instead of passAsFile This fixes compatibility with __structuredAttrs. --- pkgs/by-name/ba/bats/package.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/by-name/ba/bats/package.nix b/pkgs/by-name/ba/bats/package.nix index 0a6232cde99c..543c19248b98 100644 --- a/pkgs/by-name/ba/bats/package.nix +++ b/pkgs/by-name/ba/bats/package.nix @@ -18,6 +18,7 @@ symlinkJoin, makeWrapper, runCommand, + writeText, doInstallCheck ? true, # packages that use bats (for update testing) bash-preexec, @@ -157,7 +158,7 @@ resholve.mkDerivation rec { libraries = runCommand "${bats.name}-with-libraries-test" { - testScript = '' + testScript = writeText "bats-libraries-test-script" '' setup() { bats_load_library bats-support bats_load_library bats-assert @@ -191,7 +192,6 @@ resholve.mkDerivation rec { assert_output "hi" } ''; - passAsFile = [ "testScript" ]; } '' ${ @@ -201,7 +201,7 @@ resholve.mkDerivation rec { p.bats-file p.bats-detik ]) - }/bin/bats "$testScriptPath" + }/bin/bats "$testScript" touch "$out" ''; From 5f5d29e3a23c775790e3ca6aabdac716306622f9 Mon Sep 17 00:00:00 2001 From: Stefan Frijters Date: Wed, 25 Mar 2026 23:23:28 +0100 Subject: [PATCH 27/77] bats: add let binding to passthru.tests.libraries We don't actually need to pass the script as an argument to runCommand since we can reference it directly. Moving bats.withLibraries [...] out of the string interpolation seems a bit more readable as well. --- pkgs/by-name/ba/bats/package.nix | 80 ++++++++++++++++---------------- 1 file changed, 39 insertions(+), 41 deletions(-) diff --git a/pkgs/by-name/ba/bats/package.nix b/pkgs/by-name/ba/bats/package.nix index 543c19248b98..8990ded3209c 100644 --- a/pkgs/by-name/ba/bats/package.nix +++ b/pkgs/by-name/ba/bats/package.nix @@ -156,54 +156,52 @@ resholve.mkDerivation rec { passthru.tests = { libraries = - runCommand "${bats.name}-with-libraries-test" - { - testScript = writeText "bats-libraries-test-script" '' - setup() { - bats_load_library bats-support - bats_load_library bats-assert - bats_load_library bats-file - bats_load_library bats-detik/detik.bash + let + testScript = writeText "bats-libraries-test-script" '' + setup() { + bats_load_library bats-support + bats_load_library bats-assert + bats_load_library bats-file + bats_load_library bats-detik/detik.bash - bats_require_minimum_version 1.5.0 + bats_require_minimum_version 1.5.0 - TEST_TEMP_DIR="$(temp_make --prefix 'nixpkgs-bats-test')" - } + TEST_TEMP_DIR="$(temp_make --prefix 'nixpkgs-bats-test')" + } - teardown() { - temp_del "$TEST_TEMP_DIR" - } + teardown() { + temp_del "$TEST_TEMP_DIR" + } - @test echo_hi { - run -0 echo hi - assert_output "hi" - } + @test echo_hi { + run -0 echo hi + assert_output "hi" + } - @test cp_failure { - run ! cp - assert_line --index 0 "cp: missing file operand" - assert_line --index 1 "Try 'cp --help' for more information." - } + @test cp_failure { + run ! cp + assert_line --index 0 "cp: missing file operand" + assert_line --index 1 "Try 'cp --help' for more information." + } - @test file_exists { - echo "hi" > "$TEST_TEMP_DIR/hello.txt" - assert_file_exist "$TEST_TEMP_DIR/hello.txt" - run cat "$TEST_TEMP_DIR/hello.txt" - assert_output "hi" - } - ''; - } - '' - ${ - bats.withLibraries (p: [ - p.bats-support - p.bats-assert - p.bats-file - p.bats-detik - ]) - }/bin/bats "$testScript" - touch "$out" + @test file_exists { + echo "hi" > "$TEST_TEMP_DIR/hello.txt" + assert_file_exist "$TEST_TEMP_DIR/hello.txt" + run cat "$TEST_TEMP_DIR/hello.txt" + assert_output "hi" + } ''; + batsWithLibraries = bats.withLibraries (p: [ + p.bats-support + p.bats-assert + p.bats-file + p.bats-detik + ]); + in + runCommand "${bats.name}-with-libraries-test" { } '' + ${lib.getExe batsWithLibraries} "${testScript}" + touch "$out" + ''; upstream = bats.unresholved.overrideAttrs (old: { name = "${bats.name}-tests"; From 5eca65929e3f5c921a7e5feb34ac852697f6fe96 Mon Sep 17 00:00:00 2001 From: Stefan Frijters Date: Wed, 25 Mar 2026 23:24:56 +0100 Subject: [PATCH 28/77] bats.withLibraries: inherit meta from bats This fixes "evaluation warning: getExe: Package "bats-with-libraries-1.12.0" does not have the meta.mainProgram attribute" --- pkgs/by-name/ba/bats/package.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkgs/by-name/ba/bats/package.nix b/pkgs/by-name/ba/bats/package.nix index 8990ded3209c..6220ecf5698c 100644 --- a/pkgs/by-name/ba/bats/package.nix +++ b/pkgs/by-name/ba/bats/package.nix @@ -152,6 +152,8 @@ resholve.mkDerivation rec { wrapProgram "$out/bin/bats" \ --suffix BATS_LIB_PATH : "$out/share/bats" ''; + + inherit meta; }; passthru.tests = { From 48b46015139ee107c44c611c0fc1c7e7677f8e1b Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sat, 11 Apr 2026 18:08:32 +0000 Subject: [PATCH 29/77] liteparse: 1.4.4 -> 1.4.6 --- pkgs/by-name/li/liteparse/package.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/by-name/li/liteparse/package.nix b/pkgs/by-name/li/liteparse/package.nix index a714029b424c..66033f300268 100644 --- a/pkgs/by-name/li/liteparse/package.nix +++ b/pkgs/by-name/li/liteparse/package.nix @@ -10,13 +10,13 @@ buildNpmPackage (finalAttrs: { pname = "liteparse"; - version = "1.4.4"; + version = "1.4.6"; src = fetchFromGitHub { owner = "run-llama"; repo = "liteparse"; tag = "v${finalAttrs.version}"; - hash = "sha256-UHZaKWjzaoYbD2NHwNgvlpPfviD66zPQ6d0UWW/lrmk="; + hash = "sha256-GUtqJsmAOrbxLc/aAIre95QD6aaFsj5ClqZfo7jdwB4="; }; npmDepsHash = "sha256-Wz46n7BbubC3Cq1CHOHM2q/dVOvOVNQTloHZfkAwzpg="; From 968624394dd8c5023da349b12da35f98e6601f73 Mon Sep 17 00:00:00 2001 From: Edward Andrew Jackson Date: Sat, 11 Apr 2026 16:49:56 +0100 Subject: [PATCH 30/77] zluda: 6-preview.55 -> 6-preview.63 --- pkgs/by-name/zl/zluda/package.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/by-name/zl/zluda/package.nix b/pkgs/by-name/zl/zluda/package.nix index 6df37d213903..09097a6f828f 100644 --- a/pkgs/by-name/zl/zluda/package.nix +++ b/pkgs/by-name/zl/zluda/package.nix @@ -16,13 +16,13 @@ rustPlatform.buildRustPackage (finalAttrs: { pname = "zluda"; - version = "6-preview.55"; + version = "6-preview.63"; src = fetchFromGitHub { owner = "vosen"; repo = "ZLUDA"; rev = "v${finalAttrs.version}"; - hash = "sha256-yhWEzoDjNk1GefSqOVwowNky36ahmH/gTMdq1YTOhfE="; + hash = "sha256-AZGSO6aV1T3elsVDJxFylhzYjkhkIy1QFtTdH4u4Lrw="; fetchSubmodules = true; fetchLFS = true; }; @@ -51,7 +51,7 @@ rustPlatform.buildRustPackage (finalAttrs: { clang ]; - cargoHash = "sha256-YNBeweZ/vfXGfM0lrZbAh71z6Rb0+B7nOuO8VL2BmCo="; + cargoHash = "sha256-2YAlc8HW+aqfRzLSXw/I++DM4/JneE7UNmV6BVZb4VM="; # Tests require a GPU and segfault in the sandbox doCheck = false; From a7620c8fa2c0f977477e41a86712df0c87d1c4a7 Mon Sep 17 00:00:00 2001 From: Gaetan Lepage Date: Sun, 29 Mar 2026 15:13:14 +0000 Subject: [PATCH 31/77] onnx: 1.20.1 -> 1.21.0 Diff: https://github.com/onnx/onnx/compare/v1.20.1...v1.21.0 Changelog: https://github.com/onnx/onnx/releases/tag/v1.21.0 --- pkgs/by-name/on/onnx/package.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/by-name/on/onnx/package.nix b/pkgs/by-name/on/onnx/package.nix index d5eec863c95f..31adc3753a6c 100644 --- a/pkgs/by-name/on/onnx/package.nix +++ b/pkgs/by-name/on/onnx/package.nix @@ -33,13 +33,13 @@ stdenv.mkDerivation (finalAttrs: { strictDeps = true; pname = "onnx"; - version = "1.20.1"; + version = "1.21.0"; src = fetchFromGitHub { owner = "onnx"; repo = "onnx"; tag = "v${finalAttrs.version}"; - hash = "sha256-XZJXD6sBvVJ6cLPyDkKOW8oSkjqcw9whUqDWd7dxY3c="; + hash = "sha256-eF6BdTwTuHh6ckuLGN1d6z2GLU47lPqtzu4zIv8+cTs="; }; outputs = [ From 5cba620458d9e7132af0d442a4bf22ac5880f192 Mon Sep 17 00:00:00 2001 From: Gaetan Lepage Date: Sat, 11 Apr 2026 16:33:13 +0000 Subject: [PATCH 32/77] python3Packages.onnx-ir: skip failing tests --- pkgs/development/python-modules/onnx-ir/default.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkgs/development/python-modules/onnx-ir/default.nix b/pkgs/development/python-modules/onnx-ir/default.nix index c4dbfc72ac66..cd419744a99d 100644 --- a/pkgs/development/python-modules/onnx-ir/default.nix +++ b/pkgs/development/python-modules/onnx-ir/default.nix @@ -74,6 +74,10 @@ buildPythonPackage (finalAttrs: { disabledTestPaths = [ # Circular dependency with onnxscript "src/onnx_ir/passes/common/common_subexpression_elimination_test.py" + + # ImportError: cannot import name 'hub' from 'onnx' + # onnx.hub was removed in 1.21.0 + "tools/model_zoo_test/model_zoo_test.py" ]; # Importing onnxruntime in the sandbox crashes on aarch64-linux: From 08db481a08f0ed4fe4f372cadf5eb5b19c8ad500 Mon Sep 17 00:00:00 2001 From: Sarah Clark Date: Sat, 11 Apr 2026 11:11:03 -0700 Subject: [PATCH 33/77] python3Packages.anthropic: add optional dependencies to tests --- pkgs/development/python-modules/anthropic/default.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pkgs/development/python-modules/anthropic/default.nix b/pkgs/development/python-modules/anthropic/default.nix index 5052decd19cc..97000ae58b51 100644 --- a/pkgs/development/python-modules/anthropic/default.nix +++ b/pkgs/development/python-modules/anthropic/default.nix @@ -90,7 +90,8 @@ buildPythonPackage (finalAttrs: { pytest-xdist pytestCheckHook respx - ]; + ] + ++ lib.flatten (builtins.attrValues finalAttrs.passthru.optional-dependencies); pythonImportsCheck = [ "anthropic" ]; From 7d5033c3fb69e090742002b0f0ac7ad88440ac34 Mon Sep 17 00:00:00 2001 From: Sarah Clark Date: Sat, 11 Apr 2026 17:06:39 +0000 Subject: [PATCH 34/77] python3Packages.anthropic: 0.86.0 -> 0.94.0 --- pkgs/development/python-modules/anthropic/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/python-modules/anthropic/default.nix b/pkgs/development/python-modules/anthropic/default.nix index 97000ae58b51..7ae65e00b5d4 100644 --- a/pkgs/development/python-modules/anthropic/default.nix +++ b/pkgs/development/python-modules/anthropic/default.nix @@ -38,14 +38,14 @@ buildPythonPackage (finalAttrs: { pname = "anthropic"; - version = "0.86.0"; + version = "0.94.0"; pyproject = true; src = fetchFromGitHub { owner = "anthropics"; repo = "anthropic-sdk-python"; tag = "v${finalAttrs.version}"; - hash = "sha256-24z9LrZ6xktwITQHHvslrT4J2RZ/CKbZD3uwbZBV+rE="; + hash = "sha256-Gh7My8ftI2o0CxrwuVsbr8tdZ2MtKdRw0mfQxb7REJk="; }; postPatch = '' From 719d060bc1a62f7532ae8df98c74e673b45d0cc8 Mon Sep 17 00:00:00 2001 From: Gaetan Lepage Date: Sat, 11 Apr 2026 23:12:41 +0000 Subject: [PATCH 35/77] python3Packages.skytemple-files: cleanup, fix --- .../skytemple-files/default.nix | 59 ++++++++++++------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/pkgs/development/python-modules/skytemple-files/default.nix b/pkgs/development/python-modules/skytemple-files/default.nix index 1a2073a28a74..da4073032608 100644 --- a/pkgs/development/python-modules/skytemple-files/default.nix +++ b/pkgs/development/python-modules/skytemple-files/default.nix @@ -1,31 +1,38 @@ { - stdenv, lib, buildPythonPackage, fetchFromGitHub, + + # build-system + setuptools, + + # buildInputs + armips, + + # dependencies appdirs, dungeon-eos, explorerscript, ndspy, pillow, - setuptools, - skytemple-rust, - pyyaml, pmdsky-debug-py, + pyyaml, range-typed-integers, - # optional dependencies for SpriteCollab + skytemple-rust, + + # optional-dependencies aiohttp, - lru-dict, - graphql-core, gql, - armips, + graphql-core, + lru-dict, + # tests - pytestCheckHook, parameterized, + pytestCheckHook, xmldiff, }: -buildPythonPackage rec { +buildPythonPackage (finalAttrs: { pname = "skytemple-files"; version = "1.8.5"; pyproject = true; @@ -33,31 +40,38 @@ buildPythonPackage rec { src = fetchFromGitHub { owner = "SkyTemple"; repo = "skytemple-files"; - rev = version; - hash = "sha256-s7r6wS7H19+is3CFr+dLaTiq0N/gaO/8IFknmr+OAJk="; + tag = finalAttrs.version; # Most patches are in submodules fetchSubmodules = true; + hash = "sha256-s7r6wS7H19+is3CFr+dLaTiq0N/gaO/8IFknmr+OAJk="; }; postPatch = '' - substituteInPlace skytemple_files/patch/arm_patcher.py skytemple_files/data/data_cd/armips_importer.py \ - --replace-fail "exec_name = os.getenv(\"SKYTEMPLE_ARMIPS_EXEC\", f\"{prefix}armips\")" "exec_name = \"${armips}/bin/armips\"" + substituteInPlace \ + skytemple_files/patch/arm_patcher.py \ + skytemple_files/data/data_cd/armips_importer.py \ + --replace-fail \ + "exec_name = os.getenv(\"SKYTEMPLE_ARMIPS_EXEC\", f\"{prefix}armips\")" \ + "exec_name = \"${armips}/bin/armips\"" ''; build-system = [ setuptools ]; buildInputs = [ armips ]; + pythonRelaxDeps = [ + "pmdsky-debug-py" + ]; dependencies = [ appdirs dungeon-eos explorerscript ndspy pillow - skytemple-rust - pyyaml pmdsky-debug-py + pyyaml range-typed-integers + skytemple-rust ]; optional-dependencies = { @@ -71,11 +85,11 @@ buildPythonPackage rec { }; nativeCheckInputs = [ - pytestCheckHook parameterized + pytestCheckHook xmldiff ] - ++ optional-dependencies.spritecollab; + ++ finalAttrs.passthru.optional-dependencies.spritecollab; preCheck = "pushd test"; postCheck = "popd"; @@ -88,11 +102,14 @@ buildPythonPackage rec { pythonImportsCheck = [ "skytemple_files" ]; meta = { - homepage = "https://github.com/SkyTemple/skytemple-files"; description = "Python library to edit the ROM of Pokémon Mystery Dungeon Explorers of Sky"; + homepage = "https://github.com/SkyTemple/skytemple-files"; mainProgram = "skytemple_export_maps"; license = lib.licenses.gpl3Plus; maintainers = with lib.maintainers; [ marius851000 ]; - broken = stdenv.hostPlatform.isDarwin; # pyobjc is missing + badPlatforms = [ + # pyobjc is missing + lib.systems.inspect.patterns.isDarwin + ]; }; -} +}) From 3f149e6ea32add998f42a84f51ccab4693441199 Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sat, 11 Apr 2026 23:35:48 +0000 Subject: [PATCH 36/77] python3Packages.fluss-api: 0.2.0 -> 0.2.4 --- pkgs/development/python-modules/fluss-api/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/python-modules/fluss-api/default.nix b/pkgs/development/python-modules/fluss-api/default.nix index 44e2c522a44f..b346014af6d2 100644 --- a/pkgs/development/python-modules/fluss-api/default.nix +++ b/pkgs/development/python-modules/fluss-api/default.nix @@ -8,14 +8,14 @@ buildPythonPackage (finalAttrs: { pname = "fluss-api"; - version = "0.2.0"; + version = "0.2.4"; pyproject = true; src = fetchFromGitHub { owner = "fluss"; repo = "Fluss_Python_Library"; tag = "v${finalAttrs.version}"; - hash = "sha256-LD+boeDNWOm3KXZFIkLPvzIyngmFd6lOtIFsrn478wA="; + hash = "sha256-zAhxx2X1DnfXlf+OzyACx6e3bQkoagffBPPnEe05xbM="; }; build-system = [ setuptools ]; From 7e971c2575ed4939d4738e32257b9cb854076a62 Mon Sep 17 00:00:00 2001 From: Xiangyan Sun Date: Sat, 11 Apr 2026 17:00:49 -0700 Subject: [PATCH 37/77] mediaelch-qt5: fix build --- pkgs/by-name/me/mediaelch/package.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/pkgs/by-name/me/mediaelch/package.nix b/pkgs/by-name/me/mediaelch/package.nix index 1b4121976e7a..29adab944c09 100644 --- a/pkgs/by-name/me/mediaelch/package.nix +++ b/pkgs/by-name/me/mediaelch/package.nix @@ -78,6 +78,7 @@ stdenv.mkDerivation (finalAttrs: { HOME = "/tmp"; # for the font cache LANG = "C.UTF-8"; QT_QPA_PLATFORM = "offscreen"; # the tests require a UI + QT_QPA_PLATFORM_PLUGIN_PATH = "${qt'.qtbase}/${qt'.qtbase.qtPluginPrefix}/platforms"; }; doCheck = true; From 27bb3ad9fd8083e5abb95ce20c070791056aa971 Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 06:34:44 +0000 Subject: [PATCH 38/77] tuxbox: 3.1.0 -> 3.1.1 --- pkgs/by-name/tu/tuxbox/package.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/by-name/tu/tuxbox/package.nix b/pkgs/by-name/tu/tuxbox/package.nix index bb9e95c7a074..c889f6b2659c 100644 --- a/pkgs/by-name/tu/tuxbox/package.nix +++ b/pkgs/by-name/tu/tuxbox/package.nix @@ -5,14 +5,14 @@ }: python3Packages.buildPythonApplication (finalAttrs: { pname = "tuxbox"; - version = "3.1.0"; + version = "3.1.1"; pyproject = true; src = fetchFromGitHub { owner = "AndyCappDev"; repo = "tuxbox"; tag = "v${finalAttrs.version}"; - hash = "sha256-jPPjGumArcnsRKQm3HKhoTGh913WEB5MUs7Y7eCHXNY="; + hash = "sha256-+fVN6z6mxgSDcmG8F3baAMfFbb5eUkt+B0tu6+ZSqKw="; }; build-system = [ python3Packages.setuptools ]; From c6e01cc83887313de6f5d4100b845aedf8ef7db2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20K=C3=B6gler?= Date: Sat, 11 Apr 2026 20:49:01 +0200 Subject: [PATCH 39/77] nixos/systemd: fix socket `sshd-vsock` --- nixos/modules/system/boot/systemd.nix | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/nixos/modules/system/boot/systemd.nix b/nixos/modules/system/boot/systemd.nix index 8c2735c00b8c..2808a2ac4e21 100644 --- a/nixos/modules/system/boot/systemd.nix +++ b/nixos/modules/system/boot/systemd.nix @@ -886,6 +886,21 @@ in serviceConfig.ExecSearchPath = "${config.services.openssh.package}/bin"; overrideStrategy = "asDropin"; }; + + # Fix paths in sshd-vsock.socket + # https://github.com/systemd/systemd/blob/v259.3/src/ssh-generator/ssh-generator.c#L239 + # this socket is used, for example, when NixOS is started via systemd-vmspawn + systemd.sockets.sshd-vsock = mkIf config.services.openssh.enable { + overrideStrategy = "asDropin"; + socketConfig.ExecStartPost = [ + "" + "${config.systemd.package}/lib/systemd/systemd-ssh-issue --make-vsock" + ]; + socketConfig.ExecStopPre = [ + "" + "${config.systemd.package}/lib/systemd/systemd-ssh-issue --rm-vsock" + ]; + }; }; # FIXME: Remove these eventually. From a83ae1b019ef3aab88f438d11982b0d3124fae19 Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 11:27:45 +0000 Subject: [PATCH 40/77] filebrowser: 2.62.2 -> 2.63.2 --- pkgs/by-name/fi/filebrowser/package.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/by-name/fi/filebrowser/package.nix b/pkgs/by-name/fi/filebrowser/package.nix index c90a011ff6ac..aa6a25433792 100644 --- a/pkgs/by-name/fi/filebrowser/package.nix +++ b/pkgs/by-name/fi/filebrowser/package.nix @@ -12,13 +12,13 @@ }: let - version = "2.62.2"; + version = "2.63.2"; src = fetchFromGitHub { owner = "filebrowser"; repo = "filebrowser"; rev = "v${version}"; - hash = "sha256-yjy3RMgC38oktxMpvw78w5VVCUE/1+Lv37G/RJaQte0="; + hash = "sha256-pAD7mEiDQyfmKmClO9oMLgPua0jOrcImiQrSGLvhCEA="; }; frontend = buildNpmPackage rec { From 8606854e43192c5ff79c4b60186d1e327164f93c Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 12:41:36 +0000 Subject: [PATCH 41/77] python3Packages.llguidance: 1.7.0 -> 1.7.2 --- pkgs/development/python-modules/llguidance/default.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/development/python-modules/llguidance/default.nix b/pkgs/development/python-modules/llguidance/default.nix index fcd7ecb0d262..8e307699086d 100644 --- a/pkgs/development/python-modules/llguidance/default.nix +++ b/pkgs/development/python-modules/llguidance/default.nix @@ -23,19 +23,19 @@ buildPythonPackage (finalAttrs: { pname = "llguidance"; - version = "1.7.0"; + version = "1.7.2"; pyproject = true; src = fetchFromGitHub { owner = "guidance-ai"; repo = "llguidance"; tag = "v${finalAttrs.version}"; - hash = "sha256-f9qSnNpLl4KUdv1ZzN68MUytCOjP/+a3ZjocX7DiAlw="; + hash = "sha256-Eu+hhYCVoZWMdwrjiHyvbGwjYKnbkBETZNMQ+SOb8AU="; }; cargoDeps = rustPlatform.fetchCargoVendor { inherit (finalAttrs) src pname version; - hash = "sha256-scHxmG5XAbWMR88yyFru0ar2v7Uj/OQP0gpL5wo7Du8="; + hash = "sha256-oeFm9dPqlJWPnrA7//D31E1W2St+zIRd8pzR6gUhiTg="; }; nativeBuildInputs = [ From 2075b976011c50d9e56e1933533c9f52971491f9 Mon Sep 17 00:00:00 2001 From: user <17591696+sand4rt@users.noreply.github.com> Date: Sun, 12 Apr 2026 15:59:53 +0200 Subject: [PATCH 42/77] vimPlugins.zen-nvim: init at 0-unstable-2026-04-12 --- pkgs/applications/editors/vim/plugins/generated.nix | 13 +++++++++++++ .../editors/vim/plugins/vim-plugin-names | 1 + 2 files changed, 14 insertions(+) diff --git a/pkgs/applications/editors/vim/plugins/generated.nix b/pkgs/applications/editors/vim/plugins/generated.nix index 35c0362b2601..730c2bb311ef 100644 --- a/pkgs/applications/editors/vim/plugins/generated.nix +++ b/pkgs/applications/editors/vim/plugins/generated.nix @@ -23324,6 +23324,19 @@ final: prev: { meta.hydraPlatforms = [ ]; }; + zen-nvim = buildVimPlugin { + pname = "zen.nvim"; + version = "0-unstable-2026-04-12"; + src = fetchFromGitHub { + owner = "sand4rt"; + repo = "zen.nvim"; + rev = "31d0d45a56eae2a750818b7afa9f504044d7e382"; + hash = "sha256-vmQ3dJpMACv4oP4MKuIHe3PVs1ZMy0916lNRmtbzZ88="; + }; + meta.homepage = "https://github.com/sand4rt/zen.nvim/"; + meta.hydraPlatforms = [ ]; + }; + zenbones-nvim = buildVimPlugin { pname = "zenbones.nvim"; version = "4.10.0-unstable-2025-12-02"; diff --git a/pkgs/applications/editors/vim/plugins/vim-plugin-names b/pkgs/applications/editors/vim/plugins/vim-plugin-names index 0fef75fa66ed..b5bd0473e393 100644 --- a/pkgs/applications/editors/vim/plugins/vim-plugin-names +++ b/pkgs/applications/editors/vim/plugins/vim-plugin-names @@ -1791,6 +1791,7 @@ https://github.com/KabbAmine/zeavim.vim/,, https://github.com/swaits/zellij-nav.nvim/,HEAD, https://github.com/Lilja/zellij.nvim/,HEAD, https://github.com/folke/zen-mode.nvim/,, +https://github.com/sand4rt/zen.nvim/,HEAD, https://github.com/zenbones-theme/zenbones.nvim/,HEAD, https://github.com/jnurmine/zenburn/,, https://github.com/nvimdev/zephyr-nvim/,, From 4120bb72dfc4bc33d168ead00a89f8fec205654d Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 15:11:58 +0000 Subject: [PATCH 43/77] xpipe: 22.5 -> 22.9 --- pkgs/by-name/xp/xpipe/package.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/by-name/xp/xpipe/package.nix b/pkgs/by-name/xp/xpipe/package.nix index ae30b427484f..2018098377d3 100644 --- a/pkgs/by-name/xp/xpipe/package.nix +++ b/pkgs/by-name/xp/xpipe/package.nix @@ -39,7 +39,7 @@ let hash = { - x86_64-linux = "sha256-gyNZ+DyULv3TPD5YvHo8RvB/pjRtLHOsDNcD8bt/RbY="; + x86_64-linux = "sha256-dKYGepfjgqcYflVABXGp2heI8XY1rIyMJi04aTld4ss="; } .${system} or throwSystem; @@ -48,7 +48,7 @@ let in stdenvNoCC.mkDerivation rec { pname = "xpipe"; - version = "22.5"; + version = "22.9"; src = fetchzip { url = "https://github.com/xpipe-io/xpipe/releases/download/${version}/xpipe-portable-linux-${arch}.tar.gz"; From 1d3553857b9cc56a46220adc9161c94030c533a3 Mon Sep 17 00:00:00 2001 From: teto <886074+teto@users.noreply.github.com> Date: Mon, 30 Mar 2026 22:49:14 +0200 Subject: [PATCH 44/77] neovim: support per plugin lua config Adds a 'type' option to the plugin submodule so the user can precise what language it is. For now we limit the enum to lua/viml but we can extend it afterwards (to fennel/teal/free) This changes the type of userPluginViml, we could even remove it (or add lua one). lol --- .../editors/neovim/plugin-submodule.nix | 33 ++++++++++++++++--- pkgs/applications/editors/neovim/utils.nix | 7 ++-- pkgs/applications/editors/neovim/wrapper.nix | 8 ++++- 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/pkgs/applications/editors/neovim/plugin-submodule.nix b/pkgs/applications/editors/neovim/plugin-submodule.nix index 5a9ca56afb56..dce427c49798 100644 --- a/pkgs/applications/editors/neovim/plugin-submodule.nix +++ b/pkgs/applications/editors/neovim/plugin-submodule.nix @@ -11,6 +11,7 @@ let plugin = null; config = null; optional = false; + type = "viml"; }; in map (x: defaultPlugin // (if x ? plugin then x else { plugin = x; })) plugins; @@ -26,6 +27,15 @@ let example = "set title"; }; + type = lib.mkOption { + type = lib.types.either (lib.types.enum [ + "lua" + "viml" + ]) lib.types.str; + description = "Language used in config. Configurations are aggregated per-language."; + default = "viml"; + }; + optional = mkEnableOption "optional" // { description = "Don't load automatically on startup (load with :packadd)"; }; @@ -78,12 +88,20 @@ in userPluginViml = lib.mkOption { readOnly = true; - type = lib.types.listOf lib.types.lines; + type = lib.types.nullOr lib.types.lines; description = '' The viml config set by the user. ''; }; + userPluginConfigs = lib.mkOption { + readOnly = true; + type = lib.types.attrsOf lib.types.lines; + description = '' + The user configurations (viml, lua, ...) set by the user. + ''; + }; + pluginPython3Packages = lib.mkOption { readOnly = true; type = lib.types.listOf (lib.types.functionTo (lib.types.listOf lib.types.package)); @@ -106,6 +124,13 @@ in config = let pluginsNormalized = config.plugins; + + userPluginConfigs = + let + grouped = lib.groupBy (x: x.type) pluginsNormalized; + configsOnly = lib.foldl (acc: p: if p.config != null then acc ++ [ p.config ] else acc) [ ]; + in + lib.mapAttrs (_name: vals: lib.concatStringsSep "\n" (configsOnly vals)) grouped; in { pluginAdvisedLua = @@ -125,9 +150,9 @@ in in lib.foldl' op [ ] pluginsNormalized; - userPluginViml = lib.foldl ( - acc: p: if p.config != null then acc ++ [ p.config ] else acc - ) [ ] pluginsNormalized; + userPluginViml = userPluginConfigs.viml or null; + + inherit userPluginConfigs; pluginPython3Packages = map (plugin: plugin.python3Dependencies or (_: [ ])) pluginsNormalized; diff --git a/pkgs/applications/editors/neovim/utils.nix b/pkgs/applications/editors/neovim/utils.nix index af180c869a73..ae3ff9dc1800 100644 --- a/pkgs/applications/editors/neovim/utils.nix +++ b/pkgs/applications/editors/neovim/utils.nix @@ -6,12 +6,8 @@ config, vimUtils, vimPlugins, - nodejs, neovim-unwrapped, - bundlerEnv, - ruby, lua, - python3Packages, wrapNeovimUnstable, }: let @@ -109,11 +105,12 @@ let # viml config set by the user along with the plugin inherit (checked_cfg) - userPluginViml + userPluginViml # redefine via userPluginConfigs runtimeDeps pluginAdvisedLua pluginPython3Packages luaDependencies + userPluginConfigs ; # A Vim "package", see ':h packages' diff --git a/pkgs/applications/editors/neovim/wrapper.nix b/pkgs/applications/editors/neovim/wrapper.nix index 723f608c3f40..09ded5ccc92e 100644 --- a/pkgs/applications/editors/neovim/wrapper.nix +++ b/pkgs/applications/editors/neovim/wrapper.nix @@ -100,7 +100,10 @@ let # we call vimrcContent without 'packages' to avoid the init.vim generation neovimRcContent' = lib.concatStringsSep "\n" ( - vimPackageInfo.userPluginViml ++ lib.optional (neovimRcContent != null) neovimRcContent + lib.optional (vimPackageInfo.userPluginConfigs.viml or "" != "") ( + vimPackageInfo.userPluginConfigs.viml + ) + ++ (lib.optional (neovimRcContent != null) neovimRcContent) ); packpathDirs.myNeovimPackages = vimPackageInfo.vimPackage; @@ -126,6 +129,9 @@ let lib.optional (luaDeps != [ ]) luaPathLuaRc ++ [ providerLuaRc ] ++ lib.optional (luaRcContent != "") luaRcContent + ++ lib.optional ( + vimPackageInfo.userPluginConfigs.lua or "" != "" + ) vimPackageInfo.userPluginConfigs.lua ++ lib.optional (neovimRcContent' != "") '' vim.cmd.source "${writeText "init.vim" neovimRcContent'}" '' From ba00f7e4bfad1c1eceb30556676f637088094027 Mon Sep 17 00:00:00 2001 From: teto <886074+teto@users.noreply.github.com> Date: Wed, 8 Apr 2026 16:36:54 +0200 Subject: [PATCH 45/77] neovim.tests: cleanup removed some dead code unrelated to PRs --- .../editors/neovim/tests/default.nix | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/pkgs/applications/editors/neovim/tests/default.nix b/pkgs/applications/editors/neovim/tests/default.nix index 0e5bdf7a5d07..5b14d99b10f7 100644 --- a/pkgs/applications/editors/neovim/tests/default.nix +++ b/pkgs/applications/editors/neovim/tests/default.nix @@ -12,7 +12,6 @@ writeText, neovim, vimPlugins, - neovimUtils, wrapNeovimUnstable, neovim-unwrapped, fetchFromGitLab, @@ -21,8 +20,6 @@ pkgs, }: let - inherit (neovimUtils) makeNeovimConfig; - plugins = with vimPlugins; [ { plugin = vim-obsession; @@ -43,20 +40,6 @@ let } ]; - nvimConfSingleLines = { - plugins = packagesWithSingleLineConfigs; - neovimRcContent = '' - " just a comment - ''; - }; - - nvimConfNix = { - inherit plugins; - neovimRcContent = '' - " just a comment - ''; - }; - nvim-with-luasnip = wrapNeovim2 "-with-luasnip" { plugins = [ { @@ -105,6 +88,7 @@ let } ( '' + export PATH="${neovim-drv}/bin:$PATH" source ${nmt}/bash-lib/assertions.sh vimrc="${writeText "test-${neovim-drv.name}-init.vim" neovim-drv.initRc}" luarc="${writeText "test-${neovim-drv.name}-init.lua" neovim-drv.luaRcContent}" @@ -139,8 +123,19 @@ pkgs.lib.recurseIntoAttrs rec { ### neovim tests ################## - nvim_with_plugins = wrapNeovim2 "-with-plugins" nvimConfNix; - nvim_singlelines = wrapNeovim2 "-single-lines" nvimConfSingleLines; + nvim_with_plugins = wrapNeovim2 "-with-plugins" { + inherit plugins; + neovimRcContent = '' + " just a comment + ''; + }; + + nvim_singlelines = wrapNeovim2 "-single-lines" { + plugins = packagesWithSingleLineConfigs; + neovimRcContent = '' + " just a comment + ''; + }; # test that passthru.initRc hasn't changed passthruInitRc = runTest nvim_singlelines '' @@ -413,12 +408,13 @@ pkgs.lib.recurseIntoAttrs rec { # check that bringing in one plugin with lua deps makes those deps visible from wrapper # for instance luasnip has a dependency on jsregexp can_require_transitive_deps = runTest nvim-with-luasnip '' - ${nvim-with-luasnip}/bin/nvim -i NONE -c "lua require'jsregexp'" -e +quitall! + nvim --headless -i NONE -c "lua require'jsregexp'" -e +quitall! ''; inherit nvim_with_rocks_nvim; rocks_install_plenary = runTest nvim_with_rocks_nvim '' - ${nvim_with_rocks_nvim}/bin/nvim -V3log.txt -i NONE +'Rocks install plenary.nvim' +quit! -e + nvim -V3rocks-log.txt -i NONE +'Rocks install plenary.nvim' +quit! -e + ''; ''; inherit (vimPlugins) corePlugins; From c9baf8b27b3e1114b13b6406d58e1f6c500eae30 Mon Sep 17 00:00:00 2001 From: teto <886074+teto@users.noreply.github.com> Date: Wed, 8 Apr 2026 16:36:54 +0200 Subject: [PATCH 46/77] neovim.tests: test plugin lua config is loaded --- pkgs/applications/editors/neovim/tests/default.nix | 14 ++++++++++++++ pkgs/applications/editors/neovim/wrapper.nix | 1 - 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pkgs/applications/editors/neovim/tests/default.nix b/pkgs/applications/editors/neovim/tests/default.nix index 5b14d99b10f7..5945a5826359 100644 --- a/pkgs/applications/editors/neovim/tests/default.nix +++ b/pkgs/applications/editors/neovim/tests/default.nix @@ -27,6 +27,14 @@ let map $ Obsession ''; } + { + plugin = vim-obsession; + type = "lua"; + config = '' + -- this is a comment + vim.g.nixpkgs_test_value = 42 + ''; + } ]; packagesWithSingleLineConfigs = with vimPlugins; [ @@ -415,6 +423,12 @@ pkgs.lib.recurseIntoAttrs rec { rocks_install_plenary = runTest nvim_with_rocks_nvim '' nvim -V3rocks-log.txt -i NONE +'Rocks install plenary.nvim' +quit! -e ''; + + can_load_lua_config = runTest nvim_with_plugins '' + if ! nvim --headless -V3lua-config-log.txt -i NONE -c 'lua if vim.g.nixpkgs_test_value ~= 42 then os.exit(42) end' +quit! -e; then + echo "Failed to find plugin config" + exit 1 + fi ''; inherit (vimPlugins) corePlugins; diff --git a/pkgs/applications/editors/neovim/wrapper.nix b/pkgs/applications/editors/neovim/wrapper.nix index 09ded5ccc92e..f048fac3ac2b 100644 --- a/pkgs/applications/editors/neovim/wrapper.nix +++ b/pkgs/applications/editors/neovim/wrapper.nix @@ -14,7 +14,6 @@ neovimUtils, perl, lndir, - vimUtils, runCommand, }: From 538571f67be6bd60a546859f8bdd2500fdc6de3e Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 12 Apr 2026 17:39:30 +0200 Subject: [PATCH 47/77] home-assistant-cli: 0.9.6 -> 1.0.0 Changelog: https://github.com/home-assistant-ecosystem/home-assistant-cli/releases/tag/1.0.0 --- pkgs/servers/home-assistant/cli.nix | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/pkgs/servers/home-assistant/cli.nix b/pkgs/servers/home-assistant/cli.nix index c7b1c56ea42c..a332a5e2eb80 100644 --- a/pkgs/servers/home-assistant/cli.nix +++ b/pkgs/servers/home-assistant/cli.nix @@ -6,24 +6,23 @@ installShellFiles, }: -python3.pkgs.buildPythonApplication rec { +python3.pkgs.buildPythonApplication (finalAttrs: { pname = "homeassistant-cli"; - version = "0.9.6"; - format = "setuptools"; + version = "1.0.0"; + pyproject = true; src = fetchFromGitHub { owner = "home-assistant-ecosystem"; repo = "home-assistant-cli"; - rev = version; - hash = "sha256-4OeHJ7icDZUOC5K4L0F0Nd9lbJPgdW4LCU0wniLvJ1Q="; + tag = finalAttrs.version; + hash = "sha256-LF6JXELAP3Mvta3RuDUs4UiQ7ptNFh0vZmPh3ICJFRY="; }; - postPatch = '' - # Ignore pinned versions - sed -i "s/'\(.*\)\(==\|>=\).*'/'\1'/g" setup.py - ''; + pythonRelaxDeps = true; - propagatedBuildInputs = with python3.pkgs; [ + build-system = with python3.pkgs; [ poetry-core ]; + + dependencies = with python3.pkgs; [ aiohttp click click-log @@ -57,8 +56,8 @@ python3.pkgs.buildPythonApplication rec { description = "Command-line tool for Home Assistant"; mainProgram = "hass-cli"; homepage = "https://github.com/home-assistant-ecosystem/home-assistant-cli"; - changelog = "https://github.com/home-assistant-ecosystem/home-assistant-cli/releases/tag/${version}"; + changelog = "https://github.com/home-assistant-ecosystem/home-assistant-cli/releases/tag/${finalAttrs.src.tag}"; license = lib.licenses.asl20; teams = [ lib.teams.home-assistant ]; }; -} +}) From d226092cf26a0672d371f91d012e7c669bf9d4db Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 16:24:03 +0000 Subject: [PATCH 48/77] flyctl: 0.4.29 -> 0.4.33 --- pkgs/by-name/fl/flyctl/package.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/by-name/fl/flyctl/package.nix b/pkgs/by-name/fl/flyctl/package.nix index 325ada0394b8..7815e93ae602 100644 --- a/pkgs/by-name/fl/flyctl/package.nix +++ b/pkgs/by-name/fl/flyctl/package.nix @@ -12,7 +12,7 @@ buildGoModule rec { pname = "flyctl"; - version = "0.4.29"; + version = "0.4.33"; src = fetchFromGitHub { owner = "superfly"; @@ -22,11 +22,11 @@ buildGoModule rec { cd "$out" git rev-parse HEAD > COMMIT ''; - hash = "sha256-mpyxl8Bjk6d0nCmnl+yzp0GtKiugjLykCFlfnf53+K4="; + hash = "sha256-d6GcWiEf/Ir8Uut+xEQagOCcEjOoIxGPvvYC2fqzQPo="; }; proxyVendor = true; - vendorHash = "sha256-BqlLRnyr0m57lshGsjElK39JKYoJrIr281SevOUVhzI="; + vendorHash = "sha256-YO1/E1ys2rt/7nswYsuwynlACH3XsKtsrVRqzoJlny0="; subPackages = [ "." ]; From c475ea546779900919c3648ae2fb3e2d8c6fdf3a Mon Sep 17 00:00:00 2001 From: user <17591696+sand4rt@users.noreply.github.com> Date: Sun, 12 Apr 2026 19:42:31 +0200 Subject: [PATCH 49/77] vimPlugins.git-dev-nvim: init at 0.11.0-unstable-2026-04-11 --- pkgs/applications/editors/vim/plugins/generated.nix | 13 +++++++++++++ .../editors/vim/plugins/vim-plugin-names | 1 + 2 files changed, 14 insertions(+) diff --git a/pkgs/applications/editors/vim/plugins/generated.nix b/pkgs/applications/editors/vim/plugins/generated.nix index 35c0362b2601..5ae3c1a96072 100644 --- a/pkgs/applications/editors/vim/plugins/generated.nix +++ b/pkgs/applications/editors/vim/plugins/generated.nix @@ -5839,6 +5839,19 @@ final: prev: { meta.hydraPlatforms = [ ]; }; + git-dev-nvim = buildVimPlugin { + pname = "git-dev.nvim"; + version = "0.11.0-unstable-2026-04-11"; + src = fetchFromGitHub { + owner = "moyiz"; + repo = "git-dev.nvim"; + rev = "916c7309c34bd8f53da1e30f31cec697e9ac5e52"; + hash = "sha256-5KSjh/Gh8sXrQ7YU66XaaM1M1a3LZswamoBtnA6qiKg="; + }; + meta.homepage = "https://github.com/moyiz/git-dev.nvim/"; + meta.hydraPlatforms = [ ]; + }; + git-messenger-vim = buildVimPlugin { pname = "git-messenger.vim"; version = "0-unstable-2025-05-30"; diff --git a/pkgs/applications/editors/vim/plugins/vim-plugin-names b/pkgs/applications/editors/vim/plugins/vim-plugin-names index 0fef75fa66ed..a452e69d365c 100644 --- a/pkgs/applications/editors/vim/plugins/vim-plugin-names +++ b/pkgs/applications/editors/vim/plugins/vim-plugin-names @@ -447,6 +447,7 @@ https://github.com/eagletmt/ghcmod-vim/,, https://github.com/f-person/git-blame.nvim/,, https://github.com/akinsho/git-conflict.nvim/,HEAD, https://github.com/juansalvatore/git-dashboard-nvim/,HEAD, +https://github.com/moyiz/git-dev.nvim/,, https://github.com/rhysd/git-messenger.vim/,, https://github.com/mikesmithgh/git-prompt-string-lualine.nvim/,HEAD, https://github.com/polarmutex/git-worktree.nvim/,HEAD, From 2bb029a32db8cf23d0b3ea79e1f90ec2e44597aa Mon Sep 17 00:00:00 2001 From: rafaelrc7 Date: Sun, 12 Apr 2026 14:42:33 -0300 Subject: [PATCH 50/77] golazo: Set __structuredAttrs to true --- pkgs/by-name/go/golazo/package.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkgs/by-name/go/golazo/package.nix b/pkgs/by-name/go/golazo/package.nix index ab4a5b8f442a..7dab451dc34f 100644 --- a/pkgs/by-name/go/golazo/package.nix +++ b/pkgs/by-name/go/golazo/package.nix @@ -27,6 +27,8 @@ buildGoModule (finalAttrs: { "-X github.com/0xjuanma/golazo/cmd.Version=v${finalAttrs.version}" ]; + __structuredAttrs = true; + passthru.updateScript = gitUpdater { rev-prefix = "v"; }; From f3916ccf4c4140dfa1d60f22e29e57494f64daa2 Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 19:01:20 +0000 Subject: [PATCH 51/77] slidev-cli: 52.14.1 -> 52.14.2 --- pkgs/by-name/sl/slidev-cli/package.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/by-name/sl/slidev-cli/package.nix b/pkgs/by-name/sl/slidev-cli/package.nix index d69441182f3d..1bfbd5db6c06 100644 --- a/pkgs/by-name/sl/slidev-cli/package.nix +++ b/pkgs/by-name/sl/slidev-cli/package.nix @@ -10,13 +10,13 @@ }: stdenv.mkDerivation (finalAttrs: { pname = "slidev-cli"; - version = "52.14.1"; + version = "52.14.2"; src = fetchFromGitHub { owner = "slidevjs"; repo = "slidev"; tag = "v${finalAttrs.version}"; - hash = "sha256-GIg4KU2TJMSZXjnB+A8MPZUUp1/M1YX5ctO13dfmOz0="; + hash = "sha256-dyvEY4jrptPt3FzOpjwkAv8akXXArzyobpzV2Y3fCr0="; }; pnpmWorkspaces = [ "@slidev/cli..." ]; From 45417ace406a30ac7a3cf08714686f1101978cd4 Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 19:10:40 +0000 Subject: [PATCH 52/77] python3Packages.fastcore: 1.12.34 -> 1.12.38 --- pkgs/development/python-modules/fastcore/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/python-modules/fastcore/default.nix b/pkgs/development/python-modules/fastcore/default.nix index bdd236f11bae..e84534501c6a 100644 --- a/pkgs/development/python-modules/fastcore/default.nix +++ b/pkgs/development/python-modules/fastcore/default.nix @@ -8,14 +8,14 @@ buildPythonPackage (finalAttrs: { pname = "fastcore"; - version = "1.12.34"; + version = "1.12.38"; pyproject = true; src = fetchFromGitHub { owner = "fastai"; repo = "fastcore"; tag = finalAttrs.version; - hash = "sha256-kWF3xEou6yq1si0pfJEljzFKY1xV2IMGQceTOEOe3qI="; + hash = "sha256-xqME3sz7AqGsIuTb8Ge4ByDi4sfwKo/TXEAw6/cTTmU="; }; build-system = [ setuptools ]; From eacf986823ddcb7069ac6f5330cc05690e553f46 Mon Sep 17 00:00:00 2001 From: Markus Kowalewski Date: Mon, 30 Mar 2026 23:30:40 +0200 Subject: [PATCH 53/77] open5gs: 2.7.6 -> 2.7.7 --- pkgs/by-name/op/open5gs-webui/package.nix | 2 +- pkgs/by-name/op/open5gs/package.nix | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pkgs/by-name/op/open5gs-webui/package.nix b/pkgs/by-name/op/open5gs-webui/package.nix index 76d6c28d1241..872f7ccf77f2 100644 --- a/pkgs/by-name/op/open5gs-webui/package.nix +++ b/pkgs/by-name/op/open5gs-webui/package.nix @@ -9,5 +9,5 @@ buildNpmPackage (finalAttrs: { sourceRoot = "${finalAttrs.src.name}/webui"; - npmDepsHash = "sha256-IpqineYa15GBqoPDJ7RpaDsq+MQIIDcdq7yhwmH4Lzo="; + npmDepsHash = "sha256-Epz+pCbgejkj7vcdwbPC2RfAkp2HRqGV0urXiiBrjZQ="; }) diff --git a/pkgs/by-name/op/open5gs/package.nix b/pkgs/by-name/op/open5gs/package.nix index d4e30914a6f8..ea5895282f95 100644 --- a/pkgs/by-name/op/open5gs/package.nix +++ b/pkgs/by-name/op/open5gs/package.nix @@ -26,7 +26,7 @@ stdenv.mkDerivation (finalAttrs: { pname = "open5gs"; - version = "2.7.6"; + version = "2.7.7"; diameter = fetchFromGitHub { owner = "open5gs"; @@ -38,8 +38,8 @@ stdenv.mkDerivation (finalAttrs: { libtins = fetchFromGitHub { owner = "open5gs"; repo = "libtins"; - rev = "fb152ba63bd8d7d024d5f86e5fbd24a4cb3dd93d"; # r4.3 - hash = "sha256-q++F1bvf739P82VpUf4TUygHjhYwOsaQzStJv8PN2Hc="; + rev = "bf22438172d269e6db70e27246dffd8e1f0b96e3"; # r4.5 + hash = "sha256-BxSBNKI+jwI33lN+vmYCYSDAxsVDXS190byAzq6lB/A="; }; mesonFlags = [ @@ -58,7 +58,7 @@ stdenv.mkDerivation (finalAttrs: { owner = "open5gs"; repo = "open5gs"; tag = "v${finalAttrs.version}"; - hash = "sha256-2k+S+OXfdskJPtDUFSxb/+2UZcUiOZzRSSGgsEJWolc="; + hash = "sha256-ZK4q6m/9v+us+6dWpi0k188KfFu1b6G9pGE4VGAe4+4="; }; nativeBuildInputs = [ From 9d10842ede7d11dc1545467f9fcdd0381062f951 Mon Sep 17 00:00:00 2001 From: Lin Jian Date: Mon, 13 Apr 2026 03:33:03 +0800 Subject: [PATCH 54/77] emacs.pkgs.p4-16-mode: remove unneeded override This is not needed because we vendor fixes for Emacs bug#77143 and bug#80744 in elpa2nix.el. --- .../elisp-packages/nongnu-common-overrides.nix | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/pkgs/applications/editors/emacs/elisp-packages/nongnu-common-overrides.nix b/pkgs/applications/editors/emacs/elisp-packages/nongnu-common-overrides.nix index c8f2a54ad826..06c66787c3f1 100644 --- a/pkgs/applications/editors/emacs/elisp-packages/nongnu-common-overrides.nix +++ b/pkgs/applications/editors/emacs/elisp-packages/nongnu-common-overrides.nix @@ -20,21 +20,5 @@ in yasnippet ] ); - - p4-16-mode = super.p4-16-mode.overrideAttrs { - # workaround https://github.com/NixOS/nixpkgs/issues/301795 - prePatch = '' - mkdir tmp-untar-dir - pushd tmp-untar-dir - - tar --extract --verbose --file=$src - content_directory=$(echo p4-16-mode-*) - cp --verbose $content_directory/p4-16-mode-pkg.el $content_directory/p4-pkg.el - src=$PWD/$content_directory.tar - tar --create --verbose --file=$src $content_directory - - popd - ''; - }; # keep-sorted end } From 9720173123a260bcb8b8f95e1d36f666669d2180 Mon Sep 17 00:00:00 2001 From: Lin Jian Date: Mon, 13 Apr 2026 03:30:17 +0800 Subject: [PATCH 55/77] emacs: update vendored patch for Emacs bug#77143 and bug#80744 This update is not needed for elisp packages in Nixpkgs, but it may be useful for user-defined elisp packages. --- pkgs/applications/editors/emacs/build-support/elpa2nix.el | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pkgs/applications/editors/emacs/build-support/elpa2nix.el b/pkgs/applications/editors/emacs/build-support/elpa2nix.el index 40d822fdb6dc..7ab094793b63 100644 --- a/pkgs/applications/editors/emacs/build-support/elpa2nix.el +++ b/pkgs/applications/editors/emacs/build-support/elpa2nix.el @@ -1,13 +1,12 @@ (require 'package) (package-initialize) -;; TODO remove this patch when Emacs bug#77143 is fixed -;; see that bug for more info +;; TODO remove this patch when Emacs bug#77143 and bug#80744 are fixed (defun package--description-file (dir) "Return package description file name for package DIR." (concat (let ((subdir (file-name-nondirectory (directory-file-name dir)))) - (if (string-match "\\([^.].*?\\)-\\([0-9]+\\(?:[.][0-9]+\\|\\(?:pre\\|beta\\|alpha\\|snapshot\\)[0-9]+\\)*\\)\\'" subdir) + (if (string-match "\\([^.].*?\\)-\\([0-9]+\\(?:[.][0-9]+\\|\\(?:pre\\|beta\\|alpha\\|snapshot\\)[0-9]*\\)*\\)\\'" subdir) (match-string 1 subdir) subdir)) "-pkg.el")) From fc26589de9ceadf556f14baec218fc2eeb6cbdfd Mon Sep 17 00:00:00 2001 From: Gaetan Lepage Date: Sun, 12 Apr 2026 19:38:00 +0000 Subject: [PATCH 56/77] python3Packages.para: cleanup, disable tests on python>=3.14 --- .../python-modules/para/default.nix | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/pkgs/development/python-modules/para/default.nix b/pkgs/development/python-modules/para/default.nix index 7277d533dd86..5dc4feb35ced 100644 --- a/pkgs/development/python-modules/para/default.nix +++ b/pkgs/development/python-modules/para/default.nix @@ -3,28 +3,36 @@ stdenv, buildPythonPackage, fetchPypi, - pytestCheckHook, + + # build-system setuptools, + + # tests + pytestCheckHook, + pythonOlder, }: -buildPythonPackage rec { +buildPythonPackage (finalAttrs: { pname = "para"; version = "0.0.8"; pyproject = true; src = fetchPypi { - inherit pname version; + inherit (finalAttrs) pname version; hash = "sha256-RsMjKunY6p2IbP0IzdESiSICvthkX0C2JVWXukz+8hc="; }; build-system = [ setuptools ]; - nativeCheckInputs = [ pytestCheckHook ]; - pythonImportsCheck = [ "para" ]; - # AttributeError: Can't get local object 'test_output_queue_size..get_the_a' - doCheck = !stdenv.hostPlatform.isDarwin; + nativeCheckInputs = [ pytestCheckHook ]; + + doCheck = + # AttributeError: Can't get local object 'test_output_queue_size..get_the_a' + (!stdenv.hostPlatform.isDarwin) + # _pickle.PicklingError: Can't pickle local object .get_the_a at 0x7ffff5689fe0> + && (pythonOlder "3.14"); meta = { description = "Set utilities that ake advantage of python's 'multiprocessing' module to distribute CPU-intensive tasks"; @@ -32,4 +40,4 @@ buildPythonPackage rec { license = lib.licenses.mit; maintainers = with lib.maintainers; [ GaetanLepage ]; }; -} +}) From d5f00d36a75444426aef6cac26d3fae80a57cfbe Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 16:59:27 +0000 Subject: [PATCH 57/77] python3Packages.mwxml: 0.3.6 -> 0.3.8 --- .../python-modules/mwxml/default.nix | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/pkgs/development/python-modules/mwxml/default.nix b/pkgs/development/python-modules/mwxml/default.nix index e48f938344d6..b42e1dfcb175 100644 --- a/pkgs/development/python-modules/mwxml/default.nix +++ b/pkgs/development/python-modules/mwxml/default.nix @@ -14,16 +14,17 @@ # tests pytestCheckHook, + pythonAtLeast, }: -buildPythonPackage rec { +buildPythonPackage (finalAttrs: { pname = "mwxml"; - version = "0.3.6"; + version = "0.3.8"; pyproject = true; src = fetchPypi { - inherit pname version; - hash = "sha256-WlMYHTAhUq0D7FE/8Yaongx+H8xQx4MwRSoIcsqmOTU="; + inherit (finalAttrs) pname version; + hash = "sha256-yiIyqX6pMem7JPhbVKSRBYwjwHRXY3LnESRq+scGFuA="; }; build-system = [ setuptools ]; @@ -38,10 +39,15 @@ buildPythonPackage rec { nativeCheckInputs = [ pytestCheckHook ]; - disabledTests = lib.optionals stdenv.hostPlatform.isDarwin [ - # AttributeError: Can't get local object 'map..process_path' - "test_complex_error_handler" - ]; + disabledTests = + lib.optionals (pythonAtLeast "3.14") [ + # _pickle.PicklingError: Can't pickle local object .process_path at 0x7ffff580f480> + "test_complex_error_handler" + ] + ++ lib.optionals stdenv.hostPlatform.isDarwin [ + # AttributeError: Can't get local object 'map..process_path' + "test_complex_error_handler" + ]; meta = { description = "Set of utilities for processing MediaWiki XML dump data"; @@ -50,4 +56,4 @@ buildPythonPackage rec { license = lib.licenses.mit; maintainers = with lib.maintainers; [ GaetanLepage ]; }; -} +}) From 1d4bf652382ffd11af62d7cff944aaa255736efe Mon Sep 17 00:00:00 2001 From: teto <886074+teto@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:17:18 +0200 Subject: [PATCH 58/77] neovim-unwrapped: enable treesitter tests The full `functionaltest` fails for various reasons. We dont have to run all of it but we can try enabling some of it, starting with the treesitter tests. Right now removing the treesitter parsers trigger no error so it's easy to either not see an error in their installation of a version mismatch. Running the tests should help mitigate this shortcoming. --- pkgs/by-name/ne/neovim-unwrapped/package.nix | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/pkgs/by-name/ne/neovim-unwrapped/package.nix b/pkgs/by-name/ne/neovim-unwrapped/package.nix index 7f9bea9b6481..1990d31ae0d8 100644 --- a/pkgs/by-name/ne/neovim-unwrapped/package.nix +++ b/pkgs/by-name/ne/neovim-unwrapped/package.nix @@ -19,6 +19,7 @@ procps ? null, versionCheckHook, nix-update-script, + writableTmpDirAsHomeHook, # now defaults to false because some tests can be flaky (clipboard etc), see # also: https://github.com/neovim/neovim/issues/16233 @@ -161,22 +162,18 @@ stdenv.mkDerivation ( unibilium utf8proc ] - ++ lib.optionals finalAttrs.finalPackage.doCheck [ - glibcLocales - procps - ] ++ lib.optionals (stdenv.hostPlatform.libc != "glibc") [ # Provide libintl for non-glibc platforms gettext ]; - doCheck = false; + doCheck = true; # to be exhaustive, one could run # make oldtests too checkPhase = '' runHook preCheck - make functionaltest + make functionaltest__treesitter runHook postCheck ''; @@ -219,6 +216,7 @@ stdenv.mkDerivation ( # third-party/CMakeLists.txt is not read at all. (lib.cmakeBool "USE_BUNDLED" false) (lib.cmakeBool "ENABLE_TRANSLATIONS" true) + (lib.cmakeBool "USE_BUNDLED_BUSTED" false) ] ++ ( if lua.pkgs.isLuaJIT then @@ -252,6 +250,12 @@ stdenv.mkDerivation ( nativeInstallCheckInputs = [ versionCheckHook + lua.pkgs.busted + writableTmpDirAsHomeHook + glibcLocales + + # needs git for vim.pack tests as well + procps ]; versionCheckProgram = "${placeholder "out"}/bin/nvim"; doInstallCheck = true; From ae519751731ac34f009a68b3c7cc47e0da01d36d Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sat, 11 Apr 2026 22:22:00 +0000 Subject: [PATCH 59/77] teams-for-linux: 2.7.13 -> 2.8.0 --- pkgs/by-name/te/teams-for-linux/package.nix | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pkgs/by-name/te/teams-for-linux/package.nix b/pkgs/by-name/te/teams-for-linux/package.nix index 84ef705ebe60..e9e2ac9dfcd5 100644 --- a/pkgs/by-name/te/teams-for-linux/package.nix +++ b/pkgs/by-name/te/teams-for-linux/package.nix @@ -5,7 +5,7 @@ fetchFromGitHub, alsa-utils, copyDesktopItems, - electron_39, + electron_41, makeDesktopItem, makeWrapper, nix-update-script, @@ -16,16 +16,16 @@ buildNpmPackage rec { pname = "teams-for-linux"; - version = "2.7.13"; + version = "2.8.0"; src = fetchFromGitHub { owner = "IsmaelMartinez"; repo = "teams-for-linux"; tag = "v${version}"; - hash = "sha256-5JgmV4VeeM3mMlI3AI4BuF9wFzjsrLnmOCESnKbqY9c="; + hash = "sha256-ybxJCCdam5g43Ycf+Ro3ptOr+4+49Fw+y0rqG4fEzBc="; }; - npmDepsHash = "sha256-ChtRC+NtjZdl5mFirSSz6Jo4CvebH1UqtJ4ywfjWEOI="; + npmDepsHash = "sha256-+VwOlzR+80m+qQS4L0IPmFTn4xuPM7aX7EtSd50D9KM="; nativeBuildInputs = [ makeWrapper @@ -46,7 +46,7 @@ buildNpmPackage rec { buildPhase = '' runHook preBuild - cp -r ${electron_39.dist} electron-dist + cp -r ${electron_41.dist} electron-dist chmod -R u+w electron-dist '' # Electron builder complains about symlink in electron-dist @@ -61,7 +61,7 @@ buildNpmPackage rec { -c.npmRebuild=true \ -c.asarUnpack="**/*.node" \ -c.electronDist=electron-dist \ - -c.electronVersion=${electron_39.version} \ + -c.electronVersion=${electron_41.version} \ -c.mac.identity=null runHook postBuild @@ -83,7 +83,7 @@ buildNpmPackage rec { popd # Linux needs 'aplay' for notification sounds - makeWrapper '${lib.getExe electron_39}' "$out/bin/teams-for-linux" \ + makeWrapper '${lib.getExe electron_41}' "$out/bin/teams-for-linux" \ --prefix PATH : ${ lib.makeBinPath [ alsa-utils From 58d94653f27da69eaa8a5fedf97a9c9397c821c3 Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 20:41:41 +0000 Subject: [PATCH 60/77] cloudfox: 2.0.1 -> 2.0.2 --- pkgs/by-name/cl/cloudfox/package.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/by-name/cl/cloudfox/package.nix b/pkgs/by-name/cl/cloudfox/package.nix index 6b67c2f52cf7..8652103f5ac2 100644 --- a/pkgs/by-name/cl/cloudfox/package.nix +++ b/pkgs/by-name/cl/cloudfox/package.nix @@ -6,16 +6,16 @@ buildGoModule (finalAttrs: { pname = "cloudfox"; - version = "2.0.1"; + version = "2.0.2"; src = fetchFromGitHub { owner = "BishopFox"; repo = "cloudfox"; tag = "v${finalAttrs.version}"; - hash = "sha256-l342y30DFDmq2LDVr5L2ayLNUdC97zBwwL2w8C9MAek="; + hash = "sha256-vP19+COji92pm0a08PCE6KNaXgOWajavSuwhlaaPhl0="; }; - vendorHash = "sha256-RnAScQlq8GCTYwhugSZC0I8Crf7CYriidICq1PEII+g="; + vendorHash = "sha256-cQxmDyr+K0Gvv4QdWs9A/Ju7X53+zHQ+OXKI+SySUik="; ldflags = [ "-w" From fb249ab3909e4482502a60bc3f704b0904e0b59c Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 21:05:04 +0000 Subject: [PATCH 61/77] flood: 4.13.0 -> 4.13.9 --- pkgs/by-name/fl/flood/package.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/by-name/fl/flood/package.nix b/pkgs/by-name/fl/flood/package.nix index 431463bf6278..330d72f5f3f0 100644 --- a/pkgs/by-name/fl/flood/package.nix +++ b/pkgs/by-name/fl/flood/package.nix @@ -10,13 +10,13 @@ }: buildNpmPackage rec { pname = "flood"; - version = "4.13.0"; + version = "4.13.9"; src = fetchFromGitHub { owner = "jesec"; repo = "flood"; rev = "v${version}"; - hash = "sha256-3q9a3WwTHzKbZTptSBTevReu2q4XIkSmFzX0MJQAbc4="; + hash = "sha256-0jez1JwgE7J4EOm5wC/hFpvaP4+Zl/XvupLYAR/tGJQ="; }; nativeBuildInputs = [ pnpm_9 ]; @@ -31,7 +31,7 @@ buildNpmPackage rec { ; pnpm = pnpm_9; fetcherVersion = 1; - hash = "sha256-ukhZ1SCejwi0n3PubBo5qIRE/8snjHSZaGVIbHKvwdI="; + hash = "sha256-CT0e/IaAhFqRG+FdlA6ZIXOcmy1IzDdd677XV81SgHY="; }; passthru = { From 5dc59002fdc3c6cd8bce6103f31ea88e906a3e1e Mon Sep 17 00:00:00 2001 From: Sam <30577766+Samasaur1@users.noreply.github.com> Date: Sun, 12 Apr 2026 14:04:21 -0700 Subject: [PATCH 62/77] python312Packages.mobi: exclude standard-imghdr to fix build Our `standard-*` packages are set up to be null on the Python versions that still include the corresponding module in the standard library. However, since mobi depends on standard-imghdr unconditionally, using the package on versions of Python that still have imghdr in the standard library fails to build due to the following sequence of steps: 1. Something calls `python312Packages.mobi`. 2. `standard-imghdr` in the dependencies resolves to `null`, since `imghdr` is still in the standard library on Python 3.12 and we have the `standard-imghdr` package set to be null on versions of Python where `imghdr` is in the standard library. 3. `pythonRuntimeDepsCheck` runs. 4. `pythonRuntimeDepsCheck` sees `Requires-Dist: standard-imghdr` in mobi's distinfo metadata and checks whether the package is installed. 5. It is not, so the runtime deps check fails the build. We solve this issue by removing `standard-imghdr` from the list of dependencies on versions of Python where the package is set to `null` (those versions that have `imghdr` in the standard library). The package continues to work because it will transparently import the standard library version of `imghdr`. --- pkgs/development/python-modules/mobi/default.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkgs/development/python-modules/mobi/default.nix b/pkgs/development/python-modules/mobi/default.nix index c5e5d1e898c4..4b747b433131 100644 --- a/pkgs/development/python-modules/mobi/default.nix +++ b/pkgs/development/python-modules/mobi/default.nix @@ -6,6 +6,7 @@ hatchling, standard-imghdr, pytestCheckHook, + pythonOlder, }: buildPythonPackage rec { @@ -29,6 +30,8 @@ buildPythonPackage rec { standard-imghdr ]; + pythonRemoveDeps = lib.optionals (pythonOlder "3.13") [ "standard-imghdr" ]; + nativeCheckInputs = [ pytestCheckHook ]; From 26f2074339b783fed498b3832b28cd404a428732 Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 21:36:37 +0000 Subject: [PATCH 63/77] python3Packages.slack-bolt: 1.27.0 -> 1.28.0 --- pkgs/development/python-modules/slack-bolt/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/python-modules/slack-bolt/default.nix b/pkgs/development/python-modules/slack-bolt/default.nix index b53f724fde10..70f9969a0d27 100644 --- a/pkgs/development/python-modules/slack-bolt/default.nix +++ b/pkgs/development/python-modules/slack-bolt/default.nix @@ -41,14 +41,14 @@ buildPythonPackage rec { pname = "slack-bolt"; - version = "1.27.0"; + version = "1.28.0"; pyproject = true; src = fetchFromGitHub { owner = "slackapi"; repo = "bolt-python"; tag = "v${version}"; - hash = "sha256-3aYsISTNc2uexzpIiBNnw40XegczL5BdKqi6j9K/A80="; + hash = "sha256-1AJO7+7YG/NFh6Rmqwkm6yua2LWdYQ9Rv1oadfHAlhE="; }; build-system = [ setuptools ]; From 21a5241014422146d8bd6bda0be49336eddaa120 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 12 Apr 2026 23:45:50 +0200 Subject: [PATCH 64/77] python313Packages.pyais: 2.20.1 -> 3.0.0 Diff: https://github.com/M0r13n/pyais/compare/v2.20.1...v3.0.0 Changelog: https://github.com/M0r13n/pyais/blob/v3.0.0/CHANGELOG.txt --- pkgs/development/python-modules/pyais/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/python-modules/pyais/default.nix b/pkgs/development/python-modules/pyais/default.nix index 90a21c204ed8..2242311760c3 100644 --- a/pkgs/development/python-modules/pyais/default.nix +++ b/pkgs/development/python-modules/pyais/default.nix @@ -11,14 +11,14 @@ buildPythonPackage (finalAttrs: { pname = "pyais"; - version = "2.20.1"; + version = "3.0.0"; pyproject = true; src = fetchFromGitHub { owner = "M0r13n"; repo = "pyais"; tag = "v${finalAttrs.version}"; - hash = "sha256-ZyVXZZd9JXTkfucJ5tAcP813FLWapoiTUrzj27SrLlk="; + hash = "sha256-aAmvtCl+rObPkpuKb+FzQfKPfVhXHdbsdCWUytRE6mk="; }; __darwinAllowLocalNetworking = true; From 4fb7d14139b5412201ab8125be9b905aed2e057b Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 21:46:06 +0000 Subject: [PATCH 65/77] python3Packages.pyworxcloud: 6.3.0 -> 6.3.2 --- pkgs/development/python-modules/pyworxcloud/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/python-modules/pyworxcloud/default.nix b/pkgs/development/python-modules/pyworxcloud/default.nix index 349ceca3fe23..175ff491effd 100644 --- a/pkgs/development/python-modules/pyworxcloud/default.nix +++ b/pkgs/development/python-modules/pyworxcloud/default.nix @@ -13,14 +13,14 @@ buildPythonPackage (finalAttrs: { pname = "pyworxcloud"; - version = "6.3.0"; + version = "6.3.2"; pyproject = true; src = fetchFromGitHub { owner = "MTrab"; repo = "pyworxcloud"; tag = "v${finalAttrs.version}"; - hash = "sha256-+97WpQlAxDe9VTCpG7ByhL+qG6u2zZwPNxRFBZDlh48="; + hash = "sha256-T5mSM/vGi+fcMPtCcpAgQ8rlr6+8bnEU7nn6aO/g0H0="; }; pythonRelaxDeps = [ "awsiotsdk" ]; From 3bee0d4c462a2a8b16b569509c024e38cf655498 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 12 Apr 2026 23:48:08 +0200 Subject: [PATCH 66/77] exploitdb: 2026-04-07 -> 2026-04-11 Diff: https://gitlab.com/exploit-database/exploitdb/-/compare/2026-04-07...2026-04-11 --- pkgs/by-name/ex/exploitdb/package.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/by-name/ex/exploitdb/package.nix b/pkgs/by-name/ex/exploitdb/package.nix index c0449a53b8d9..26f51f32f3a9 100644 --- a/pkgs/by-name/ex/exploitdb/package.nix +++ b/pkgs/by-name/ex/exploitdb/package.nix @@ -6,13 +6,13 @@ }: stdenv.mkDerivation (finalAttrs: { pname = "exploitdb"; - version = "2026-04-07"; + version = "2026-04-11"; src = fetchFromGitLab { owner = "exploit-database"; repo = "exploitdb"; tag = finalAttrs.version; - hash = "sha256-tq0E5Kzp4T+eYfA4Q4kR5kbpWrtnyKoNEpJNJCDcEKc="; + hash = "sha256-Gxi+gb9PbjF2QYDYClSBqru8pebf8ay0AvJnCEYbaSc="; }; nativeBuildInputs = [ makeWrapper ]; From 6296268b145058df635ce2720702ab8b75332fb8 Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 21:52:58 +0000 Subject: [PATCH 67/77] python3Packages.kagglesdk: 0.1.16 -> 0.1.18 --- pkgs/development/python-modules/kagglesdk/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/development/python-modules/kagglesdk/default.nix b/pkgs/development/python-modules/kagglesdk/default.nix index 25a5ff60464e..ea5f0c18b3b0 100644 --- a/pkgs/development/python-modules/kagglesdk/default.nix +++ b/pkgs/development/python-modules/kagglesdk/default.nix @@ -16,14 +16,14 @@ buildPythonPackage (finalAttrs: { pname = "kagglesdk"; - version = "0.1.16"; + version = "0.1.18"; pyproject = true; src = fetchFromGitHub { owner = "Kaggle"; repo = "kagglesdk"; tag = "v${finalAttrs.version}"; - hash = "sha256-MmgX9gQ8fQU8yE/2qpw1Kz/VslVix3qUhaGkRahSxns="; + hash = "sha256-2WmYx4Q8Qx1ZdDzqeYwGsOPf0q1Cxtw9zM0iWK4z2xM="; }; build-system = [ From ca8f20ef41856d4cc98fe49569ee9556c97a5e33 Mon Sep 17 00:00:00 2001 From: Clara Engler Date: Sat, 11 Apr 2026 21:05:47 +0200 Subject: [PATCH 68/77] maintainers: add cvengler --- maintainers/maintainer-list.nix | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index db8a6d03d324..d9fe40a1dd25 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -5685,6 +5685,11 @@ name = "Serg Nesterov"; keys = [ { fingerprint = "6E7D BA30 DB5D BA60 693C 3BE3 1512 F6EB 84AE CC8C"; } ]; }; + cvengler = { + name = "Clara Engler"; + github = "cvengler"; + githubId = 12272949; + }; cwoac = { email = "oliver@codersoffortune.net"; github = "cwoac"; From d85d3c6701445f9ef6b25f595f88d38d98650010 Mon Sep 17 00:00:00 2001 From: Clara Engler Date: Sat, 11 Apr 2026 21:07:41 +0200 Subject: [PATCH 69/77] openbgpd: replace cvengler as openbgpd maintainer Discussed with kloenk in a private chat. See also #509060. --- pkgs/by-name/op/openbgpd/package.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkgs/by-name/op/openbgpd/package.nix b/pkgs/by-name/op/openbgpd/package.nix index 910e80f2a63b..79d8f6b8b73c 100644 --- a/pkgs/by-name/op/openbgpd/package.nix +++ b/pkgs/by-name/op/openbgpd/package.nix @@ -60,7 +60,7 @@ stdenv.mkDerivation rec { description = "Free implementation of the Border Gateway Protocol, Version 4. It allows ordinary machines to be used as routers exchanging routes with other systems speaking the BGP protocol"; license = lib.licenses.isc; homepage = "http://www.openbgpd.org/"; - maintainers = with lib.maintainers; [ kloenk ]; + maintainers = with lib.maintainers; [ cvengler ]; platforms = lib.platforms.linux; }; } From d25d786f61615fb8376808b7ed92b7bd536222da Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 12 Apr 2026 23:57:48 +0200 Subject: [PATCH 70/77] python3Packages.slack-bolt: migrate to finalAttrs --- pkgs/development/python-modules/slack-bolt/default.nix | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pkgs/development/python-modules/slack-bolt/default.nix b/pkgs/development/python-modules/slack-bolt/default.nix index 70f9969a0d27..9f78da222d65 100644 --- a/pkgs/development/python-modules/slack-bolt/default.nix +++ b/pkgs/development/python-modules/slack-bolt/default.nix @@ -39,7 +39,7 @@ writableTmpDirAsHomeHook, }: -buildPythonPackage rec { +buildPythonPackage (finalAttrs: { pname = "slack-bolt"; version = "1.28.0"; pyproject = true; @@ -47,7 +47,7 @@ buildPythonPackage rec { src = fetchFromGitHub { owner = "slackapi"; repo = "bolt-python"; - tag = "v${version}"; + tag = "v${finalAttrs.version}"; hash = "sha256-1AJO7+7YG/NFh6Rmqwkm6yua2LWdYQ9Rv1oadfHAlhE="; }; @@ -89,7 +89,7 @@ buildPythonPackage rec { pytestCheckHook writableTmpDirAsHomeHook ] - ++ lib.concatAttrValues optional-dependencies; + ++ lib.flatten (builtins.attrValues finalAttrs.passthru.optional-dependencies); __darwinAllowLocalNetworking = true; @@ -108,8 +108,8 @@ buildPythonPackage rec { meta = { description = "Framework to build Slack apps using Python"; homepage = "https://github.com/slackapi/bolt-python"; - changelog = "https://github.com/slackapi/bolt-python/releases/tag/${src.tag}"; + changelog = "https://github.com/slackapi/bolt-python/releases/tag/${finalAttrs.src.tag}"; license = lib.licenses.mit; maintainers = with lib.maintainers; [ samuela ]; }; -} +}) From 9992618b854b6bf13a60daf67d13bc9239f231f2 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Apr 2026 00:02:25 +0200 Subject: [PATCH 71/77] cdncheck: 1.2.30 -> 1.2.31 Diff: https://github.com/projectdiscovery/cdncheck/compare/v1.2.30...v1.2.31 Changelog: https://github.com/projectdiscovery/cdncheck/releases/tag/v1.2.31 --- pkgs/by-name/cd/cdncheck/package.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkgs/by-name/cd/cdncheck/package.nix b/pkgs/by-name/cd/cdncheck/package.nix index 3c848f798e79..bd8a3b1a0844 100644 --- a/pkgs/by-name/cd/cdncheck/package.nix +++ b/pkgs/by-name/cd/cdncheck/package.nix @@ -6,13 +6,13 @@ buildGoModule (finalAttrs: { pname = "cdncheck"; - version = "1.2.30"; + version = "1.2.31"; src = fetchFromGitHub { owner = "projectdiscovery"; repo = "cdncheck"; tag = "v${finalAttrs.version}"; - hash = "sha256-CzTwax3XuUt5ZJsYXIbXHz3czev6natd1WsTQIrokEE="; + hash = "sha256-IHImxkPuid5dALQ6YUf0eYHs4AlV5vF+w7xQXw+z05o="; }; vendorHash = "sha256-z/wOCtd39ENUe8WQUst4uhl8R6RwCDdcUC4OZcRJWSs="; From 23fcd7748c0efbf22f33a1009d1bdf16ff4dee0d Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 22:19:07 +0000 Subject: [PATCH 72/77] terraform-providers.bpg_proxmox: 0.100.0 -> 0.101.1 --- .../networking/cluster/terraform-providers/providers.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/applications/networking/cluster/terraform-providers/providers.json b/pkgs/applications/networking/cluster/terraform-providers/providers.json index 5e1037ff713d..ad8bb4db9013 100644 --- a/pkgs/applications/networking/cluster/terraform-providers/providers.json +++ b/pkgs/applications/networking/cluster/terraform-providers/providers.json @@ -110,13 +110,13 @@ "vendorHash": null }, "bpg_proxmox": { - "hash": "sha256-1bNiIhF5AyvpQZYIOu9YHa+ACx/mE+1MRUdK8AcHuv0=", + "hash": "sha256-D8pHNC3iof/zSVsCLAu2S6BJlUnUGySQc0tP4RfZ9V0=", "homepage": "https://registry.terraform.io/providers/bpg/proxmox", "owner": "bpg", "repo": "terraform-provider-proxmox", - "rev": "v0.100.0", + "rev": "v0.101.1", "spdx": "MPL-2.0", - "vendorHash": "sha256-l0acl8PpDN/o2OHVRirswy297L/VM8MC85OrsPbyo0s=" + "vendorHash": "sha256-oEl7thSbcviz3pDOYE6ovCBBA4Zdmoss8H/On33zL2o=" }, "brightbox_brightbox": { "hash": "sha256-pwFbCP+qDL/4IUfbPRCkddkbsEEeAu7Wp12/mDL0ABA=", From 99cfdd764636e90d82d4eb9500ba7993e248da9b Mon Sep 17 00:00:00 2001 From: azban Date: Sun, 12 Apr 2026 15:27:24 -0600 Subject: [PATCH 73/77] gleam: 1.15.2 -> 1.15.4 Resolves https://github.com/NixOS/nixpkgs/issues/509292 Fixes https://nvd.nist.gov/vuln/detail/CVE-2026-32146 --- pkgs/by-name/gl/gleam/package.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/by-name/gl/gleam/package.nix b/pkgs/by-name/gl/gleam/package.nix index 061d2abf4b8b..94b734c0240a 100644 --- a/pkgs/by-name/gl/gleam/package.nix +++ b/pkgs/by-name/gl/gleam/package.nix @@ -16,16 +16,16 @@ rustPlatform.buildRustPackage (finalAttrs: { pname = "gleam"; - version = "1.15.2"; + version = "1.15.4"; src = fetchFromGitHub { owner = "gleam-lang"; repo = "gleam"; tag = "v${finalAttrs.version}"; - hash = "sha256-A5rss4+hTLiE0mylzTT1sw18MmDdYBIyu6xLTvMJ1YY="; + hash = "sha256-BTbBcmGOoII7GP68RNl/U2PCNQdG2vdwq1/3/brMuIc="; }; - cargoHash = "sha256-VyVcBAqwrgwiyUXkKPbfP4qTKtFOMCUD0Tho79xJxC8="; + cargoHash = "sha256-+5sGYrqF8CKG5/G1QEQEnMZDFnE8D40TBGygdHBBthA="; nativeBuildInputs = [ pkg-config From bcc3b7065c1ca1a275a498363f5857e7bdf81f85 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Apr 2026 00:52:18 +0200 Subject: [PATCH 74/77] python3Packages.synthetic-home: init at 5.0.2 Library for managing synthetic home device registry https://github.com/allenporter/synthetic-home --- .../python-modules/synthetic-home/default.nix | 55 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 + 2 files changed, 57 insertions(+) create mode 100644 pkgs/development/python-modules/synthetic-home/default.nix diff --git a/pkgs/development/python-modules/synthetic-home/default.nix b/pkgs/development/python-modules/synthetic-home/default.nix new file mode 100644 index 000000000000..6c974e90bdd7 --- /dev/null +++ b/pkgs/development/python-modules/synthetic-home/default.nix @@ -0,0 +1,55 @@ +{ + lib, + aiohttp, + buildPythonPackage, + fetchFromGitHub, + mashumaro, + pytest-asyncio, + pytestCheckHook, + python-slugify, + pyyaml, + setuptools, + syrupy, +}: + +buildPythonPackage (finalAttrs: { + pname = "synthetic-home"; + version = "5.0.2"; + pyproject = true; + + src = fetchFromGitHub { + owner = "allenporter"; + repo = "synthetic-home"; + tag = finalAttrs.version; + hash = "sha256-u5suLTK7Cdp6IKVxnmiw8p+xQiXV5nfc6QUvpqCyxTk="; + }; + + build-system = [ setuptools ]; + + dependencies = [ + aiohttp + mashumaro + ]; + + nativeCheckInputs = [ + pytest-asyncio + pytestCheckHook + python-slugify + pyyaml + syrupy + ]; + + pythonImportsCheck = [ "synthetic_home" ]; + + preCheck = '' + export PATH="$PATH:$out/bin"; + ''; + + meta = { + description = "Library for managing synthetic home device registry"; + homepage = "https://github.com/allenporter/synthetic-home"; + changelog = "https://github.com/allenporter/synthetic-home/releases/tag/${finalAttrs.src.tag}"; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [ fab ]; + }; +}) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 91208e3b4e53..fe3d43516de8 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -18904,6 +18904,8 @@ self: super: with self; { synology-srm = callPackage ../development/python-modules/synology-srm { }; + synthetic-home = callPackage ../development/python-modules/synthetic-home { }; + syrupy = callPackage ../development/python-modules/syrupy { }; syslog-rfc5424-formatter = callPackage ../development/python-modules/syslog-rfc5424-formatter { }; From a84374b17038bd8e1ceb8c79140e0c54efbd5030 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 13 Apr 2026 00:53:00 +0200 Subject: [PATCH 75/77] python3Packages.home-assistant-datasets: init at 0.3.0 Collection of datasets for evaluating AI Models in the context of Home Assistant https://github.com/allenporter/home-assistant-datasets --- .../home-assistant-datasets/default.nix | 66 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 + 2 files changed, 68 insertions(+) create mode 100644 pkgs/development/python-modules/home-assistant-datasets/default.nix diff --git a/pkgs/development/python-modules/home-assistant-datasets/default.nix b/pkgs/development/python-modules/home-assistant-datasets/default.nix new file mode 100644 index 000000000000..256262b4fc22 --- /dev/null +++ b/pkgs/development/python-modules/home-assistant-datasets/default.nix @@ -0,0 +1,66 @@ +{ + lib, + buildPythonPackage, + fetchFromGitHub, + google-generativeai, + hass-client, + jinja2, + mashumaro, + openai, + pyrate-limiter, + pytestCheckHook, + python-slugify, + pyyaml, + setuptools-scm, + setuptools, + synthetic-home, + syrupy, +}: + +buildPythonPackage (finalAttrs: { + pname = "home-assistant-datasets"; + version = "0.3.0"; + pyproject = true; + + src = fetchFromGitHub { + owner = "allenporter"; + repo = "home-assistant-datasets"; + tag = finalAttrs.version; + hash = "sha256-csvjbPtsl7/olJAFmiLES9GH7wAZHxOADTpqbcQbM3s="; + }; + + build-system = [ + setuptools + setuptools-scm + ]; + + dependencies = [ + google-generativeai + hass-client + mashumaro + openai + pyrate-limiter + pyyaml + synthetic-home + ]; + + nativeCheckInputs = [ + jinja2 + pytestCheckHook + python-slugify + syrupy + ]; + + pythonImportsCheck = [ "home_assistant_datasets" ]; + + # Tests want to import Home Assistant as a module + doCheck = false; + + meta = { + description = "Collection of datasets for evaluating AI Models in the context of Home Assistant"; + homepage = "https://github.com/allenporter/home-assistant-datasets"; + changelog = "https://github.com/allenporter/home-assistant-datasets/releases/tag/${finalAttrs.src.tag}"; + license = lib.licenses.asl20; + maintainers = with lib.maintainers; [ fab ]; + }; +}) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index fe3d43516de8..de8db39d0d0b 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -7106,6 +7106,8 @@ self: super: with self; { callPackage ../development/python-modules/home-assistant-chip-wheels { } ); + home-assistant-datasets = callPackage ../development/python-modules/home-assistant-datasets { }; + home-connect-async = callPackage ../development/python-modules/home-connect-async { }; homeassistant-stubs = callPackage ../servers/home-assistant/stubs.nix { }; From f5ac9eb951a99f0d78e3870a2579dead8eba01b2 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 12 Apr 2026 15:24:11 +0200 Subject: [PATCH 76/77] python3Packages.connect-box3: init at 0.2.1 Interact with a Connect Box 3 modem/router https://github.com/home-assistant-ecosystem/python-connect-box3 --- pkgs/by-name/co/connect-box/package.nix | 5 ++ .../python-modules/connect-box3/default.nix | 52 +++++++++++++++++++ pkgs/top-level/python-packages.nix | 2 + 3 files changed, 59 insertions(+) create mode 100644 pkgs/by-name/co/connect-box/package.nix create mode 100644 pkgs/development/python-modules/connect-box3/default.nix diff --git a/pkgs/by-name/co/connect-box/package.nix b/pkgs/by-name/co/connect-box/package.nix new file mode 100644 index 000000000000..87769f0d7360 --- /dev/null +++ b/pkgs/by-name/co/connect-box/package.nix @@ -0,0 +1,5 @@ +{ python3Packages }: + +(python3Packages.toPythonApplication python3Packages.connect-box3).overrideAttrs { + __structuredAttrs = true; +} diff --git a/pkgs/development/python-modules/connect-box3/default.nix b/pkgs/development/python-modules/connect-box3/default.nix new file mode 100644 index 000000000000..e9fd4a33a4d5 --- /dev/null +++ b/pkgs/development/python-modules/connect-box3/default.nix @@ -0,0 +1,52 @@ +{ + lib, + buildPythonPackage, + cyclopts, + fetchFromGitHub, + hatchling, + httpx, + mashumaro, + pytest-asyncio, + pytest-httpx, + pytestCheckHook, + rich, +}: + +buildPythonPackage (finalAttrs: { + pname = "connect-box3"; + version = "0.2.1"; + pyproject = true; + + src = fetchFromGitHub { + owner = "home-assistant-ecosystem"; + repo = "python-connect-box3"; + tag = finalAttrs.version; + hash = "sha256-eLrCMziV/+maLIded1n0248Xb14uVBps/gzTUz8NMMc="; + }; + + build-system = [ hatchling ]; + + dependencies = [ + cyclopts + httpx + mashumaro + rich + ]; + + nativeCheckInputs = [ + pytestCheckHook + pytest-asyncio + pytest-httpx + ]; + + pythonImportsCheck = [ "connect_box3" ]; + + meta = { + description = "Interact with a Connect Box 3 modem/router"; + homepage = "https://github.com/home-assistant-ecosystem/python-connect-box3"; + changelog = "https://github.com/home-assistant-ecosystem/python-connect-box3/releases/tag/${finalAttrs.src.tag}"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ fab ]; + mainProgram = "connect-box"; + }; +}) diff --git a/pkgs/top-level/python-packages.nix b/pkgs/top-level/python-packages.nix index 91208e3b4e53..87f315ef871e 100644 --- a/pkgs/top-level/python-packages.nix +++ b/pkgs/top-level/python-packages.nix @@ -3160,6 +3160,8 @@ self: super: with self; { connect-box = callPackage ../development/python-modules/connect-box { }; + connect-box3 = callPackage ../development/python-modules/connect-box3 { }; + connected-components-3d = callPackage ../development/python-modules/connected-components-3d { }; connection-pool = callPackage ../development/python-modules/connection-pool { }; From e97f51246f14cd29d1638b36f1b72a2a6a72a73d Mon Sep 17 00:00:00 2001 From: "R. Ryantm" Date: Sun, 12 Apr 2026 23:15:18 +0000 Subject: [PATCH 77/77] terraform-providers.kreuzwerker_docker: 4.0.0 -> 4.1.0 --- .../networking/cluster/terraform-providers/providers.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkgs/applications/networking/cluster/terraform-providers/providers.json b/pkgs/applications/networking/cluster/terraform-providers/providers.json index 5e1037ff713d..28dc06dcdb69 100644 --- a/pkgs/applications/networking/cluster/terraform-providers/providers.json +++ b/pkgs/applications/networking/cluster/terraform-providers/providers.json @@ -824,13 +824,13 @@ "vendorHash": "sha256-7mJ+BX7laBKsr4DX1keMXnGi79CZp8M1jD0COQ1lcmU=" }, "kreuzwerker_docker": { - "hash": "sha256-fektxIObUvQSHeu1MJL3lirF+oUq8+CheaxcPDoQB+k=", + "hash": "sha256-PwImvuX6NkdYFjS4I7BbTZWEIVsJ01rsfiLcLfGales=", "homepage": "https://registry.terraform.io/providers/kreuzwerker/docker", "owner": "kreuzwerker", "repo": "terraform-provider-docker", - "rev": "v4.0.0", + "rev": "v4.1.0", "spdx": "MPL-2.0", - "vendorHash": "sha256-wqHArSldDyAxFX0Hmcl6FRDzfRuZGssl1h4GjN/0mgQ=" + "vendorHash": "sha256-3NlY3EysHcRu7aV4NoJxF2IhQ17F9JtxldC5+x3PbL0=" }, "launchdarkly_launchdarkly": { "hash": "sha256-lcemT7kpBlZX35Sb+ujHzSdakBQkUSmYAxTVsJkRW6A=",