diff --git a/maintainers/maintainer-list.nix b/maintainers/maintainer-list.nix index 142d6832fee2..fbc686a01017 100644 --- a/maintainers/maintainer-list.nix +++ b/maintainers/maintainer-list.nix @@ -16424,6 +16424,11 @@ githubId = 83420438; name = "Lewis"; }; + lubsch = { + github = "lubsch"; + githubId = 33580245; + name = "Benjamin Lohmar"; + }; luc65r = { email = "lucas@ransan.fr"; github = "luc65r"; diff --git a/pkgs/applications/emulators/libretro/cores/beetle-pce-fast.nix b/pkgs/applications/emulators/libretro/cores/beetle-pce-fast.nix index 5b806bb2dcc4..8a89ec55c87b 100644 --- a/pkgs/applications/emulators/libretro/cores/beetle-pce-fast.nix +++ b/pkgs/applications/emulators/libretro/cores/beetle-pce-fast.nix @@ -5,13 +5,13 @@ }: mkLibretroCore { core = "mednafen-pce-fast"; - version = "0-unstable-2026-07-03"; + version = "0-unstable-2026-07-10"; src = fetchFromGitHub { owner = "libretro"; repo = "beetle-pce-fast-libretro"; - rev = "744a9ffb6120e7531c153aa468f34adb3fab9057"; - hash = "sha256-n5Mz0a2bIbQEDsX8PZzji58D8L/yFoQVghrMTg7Srd0="; + rev = "0bc6c86928343ca4202c5b6ef33fa4387c47fc12"; + hash = "sha256-TgUueogxf5KZ1S5pt0WiYtoHXWQI81C6QUts1xJClh8="; }; makefile = "Makefile"; diff --git a/pkgs/applications/networking/browsers/chromium/info.json b/pkgs/applications/networking/browsers/chromium/info.json index 13ca006eb4db..9f18dc8e1bec 100644 --- a/pkgs/applications/networking/browsers/chromium/info.json +++ b/pkgs/applications/networking/browsers/chromium/info.json @@ -837,7 +837,7 @@ } }, "ungoogled-chromium": { - "version": "150.0.7871.124", + "version": "150.0.7871.128", "deps": { "depot_tools": { "rev": "f4fadaf6a5ba1bced9d3d9021060667b563bf583", @@ -849,16 +849,16 @@ "hash": "sha256-/1A+DkzAQj2zGPe/A/G0Z3VrYJXUxq4Hd/+d/o5p3G8=" }, "ungoogled-patches": { - "rev": "150.0.7871.124-1", - "hash": "sha256-3dwDG3YuX/l5bOLcC3lICM2qmGnwVAPPJraDRaHZSe8=" + "rev": "150.0.7871.128-1", + "hash": "sha256-GxSsGTC68IEMPt85RLBCVDT0dTl7ZVVPc8o4vxc50H8=" }, "npmHash": "sha256-pF0JtwFpPC4/fodbhSJnQKkczA9WlDg4VqEAy9aDVLg=" }, "DEPS": { "src": { "url": "https://chromium.googlesource.com/chromium/src.git", - "rev": "9261fd0a595ac4964ea84e6bd4a025c1173a2ffa", - "hash": "sha256-YKkZfxFZ7mitD6YqJZW+NQByq71UVb0jCFIBXj0SyzU=", + "rev": "81891e5ca708047763816c778216799ef14c66cb", + "hash": "sha256-lGHZZ2xIih+TaH145CZwEwyXsM1ZQWwqXsIQjWQ/jvk=", "recompress": true }, "src/third_party/clang-format/script": { @@ -1663,8 +1663,8 @@ }, "src/v8": { "url": "https://chromium.googlesource.com/v8/v8.git", - "rev": "209c9cea0db17d8caf23e9d2c7de08c351609744", - "hash": "sha256-3jUyRERu1r+Fl2uSAaRchV2L99XLp8XO9DHctk0lMjY=" + "rev": "2b2f69158528fdd9d86b778cfcc2d0a1c4f8c59f", + "hash": "sha256-bqzCZSpKdXgKv3O1I7ck1PEXCa/2jBT7hpBEKW0LgTA=" }, "src/agents/shared": { "url": "https://chromium.googlesource.com/chromium/agents.git", diff --git a/pkgs/by-name/ad/adslib/package.nix b/pkgs/by-name/ad/adslib/package.nix index 72f9602714ac..d5ea2a987392 100644 --- a/pkgs/by-name/ad/adslib/package.nix +++ b/pkgs/by-name/ad/adslib/package.nix @@ -5,18 +5,17 @@ meson, ninja, pkg-config, - unstableGitUpdater, }: stdenv.mkDerivation (finalAttrs: { pname = "adslib"; - version = "0-unstable-2026-04-27"; + version = "113.0.34-1"; src = fetchFromGitHub { owner = "stlehmann"; repo = "ADS"; - rev = "77953d58f2690436e82db9954e2e55878c5edaa4"; - hash = "sha256-UDPuzqD1krEZa7436k1NvE0lJUmNYG4kiP5fstoRDMc="; + tag = finalAttrs.version; + hash = "sha256-Kh8BDioZdwSdATHPgZ7Ar3/E0y3eRRpG/38/2uHZEEQ="; }; nativeBuildInputs = [ @@ -27,12 +26,10 @@ stdenv.mkDerivation (finalAttrs: { postInstall = '' # Downstream consumers (e.g. pyads) load the shared library as - # `adslib.so` rather than the meson default `libadslib.so`. - ln -s libadslib.so $out/lib/adslib.so + # `adslib.so` rather than the meson default `libAdsLib.so`. + ln -s libAdsLib.so $out/lib/adslib.so ''; - passthru.updateScript = unstableGitUpdater { }; - meta = { description = "Beckhoff protocol to communicate with TwinCAT devices"; homepage = "https://github.com/stlehmann/ADS"; diff --git a/pkgs/by-name/au/autobrr/package.nix b/pkgs/by-name/au/autobrr/package.nix index 7078ed821ede..7da263486503 100644 --- a/pkgs/by-name/au/autobrr/package.nix +++ b/pkgs/by-name/au/autobrr/package.nix @@ -16,12 +16,12 @@ let pname = "autobrr"; - version = "1.81.0"; + version = "1.82.1"; src = fetchFromGitHub { owner = "autobrr"; repo = "autobrr"; tag = "v${version}"; - hash = "sha256-Xm5cYtQabHkoiVZ6v71qWKIpx44obzr0Om2hahFUyO8="; + hash = "sha256-dB/lk05v9L8GAF//N1We3byhsK+156rzRT+r9Q+EVD4="; }; autobrr-web = stdenvNoCC.mkDerivation { @@ -46,7 +46,7 @@ let ; pnpm = pnpm_11; fetcherVersion = 4; - hash = "sha256-VDW1B8OVFZ72nBl8IYM5nXqit2za1Q8mXI6UhcmEeSo="; + hash = "sha256-wlikd38tAfgaSSD9L7DiSXRQFYcfVq5YA1eWs5NE4n8="; }; postBuild = '' @@ -65,7 +65,7 @@ buildGoModule (finalAttrs: { src ; - vendorHash = "sha256-mOsiQXuhhNSbViEFecmlNk549LyfUIuc8FxwDma9XNI="; + vendorHash = "sha256-tsGl0uiQV25aemEQvedZUISrlO4IPE+V87nl31m8hZI="; preBuild = '' cp -r ${finalAttrs.passthru.autobrr-web}/* web/dist diff --git a/pkgs/by-name/br/bruijn/generated.nix b/pkgs/by-name/br/bruijn/generated.nix index 41327b681a4d..d96ef096eee4 100644 --- a/pkgs/by-name/br/bruijn/generated.nix +++ b/pkgs/by-name/br/bruijn/generated.nix @@ -22,10 +22,10 @@ }: mkDerivation { pname = "bruijn"; - version = "0-unstable-2026-07-05"; + version = "0-unstable-2026-07-16"; src = fetchzip { - url = "https://github.com/marvinborner/bruijn/archive/29a4a3e9620702f47d839a154d64489b8fdce1a7.tar.gz"; - sha256 = "18vxzgd6faq8djgpav4na1nvp0jid44vd52gn9a8smwr2xk44wnz"; + url = "https://github.com/marvinborner/bruijn/archive/9f1ac8856d09666a7444874f80b91b876929eecf.tar.gz"; + sha256 = "18mcwp2xn7wgr81mgqr38irvkf24rf0nvwzi8janasq5favim0vy"; }; isLibrary = true; isExecutable = true; diff --git a/pkgs/by-name/cg/cgal/package.nix b/pkgs/by-name/cg/cgal/package.nix index 9c7be9d86df0..f49fbddeae49 100644 --- a/pkgs/by-name/cg/cgal/package.nix +++ b/pkgs/by-name/cg/cgal/package.nix @@ -11,11 +11,11 @@ stdenv.mkDerivation (finalAttrs: { pname = "cgal"; - version = "6.1.1"; + version = "6.2"; src = fetchurl { url = "https://github.com/CGAL/cgal/releases/download/v${finalAttrs.version}/CGAL-${finalAttrs.version}.tar.xz"; - sha256 = "sha256-UlBpNfcOJH7Sd348ZfIOhveSCMKi0OGArnR12vEclu8="; + sha256 = "sha256-+8MoFnRehxpcvetiRTF+nb8QrhqVewqx7bALT94Auo0="; }; patches = [ ./cgal_path.patch ]; diff --git a/pkgs/by-name/de/dezoomify-rs/package.nix b/pkgs/by-name/de/dezoomify-rs/package.nix index 96df189c77aa..5b69579ed744 100644 --- a/pkgs/by-name/de/dezoomify-rs/package.nix +++ b/pkgs/by-name/de/dezoomify-rs/package.nix @@ -11,7 +11,7 @@ rustPlatform.buildRustPackage (finalAttrs: { pname = "dezoomify-rs"; - version = "2.16.0"; + version = "2.17.0"; __structuredAttrs = true; @@ -19,7 +19,7 @@ rustPlatform.buildRustPackage (finalAttrs: { owner = "lovasoa"; repo = "dezoomify-rs"; tag = "v${finalAttrs.version}"; - hash = "sha256-45Vlgle605s3uvPh+Lr+KAk72AzIoolnSuhFzRCORC4="; + hash = "sha256-iRcRMzUW3K0pzRP9Y7ID29Kxpi3dPxRCC4WY+2ydAyE="; }; nativeBuildInputs = lib.optionals (!stdenv.hostPlatform.isDarwin) [ @@ -36,7 +36,7 @@ rustPlatform.buildRustPackage (finalAttrs: { passthru.updateScript = nix-update-script { }; - cargoHash = "sha256-tfeknHPrY11rSmHyEAUvJgCLDwmIpo9jk8BLgzgQCrc="; + cargoHash = "sha256-Tou+t4rbN/KfUAr9AVWD/aAzz+u50v9UZwo5mGXmjy4="; # hyper uses SystemConfiguration.framework to read system proxy settings. # Allow access to the Mach service to prevent the tests from failing. diff --git a/pkgs/by-name/fl/flood/package.nix b/pkgs/by-name/fl/flood/package.nix index 519b00b12135..c413e958d102 100644 --- a/pkgs/by-name/fl/flood/package.nix +++ b/pkgs/by-name/fl/flood/package.nix @@ -10,13 +10,13 @@ }: buildNpmPackage (finalAttrs: { pname = "flood"; - version = "4.14.2"; + version = "4.15.0"; src = fetchFromGitHub { owner = "jesec"; repo = "flood"; tag = "v${finalAttrs.version}"; - hash = "sha256-gSjkpAGkvgRRh8WDpL/F7fS8KDxHRJUuWVqHGcFEGAc="; + hash = "sha256-wd+9owJi9W9pf6c1JuO0X/6JWxLq8XIypj6r4rQUemM="; }; nativeBuildInputs = [ pnpm_10 ]; @@ -31,7 +31,7 @@ buildNpmPackage (finalAttrs: { ; pnpm = pnpm_10; fetcherVersion = 4; - hash = "sha256-yNRC5sCBn002gxUfHMUvh3DZeVYOokfz4MTvqXR2MzI="; + hash = "sha256-a1PoQ5pXw1SgyGFRa3+7AOr6vpyGyHxkMU7KQEFlZ04="; }; passthru = { diff --git a/pkgs/by-name/ma/mago/package.nix b/pkgs/by-name/ma/mago/package.nix index e826b30803c0..44cee926a131 100644 --- a/pkgs/by-name/ma/mago/package.nix +++ b/pkgs/by-name/ma/mago/package.nix @@ -11,17 +11,17 @@ rustPlatform.buildRustPackage (finalAttrs: { pname = "mago"; - version = "1.29.0"; + version = "1.43.0"; src = fetchFromGitHub { owner = "carthage-software"; repo = "mago"; tag = finalAttrs.version; - hash = "sha256-e/LKOQ+GAtdDye/poJdbX/98gDWle3NWIZ2zHwkGkcQ="; + hash = "sha256-AWnPhylz41E6d1M7PxVpH4EbyYeO9T6jlWVlzBqiOhQ="; forceFetchGit = true; # Does not download all files otherwise }; - cargoHash = "sha256-stjjP8VRHy5k9zMXWGikVNExXRFte0gVBEsbKmPY6U4="; + cargoHash = "sha256-f7HZTJ0ESx7QTKgBqd2FOH1nCeIzgODMM9Sb0tQpfdE="; env = { # Get openssl-sys to use pkg-config diff --git a/pkgs/by-name/mu/musescore/package.nix b/pkgs/by-name/mu/musescore/package.nix index dae5ea43ad8a..76e90f3b9c30 100644 --- a/pkgs/by-name/mu/musescore/package.nix +++ b/pkgs/by-name/mu/musescore/package.nix @@ -2,6 +2,7 @@ lib, stdenv, fetchFromGitHub, + fetchpatch, # nativeBuildInputs cmake, @@ -36,15 +37,25 @@ stdenv.mkDerivation (finalAttrs: { pname = "musescore"; - version = "4.7.3"; + version = "4.7.4"; src = fetchFromGitHub { owner = "musescore"; repo = "MuseScore"; tag = "v${finalAttrs.version}"; - hash = "sha256-wWqFJkXLRi3JtnEW3STTG/jBBIQK1dIYPZdKCiBn0m0="; + hash = "sha256-ny6s5hQUxopb6c45KJugYEZULkC8fLP+Au5ghic0KvI="; }; + patches = [ + # Fix for https://github.com/musescore/MuseScore/issues/34091 also reported + # downstream at: https://github.com/NixOS/nixpkgs/issues/540783. PR to + # track: https://github.com/musescore/MuseScore/pull/34204 + (fetchpatch { + url = "https://github.com/musescore/MuseScore/commit/f273501e418842351c4bda10cce32b0e329eaff1.patch"; + hash = "sha256-zrZRzeAHSFGtCuw/o4A3b1Blbo3FxKGxw1UDu9IggzY="; + }) + ]; + cmakeFlags = [ (lib.cmakeFeature "MUSE_APP_BUILD_MODE" "release") # Disable the build and usage of the `/bin/crashpad_handler` utility - it's diff --git a/pkgs/by-name/na/nanoarrow/cpp20-arrow-cpp-fix.diff b/pkgs/by-name/na/nanoarrow/cpp20-arrow-cpp-fix.diff new file mode 100644 index 000000000000..ee8d2dcfa412 --- /dev/null +++ b/pkgs/by-name/na/nanoarrow/cpp20-arrow-cpp-fix.diff @@ -0,0 +1,13 @@ +diff --git i/meson.build w/meson.build +index 5c3032d..5ec2e56 100644 +--- i/meson.build ++++ w/meson.build +@@ -22,7 +22,7 @@ project( + version: '0.8.0', + license: 'Apache-2.0', + meson_version: '>=0.58.0', +- default_options: ['c_std=c99', 'warning_level=2', 'cpp_std=c++17'], ++ default_options: ['c_std=c99', 'warning_level=2', 'cpp_std=c++20'], + ) + + cc = meson.get_compiler('c') diff --git a/pkgs/by-name/na/nanoarrow/package.nix b/pkgs/by-name/na/nanoarrow/package.nix index 07b48bdb0dbf..862f2ce0bff3 100644 --- a/pkgs/by-name/na/nanoarrow/package.nix +++ b/pkgs/by-name/na/nanoarrow/package.nix @@ -30,6 +30,12 @@ stdenv.mkDerivation (finalAttrs: { tag = "apache-arrow-nanoarrow-${finalAttrs.version}"; hash = "sha256-1iLbT1eeyZaoB75uYTgg4qns+C7b4DErqMwJ9nQPRls="; }; + patches = [ + # Fixes an issue between our `arrow-cpp` and this version of `nanoarrow`. + # Not applicable for upstreaming so it seems. See discussion: + # https://github.com/apache/arrow-nanoarrow/issues/902 + ./cpp20-arrow-cpp-fix.diff + ]; nativeBuildInputs = [ meson diff --git a/pkgs/by-name/qr/qrupdate/package.nix b/pkgs/by-name/qr/qrupdate/package.nix index 0947f6267cf3..70bf3aedb09f 100644 --- a/pkgs/by-name/qr/qrupdate/package.nix +++ b/pkgs/by-name/qr/qrupdate/package.nix @@ -12,13 +12,13 @@ stdenv.mkDerivation (finalAttrs: { pname = "qrupdate"; - version = "1.1.5"; + version = "1.2.0"; src = fetchFromGitHub { owner = "mpimd-csc"; repo = "qrupdate-ng"; rev = "v${finalAttrs.version}"; - hash = "sha256-dHxLPrN00wwozagY2JyfZkD3sKUD2+BcnbjNgZepzFg="; + hash = "sha256-d5bc9JJOM3Tn41yZfqq3/rPMqZQxxICJo49oELSwxjc="; }; cmakeFlags = diff --git a/pkgs/by-name/ro/routedns/package.nix b/pkgs/by-name/ro/routedns/package.nix index e73c5624f540..f2f9791f11dc 100644 --- a/pkgs/by-name/ro/routedns/package.nix +++ b/pkgs/by-name/ro/routedns/package.nix @@ -7,16 +7,16 @@ buildGoModule (finalAttrs: { pname = "routedns"; - version = "0.1.209"; + version = "0.1.223"; src = fetchFromGitHub { owner = "folbricht"; repo = "routedns"; rev = "v${finalAttrs.version}"; - hash = "sha256-fzBiF0xIArHchV2umdiO6Q2LPe/nZ7QUVKa2w7onO/0="; + hash = "sha256-RUGKdTtCIljqJlDOOSh0rEh7J+kF9m0dasAhlqpnkyw="; }; - vendorHash = "sha256-e19ZqeVA+WQOILZrju7xFDii/lxmZceXk30tWY74cmM="; + vendorHash = "sha256-WN94s9eRr+Um2WYPnUSDKXRDeNYVy6R920eaCTNd86w="; subPackages = [ "./cmd/routedns" ]; diff --git a/pkgs/by-name/zs/zsh-patina/package.nix b/pkgs/by-name/zs/zsh-patina/package.nix new file mode 100644 index 000000000000..21c42b1b3950 --- /dev/null +++ b/pkgs/by-name/zs/zsh-patina/package.nix @@ -0,0 +1,47 @@ +{ + lib, + stdenv, + rustPlatform, + fetchFromGitHub, + installShellFiles, + nix-update-script, + versionCheckHook, +}: + +rustPlatform.buildRustPackage (finalAttrs: { + pname = "zsh-patina"; + version = "1.7.0"; + __structuredAttrs = true; + + src = fetchFromGitHub { + owner = "michel-kraemer"; + repo = "zsh-patina"; + tag = finalAttrs.version; + hash = "sha256-sPlIT3UHtq+5+bpfrSPPfVXTdmqjEq+6k9tPShhG7h0="; + }; + + cargoHash = "sha256-j2MwEwQhSCUCwANAxr0aZjJ9iS0cGzRRttfK8LONEpg="; + + nativeBuildInputs = [ installShellFiles ]; + postInstall = '' + install -Dm644 LICENSE $out/share/licenses/zsh-patina/LICENSE + '' + + lib.optionalString (stdenv.buildPlatform.canExecute stdenv.hostPlatform) '' + installShellCompletion --cmd zsh-patina --zsh <($out/bin/zsh-patina completion) + ''; + + doInstallCheck = true; + nativeInstallCheckInputs = [ versionCheckHook ]; + + passthru.updateScript = nix-update-script { }; + + meta = { + description = "Zsh syntax highlighter"; + homepage = "https://github.com/michel-kraemer/zsh-patina"; + changelog = "https://github.com/michel-kraemer/zsh-patina/blob/${finalAttrs.version}/CHANGELOG.md"; + license = lib.licenses.mit; + maintainers = with lib.maintainers; [ lubsch ]; + platforms = lib.platforms.unix; + mainProgram = "zsh-patina"; + }; +}) diff --git a/pkgs/development/python-modules/beets/default.nix b/pkgs/development/python-modules/beets/default.nix index 80bdd408fb56..b4bb0db3c641 100644 --- a/pkgs/development/python-modules/beets/default.nix +++ b/pkgs/development/python-modules/beets/default.nix @@ -59,6 +59,7 @@ aacgain, beautifulsoup4, chromaprint, + dbus-python, discogs-client, ffmpeg, flac, @@ -88,6 +89,7 @@ extraNativeBuildInputs ? [ ], # tests + doCheck ? true, pytestCheckHook, pytest-cov-stub, pytest-factoryboy, @@ -194,6 +196,8 @@ buildPythonPackage (finalAttrs: { ] ++ finalAttrs.finalPackage.passthru.plugins.wrapperBins; + inherit doCheck; + __darwinAllowLocalNetworking = true; disabledTestPaths = @@ -275,7 +279,11 @@ buildPythonPackage (finalAttrs: { bench.testPaths = [ ]; bpd = { }; bpm.testPaths = [ ]; - bpsync.testPaths = [ ]; + bpsync = { + # plugin retired: https://github.com/beetbox/beets/issues/3862. + deprecated = true; + testPaths = [ ]; + }; bucket = { }; chroma = { propagatedBuildInputs = [ pyacoustid ]; @@ -288,10 +296,15 @@ buildPythonPackage (finalAttrs: { propagatedBuildInputs = [ requests ]; testPaths = [ ]; }; - discogs.propagatedBuildInputs = [ - discogs-client - requests - ]; + discogs = { + propagatedBuildInputs = [ + discogs-client + requests + ]; + singlePluginTest.config = { + user_token = "test"; + }; + }; duplicates.testPaths = [ ]; edit = { }; embedart = { @@ -334,7 +347,10 @@ buildPythonPackage (finalAttrs: { testPaths = [ ]; }; limit = { }; - listenbrainz = { }; + listenbrainz.singlePluginTest.config = { + token = "test"; + username = "test"; + }; loadext = { propagatedBuildInputs = [ requests ]; testPaths = [ ]; @@ -348,7 +364,10 @@ buildPythonPackage (finalAttrs: { mbsubmit = { }; mbsync = { }; mbpseudo = { }; - metasync.testPaths = [ ]; + metasync = { + propagatedBuildInputs = [ dbus-python ]; + testPaths = [ ]; + }; missing.testPaths = [ ]; mpdstats.propagatedBuildInputs = [ python-mpd2 ]; mpdupdate = { @@ -363,11 +382,14 @@ buildPythonPackage (finalAttrs: { plexupdate = { }; random = { }; replace = { }; - replaygain.wrapperBins = [ - aacgain - ffmpeg - mp3gain - ]; + replaygain = { + singlePluginTest.config.backend = "gstreamer"; + wrapperBins = [ + aacgain + ffmpeg + mp3gain + ]; + }; rewrite.testPaths = [ ]; scrub.testPaths = [ ]; smartplaylist = { }; @@ -375,7 +397,10 @@ buildPythonPackage (finalAttrs: { propagatedBuildInputs = [ soco ]; testPaths = [ ]; }; - spotify = { }; + spotify.singlePluginTest.setup = '' + mkdir -p $HOME/.config/beets + echo '{"access_token":"test"}' > $HOME/.config/beets/spotify_token.json + ''; subsonicplaylist = { propagatedBuildInputs = [ requests ]; testPaths = [ ]; @@ -384,7 +409,7 @@ buildPythonPackage (finalAttrs: { substitute = { testPaths = [ ]; }; - tidal = { }; + tidal.propagatedBuildInputs = [ requests-oauthlib ]; the = { }; titlecase.propagatedBuildInputs = [ titlecase ]; thumbnails = { @@ -416,23 +441,24 @@ buildPythonPackage (finalAttrs: { lib.throwIf (finalAttrs.finalPackage.passthru.plugins.builtins.${plugName}.deprecated or false) "beets evaluation error: Plugin ${plugName} was enabled in pluginOverrides, but it has been removed. Remove the override to fix evaluation." ) pluginOverrides; - all = - lib.mapAttrs - ( - n: a: - { - name = n; - enable = !disableAllPlugins; - builtin = false; - propagatedBuildInputs = [ ]; - testPaths = [ "test/plugins/test_${n}.py" ]; - wrapperBins = [ ]; - } - // a - ) - ( - lib.recursiveUpdate finalAttrs.finalPackage.passthru.plugins.base finalAttrs.finalPackage.passthru.plugins.overrides - ); + all = lib.pipe finalAttrs.finalPackage.passthru.plugins.base [ + (base: lib.recursiveUpdate base finalAttrs.finalPackage.passthru.plugins.overrides) + (lib.mapAttrs ( + n: a: + lib.recursiveUpdate { + name = n; + enable = !disableAllPlugins; + builtin = false; + propagatedBuildInputs = [ ]; + singlePluginTest = { + config = { }; + setup = ""; + }; + testPaths = [ "test/plugins/test_${n}.py" ]; + wrapperBins = [ ]; + } a + )) + ]; enabled = lib.filterAttrs (_: p: p.enable) finalAttrs.finalPackage.passthru.plugins.all; disabled = lib.filterAttrs (_: p: !p.enable) finalAttrs.finalPackage.passthru.plugins.all; disabledTestPaths = lib.flatten ( @@ -443,23 +469,6 @@ buildPythonPackage (finalAttrs: { ); }; tests = { - gstreamer = - runCommand "beets-gstreamer-test" - { - meta.timeout = 60; - } - '' - set -euo pipefail - export HOME=$(mktemp -d) - mkdir $out - - cat << EOF > $out/config.yaml - replaygain: - backend: gstreamer - EOF - - ${finalAttrs.finalPackage}/bin/beet -c $out/config.yaml > /dev/null - ''; with-new-builtin-plugin = finalAttrs.finalPackage.overrideAttrs ( newAttrs: oldAttrs: { postPatch = (oldAttrs.postPatch or "") + '' @@ -497,7 +506,66 @@ buildPythonPackage (finalAttrs: { -c $out/config.yaml \ mpdstats --help 2> $out/mpdstats-help-stderr || true ''; - }; + } + # Build and start beets once for each supported built-in plugin. Keeping the + # plugins isolated makes missing optional dependencies visible. + // lib.pipe finalAttrs.finalPackage.passthru.plugins.all [ + # Deprecated plugins are not useful regression targets. + (lib.filterAttrs (_: pluginAttrs: !(pluginAttrs.deprecated or false))) + (lib.concatMapAttrs ( + pluginName: pluginAttrs: + let + testConfig = { + plugins = [ pluginName ]; + } + # Some plugins do not accept an empty attribute set as config. + // lib.optionalAttrs (pluginAttrs.singlePluginTest.config != { }) { + ${pluginName} = pluginAttrs.singlePluginTest.config; + }; + beetsWithSinglePlugin = beets.override { + disableAllPlugins = true; + pluginOverrides = { + ${pluginName}.enable = true; + }; + # The runCommand below is the relevant check; avoid running + # the full upstream test suite once per plugin. NOTE that + # testing whether any plugin's `testPaths` is incorrect, is + # done for all plugins via the `beets-minimal` derivation. + doCheck = false; + }; + in + { + "with-single-plugin-${pluginName}" = beetsWithSinglePlugin; + "single-plugin-${pluginName}" = runCommand "beets-single-plugin-${pluginName}-test" { } '' + set -euo pipefail + export HOME=$(mktemp -d) + ${pluginAttrs.singlePluginTest.setup} + mkdir $out + + cat <<'EOF' > $out/config.yaml + ${lib.generators.toYAML { } testConfig} + EOF + + status=0 + ${lib.getExe beetsWithSinglePlugin} \ + -c "$out/config.yaml" \ + --help > "$out/stdout" 2> "$out/stderr" || status=$? + + # beet exits successfully when a plugin fails to load, so its + # stderr must also be checked for the diagnostic. + if (( status != 0 )) || grep -Fq "error loading plugin" "$out/stderr"; then + { + printf '%s\n' '----- stdout -----' + cat "$out/stdout" + printf '%s\n' '----- stderr -----' + cat "$out/stderr" + } >&2 + exit 1 + fi + ''; + } + )) + ]; }; meta = { @@ -509,6 +577,7 @@ buildPythonPackage (finalAttrs: { doronbehar lovesegfault pjones + staticdev ]; platforms = lib.platforms.linux ++ lib.platforms.darwin; mainProgram = "beet";