specialisation: add default specialisation option

Add the option `specialisation.<name>.default`, which activates this
specialisation by default.
This commit is contained in:
Weathercold 2022-10-08 16:29:25 -04:00
parent 304a011325
commit 01a518ba06
No known key found for this signature in database
GPG key ID: 059102E35214D867

View file

@ -2,7 +2,8 @@
with lib; with lib;
{ let cfg = config.specialisation;
in {
imports = imports =
[ (mkRenamedOptionModule [ "specialization" ] [ "specialisation" ]) ]; [ (mkRenamedOptionModule [ "specialization" ] [ "specialisation" ]) ];
@ -10,32 +11,44 @@ with lib;
type = types.attrsOf (types.submodule { type = types.attrsOf (types.submodule {
options = { options = {
configuration = mkOption { configuration = mkOption {
type = let type =
extended = extendModules { let
modules = [{ extended = extendModules {
# Prevent infinite recursion modules = [{
specialisation = mkOverride 0 { }; # Prevent infinite recursion
specialisation = mkOverride 0 { };
# If used inside the NixOS/nix-darwin module, we get conflicting definitions # If used inside the NixOS/nix-darwin module, we get conflicting definitions
# of `name` inside the specialisation: one is the user name coming from the # of `name` inside the specialisation: one is the user name coming from the
# NixOS module definition and the other is `configuration`, the name of this # NixOS module definition and the other is `configuration`, the name of this
# option. Thus we need to explicitly wire the former into the module arguments. # option. Thus we need to explicitly wire the former into the module arguments.
# See discussion at https://github.com/nix-community/home-manager/issues/3716 # See discussion at https://github.com/nix-community/home-manager/issues/3716
_module.args.name = mkForce name; _module.args.name = mkForce name;
}]; }];
}; };
in extended.type; in
extended.type;
default = { }; default = { };
visible = "shallow"; visible = "shallow";
description = '' description = ''
Arbitrary Home Manager configuration settings. Arbitrary Home Manager configuration settings.
''; '';
}; };
default = mkOption {
type = types.bool;
default = false;
description = ''
Whether this specialisation is activated by default.
Note that setting this option will override the default activation
script, making it impossible to activate the default
configuration.
'';
};
}; };
}); });
default = { }; default = { };
description = '' description = ''
A set of named specialized configurations. These can be used to extend A set of named specialised configurations. These can be used to extend
your base configuration with additional settings. For example, you can your base configuration with additional settings. For example, you can
have specialisations named "light" and "dark" have specialisations named "light" and "dark"
that apply light and dark color theme configurations. that apply light and dark color theme configurations.
@ -70,14 +83,31 @@ with lib;
''; '';
}; };
config = mkIf (config.specialisation != { }) { config = mkIf (cfg != { }) {
home.extraBuilderCommands = let assertions = [{
link = n: v: assertion = count (s: s.default) (attrValues cfg) <= 1;
let pkg = v.configuration.home.activationPackage; message = "There can only be one default specialisation";
in "ln -s ${pkg} $out/specialisation/${n}"; }];
in ''
mkdir $out/specialisation home.extraBuilderCommands =
${concatStringsSep "\n" (mapAttrsToList link config.specialisation)} let
''; link = n: v:
let pkg = v.configuration.home.activationPackage;
in "ln -s ${pkg} $out/specialisation/${n}";
in
''
mkdir $out/specialisation
${concatStringsSep "\n" (mapAttrsToList link cfg)}
'';
home.activation =
let
defaultSpecialisation = findFirst (s: s.default) null (attrValues cfg);
in
mkIf (defaultSpecialisation != null) (mkForce {
activateSpecialisation = ''
${defaultSpecialisation.configuration.home.activationPackage}/activate
'';
});
}; };
} }