about summary refs log tree commit diff
diff options
context:
space:
mode:
authorgithub-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>2023-02-18 00:02:56 +0000
committerGitHub <noreply@github.com>2023-02-18 00:02:56 +0000
commitc466fa7ff40eba6a1e50a54c6670e081249b390d (patch)
treeadaef52091efcd2434eb82ee0d8e400ade27aa9e
parent19a3d0a6e806a8fe6694f54510ea1760e807a203 (diff)
parent69a8c9e227c27a906d5a617993ccd49925f692ab (diff)
downloadnixlib-c466fa7ff40eba6a1e50a54c6670e081249b390d.tar
nixlib-c466fa7ff40eba6a1e50a54c6670e081249b390d.tar.gz
nixlib-c466fa7ff40eba6a1e50a54c6670e081249b390d.tar.bz2
nixlib-c466fa7ff40eba6a1e50a54c6670e081249b390d.tar.lz
nixlib-c466fa7ff40eba6a1e50a54c6670e081249b390d.tar.xz
nixlib-c466fa7ff40eba6a1e50a54c6670e081249b390d.tar.zst
nixlib-c466fa7ff40eba6a1e50a54c6670e081249b390d.zip
Merge staging-next into staging
-rw-r--r--nixos/doc/manual/development/developing-the-test-driver.chapter.md43
-rw-r--r--nixos/doc/manual/development/development.md1
-rw-r--r--nixos/lib/testing/meta.nix2
-rw-r--r--nixos/modules/services/hardware/kanata.nix86
-rw-r--r--nixos/modules/services/mail/maddy.nix51
-rw-r--r--nixos/modules/virtualisation/docker.nix2
-rw-r--r--nixos/tests/maddy.nix2
-rw-r--r--nixos/tests/pass-secret-service.nix2
-rw-r--r--nixos/tests/quake3.nix8
-rw-r--r--pkgs/applications/misc/protonup-qt/default.nix2
-rw-r--r--pkgs/applications/networking/cluster/nomad/default.nix26
-rw-r--r--pkgs/development/beam-modules/fetch-mix-deps.nix2
-rw-r--r--pkgs/development/libraries/libdisplay-info/default.nix6
-rw-r--r--pkgs/development/python-modules/griffe/default.nix4
-rw-r--r--pkgs/development/python-modules/pydeconz/default.nix5
-rw-r--r--pkgs/development/python-modules/pyfido/default.nix4
-rw-r--r--pkgs/development/python-modules/python-ipmi/default.nix4
-rw-r--r--pkgs/development/python-modules/python-ironicclient/default.nix4
-rw-r--r--pkgs/development/python-modules/slack-sdk/default.nix4
-rw-r--r--pkgs/development/python-modules/wandb/default.nix2
-rw-r--r--pkgs/development/python-modules/weconnect-mqtt/default.nix6
-rw-r--r--pkgs/development/python-modules/weconnect/default.nix8
-rw-r--r--pkgs/development/python-modules/z3c-checkversions/default.nix9
-rw-r--r--pkgs/development/tools/ansi/default.nix2
-rw-r--r--pkgs/servers/plex/raw.nix6
-rw-r--r--pkgs/tools/X11/paperview/default.nix35
-rw-r--r--pkgs/tools/misc/turbo/default.nix91
-rw-r--r--pkgs/top-level/all-packages.nix4
28 files changed, 294 insertions, 127 deletions
diff --git a/nixos/doc/manual/development/developing-the-test-driver.chapter.md b/nixos/doc/manual/development/developing-the-test-driver.chapter.md
new file mode 100644
index 000000000000..4b70fe00af47
--- /dev/null
+++ b/nixos/doc/manual/development/developing-the-test-driver.chapter.md
@@ -0,0 +1,43 @@
+
+# Developing the NixOS Test Driver {#chap-developing-the-test-driver}
+
+The NixOS test framework is a project of its own.
+
+It consists of roughly the following components:
+
+ - `nixos/lib/test-driver`: The Python framework that sets up the test and runs the [`testScript`](#test-opt-testScript)
+ - `nixos/lib/testing`: The Nix code responsible for the wiring, written using the (NixOS) Module System.
+
+These components are exposed publicly through:
+
+ - `nixos/lib/default.nix`: The public interface that exposes the `nixos/lib/testing` entrypoint.
+ - `flake.nix`: Exposes the `lib.nixos`, including the public test interface.
+
+Beyond the test driver itself, its integration into NixOS and Nixpkgs is important.
+
+ - `pkgs/top-level/all-packages.nix`: Defines the `nixosTests` attribute, used
+   by the package `tests` attributes and OfBorg.
+ - `nixos/release.nix`: Defines the `tests` attribute built by Hydra, independently, but analogous to `nixosTests`
+ - `nixos/release-combined.nix`: Defines which tests are channel blockers.
+
+Finally, we have legacy entrypoints that users should move away from, but are cared for on a best effort basis.
+These include `pkgs.nixosTest`, `testing-python.nix` and `make-test-python.nix`.
+
+## Testing changes to the test framework {#sec-test-the-test-framework}
+
+When making significant changes to the test framework, we run the tests on Hydra, to avoid disrupting the larger NixOS project.
+
+For this, we use the `python-test-refactoring` branch in the `NixOS/nixpkgs` repository, and its [corresponding Hydra jobset](https://hydra.nixos.org/jobset/nixos/python-test-refactoring).
+This branch is used as a pointer, and not as a feature branch.
+
+1. Rebase the PR onto a recent, good evaluation of `nixos-unstable`
+2. Create a baseline evaluation by force-pushing this revision of `nixos-unstable` to `python-test-refactoring`.
+3. Note the evaluation number (we'll call it `<previous>`)
+4. Push the PR to `python-test-refactoring` and evaluate the PR on Hydra
+5. Create a comparison URL by navigating to the latest build of the PR and adding to the URL `?compare=<previous>`. This is not necessary for the evaluation that comes right after the baseline.
+
+Review the removed tests and newly failed tests using the constructed URL; otherwise you will accidentally compare iterations of the PR instead of changes to the PR base.
+
+As we currently have some flaky tests, newly failing tests are expected, but should be reviewed to make sure that
+ - The number of failures did not increase significantly.
+ - All failures that do occur can reasonably be assumed to fail for a different reason than the changes.
diff --git a/nixos/doc/manual/development/development.md b/nixos/doc/manual/development/development.md
index 6a0dd091b129..76f405c3b29c 100644
--- a/nixos/doc/manual/development/development.md
+++ b/nixos/doc/manual/development/development.md
@@ -10,5 +10,6 @@ bootspec.chapter.md
 what-happens-during-a-system-switch.chapter.md
 writing-documentation.chapter.md
 nixos-tests.chapter.md
+developing-the-test-driver.chapter.md
 testing-installer.chapter.md
 ```
diff --git a/nixos/lib/testing/meta.nix b/nixos/lib/testing/meta.nix
index 65754fe3c541..805b7520edff 100644
--- a/nixos/lib/testing/meta.nix
+++ b/nixos/lib/testing/meta.nix
@@ -22,7 +22,7 @@ in
           };
           timeout = lib.mkOption {
             type = types.nullOr types.int;
-            default = null; # NOTE: null values are filtered out by `meta`.
+            default = 3600;  # 1 hour
             description = mdDoc ''
               The [{option}`test`](#test-opt-test)'s [`meta.timeout`](https://nixos.org/manual/nixpkgs/stable/#var-meta-timeout) in seconds.
             '';
diff --git a/nixos/modules/services/hardware/kanata.nix b/nixos/modules/services/hardware/kanata.nix
index 84265eb8f947..bb730037277b 100644
--- a/nixos/modules/services/hardware/kanata.nix
+++ b/nixos/modules/services/hardware/kanata.nix
@@ -8,19 +8,9 @@ let
   keyboard = {
     options = {
       devices = mkOption {
-        type = types.addCheck (types.listOf types.str)
-          (devices: (length devices) > 0);
+        type = types.listOf types.str;
         example = [ "/dev/input/by-id/usb-0000_0000-event-kbd" ];
-        # TODO replace note with tip, which has not been implemented yet in
-        # nixos/lib/make-options-doc/mergeJSON.py
-        description = mdDoc ''
-          Paths to keyboard devices.
-
-          ::: {.note}
-          To avoid unnecessary triggers of the service unit, unplug devices in
-          the order of the list.
-          :::
-        '';
+        description = mdDoc "Paths to keyboard devices.";
       };
       config = mkOption {
         type = types.lines;
@@ -44,8 +34,10 @@ let
             cap (tap-hold 100 100 caps lctl))
         '';
         description = mdDoc ''
-          Configuration other than `defcfg`. See [example config
-          files](https://github.com/jtroo/kanata) for more information.
+          Configuration other than `defcfg`.
+
+          See [example config files](https://github.com/jtroo/kanata)
+          for more information.
         '';
       };
       extraDefCfg = mkOption {
@@ -53,8 +45,12 @@ let
         default = "";
         example = "danger-enable-cmd yes";
         description = mdDoc ''
-          Configuration of `defcfg` other than `linux-dev`. See [example
-          config files](https://github.com/jtroo/kanata) for more information.
+          Configuration of `defcfg` other than `linux-dev` (generated
+          from the devices option) and
+          `linux-continue-if-no-devs-found` (hardcoded to be yes).
+
+          See [example config files](https://github.com/jtroo/kanata)
+          for more information.
         '';
       };
       extraArgs = mkOption {
@@ -67,8 +63,7 @@ let
         default = null;
         example = 6666;
         description = mdDoc ''
-          Port to run the notification server on. `null` will not run the
-          server.
+          Port to run the TCP server on. `null` will not run the server.
         '';
       };
     };
@@ -76,28 +71,23 @@ let
 
   mkName = name: "kanata-${name}";
 
-  mkDevices = devices: concatStringsSep ":" devices;
+  mkDevices = devices:
+    optionalString ((length devices) > 0) "linux-dev ${concatStringsSep ":" devices}";
 
   mkConfig = name: keyboard: pkgs.writeText "${mkName name}-config.kdb" ''
     (defcfg
       ${keyboard.extraDefCfg}
-      linux-dev ${mkDevices keyboard.devices})
+      ${mkDevices keyboard.devices}
+      linux-continue-if-no-devs-found yes)
 
     ${keyboard.config}
   '';
 
   mkService = name: keyboard: nameValuePair (mkName name) {
-    description = "kanata for ${mkDevices keyboard.devices}";
-
-    # Because path units are used to activate service units, which
-    # will start the old stopped services during "nixos-rebuild
-    # switch", stopIfChanged here is a workaround to make sure new
-    # services are running after "nixos-rebuild switch".
-    stopIfChanged = false;
-
+    wantedBy = [ "multi-user.target" ];
     serviceConfig = {
       ExecStart = ''
-        ${cfg.package}/bin/kanata \
+        ${getExe cfg.package} \
           --cfg ${mkConfig name keyboard} \
           --symlink-path ''${RUNTIME_DIRECTORY}/${name} \
           ${optionalString (keyboard.port != null) "--port ${toString keyboard.port}"} \
@@ -146,37 +136,10 @@ let
       UMask = "0077";
     };
   };
-
-  mkPathName = i: name: "${mkName name}-${toString i}";
-
-  mkPath = name: n: i: device:
-    nameValuePair (mkPathName i name) {
-      description =
-        "${toString (i+1)}/${toString n} kanata trigger for ${name}, watching ${device}";
-      wantedBy = optional (i == 0) "multi-user.target";
-      pathConfig = {
-        PathExists = device;
-        # (ab)use systemd.path to construct a trigger chain so that the
-        # service unit is only started when all paths exist
-        # however, manual of systemd.path says Unit's suffix is not ".path"
-        Unit =
-          if (i + 1) == n
-          then "${mkName name}.service"
-          else "${mkPathName (i + 1) name}.path";
-      };
-      unitConfig.StopPropagatedFrom = optional (i > 0) "${mkName name}.service";
-    };
-
-  mkPaths = name: keyboard:
-    let
-      n = length keyboard.devices;
-    in
-    imap0 (mkPath name n) keyboard.devices
-  ;
 in
 {
   options.services.kanata = {
-    enable = mkEnableOption (lib.mdDoc "kanata");
+    enable = mkEnableOption (mdDoc "kanata");
     package = mkOption {
       type = types.package;
       default = pkgs.kanata;
@@ -201,14 +164,7 @@ in
   config = mkIf cfg.enable {
     hardware.uinput.enable = true;
 
-    systemd = {
-      paths = trivial.pipe cfg.keyboards [
-        (mapAttrsToList mkPaths)
-        concatLists
-        listToAttrs
-      ];
-      services = mapAttrs' mkService cfg.keyboards;
-    };
+    systemd.services = mapAttrs' mkService cfg.keyboards;
   };
 
   meta.maintainers = with maintainers; [ linj ];
diff --git a/nixos/modules/services/mail/maddy.nix b/nixos/modules/services/mail/maddy.nix
index eeb113e204c6..5f3a9b56292d 100644
--- a/nixos/modules/services/mail/maddy.nix
+++ b/nixos/modules/services/mail/maddy.nix
@@ -223,22 +223,59 @@ in {
         '';
       };
 
+      ensureAccounts = mkOption {
+        type = types.listOf types.str;
+        default = [];
+        description = lib.mdDoc ''
+          List of IMAP accounts which get automatically created. Note that for
+          a complete setup, user credentials for these accounts are required too
+          and can be created using the command `maddyctl creds`.
+          This option does not delete accounts which are not (anymore) listed.
+        '';
+        example = [
+          "user1@localhost"
+          "user2@localhost"
+        ];
+      };
+
     };
   };
 
   config = mkIf cfg.enable {
 
     systemd = {
+
       packages = [ pkgs.maddy ];
-      services.maddy = {
-        serviceConfig = {
-          User = cfg.user;
-          Group = cfg.group;
-          StateDirectory = [ "maddy" ];
+      services = {
+        maddy = {
+          serviceConfig = {
+            User = cfg.user;
+            Group = cfg.group;
+            StateDirectory = [ "maddy" ];
+          };
+          restartTriggers = [ config.environment.etc."maddy/maddy.conf".source ];
+          wantedBy = [ "multi-user.target" ];
+        };
+        maddy-ensure-accounts = {
+          script = ''
+            ${optionalString (cfg.ensureAccounts != []) ''
+              ${concatMapStrings (account: ''
+                if ! ${pkgs.maddy}/bin/maddyctl imap-acct list | grep "${account}"; then
+                  ${pkgs.maddy}/bin/maddyctl imap-acct create ${account}
+                fi
+              '') cfg.ensureAccounts}
+            ''}
+          '';
+          serviceConfig = {
+            Type = "oneshot";
+            User= "maddy";
+          };
+          after = [ "maddy.service" ];
+          wantedBy = [ "multi-user.target" ];
         };
-        restartTriggers = [ config.environment.etc."maddy/maddy.conf".source ];
-        wantedBy = [ "multi-user.target" ];
+
       };
+
     };
 
     environment.etc."maddy/maddy.conf" = {
diff --git a/nixos/modules/virtualisation/docker.nix b/nixos/modules/virtualisation/docker.nix
index d9bd10ba1fc8..505cb4e32e1e 100644
--- a/nixos/modules/virtualisation/docker.nix
+++ b/nixos/modules/virtualisation/docker.nix
@@ -163,7 +163,7 @@ in
   ###### implementation
 
   config = mkIf cfg.enable (mkMerge [{
-      boot.kernelModules = [ "bridge" "veth" ];
+      boot.kernelModules = [ "bridge" "veth" "br_netfilter" "xt_nat" ];
       boot.kernel.sysctl = {
         "net.ipv4.conf.all.forwarding" = mkOverride 98 true;
         "net.ipv4.conf.default.forwarding" = mkOverride 98 true;
diff --git a/nixos/tests/maddy.nix b/nixos/tests/maddy.nix
index b9d0416482da..800d254f1770 100644
--- a/nixos/tests/maddy.nix
+++ b/nixos/tests/maddy.nix
@@ -9,6 +9,7 @@ import ./make-test-python.nix ({ pkgs, ... }: {
         hostname = "server";
         primaryDomain = "server";
         openFirewall = true;
+        ensureAccounts = [ "postmaster@server" ];
       };
     };
 
@@ -50,7 +51,6 @@ import ./make-test-python.nix ({ pkgs, ... }: {
     server.wait_for_open_port(587)
 
     server.succeed("maddyctl creds create --password test postmaster@server")
-    server.succeed("maddyctl imap-acct create postmaster@server")
 
     client.succeed("send-testmail")
     client.succeed("test-imap")
diff --git a/nixos/tests/pass-secret-service.nix b/nixos/tests/pass-secret-service.nix
index a85a508bfe16..e0dddf0ad29e 100644
--- a/nixos/tests/pass-secret-service.nix
+++ b/nixos/tests/pass-secret-service.nix
@@ -1,6 +1,6 @@
 import ./make-test-python.nix ({ pkgs, lib, ... }: {
   name = "pass-secret-service";
-  meta.maintainers = with lib; [ aidalgol ];
+  meta.maintainers = [ lib.maintainers.aidalgol ];
 
   nodes.machine = { nodes, pkgs, ... }:
     {
diff --git a/nixos/tests/quake3.nix b/nixos/tests/quake3.nix
index 82af1af463d0..ef5fcc41476b 100644
--- a/nixos/tests/quake3.nix
+++ b/nixos/tests/quake3.nix
@@ -1,4 +1,4 @@
-import ./make-test-python.nix ({ pkgs, ...} :
+import ./make-test-python.nix ({ pkgs, lib, ...} :
 
 let
 
@@ -11,9 +11,9 @@ let
     };
 
   # Only allow the demo data to be used (only if it's unfreeRedistributable).
-  unfreePredicate = pkg: with pkgs.lib; let
+  unfreePredicate = pkg: with lib; let
     allowPackageNames = [ "quake3-demodata" "quake3-pointrelease" ];
-    allowLicenses = [ pkgs.lib.licenses.unfreeRedistributable ];
+    allowLicenses = [ lib.licenses.unfreeRedistributable ];
   in elem pkg.pname allowPackageNames &&
      elem (pkg.meta.license or null) allowLicenses;
 
@@ -31,7 +31,7 @@ in
 
 rec {
   name = "quake3";
-  meta = with pkgs.stdenv.lib.maintainers; {
+  meta = with lib.maintainers; {
     maintainers = [ domenkozar eelco ];
   };
 
diff --git a/pkgs/applications/misc/protonup-qt/default.nix b/pkgs/applications/misc/protonup-qt/default.nix
index 72997d1e09a3..0638a9d4efde 100644
--- a/pkgs/applications/misc/protonup-qt/default.nix
+++ b/pkgs/applications/misc/protonup-qt/default.nix
@@ -28,6 +28,6 @@ appimageTools.wrapType2 rec {
     sourceProvenance = with sourceTypes; [ binaryNativeCode ];
     mainProgram = "protonup-qt";
     platforms = [ "x86_64-linux" ];
-    maintainers = with maintainers; [ ];
+    maintainers = with maintainers; [ michaelBelsanti ];
   };
 }
diff --git a/pkgs/applications/networking/cluster/nomad/default.nix b/pkgs/applications/networking/cluster/nomad/default.nix
index faec09480774..ba7f86e9e7d6 100644
--- a/pkgs/applications/networking/cluster/nomad/default.nix
+++ b/pkgs/applications/networking/cluster/nomad/default.nix
@@ -1,6 +1,6 @@
 { lib
 , buildGoModule
-, buildGo119Module
+, buildGo120Module
 , fetchFromGitHub
 , nixosTests
 }:
@@ -47,24 +47,24 @@ rec {
   nomad = nomad_1_4;
 
   nomad_1_2 = generic {
-    buildGoModule = buildGo119Module;
-    version = "1.2.15";
-    sha256 = "sha256-p9yRjSapQAhuHv+slUmYI25bUb1N1A7LBiJOdk1++iI=";
-    vendorSha256 = "sha256-6d3tE337zVAIkzQzAnV2Ya5xwwhuzmKgtPUJcJ9HRto=";
+    buildGoModule = buildGo120Module;
+    version = "1.2.16";
+    sha256 = "sha256-fhfUpcG91EgIzJ4mCS7geyIJyTSHS2e8t4yYiI3PqpQ=";
+    vendorSha256 = "sha256-kwCDsGFw+25Mimgt/cTK/Z2H7Qh5n4rjr3kIBvjcPL8=";
   };
 
   nomad_1_3 = generic {
-    buildGoModule = buildGo119Module;
-    version = "1.3.8";
-    sha256 = "sha256-hUmDWgGV8HAXew8SpcbhaiaF9VfBN5mk1W7t5lhnZ9I=";
-    vendorSha256 = "sha256-IfYobyDFriOldJnNfRK0QVKBfttoZZ1iOkt4cBQxd00=";
+    buildGoModule = buildGo120Module;
+    version = "1.3.9";
+    sha256 = "sha256-xfoIzLDG/OfqAPQqeLvQZ11uESWFNyOyLP6Imi+S96w=";
+    vendorSha256 = "sha256-kW0goicoM1lM1NEHPTfozg2EKR1daf33UxT/mVabyfY=";
   };
 
   nomad_1_4 = generic {
-    buildGoModule = buildGo119Module;
-    version = "1.4.3";
-    sha256 = "sha256-GQVfrn9VlzfdIj73W3hBpHcevsXZcb6Uj808HUCZUUg=";
-    vendorSha256 = "sha256-JQRpsQhq5r/QcgFwtnptmvnjBEhdCFrXFrTKkJioL3A=";
+    buildGoModule = buildGo120Module;
+    version = "1.4.4";
+    sha256 = "sha256-mAimuWolTJ3lMY/ArnLZFu+GZv9ADdGsriXsTcEgdYc=";
+    vendorSha256 = "sha256-QtP7pzsIBd2S79AUcbOeVG71Mb5qK706rq5DkT41VqM=";
     passthru.tests.nomad = nixosTests.nomad;
   };
 }
diff --git a/pkgs/development/beam-modules/fetch-mix-deps.nix b/pkgs/development/beam-modules/fetch-mix-deps.nix
index 2bba3a93c294..6d047dbe1ca5 100644
--- a/pkgs/development/beam-modules/fetch-mix-deps.nix
+++ b/pkgs/development/beam-modules/fetch-mix-deps.nix
@@ -45,7 +45,7 @@ stdenvNoCC.mkDerivation (attrs // {
 
   installPhase = attrs.installPhase or ''
     runHook preInstall
-    mix deps.get ''${mixEnv:+--only $mixEnv}
+    mix deps.get ''${MIX_ENV:+--only $MIX_ENV}
     find "$TEMPDIR/deps" -path '*/.git/*' -a ! -name HEAD -exec rm -rf {} +
     cp -r --no-preserve=mode,ownership,timestamps $TEMPDIR/deps $out
     runHook postInstall
diff --git a/pkgs/development/libraries/libdisplay-info/default.nix b/pkgs/development/libraries/libdisplay-info/default.nix
index a83aa299b0bc..fa499a001464 100644
--- a/pkgs/development/libraries/libdisplay-info/default.nix
+++ b/pkgs/development/libraries/libdisplay-info/default.nix
@@ -25,10 +25,8 @@ stdenv.mkDerivation rec {
 
   buildInputs = [ hwdata ];
 
-  prePatch = ''
-    substituteInPlace meson.build \
-        --replace "find_program('tool/gen-search-table.py')" "find_program('python3')" \
-        --replace "gen_search_table," "gen_search_table, '$src/tool/gen-search-table.py',"
+  postPatch = ''
+    patchShebangs tool/gen-search-table.py
   '';
 
   meta = with lib; {
diff --git a/pkgs/development/python-modules/griffe/default.nix b/pkgs/development/python-modules/griffe/default.nix
index 692b2fe6d8e6..8dfabb097296 100644
--- a/pkgs/development/python-modules/griffe/default.nix
+++ b/pkgs/development/python-modules/griffe/default.nix
@@ -12,7 +12,7 @@
 
 buildPythonPackage rec {
   pname = "griffe";
-  version = "0.25.4";
+  version = "0.25.5";
   format = "pyproject";
 
   disabled = pythonOlder "3.7";
@@ -21,7 +21,7 @@ buildPythonPackage rec {
     owner = "mkdocstrings";
     repo = pname;
     rev = "refs/tags/${version}";
-    hash = "sha256-AZZhwHtVhdHkztzr/Hdi63VC5CjK2Vz8h8zizmSUdNY=";
+    hash = "sha256-0+n5v93ERcQDKNtXxSZYfCUMTRzcbtQEXl023KSxfrE=";
   };
 
   postPatch = ''
diff --git a/pkgs/development/python-modules/pydeconz/default.nix b/pkgs/development/python-modules/pydeconz/default.nix
index 54b4b2ef1d8a..5a4532c598ef 100644
--- a/pkgs/development/python-modules/pydeconz/default.nix
+++ b/pkgs/development/python-modules/pydeconz/default.nix
@@ -12,7 +12,7 @@
 
 buildPythonPackage rec {
   pname = "pydeconz";
-  version = "106";
+  version = "107";
   format = "setuptools";
 
   disabled = pythonOlder "3.9";
@@ -21,7 +21,7 @@ buildPythonPackage rec {
     owner = "Kane610";
     repo = "deconz";
     rev = "refs/tags/v${version}";
-    hash = "sha256-13of5ohz/hezlmGvSNqCu9QoOPKdPPtrhQHbxmG2/Do=";
+    hash = "sha256-5NR+N2UoWvzD/y1kP08qOS2djMsLIwLDuaIBmt0AV/s=";
   };
 
   propagatedBuildInputs = [
@@ -43,6 +43,7 @@ buildPythonPackage rec {
   meta = with lib; {
     description = "Python library wrapping the Deconz REST API";
     homepage = "https://github.com/Kane610/deconz";
+    changelog = "https://github.com/Kane610/deconz/releases/tag/v${version}";
     license = with licenses; [ mit ];
     maintainers = with maintainers; [ fab ];
   };
diff --git a/pkgs/development/python-modules/pyfido/default.nix b/pkgs/development/python-modules/pyfido/default.nix
index 43909e2c130f..a850030274c4 100644
--- a/pkgs/development/python-modules/pyfido/default.nix
+++ b/pkgs/development/python-modules/pyfido/default.nix
@@ -6,11 +6,11 @@
 
 buildPythonPackage rec {
   pname = "pyfido";
-  version = "2.1.1";
+  version = "2.1.2";
 
   src = fetchPypi {
     inherit pname version;
-    sha256 = "0b28bhyhscaw7dbc92dxswann05x8mz92cagyawdfm8jnc67gq4b";
+    sha256 = "sha256-hh2g46GVCkiMHElEP6McY8FdzGNzZV7pgA5DQhodP20=";
   };
 
   propagatedBuildInputs = [ aiohttp ];
diff --git a/pkgs/development/python-modules/python-ipmi/default.nix b/pkgs/development/python-modules/python-ipmi/default.nix
index 9ee03dc8911c..68bcd7434d05 100644
--- a/pkgs/development/python-modules/python-ipmi/default.nix
+++ b/pkgs/development/python-modules/python-ipmi/default.nix
@@ -10,14 +10,14 @@
 
 buildPythonPackage rec {
   pname = "python-ipmi";
-  version = "0.5.3";
+  version = "0.5.4";
   disabled = pythonOlder "3.6";
 
   src = fetchFromGitHub {
     owner = "kontron";
     repo = pname;
     rev = version;
-    sha256 = "sha256-Y8HJ7MXYHJRUWPTcw8p+GGSFswuRI7u+/bIaJpKy7lY=";
+    sha256 = "sha256-IXEq3d1nXGEndciQw2MJ1Abc0vmEYez+k6aWGSWEzWA=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/development/python-modules/python-ironicclient/default.nix b/pkgs/development/python-modules/python-ironicclient/default.nix
index 0214a6b0d2e4..193717d6d83e 100644
--- a/pkgs/development/python-modules/python-ironicclient/default.nix
+++ b/pkgs/development/python-modules/python-ironicclient/default.nix
@@ -20,11 +20,11 @@
 
 buildPythonPackage rec {
   pname = "python-ironicclient";
-  version = "5.0.1";
+  version = "5.1.0";
 
   src = fetchPypi {
     inherit pname version;
-    sha256 = "sha256-7RawbJ5O5KCruD499fOkuFcouBzp3f7aEUnE37wJqmM=";
+    sha256 = "sha256-yYmzZuwZSasN6g6Bosivexe5oOy3dP+l/cD5TkXC87g=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/development/python-modules/slack-sdk/default.nix b/pkgs/development/python-modules/slack-sdk/default.nix
index 22901130ccd8..7114b7b16716 100644
--- a/pkgs/development/python-modules/slack-sdk/default.nix
+++ b/pkgs/development/python-modules/slack-sdk/default.nix
@@ -21,7 +21,7 @@
 
 buildPythonPackage rec {
   pname = "slack-sdk";
-  version = "3.19.5";
+  version = "3.20.0";
   format = "setuptools";
 
   disabled = pythonOlder "3.6";
@@ -30,7 +30,7 @@ buildPythonPackage rec {
     owner = "slackapi";
     repo = "python-slack-sdk";
     rev = "refs/tags/v${version}";
-    hash = "sha256-/DVcnfHjvmRreHSlZbzxz6pbqytEUdqbaGbQVxIW4Qk=";
+    hash = "sha256-NlUmoOlRV7h7d553uX2tAWi2aWCAqpHflSUrdZxlaws=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/development/python-modules/wandb/default.nix b/pkgs/development/python-modules/wandb/default.nix
index f6d1769f526b..e1139ecf1b14 100644
--- a/pkgs/development/python-modules/wandb/default.nix
+++ b/pkgs/development/python-modules/wandb/default.nix
@@ -104,7 +104,7 @@ buildPythonPackage rec {
   # Set BOKEH_CDN_VERSION to stop bokeh throwing an exception in tests
   preCheck = ''
     export HOME=$(mktemp -d)
-    export BOKEH_CDN_VERSION=3.0.3
+    export BOKEH_CDN_VERSION=${bokeh.version}
   '';
 
   pythonRelaxDeps = [ "protobuf" ];
diff --git a/pkgs/development/python-modules/weconnect-mqtt/default.nix b/pkgs/development/python-modules/weconnect-mqtt/default.nix
index 4f6a8b00d213..7e7517980151 100644
--- a/pkgs/development/python-modules/weconnect-mqtt/default.nix
+++ b/pkgs/development/python-modules/weconnect-mqtt/default.nix
@@ -10,16 +10,16 @@
 
 buildPythonPackage rec {
   pname = "weconnect-mqtt";
-  version = "0.41.1";
+  version = "0.42.0";
   format = "setuptools";
 
-  disabled = pythonOlder "3.7";
+  disabled = pythonOlder "3.8";
 
   src = fetchFromGitHub {
     owner = "tillsteinbach";
     repo = "WeConnect-mqtt";
     rev = "refs/tags/v${version}";
-    hash = "sha256-RYxfz5uBWV1HLbcIK1N/glJv2w0nfPLBPyM2b7HuDIY=";
+    hash = "sha256-jxfV2RDyGLugnPae+uNtg/GBsWbKCSbKxuHll10guhU=";
   };
 
   propagatedBuildInputs = [
diff --git a/pkgs/development/python-modules/weconnect/default.nix b/pkgs/development/python-modules/weconnect/default.nix
index db66c2e9b1c8..7a8c691a8011 100644
--- a/pkgs/development/python-modules/weconnect/default.nix
+++ b/pkgs/development/python-modules/weconnect/default.nix
@@ -12,16 +12,16 @@
 
 buildPythonPackage rec {
   pname = "weconnect";
-  version = "0.50.1";
+  version = "0.52.0";
   format = "setuptools";
 
-  disabled = pythonOlder "3.7";
+  disabled = pythonOlder "3.8";
 
   src = fetchFromGitHub {
     owner = "tillsteinbach";
     repo = "WeConnect-python";
     rev = "refs/tags/v${version}";
-    hash = "sha256-KYGNtUJXpY1UrRbUxr71EHxLCR6WixTAk+ybkfqB3Ps=";
+    hash = "sha256-SfdN/em4NrzNeItcaVuyOcUxmE50n5/jjmY4I5hfpQI=";
   };
 
   propagatedBuildInputs = [
@@ -48,7 +48,7 @@ buildPythonPackage rec {
       --replace "setup_requires=SETUP_REQUIRED," "setup_requires=[]," \
       --replace "tests_require=TEST_REQUIRED," "tests_require=[],"
     substituteInPlace image_extra_requirements.txt \
-      --replace "pillow~=9.3.0" "pillow"
+      --replace "pillow~=9.4.0" "pillow"
     substituteInPlace pytest.ini \
       --replace "--cov=weconnect --cov-config=.coveragerc --cov-report html" "" \
       --replace "pytest-cov" ""
diff --git a/pkgs/development/python-modules/z3c-checkversions/default.nix b/pkgs/development/python-modules/z3c-checkversions/default.nix
index 5aad3df78a63..7678b223297c 100644
--- a/pkgs/development/python-modules/z3c-checkversions/default.nix
+++ b/pkgs/development/python-modules/z3c-checkversions/default.nix
@@ -9,24 +9,25 @@
 
 buildPythonPackage rec {
   pname = "z3c-checkversions";
-  version = "1.2";
+  version = "2.0";
 
   src = fetchPypi {
     inherit version;
     pname = "z3c.checkversions";
-    sha256 = "94c7ab0810ee6fdb66a4689b48e537b57e2dbee277cb1de2ece7a7f4d8c83001";
+    hash = "sha256-rn4kl8Pn6YNqbE+VD6L8rVBQHkQqXSD47ZIy77+ashE=";
   };
 
   propagatedBuildInputs = [ zc-buildout ];
+
   nativeCheckInputs = [ zope_testrunner ];
-  doCheck = !python.pkgs.isPy27;
+
   checkPhase = ''
     ${python.interpreter} -m zope.testrunner --test-path=src []
   '';
 
   meta = with lib; {
-    broken = (stdenv.isLinux && stdenv.isAarch64) || stdenv.isDarwin;
     homepage = "https://github.com/zopefoundation/z3c.checkversions";
+    changelog = "https://github.com/zopefoundation/z3c.checkversions/blob/${version}/CHANGES.rst";
     description = "Find newer package versions on PyPI";
     license = licenses.zpl21;
   };
diff --git a/pkgs/development/tools/ansi/default.nix b/pkgs/development/tools/ansi/default.nix
index 305b29aef6f9..13794dee2e15 100644
--- a/pkgs/development/tools/ansi/default.nix
+++ b/pkgs/development/tools/ansi/default.nix
@@ -15,7 +15,7 @@ rustPlatform.buildRustPackage rec {
     description = "Quickly get ANSI escape sequences";
     longDescription = ''
       CLI utility called "ansi" to quickly get ANSI escape sequences. Supports
-      the colors and styles, such as bold or italic.";
+      the colors and styles, such as bold or italic.
     '';
     homepage = "https://github.com/phip1611/ansi-escape-sequences-cli";
     license = with licenses; [ mit ];
diff --git a/pkgs/servers/plex/raw.nix b/pkgs/servers/plex/raw.nix
index 3cee78f571ee..abc89d8e8129 100644
--- a/pkgs/servers/plex/raw.nix
+++ b/pkgs/servers/plex/raw.nix
@@ -12,16 +12,16 @@
 # server, and the FHS userenv and corresponding NixOS module should
 # automatically pick up the changes.
 stdenv.mkDerivation rec {
-  version = "1.30.2.6563-3d4dc0cce";
+  version = "1.31.0.6654-02189b09f";
   pname = "plexmediaserver";
 
   # Fetch the source
   src = if stdenv.hostPlatform.system == "aarch64-linux" then fetchurl {
     url = "https://downloads.plex.tv/plex-media-server-new/${version}/debian/plexmediaserver_${version}_arm64.deb";
-    sha256 = "0sz6xc484flh1cnlrvwin7x34bl118yy2mwj034f8p9ngiy5hrkw";
+    sha256 = "sha256-ttkvYD+ALxfZpQutI1VyTbmQi/7hmvZ+YMUv3lskeWU=";
   } else fetchurl {
     url = "https://downloads.plex.tv/plex-media-server-new/${version}/debian/plexmediaserver_${version}_amd64.deb";
-    sha256 = "0ymxfy3s9nygv9syiy2bdwmjfqg8m4i5n8c37z1ib6393iwj8mgi";
+    sha256 = "sha256-TTEcyIBFiuJTNHeJ9wu+4o2ol72oCvM9FdDPC83J3Mc=";
   };
 
   outputs = [ "out" "basedb" ];
diff --git a/pkgs/tools/X11/paperview/default.nix b/pkgs/tools/X11/paperview/default.nix
new file mode 100644
index 000000000000..790eaed53ab5
--- /dev/null
+++ b/pkgs/tools/X11/paperview/default.nix
@@ -0,0 +1,35 @@
+{ lib
+, stdenv
+, fetchFromGitHub
+, libX11
+, SDL2
+}:
+
+stdenv.mkDerivation rec {
+  pname = "paperview";
+  version = "unstable-2020-09-22";
+
+  src = fetchFromGitHub {
+    owner = "glouw";
+    repo = "paperview";
+    rev = "40162fb76566fec8163c338c169c2fcd9df6ef42";
+    hash = "sha256-rvf89vMIT274+Hva+N4KFu1iT2XE6fq5Bi4kOQg2M0g=";
+  };
+
+  buildInputs = [
+    SDL2
+    libX11
+  ];
+
+  makeFlags = [
+    "PREFIX=${placeholder "out"}"
+  ];
+
+  meta = with lib; {
+    description = "A high performance X11 animated wallpaper setter";
+    homepage = "https://github.com/glouw/paperview";
+    platforms = platforms.linux;
+    license = with licenses; [ mit ];
+    maintainers = with maintainers; [ _3JlOy-PYCCKUi ];
+  };
+}
diff --git a/pkgs/tools/misc/turbo/default.nix b/pkgs/tools/misc/turbo/default.nix
new file mode 100644
index 000000000000..5aca983252df
--- /dev/null
+++ b/pkgs/tools/misc/turbo/default.nix
@@ -0,0 +1,91 @@
+{ lib
+, fetchFromGitHub
+, buildGoModule
+, git
+, nodejs
+, protobuf
+, protoc-gen-go
+, protoc-gen-go-grpc
+, rustPlatform
+, pkg-config
+, openssl
+, extra-cmake-modules
+, fontconfig
+, go
+}:
+let
+  version = "1.7.0";
+  src = fetchFromGitHub {
+    owner = "vercel";
+    repo = "turbo";
+    rev = "v${version}";
+    sha256 = "YTuEv2S3jNV2o7HJML+P6OMazgwgRhUPnd/zaTWfDWs=";
+  };
+
+  go-turbo = buildGoModule rec {
+    inherit src version;
+    pname = "go-turbo";
+    modRoot = "cli";
+
+    vendorSha256 = "Kx/CLFv23h2TmGe8Jwu+S3QcONfqeHk2fCW1na75c0s=";
+
+    nativeBuildInputs = [
+      git
+      nodejs
+      protobuf
+      protoc-gen-go
+      protoc-gen-go-grpc
+    ];
+
+    preBuild = ''
+      make compile-protos
+    '';
+
+    preCheck = ''
+      # Some tests try to run mkdir $HOME
+      HOME=$TMP
+
+      # Test_getTraversePath requires that source is a git repo
+      # pwd: /build/source/cli
+      pushd ..
+      git config --global init.defaultBranch main
+      git init
+      popd
+    '';
+
+  };
+in
+rustPlatform.buildRustPackage rec {
+  pname = "turbo";
+  inherit src version;
+  cargoBuildFlags = [
+    "--package"
+    "turbo"
+  ];
+  RELEASE_TURBO_CLI = "true";
+
+  cargoSha256 = "ENw6NU3Fedd+OJEEWgL8A54aowNqjn3iv7rxlr+/4ZE=";
+  RUSTC_BOOTSTRAP = 1;
+  nativeBuildInputs = [
+    pkg-config
+    extra-cmake-modules
+  ];
+  buildInputs = [
+    openssl
+    fontconfig
+  ];
+
+  postInstall = ''
+    ln -s ${go-turbo}/bin/turbo $out/bin/go-turbo
+  '';
+
+  # Browser tests time out with chromium and google-chrome
+  doCheck = false;
+
+  meta = with lib; {
+    description = "High-performance build system for JavaScript and TypeScript codebases";
+    homepage = "https://turbo.build/";
+    maintainers = with maintainers; [ dlip ];
+    license = licenses.mpl20;
+  };
+}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index b3877b13aee0..2c46fa3ad984 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -1536,6 +1536,8 @@ with pkgs;
 
   ocs-url = libsForQt5.callPackage ../tools/misc/ocs-url { };
 
+  paperview = callPackage ../tools/X11/paperview { };
+
   pferd = callPackage ../tools/misc/pferd {};
 
   proycon-wayout = callPackage ../tools/wayland/proycon-wayout {};
@@ -12804,6 +12806,8 @@ with pkgs;
 
   tuptime = callPackage ../tools/system/tuptime { };
 
+  turbo = callPackage ../tools/misc/turbo { };
+
   turses = callPackage ../applications/networking/instant-messengers/turses { };
 
   tutanota-desktop = callPackage ../applications/networking/mailreaders/tutanota-desktop { };