Modular, context-aware and aspect-oriented dendritic Nix configurations. Discussions: https://oeiuwq.zulipchat.com/join/nqp26cd4kngon6mo3ncgnuap/ den.oeiuwq.com
configurations den dendritic nix aspect oriented
8
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: strip _ aliases from external denful to prevent include duplication (#402)

When an external namespace's evaluated config is re-imported via
den.namespace, both _ and provides contain identical content due to the
_ → provides alias in aspectSubmodule. The module system merges both
paths, causing listOf options like includes to duplicate entries.

Strip _ from external denful configs before assignment to den.ful.

Fixes #400

authored by

Jason Bowman and committed by
GitHub
13ad634a 6ca251e7

+115 -1
+8 -1
nix/lib/namespace.nix
··· 8 8 name 9 9 ]) (builtins.filter builtins.isAttrs from); 10 10 11 - sourceModules = map (denful: { config.den.ful.${name} = denful; }) denfuls; 11 + # Strip _ aliases from external denful to prevent duplication on re-import. 12 + # The _ → provides alias in aspectSubmodule means evaluated configs contain 13 + # both _ and provides with identical content. Re-importing both causes 14 + # listOf options (like includes) to merge duplicates. 15 + stripAliases = lib.mapAttrs ( 16 + _: v: if builtins.isAttrs v then builtins.removeAttrs v [ "_" ] else v 17 + ); 18 + sourceModules = map (denful: { config.den.ful.${name} = stripAliases denful; }) denfuls; 12 19 13 20 aliasModule = lib.mkAliasOptionModule [ name ] [ "den" "ful" name ]; 14 21
+107
templates/ci/modules/features/deadbugs/issue-400-namespace-include-duplication.nix
··· 1 + { denTest, lib, ... }: 2 + { 3 + flake.tests.deadbugs-issue-400 = 4 + let 5 + module = 6 + { inputs, ... }: 7 + { 8 + imports = [ 9 + inputs.den.flakeModule 10 + (inputs.den.namespace "test" true) 11 + ]; 12 + 13 + test.aspect = 14 + { host }: 15 + { 16 + nixos.test = [ "aspect-${host.name}" ]; 17 + }; 18 + 19 + test.provided._.provider = 20 + { host }: 21 + { 22 + nixos.test = [ "provider-${host.name}" ]; 23 + }; 24 + 25 + test.provided._.included = { 26 + includes = [ 27 + ( 28 + { host }: 29 + { 30 + nixos.test = [ "included-${host.name}" ]; 31 + } 32 + ) 33 + ]; 34 + }; 35 + }; 36 + 37 + external-module = 38 + inputs: 39 + (inputs.nixpkgs.lib.evalModules { 40 + specialArgs = { inherit inputs; }; 41 + modules = [ module ]; 42 + }).config.flake; 43 + 44 + test-module.nixos.options.test = lib.mkOption { 45 + type = lib.types.listOf lib.types.str; 46 + default = [ ]; 47 + }; 48 + in 49 + { 50 + test-internal-namespace = denTest ( 51 + { 52 + test, 53 + igloo, 54 + ... 55 + }: 56 + { 57 + imports = [ module ]; 58 + 59 + den.hosts.x86_64-linux.igloo.users.tux = { }; 60 + den.aspects.igloo.includes = [ test-module ]; 61 + 62 + den.ctx.host.includes = [ 63 + test.aspect 64 + test.provided._.provider 65 + test.provided._.included 66 + ]; 67 + 68 + expr = igloo.test; 69 + expected = [ 70 + "included-igloo" 71 + "provider-igloo" 72 + "aspect-igloo" 73 + ]; 74 + } 75 + ); 76 + 77 + test-external-namespace = denTest ( 78 + { 79 + inputs, 80 + test, 81 + igloo, 82 + ... 83 + }: 84 + { 85 + imports = [ 86 + (inputs.den.namespace "test" [ (external-module inputs) ]) 87 + ]; 88 + 89 + den.hosts.x86_64-linux.igloo.users.tux = { }; 90 + den.aspects.igloo.includes = [ test-module ]; 91 + 92 + den.ctx.host.includes = [ 93 + test.aspect 94 + test.provided._.provider 95 + test.provided._.included 96 + ]; 97 + 98 + expr = igloo.test; 99 + expected = [ 100 + "included-igloo" 101 + "provider-igloo" 102 + "aspect-igloo" 103 + ]; 104 + } 105 + ); 106 + }; 107 + }