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

nixos/systemd: merge unit options as lists when at least one value is a list

Changed files
+51 -8
nixos
doc
manual
release-notes
lib
pkgs
test
+5
nixos/doc/manual/release-notes/rl-2405.section.md
···
- 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
nixos/lib/systemd-unit-options.nix
···
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
pkgs/test/default.nix
···
nixpkgs-check-by-name = callPackage ./nixpkgs-check-by-name { };
auto-patchelf-hook = callPackage ./auto-patchelf-hook { };
+
+
systemd = callPackage ./systemd { };
}
+5
pkgs/test/systemd/default.nix
···
+
{ lib, callPackage }:
+
+
lib.recurseIntoAttrs {
+
nixos = callPackage ./nixos { };
+
}
+37
pkgs/test/systemd/nixos/default.nix
···
+
{ 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" ];
+
};
+
}