Skip to content

Commit db763f8

Browse files
committed
provides merge
1 parent d0a226c commit db763f8

File tree

2 files changed

+128
-0
lines changed

2 files changed

+128
-0
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
{ lib, targetLib, ... }:
2+
let
3+
flake-aspects-lib = import targetLib lib;
4+
in
5+
{
6+
# Test demonstrating duplication issue when merging aspect structures
7+
# from multiple sources using lib.mkMerge at the module level.
8+
#
9+
# The problem: when lib.mkMerge combines pre-evaluated aspect structures,
10+
# the recursive resolution in resolve.nix processes includes multiple times,
11+
# causing multiplicative duplication.
12+
#
13+
# This reproduces the issue seen in den's namespace.nix where:
14+
# config.den.ful.${name} = lib.mkMerge denfuls;
15+
# causes 64x duplication when merging multiple input flakes.
16+
17+
flake.tests."test mkMerge aspect duplication" =
18+
let
19+
# Create two separate pre-evaluated aspect scopes
20+
inputA = lib.evalModules {
21+
modules = [
22+
(flake-aspects-lib.new-scope "ns")
23+
{ ns.aspects.foo.nixos.vals = [ "A" ]; }
24+
];
25+
};
26+
27+
inputB = lib.evalModules {
28+
modules = [
29+
(flake-aspects-lib.new-scope "ns")
30+
{ ns.aspects.bar.nixos.vals = [ "B" ]; }
31+
];
32+
};
33+
34+
# Merge using lib.mkMerge - reproduces den namespace.nix pattern
35+
merged = lib.evalModules {
36+
modules = [
37+
(flake-aspects-lib.new-scope "ns")
38+
{
39+
ns = lib.mkMerge [
40+
inputA.config.ns
41+
inputB.config.ns
42+
];
43+
}
44+
{
45+
ns.aspects.combined.nixos.vals = [ "C" ];
46+
ns.aspects.combined.includes = [
47+
merged.config.ns.aspects.foo
48+
merged.config.ns.aspects.bar
49+
];
50+
}
51+
];
52+
};
53+
54+
# Resolve
55+
resolved = merged.config.ns.aspects.combined.modules.nixos;
56+
result = lib.evalModules {
57+
modules = [
58+
resolved
59+
{ options.vals = lib.mkOption { type = lib.types.listOf lib.types.str; }; }
60+
];
61+
};
62+
63+
allVals = result.config.vals;
64+
uniqueVals = lib.sort lib.lessThan (lib.unique allVals);
65+
66+
in
67+
{
68+
expr = uniqueVals;
69+
expected = [
70+
"A"
71+
"B"
72+
"C"
73+
];
74+
};
75+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{ lib, targetLib, ... }:
2+
{
3+
flake.tests.test-aspects-merged-provides =
4+
let
5+
flake-aspects-lib = import targetLib lib;
6+
7+
first = lib.evalModules {
8+
modules = [
9+
(flake-aspects-lib.new-scope "foo")
10+
(flake-aspects-lib.new-scope "bar")
11+
(flake-aspects-lib.new-scope "baz")
12+
{
13+
foo.aspects.a.provides.b.nixos.x = [ "b" ];
14+
}
15+
{
16+
bar.aspects.a.provides.c.nixos.x = [ "c" ];
17+
}
18+
(
19+
{ config, ... }:
20+
{
21+
bar = config.foo;
22+
}
23+
)
24+
(
25+
{ config, ... }:
26+
{
27+
baz.aspects.all.nixos = { };
28+
baz.aspects.all.includes = [
29+
config.bar.aspects.a._.b
30+
config.bar.aspects.a._.c
31+
];
32+
}
33+
)
34+
];
35+
};
36+
37+
second = lib.evalModules {
38+
modules = [
39+
first.config.baz.aspects.all.modules.nixos
40+
{ options.x = lib.mkOption { type = lib.types.listOf lib.types.str; }; }
41+
];
42+
};
43+
44+
expr = lib.sort (a: b: a < b) (lib.unique second.config.x);
45+
expected = [
46+
"b"
47+
"c"
48+
];
49+
in
50+
{
51+
inherit expr expected;
52+
};
53+
}

0 commit comments

Comments
 (0)