nbp | * The infinite recursion comes from the fact that osConfigs might contain home-manager user configurations.
I suggest to explicitly the top-level attributes that can be set to exclude users;
osConfigs' = flatten …;
# Generate an error if `users` is set.
osConfigs = ({programs? {}, services? {}}: {
inherit programs services;
}) osConfigs';
| 09:46:35 |
nbp | * The infinite recursion comes from the fact that osConfigs might contain home-manager user configurations.
I suggest to explicit the top-level attributes that can be set to exclude users;
osConfigs' = flatten …;
# Generate an error if `users` is set.
osConfigs = ({programs? {}, services? {}}: {
inherit programs services;
}) osConfigs';
| 09:46:57 |
mr-qubo | In reply to @mr-qubo:matrix.org
I'm trying to write nixos config where I can set nixos options from home-manager modules. But I can't get around infinite recursion errors. I wrote this nixos module, I though this should work, but I'm still getting infinite recursion error, which I don't know how to debug.
{ lib, options, ... }:
with builtins; with lib;
let
hmModuleBase = with options.home-manager.users.type.nestedTypes.elemType.functor.payload; evalModules {
inherit class specialArgs;
modules = modules ++ [{
options.MrQubo = {
osConfigs = {
type = options.raw;
};
};
}];
};
evalHmModule = module:
hmModuleBase.extendModules { modules = [ module ]; };
isImportableNV = { name, value }:
(value == "regular" && match ".*\\.nix" name != null) || (value == "directory" && (readDir "${localOverlays}/${name}") ? "default.nix");
parseNV = { name, value }: rec {
username = removeSuffix ".nix" name;
module = evalHmModule ../users/${name};
};
userModules = map parseNV (filter isImportableNV (attrsToList (readDir ../users)));
osConfigs = flatten (map (attrs: attrs.module.MrQubo.osConfigs) userModules);
hmUsersConfig = {
home-manager.users = listToAttrs (map (attrs: { name = attrs.username; value = attrs.module; }) userModules);
};
in mkMerge (osConfigs ++ [ hmUsersConfig ])
My second attempt:
{ lib, ... }:
with builtins; with lib;
let
isImportable = { name, value }:
(value == "regular" && match ".*\\.nix" name != null) || (value == "directory" && (readDir "${localOverlays}/${name}") ? "default.nix");
parseUser = { name, value }: rec {
username = removeSuffix ".nix" name;
module = ../users/${name};
};
users = map parseUser (filter isImportable (attrsToList (readDir ../users)));
evalHmModule = { username, module, config, pkgs, ... }:
(import <home-manager/modules> {
configuration = {
options.MrQubo = {
osConfig.services = mkOption {
type = types.raw;
};
};
config = {
submoduleSupport.enable = true;
submoduleSupport.externalPackageInstall = false;
home.username = config.users.users.${username}.name;
home.homeDirectory = config.users.users.${username}.home;
# Make activation script use same version of Nix as system as a whole.
# This avoids problems with Nix not being in PATH.
nix.package = config.nix.package;
};
};
inherit pkgs;
}).extendModules {
modules = [
{
MrQubo.osConfig.services = config.services;
}
module
];
};
osConfigModules = flip map users (user: { pkgs, config, ... }:
{ config.services = (evalHmModule ({ inherit pkgs config; } // user)).config.MrQubo.osConfig.services; }
);
in {
imports = osConfigModules;
}
It still doesn't work, even with just "services" option. I get
… while evaluating the option `services.sftpgo.user':
error: infinite recursion encountered
| 11:26:33 |
mr-qubo | In reply to @nbp:mozilla.org mr-qubo: I do not have enough information with what you copied to give you any answer, apart that I do not see any reasons for an infinite recursion in this file. I run it with nixos-rebuild -I nixos-config=$(pwd)/users-impl.nix dry-build --show-trace. ./user-impl.nix is the name of the file contents which I pasted. You also need to put some file in ../users/ dir. I have nix.nix file with those contents:
{
home.stateVersion = "23.11";
}
home.stateVersion is needed, otherwise there's a different error from home-manager.
| 16:33:27 |
mr-qubo | In reply to @nbp:mozilla.org mr-qubo: I do not have enough information with what you copied to give you any answer, apart that I do not see any reasons for an infinite recursion in this file. * I run it with nixos-rebuild -I nixos-config=$(pwd)/users-impl.nix dry-build --show-trace. ./user-impl.nix is the name of the file contents which I pasted. You also need to put some file in ../users/ dir. I have nix.nix file with those contents:
{
home.stateVersion = "23.11";
}
home.stateVersion is needed, otherwise there's a different error from home-manager. And you also need <home-manager> channel.
| 16:34:21 |