feat: upgrade overlays to support merging namespaces
This commit is contained in:
parent
8141ee43d8
commit
2bc7d5fab3
5 changed files with 251 additions and 110 deletions
|
|
@ -7,10 +7,12 @@ let
|
|||
inherit (core-inputs.nixpkgs.lib)
|
||||
assertMsg
|
||||
mapAttrsToList
|
||||
mapAttrs
|
||||
flatten
|
||||
fold
|
||||
foldl
|
||||
recursiveUpdate
|
||||
mergeAttrs;
|
||||
mergeAttrs
|
||||
isDerivation;
|
||||
in
|
||||
{
|
||||
attrs = {
|
||||
|
|
@ -25,12 +27,33 @@ in
|
|||
# Type: [Attrs] -> Attrs
|
||||
# Usage: merge-deep [{ x = 1; } { x = 2; }]
|
||||
# result: { x = 2; }
|
||||
merge-deep = fold recursiveUpdate { };
|
||||
merge-deep = foldl recursiveUpdate { };
|
||||
|
||||
# Merge the root of a list of attribute sets.
|
||||
# Type: [Attrs] -> Attrs
|
||||
# Usage: merge-shallow [{ x = 1; } { x = 2; }]
|
||||
# result: { x = 2; }
|
||||
merge-shallow = fold mergeAttrs { };
|
||||
merge-shallow = foldl mergeAttrs { };
|
||||
|
||||
# Merge shallow for packages, but allow one deeper layer of attribute sets.
|
||||
# Type: [Attrs] -> Attrs
|
||||
# Usage: merge-shallow-packages [ { inherit (pkgs) vim; some.value = true; } { some.value = false; } ]
|
||||
# result: { vim = ...; some.value = false; }
|
||||
merge-shallow-packages = items:
|
||||
foldl
|
||||
(result: item:
|
||||
result // (mapAttrs
|
||||
(name: value:
|
||||
if isDerivation value then
|
||||
value
|
||||
else if builtins.isAttrs value then
|
||||
(result.${name} or { }) // value
|
||||
else
|
||||
value
|
||||
)
|
||||
item)
|
||||
)
|
||||
{ }
|
||||
items;
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -78,9 +78,10 @@ rec {
|
|||
modules = snowfall-lib.module.create-modules {
|
||||
overrides = (full-flake-options.modules or { });
|
||||
};
|
||||
overlays = core-inputs.flake-utils-plus.lib.exportOverlays ({
|
||||
inherit (user-inputs.self) pkgs inputs;
|
||||
});
|
||||
overlays = snowfall-lib.overlay.create-overlays {
|
||||
overlay-package-namespace = full-flake-options.overlay-package-namespace or null;
|
||||
extra-overlays = full-flake-options.extra-exported-overlays or { };
|
||||
};
|
||||
|
||||
outputs-builder = channels:
|
||||
let
|
||||
|
|
@ -107,7 +108,7 @@ rec {
|
|||
snowfall-lib.attrs.merge-deep [ user-outputs outputs ];
|
||||
|
||||
flake-options = custom-flake-options // {
|
||||
inherit hosts templates overlays;
|
||||
inherit hosts templates;
|
||||
inherit (user-inputs) self;
|
||||
|
||||
lib = snowfall-lib.internal.user-lib;
|
||||
|
|
@ -117,7 +118,7 @@ rec {
|
|||
|
||||
channelsConfig = full-flake-options.channels-config or { };
|
||||
|
||||
channels.nixpkgs.overlaysBuilder = snowfall-lib.overlay.create-overlays {
|
||||
channels.nixpkgs.overlaysBuilder = snowfall-lib.overlay.create-overlays-builder {
|
||||
overlay-package-namespace = full-flake-options.overlay-package-namespace or null;
|
||||
extra-overlays = full-flake-options.overlays or [ ];
|
||||
};
|
||||
|
|
@ -125,36 +126,14 @@ rec {
|
|||
outputsBuilder = outputs-builder;
|
||||
};
|
||||
|
||||
flake-outputs =
|
||||
flake-utils-plus-outputs =
|
||||
core-inputs.flake-utils-plus.lib.mkFlake flake-options;
|
||||
|
||||
overlay = (final: prev:
|
||||
let
|
||||
overlay-package-namespace = full-flake-options.overlay-package-namespace or null;
|
||||
user-overlay-packages =
|
||||
(builtins.map (overlay: overlay final prev) (builtins.attrValues flake-outputs.overlays));
|
||||
namespaced-user-overlay-packages =
|
||||
foldl
|
||||
(namespaced-user-overlay-packages: user-overlay-package:
|
||||
namespaced-user-overlay-packages // user-overlay-package.${overlay-package-namespace}
|
||||
)
|
||||
{ }
|
||||
user-overlay-packages;
|
||||
merged-user-overlay-packages =
|
||||
if overlay-package-namespace == null then
|
||||
snowfall-lib.attrs.merge-shallow
|
||||
user-overlay-packages
|
||||
else
|
||||
{
|
||||
${overlay-package-namespace} =
|
||||
(prev.${overlay-package-namespace} or { })
|
||||
// namespaced-user-overlay-packages;
|
||||
};
|
||||
in
|
||||
merged-user-overlay-packages
|
||||
);
|
||||
flake-outputs =
|
||||
flake-utils-plus-outputs // {
|
||||
inherit overlays;
|
||||
overlay = overlays.default;
|
||||
};
|
||||
in
|
||||
flake-outputs // {
|
||||
inherit overlay;
|
||||
};
|
||||
flake-outputs;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,9 +4,10 @@
|
|||
}:
|
||||
|
||||
let
|
||||
inherit (core-inputs.nixpkgs.lib) assertMsg;
|
||||
inherit (core-inputs.nixpkgs.lib) assertMsg foldl concatStringsSep;
|
||||
|
||||
user-overlays-root = snowfall-lib.fs.get-file "overlays";
|
||||
user-packages-root = snowfall-lib.fs.get-file "packages";
|
||||
in
|
||||
{
|
||||
overlay = {
|
||||
|
|
@ -14,7 +15,7 @@ in
|
|||
# Type: Attrs -> Attrs -> [(a -> b -> c)]
|
||||
# Usage: create-overlays { src = ./my-overlays; overlay-package-namespace = "my-packages"; }
|
||||
# result: (channels: [ ... ])
|
||||
create-overlays =
|
||||
create-overlays-builder =
|
||||
{ src ? user-overlays-root
|
||||
, overlay-package-namespace ? null
|
||||
, extra-overlays ? [ ]
|
||||
|
|
@ -42,5 +43,140 @@ in
|
|||
overlays = [ user-packages-overlay ] ++ extra-overlays ++ (builtins.map create-overlay user-overlays);
|
||||
in
|
||||
overlays;
|
||||
|
||||
# Create exported overlays from the user flake.
|
||||
# Adapted from flake-utils-plus:
|
||||
# https://github.com/gytis-ivaskevicius/flake-utils-plus/blob/2bf0f91643c2e5ae38c1b26893ac2927ac9bd82a/lib/exportOverlays.nix
|
||||
# Type: Attrs -> Attrs
|
||||
# Usage: create-overlays { src = ./my-overlays; packages-src = ./my-packages; overlay-package-namespace = "my-namespace"; extra-overlays = {}; }
|
||||
# result: { default = final: prev: ...; some-overlay = final: prev: ...; }
|
||||
create-overlays =
|
||||
{ src ? user-overlays-root
|
||||
, packages-src ? user-packages-root
|
||||
, overlay-package-namespace ? null
|
||||
, extra-overlays ? { }
|
||||
}:
|
||||
let
|
||||
fake-pkgs = {
|
||||
callPackage = x: x;
|
||||
isFakePkgs = true;
|
||||
lib = { };
|
||||
system = "fake-system";
|
||||
};
|
||||
|
||||
user-overlays = snowfall-lib.fs.get-default-nix-files-recursive src;
|
||||
|
||||
channel-systems = user-inputs.self.pkgs;
|
||||
|
||||
user-packages-overlay = final: prev:
|
||||
let
|
||||
user-packages = snowfall-lib.package.create-packages {
|
||||
pkgs = final;
|
||||
channels = channel-systems.${prev.system};
|
||||
};
|
||||
in
|
||||
if overlay-package-namespace == null then
|
||||
user-packages
|
||||
else
|
||||
{
|
||||
${overlay-package-namespace} =
|
||||
(prev.${overlay-package-namespace} or { })
|
||||
// user-packages;
|
||||
};
|
||||
|
||||
create-overlay = (overlays: file:
|
||||
let
|
||||
name = builtins.unsafeDiscardStringContext (snowfall-lib.path.get-parent-directory file);
|
||||
overlay = final: prev:
|
||||
let
|
||||
channels = channel-systems.${prev.system};
|
||||
user-overlay = import file (user-inputs // { inherit channels; });
|
||||
packages = user-packages-overlay final prev;
|
||||
prev-with-packages =
|
||||
if overlay-package-namespace == null then
|
||||
prev // packages
|
||||
else
|
||||
prev // {
|
||||
${overlay-package-namespace} =
|
||||
(prev.${overlay-package-namespace} or { })
|
||||
// packages.${overlay-package-namespace};
|
||||
};
|
||||
user-overlay-packages =
|
||||
user-overlay
|
||||
final
|
||||
prev-with-packages;
|
||||
outputs =
|
||||
user-overlay-packages;
|
||||
in
|
||||
if user-overlay-packages.__dontExport or false == true then
|
||||
outputs // { __dontExport = true; }
|
||||
else
|
||||
outputs;
|
||||
fake-overlay-result = overlay fake-pkgs fake-pkgs;
|
||||
in
|
||||
if fake-overlay-result.__dontExport or false == true then
|
||||
overlays
|
||||
else
|
||||
overlays // {
|
||||
"nixpkgs/${name}" = overlay;
|
||||
}
|
||||
);
|
||||
|
||||
overlays =
|
||||
foldl
|
||||
create-overlay
|
||||
{ }
|
||||
user-overlays;
|
||||
|
||||
user-packages = snowfall-lib.fs.get-default-nix-files-recursive packages-src;
|
||||
|
||||
create-package-overlay = package-overlays: file:
|
||||
let
|
||||
name = builtins.unsafeDiscardStringContext (snowfall-lib.path.get-parent-directory file);
|
||||
overlay = final: prev:
|
||||
let
|
||||
channels = channel-systems.${prev.system};
|
||||
packages = snowfall-lib.package.create-packages {
|
||||
channels = channel-systems.${prev.system};
|
||||
};
|
||||
in
|
||||
if overlay-package-namespace == null then
|
||||
{ ${name} = packages.${name}; }
|
||||
else
|
||||
{
|
||||
${overlay-package-namespace} =
|
||||
(prev.${overlay-package-namespace} or { })
|
||||
// { ${name} = packages.${name}; };
|
||||
};
|
||||
in
|
||||
package-overlays //
|
||||
{
|
||||
"nixpkgs/${name}" = overlay;
|
||||
};
|
||||
|
||||
package-overlays =
|
||||
foldl
|
||||
create-package-overlay
|
||||
{ }
|
||||
user-packages;
|
||||
|
||||
default-overlay = final: prev:
|
||||
let
|
||||
overlays-list = builtins.attrValues overlays;
|
||||
package-overlays-list = builtins.attrValues package-overlays;
|
||||
|
||||
overlays-results = builtins.map (overlay: overlay final prev) overlays-list;
|
||||
package-overlays-results = builtins.map (overlay: overlay final prev) package-overlays-list;
|
||||
|
||||
merged-results = snowfall-lib.attrs.merge-shallow-packages
|
||||
(package-overlays-results ++ overlays-results);
|
||||
in
|
||||
merged-results;
|
||||
in
|
||||
package-overlays
|
||||
// overlays
|
||||
// { default = default-overlay; }
|
||||
// extra-overlays;
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue