Unverified Commit f5622df4 authored by Will Fancher's avatar Will Fancher Committed by GitHub
Browse files

Merge pull request #290946 from ju1m/systemd-option-list

nixos/systemd: merge unit options as lists when at least one value is a list
parents a976e65f 7d0c8129
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -388,6 +388,11 @@ The pre-existing [services.ankisyncd](#opt-services.ankisyncd.enable) has been m

- The `mpich` package expression now requires `withPm` to be a list, e.g. `"hydra:gforker"` becomes `[ "hydra" "gforker" ]`.

- When merging systemd unit options (of type `unitOption`),
  if at least one definition is a list, all those which aren't are now lifted into a list,
  making it possible to accumulate definitions without resorting to `mkForce`,
  hence to retain the definitions not anticipating that need.

- YouTrack is bumped to 2023.3. The update is not performed automatically, it requires manual interaction. See the YouTrack section in the manual for details.

- QtMultimedia has changed its default backend to `QT_MEDIA_BACKEND=ffmpeg` (previously `gstreamer` on Linux or `darwin` on MacOS).
+2 −8
Original line number Diff line number Diff line
@@ -21,14 +21,8 @@ in rec {
      let
        defs' = filterOverrides defs;
      in
        if isList (head defs').value
        then concatMap (def:
          if builtins.typeOf def.value == "list"
          then def.value
          else
            throw "The definitions for systemd unit options should be either all lists, representing repeatable options, or all non-lists, but for the option ${showOption loc}, the definitions are a mix of list and non-list ${lib.options.showDefs defs'}"
        ) defs'

        if any (def: isList def.value) defs'
        then concatMap (def: toList def.value) defs'
        else mergeEqualOption loc defs';
  };

+2 −0
Original line number Diff line number Diff line
@@ -175,4 +175,6 @@ with pkgs;
  nixpkgs-check-by-name = callPackage ./nixpkgs-check-by-name { };

  auto-patchelf-hook = callPackage ./auto-patchelf-hook { };

  systemd = callPackage ./systemd { };
}
+5 −0
Original line number Diff line number Diff line
{ lib, callPackage }:

lib.recurseIntoAttrs {
  nixos = callPackage ./nixos { };
}
+37 −0
Original line number Diff line number Diff line
{ pkgs, lib, stdenv, ... }:

lib.runTests {
  # Merging two non-list definitions must still result in an error
  # about a conflicting definition.
  test-unitOption-merging-non-lists-conflict =
    let nixos = pkgs.nixos {
        system.stateVersion = lib.trivial.release;
        systemd.services.systemd-test-nixos = {
          serviceConfig = lib.mkMerge [
            { StateDirectory = "foo"; }
            { StateDirectory = "bar"; }
          ];
        };
      };
    in {
    expr = (builtins.tryEval (nixos.config.systemd.services.systemd-test-nixos.serviceConfig.StateDirectory)).success;
    expected = false;
  };

  # Merging must lift non-list definitions to a list
  # if at least one of them is a list.
  test-unitOption-merging-list-non-list-append =
    let nixos = pkgs.nixos {
        system.stateVersion = lib.trivial.release;
        systemd.services.systemd-test-nixos = {
          serviceConfig = lib.mkMerge [
            { StateDirectory = "foo"; }
            { StateDirectory = ["bar"]; }
          ];
        };
      };
    in {
    expr = nixos.config.systemd.services.systemd-test-nixos.serviceConfig.StateDirectory;
    expected = [ "foo" "bar" ];
  };
}