Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 16 additions & 10 deletions modules/aspects/provides/inputs.nix
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
{ den, withSystem, ... }:
let
inherit (den.lib)
parametric
take
;
in
{
den.provides.inputs' = den.lib.parametric.exactly {
den.provides.inputs' = parametric.exactly {
description = ''
Provides the `flake-parts` `inputs'` (the flake's `inputs` with system pre-selected)
as a top-level module argument.
Expand Down Expand Up @@ -30,12 +36,12 @@
(
{ OS, host }:
let
unused = den.lib.take.unused OS;
unused = take.unused OS;
in
withSystem host.system (
{ inputs', ... }:
{
${host.class}._module.args.inputs' = unused inputs';
unused {
${host.class}._module.args.inputs' = inputs';
}
)
)
Expand All @@ -47,27 +53,27 @@
host,
}:
let
unused = den.lib.take.unused [
unused = take.unused [
OS
HM
];
in
withSystem host.system (
{ inputs', ... }:
{
${user.class}._module.args.inputs' = unused inputs';
unused {
${user.class}._module.args.inputs' = inputs';
}
)
)
(
{ HM, home }:
let
unused = den.lib.take.unused HM;
unused = take.unused HM;
in
withSystem home.system (
{ inputs', ... }:
{
${home.class}._module.args.inputs' = unused inputs';
unused {
${home.class}._module.args.inputs' = inputs';
}
)
)
Expand Down
91 changes: 91 additions & 0 deletions modules/aspects/provides/unfree/unfree-predicate-builder.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
{ den, lib, ... }:
let
inherit (den.lib)
parametric
take
;

description = ''
This is a private aspect always included in den.default.

It adds a module option that gathers all packages defined
in den._.unfree usages and declares a
nixpkgs.config.allowUnfreePredicate for each class.

'';

unfreeComposableModule.options.unfree = {
packages = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
};
};

nixosAspect =
{ config, ... }:
{
nixpkgs.config.allowUnfreePredicate = (pkg: builtins.elem (lib.getName pkg) config.unfree.packages);
};

homeManagerAspect =
{ config, osConfig, ... }:
{
nixpkgs = lib.mkIf (!osConfig.home-manager.useGlobalPkgs) {
config.allowUnfreePredicate = (pkg: builtins.elem (lib.getName pkg) config.unfree.packages);
};
};

aspect = parametric.exactly {
inherit description;
includes = [
(
{ OS, host }:
let
unused = take.unused OS;
in
{
${host.class}.imports = unused [
unfreeComposableModule
nixosAspect
];
}
)
(
{
OS,
HM,
user,
host,
}:
let
unused = take.unused [
OS
HM
host
];
in
{
${user.class}.imports = unused [
unfreeComposableModule
homeManagerAspect
];
}
)
(
{ HM, home }:
let
unused = take.unused HM;
in
{
${home.class}.imports = unused [
unfreeComposableModule
nixosAspect
];
}
)
];
};
in
{
den.default.includes = [ aspect ];
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{ lib, den, ... }:
{ den, ... }:
{
den.provides.unfree.description = ''
A class generic aspect that enables unfree packages by name.
Expand All @@ -16,6 +16,6 @@
_self: allowed-names:
{ class, aspect-chain }:
den.lib.take.unused aspect-chain {
${class}.nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) allowed-names;
${class}.unfree.packages = allowed-names;
};
}
6 changes: 3 additions & 3 deletions templates/examples/flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 22 additions & 3 deletions templates/examples/modules/_example/ci/unfree.nix
Original file line number Diff line number Diff line change
@@ -1,6 +1,25 @@
{ den, ... }:

let
codeAspect = {
includes = [ (den._.unfree [ "vscode" ]) ];
homeManager.programs.vscode.enable = true;
};
discordAspect = {
includes = [
(den._.unfree [ "discord" ])
];
homeManager =
{ pkgs, ... }:
{
home.packages = [ pkgs.discord ];
};
};
in
{
# cam uses unfree vscode.
den.aspects.cam.homeManager.programs.vscode.enable = true;
den.aspects.cam.includes = [ (den._.unfree [ "vscode" ]) ];
# cam uses unfree vscode and discord loaded from different aspects.
den.aspects.cam.includes = [
codeAspect
discordAspect
];
}