1
1
mirror of https://github.com/divnix/digga.git synced 2024-12-22 23:51:39 +03:00

tree: format all nix code with alejandra

This commit is contained in:
Parthiv Seetharaman 2022-04-20 21:14:31 -07:00
parent 2867f0e8e2
commit 41ac43c7e2
51 changed files with 1592 additions and 1507 deletions

View File

@ -1,39 +1,38 @@
{ system ? builtins.currentSystem {
, inputs ? (import ../.).inputs system ? builtins.currentSystem,
}: inputs ? (import ../.).inputs,
let }: let
inherit (inputs) digga nixpkgs; inherit (inputs) digga nixpkgs;
lib = nixpkgs.lib // digga.lib; lib = nixpkgs.lib // digga.lib;
pkgs = nixpkgs.legacyPackages.${system}; pkgs = nixpkgs.legacyPackages.${system};
in {
in libTests =
{ pkgs.runCommandNoCC "devos-lib-tests"
libTests = pkgs.runCommandNoCC "devos-lib-tests"
{ {
buildInputs = [ buildInputs = [
pkgs.nix pkgs.nix
( (
let tests = import ./lib { inherit pkgs lib; }; in let
if tests == [ ] then null tests = import ./lib {inherit pkgs lib;};
else throw (builtins.toJSON tests) in
if tests == []
then null
else throw (builtins.toJSON tests)
) )
]; ];
} '' } ''
datadir="${pkgs.nix}/share" datadir="${pkgs.nix}/share"
export TEST_ROOT=$(pwd)/test-tmp export TEST_ROOT=$(pwd)/test-tmp
export NIX_BUILD_HOOK= export NIX_BUILD_HOOK=
export NIX_CONF_DIR=$TEST_ROOT/etc export NIX_CONF_DIR=$TEST_ROOT/etc
export NIX_LOCALSTATE_DIR=$TEST_ROOT/var export NIX_LOCALSTATE_DIR=$TEST_ROOT/var
export NIX_LOG_DIR=$TEST_ROOT/var/log/nix export NIX_LOG_DIR=$TEST_ROOT/var/log/nix
export NIX_STATE_DIR=$TEST_ROOT/var/nix export NIX_STATE_DIR=$TEST_ROOT/var/nix
export NIX_STORE_DIR=$TEST_ROOT/store export NIX_STORE_DIR=$TEST_ROOT/store
export PAGER=cat export PAGER=cat
cacheDir=$TEST_ROOT/binary-cache cacheDir=$TEST_ROOT/binary-cache
nix-store --init nix-store --init
touch $out
'';
touch $out
'';
} }

View File

@ -1,23 +1,26 @@
{ pkgs, lib }: {
pkgs,
lib,
}:
with lib; with lib;
lib.runTests { lib.runTests {
testRakeLeaves = { testRakeLeaves = {
expr = rakeLeaves ./profiles; expr = rakeLeaves ./profiles;
expected = { expected = {
f = ./profiles/f.nix; f = ./profiles/f.nix;
foo = ./profiles/foo; foo = ./profiles/foo;
t = { t = {
bar = ./profiles/t/bar.nix; bar = ./profiles/t/bar.nix;
};
}; };
}; };
};
testFlattenTree = { testFlattenTree = {
expr = flattenTree (rakeLeaves ./profiles); expr = flattenTree (rakeLeaves ./profiles);
expected = { expected = {
f = ./profiles/f.nix; f = ./profiles/f.nix;
foo = ./profiles/foo; foo = ./profiles/foo;
"t.bar" = ./profiles/t/bar.nix; "t.bar" = ./profiles/t/bar.nix;
};
}; };
}; }
}

View File

@ -1 +1 @@
{ } {}

View File

@ -1 +1 @@
{ } {}

View File

@ -1,18 +1,24 @@
let let
inherit (import inherit
( (
let lock = builtins.fromJSON (builtins.readFile ./flake.lock); in import
fetchTarball { (
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz"; let
sha256 = lock.nodes.flake-compat.locked.narHash; lock = builtins.fromJSON (builtins.readFile ./flake.lock);
} in
fetchTarball {
url = "https://github.com/edolstra/flake-compat/archive/${lock.nodes.flake-compat.locked.rev}.tar.gz";
sha256 = lock.nodes.flake-compat.locked.narHash;
}
)
{src = ./.;}
) )
{ src = ./.; } defaultNix
) defaultNix; ;
in in
# Pass this flake as inputs.digga # Pass this flake as inputs.digga
defaultNix // { defaultNix
inputs = defaultNix.inputs // { digga = defaultNix; }; // {
shell = import ./devShell.nix { }; inputs = defaultNix.inputs // {digga = defaultNix;};
shell = import ./devShell.nix {};
} }

View File

@ -1,16 +1,20 @@
{ lib, flake-utils-plus, internal-modules, importers, nixosModules }: {
lib,
flake-utils-plus,
internal-modules,
importers,
nixosModules,
}:
lib.warn '' lib.warn ''
You are accessing a deprecated item of the digga lib. You are accessing a deprecated item of the digga lib.
Please update timely, it will be remove soon. Please update timely, it will be remove soon.
'' ''
rec { rec {
importModules = importModules =
lib.warn '' lib.warn ''
Deprecated Function: lib.importModules. Deprecated Function: lib.importModules.
Use lib.importExportableModules instead to set `exportedModules` option Use lib.importExportableModules instead to set `exportedModules` option
'' ''
importers.importExportableModules; importers.importExportableModules;
} }

View File

@ -1,12 +1,11 @@
{ system ? builtins.currentSystem {
, inputs ? (import ./.).inputs system ? builtins.currentSystem,
}: inputs ? (import ./.).inputs,
let }: let
pkgs = inputs.nixpkgs.legacyPackages.${system}; pkgs = inputs.nixpkgs.legacyPackages.${system};
devshell = import inputs.devshell { inherit pkgs system; }; devshell = import inputs.devshell {inherit pkgs system;};
withCategory = category: attrset: attrset // { inherit category; }; withCategory = category: attrset: attrset // {inherit category;};
utils = withCategory "utils"; utils = withCategory "utils";
docs = withCategory "docs"; docs = withCategory "docs";
@ -30,120 +29,117 @@ let
&& cp result "$PRJ_ROOT/doc/api-reference-nixos.md" \ && cp result "$PRJ_ROOT/doc/api-reference-nixos.md" \
&& chmod 755 "$PRJ_ROOT//doc/api-reference-nixos.md" && chmod 755 "$PRJ_ROOT//doc/api-reference-nixos.md"
''; '';
}; };
test = type: name: withCategory "tests" { test = type: name:
name = "check-${name}"; withCategory "tests" {
help = "Checks ${name} ${type}"; name = "check-${name}";
command = '' help = "Checks ${name} ${type}";
set -e command = ''
# set -x set -e
# set -x
diggaurl= diggaurl=
lockfile_updated=1 lockfile_updated=1
lockfile_present=1 lockfile_present=1
tempdigga="\"path:$PRJ_ROOT\"" tempdigga="\"path:$PRJ_ROOT\""
cleanup() { cleanup() {
if is $lockfile_present; then if is $lockfile_present; then
git checkout -- flake.lock git checkout -- flake.lock
elif is $lockfile_updated; then elif is $lockfile_updated; then
git rm -f flake.lock git rm -f flake.lock
fi fi
# ensure: restore input # ensure: restore input
[ -z $diggaurl ] || ${pkgs.gnused}/bin/sed -i "s|$tempdigga|$diggaurl|g" flake.nix [ -z $diggaurl ] || ${pkgs.gnused}/bin/sed -i "s|$tempdigga|$diggaurl|g" flake.nix
} }
digga_fixture() { digga_fixture() {
# ensure: replace input # ensure: replace input
diggaurl=$({ grep -o '"github:divnix/digga.*"' flake.nix || true; }) diggaurl=$({ grep -o '"github:divnix/digga.*"' flake.nix || true; })
[ -z $diggaurl ] || ${pkgs.gnused}/bin/sed -i "s|$diggaurl|$tempdigga|g" flake.nix [ -z $diggaurl ] || ${pkgs.gnused}/bin/sed -i "s|$diggaurl|$tempdigga|g" flake.nix
} }
trap_err() {
local ret=$?
cleanup
echo -e \
"\033[1m\033[31m""exit $ret: \033[0m\033[1m""command [$BASH_COMMAND] failed""\033[0m"
}
is () { [ "$1" -eq "0" ]; }
trap 'trap_err' ERR
# --------------------------------------------------------------------------------
cd $PRJ_ROOT/${type}/${name}
digga_fixture
test -f flake.lock && lockfile_present=$? || true
${pkgs.nixUnstable}/bin/nix flake lock --update-input digga "$@"; lockfile_updated=$?;
${pkgs.nixUnstable}/bin/nix flake show "$@"
${pkgs.nixUnstable}/bin/nix flake check "$@"
trap_err() {
local ret=$?
cleanup cleanup
echo -e \ '';
"\033[1m\033[31m""exit $ret: \033[0m\033[1m""command [$BASH_COMMAND] failed""\033[0m" };
}
is () { [ "$1" -eq "0" ]; }
trap 'trap_err' ERR
# --------------------------------------------------------------------------------
cd $PRJ_ROOT/${type}/${name}
digga_fixture
test -f flake.lock && lockfile_present=$? || true
${pkgs.nixUnstable}/bin/nix flake lock --update-input digga "$@"; lockfile_updated=$?;
${pkgs.nixUnstable}/bin/nix flake show "$@"
${pkgs.nixUnstable}/bin/nix flake check "$@"
cleanup
'';
};
in in
devshell.mkShell { devshell.mkShell {
name = "digga"; name = "digga";
packages = with pkgs; [ packages = with pkgs; [
fd fd
alejandra alejandra
nixUnstable nixUnstable
]; ];
env = [ env = [
{ {
name = "NIX_CONFIG"; name = "NIX_CONFIG";
value = value = '' extra-experimental-features = nix-command flakes
''extra-experimental-features = nix-command flakes extra-substituters = https://nrdxp.cachix.org https://nix-community.cachix.org
extra-substituters = https://nrdxp.cachix.org https://nix-community.cachix.org extra-trusted-public-keys = nrdxp.cachix.org-1:Fc5PSqY2Jm1TrWfm88l6cvGWwz3s93c6IOifQWnhNW4= nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs='';
extra-trusted-public-keys = nrdxp.cachix.org-1:Fc5PSqY2Jm1TrWfm88l6cvGWwz3s93c6IOifQWnhNW4= nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=''; }
} ];
];
# tempfix: remove when merged https://github.com/numtide/devshell/pull/123 # tempfix: remove when merged https://github.com/numtide/devshell/pull/123
devshell.startup.load_profiles = pkgs.lib.mkForce (pkgs.lib.noDepEntry '' devshell.startup.load_profiles = pkgs.lib.mkForce (pkgs.lib.noDepEntry ''
# PATH is devshell's exorbitant privilige: # PATH is devshell's exorbitant privilige:
# fence against its pollution # fence against its pollution
_PATH=''${PATH} _PATH=''${PATH}
# Load installed profiles # Load installed profiles
for file in "$DEVSHELL_DIR/etc/profile.d/"*.sh; do for file in "$DEVSHELL_DIR/etc/profile.d/"*.sh; do
# If that folder doesn't exist, bash loves to return the whole glob # If that folder doesn't exist, bash loves to return the whole glob
[[ -f "$file" ]] && source "$file" [[ -f "$file" ]] && source "$file"
done done
# Exert exorbitant privilige and leave no trace # Exert exorbitant privilige and leave no trace
export PATH=''${_PATH} export PATH=''${_PATH}
unset _PATH unset _PATH
''); '');
commands = [ commands = [
(utils { (utils {
command = "git rm --ignore-unmatch -f $PRJ_ROOT/{tests,examples}/*/flake.lock"; command = "git rm --ignore-unmatch -f $PRJ_ROOT/{tests,examples}/*/flake.lock";
help = "Remove all lock files"; help = "Remove all lock files";
name = "rm-locks"; name = "rm-locks";
}) })
(utils { (utils {
name = "fmt"; name = "fmt";
help = "Check Nix formatting"; help = "Check Nix formatting";
command = "alejandra \${@} $PRJ_ROOT"; command = "alejandra \${@} $PRJ_ROOT";
}) })
(utils { (utils {
name = "evalnix"; name = "evalnix";
help = "Check Nix parsing"; help = "Check Nix parsing";
command = "fd --extension nix --exec nix-instantiate --parse --quiet {} >/dev/null"; command = "fd --extension nix --exec nix-instantiate --parse --quiet {} >/dev/null";
}) })
(test "examples" "devos") (test "examples" "devos")
(test "examples" "groupByConfig") (test "examples" "groupByConfig")
(test "examples" "hmOnly") (test "examples" "hmOnly")
(test "examples" "all" // { command = "check-devos && check-groupByConfig && check-hmOnly"; }) (test "examples" "all" // {command = "check-devos && check-groupByConfig && check-hmOnly";})
(docs { package = pkgs.mdbook; }) (docs {package = pkgs.mdbook;})
(docs makeDocs) (docs makeDocs)
];
]; }
}

View File

@ -9,23 +9,28 @@ let
"x86_64-linux" "x86_64-linux"
]; ];
filterSystems = lib.filterAttrs filterSystems =
lib.filterAttrs
(system: _: lib.elem system ciSystems); (system: _: lib.elem system ciSystems);
recurseIntoAttrsRecursive = lib.mapAttrs (_: v: recurseIntoAttrsRecursive = lib.mapAttrs (
if lib.isAttrs v _: v:
then recurseIntoAttrsRecursive (lib.recurseIntoAttrs v) if lib.isAttrs v
else v then recurseIntoAttrsRecursive (lib.recurseIntoAttrs v)
else v
); );
systemOutputs = lib.filterAttrs systemOutputs =
(name: set: lib.isAttrs set lib.filterAttrs
&& lib.any (
(system: set ? ${system} && name != "legacyPackages") name: set:
ciSystems lib.isAttrs set
&& lib.any
(system: set ? ${system} && name != "legacyPackages")
ciSystems
) )
default.outputs; default.outputs;
ciDrvs = lib.mapAttrs (_: system: filterSystems system) systemOutputs; ciDrvs = lib.mapAttrs (_: system: filterSystems system) systemOutputs;
in in
(recurseIntoAttrsRecursive ciDrvs) // { shell = import ./shell.nix; } (recurseIntoAttrsRecursive ciDrvs) // {shell = import ./shell.nix;}

View File

@ -5,138 +5,139 @@
nixConfig.extra-substituters = "https://nrdxp.cachix.org https://nix-community.cachix.org"; nixConfig.extra-substituters = "https://nrdxp.cachix.org https://nix-community.cachix.org";
nixConfig.extra-trusted-public-keys = "nrdxp.cachix.org-1:Fc5PSqY2Jm1TrWfm88l6cvGWwz3s93c6IOifQWnhNW4= nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="; nixConfig.extra-trusted-public-keys = "nrdxp.cachix.org-1:Fc5PSqY2Jm1TrWfm88l6cvGWwz3s93c6IOifQWnhNW4= nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=";
inputs = inputs = {
{ # Track channels with commits tested and built by hydra
# Track channels with commits tested and built by hydra nixos.url = "github:nixos/nixpkgs/nixos-21.11";
nixos.url = "github:nixos/nixpkgs/nixos-21.11"; latest.url = "github:nixos/nixpkgs/nixos-unstable";
latest.url = "github:nixos/nixpkgs/nixos-unstable";
digga.url = "github:divnix/digga"; digga.url = "github:divnix/digga";
digga.inputs.nixpkgs.follows = "nixos"; digga.inputs.nixpkgs.follows = "nixos";
digga.inputs.nixlib.follows = "nixos"; digga.inputs.nixlib.follows = "nixos";
digga.inputs.home-manager.follows = "home"; digga.inputs.home-manager.follows = "home";
digga.inputs.deploy.follows = "deploy"; digga.inputs.deploy.follows = "deploy";
bud.url = "github:divnix/bud"; bud.url = "github:divnix/bud";
bud.inputs.nixpkgs.follows = "nixos"; bud.inputs.nixpkgs.follows = "nixos";
bud.inputs.devshell.follows = "digga/devshell"; bud.inputs.devshell.follows = "digga/devshell";
home.url = "github:nix-community/home-manager/release-21.11"; home.url = "github:nix-community/home-manager/release-21.11";
home.inputs.nixpkgs.follows = "nixos"; home.inputs.nixpkgs.follows = "nixos";
darwin.url = "github:LnL7/nix-darwin"; darwin.url = "github:LnL7/nix-darwin";
darwin.inputs.nixpkgs.follows = "nixos"; darwin.inputs.nixpkgs.follows = "nixos";
deploy.url = "github:serokell/deploy-rs"; deploy.url = "github:serokell/deploy-rs";
deploy.inputs.nixpkgs.follows = "nixos"; deploy.inputs.nixpkgs.follows = "nixos";
agenix.url = "github:ryantm/agenix"; agenix.url = "github:ryantm/agenix";
agenix.inputs.nixpkgs.follows = "nixos"; agenix.inputs.nixpkgs.follows = "nixos";
nvfetcher.url = "github:berberman/nvfetcher"; nvfetcher.url = "github:berberman/nvfetcher";
nvfetcher.inputs.nixpkgs.follows = "nixos"; nvfetcher.inputs.nixpkgs.follows = "nixos";
naersk.url = "github:nmattia/naersk"; naersk.url = "github:nmattia/naersk";
naersk.inputs.nixpkgs.follows = "nixos"; naersk.inputs.nixpkgs.follows = "nixos";
nixos-hardware.url = "github:nixos/nixos-hardware"; nixos-hardware.url = "github:nixos/nixos-hardware";
nixos-generators.url = "github:nix-community/nixos-generators"; nixos-generators.url = "github:nix-community/nixos-generators";
}; };
outputs = outputs = {
{ self self,
, digga digga,
, bud bud,
, nixos nixos,
, home home,
, nixos-hardware nixos-hardware,
, nur nur,
, agenix agenix,
, nvfetcher nvfetcher,
, deploy deploy,
, ... ...
} @ inputs: } @ inputs:
digga.lib.mkFlake digga.lib.mkFlake
{ {
inherit self inputs; inherit self inputs;
channelsConfig = { allowUnfree = true; }; channelsConfig = {allowUnfree = true;};
channels = { channels = {
nixos = { nixos = {
imports = [ (digga.lib.importOverlays ./overlays) ]; imports = [(digga.lib.importOverlays ./overlays)];
overlays = [ overlays = [
nur.overlay nur.overlay
agenix.overlay agenix.overlay
nvfetcher.overlay nvfetcher.overlay
./pkgs/default.nix ./pkgs/default.nix
]; ];
}; };
latest = { }; latest = {};
};
lib = import ./lib {lib = digga.lib // nixos.lib;};
sharedOverlays = [
(final: prev: {
__dontExport = true;
lib = prev.lib.extend (lfinal: lprev: {
our = self.lib;
});
})
];
nixos = {
hostDefaults = {
system = "x86_64-linux";
channelName = "nixos";
imports = [(digga.lib.importExportableModules ./modules)];
modules = [
{lib.our = self.lib;}
digga.nixosModules.bootstrapIso
digga.nixosModules.nixConfig
home.nixosModules.home-manager
agenix.nixosModules.age
bud.nixosModules.bud
];
}; };
lib = import ./lib { lib = digga.lib // nixos.lib; }; imports = [(digga.lib.importHosts ./hosts)];
hosts = {
sharedOverlays = [ /*
(final: prev: { set host specific properties here
__dontExport = true; */
lib = prev.lib.extend (lfinal: lprev: { NixOS = {};
our = self.lib; };
}); importables = rec {
}) profiles =
]; digga.lib.rakeLeaves ./profiles
// {
nixos = {
hostDefaults = {
system = "x86_64-linux";
channelName = "nixos";
imports = [ (digga.lib.importExportableModules ./modules) ];
modules = [
{ lib.our = self.lib; }
digga.nixosModules.bootstrapIso
digga.nixosModules.nixConfig
home.nixosModules.home-manager
agenix.nixosModules.age
bud.nixosModules.bud
];
};
imports = [ (digga.lib.importHosts ./hosts) ];
hosts = {
/* set host specific properties here */
NixOS = { };
};
importables = rec {
profiles = digga.lib.rakeLeaves ./profiles // {
users = digga.lib.rakeLeaves ./users; users = digga.lib.rakeLeaves ./users;
}; };
suites = with profiles; rec { suites = with profiles; rec {
base = [ core users.nixos users.root ]; base = [core users.nixos users.root];
};
}; };
}; };
};
home = { home = {
imports = [ (digga.lib.importExportableModules ./users/modules) ]; imports = [(digga.lib.importExportableModules ./users/modules)];
modules = [ ]; modules = [];
importables = rec { importables = rec {
profiles = digga.lib.rakeLeaves ./users/profiles; profiles = digga.lib.rakeLeaves ./users/profiles;
suites = with profiles; rec { suites = with profiles; rec {
base = [ direnv git ]; base = [direnv git];
};
}; };
users = {
nixos = { suites, ... }: { imports = suites.base; };
}; # digga.lib.importers.rakeLeaves ./users/hm;
}; };
users = {
nixos = {suites, ...}: {imports = suites.base;};
}; # digga.lib.importers.rakeLeaves ./users/hm;
};
devshell = ./shell; devshell = ./shell;
homeConfigurations = digga.lib.mkHomeConfigurations self.nixosConfigurations; homeConfigurations = digga.lib.mkHomeConfigurations self.nixosConfigurations;
deploy.nodes = digga.lib.mkDeployNodes self.nixosConfigurations { }; deploy.nodes = digga.lib.mkDeployNodes self.nixosConfigurations {};
};
}
;
} }

View File

@ -1,5 +1,4 @@
{ suites, ... }: {suites, ...}: {
{
### root password is empty by default ### ### root password is empty by default ###
imports = suites.base; imports = suites.base;
@ -8,5 +7,5 @@
networking.networkmanager.enable = true; networking.networkmanager.enable = true;
fileSystems."/" = { device = "/dev/disk/by-label/nixos"; }; fileSystems."/" = {device = "/dev/disk/by-label/nixos";};
} }

View File

@ -1,5 +1,4 @@
{ profiles, ... }: {profiles, ...}: {
{
# build with: `bud build bootstrap bootstrapIso` # build with: `bud build bootstrap bootstrapIso`
# reachable on the local link via ssh root@fe80::47%eno1 # reachable on the local link via ssh root@fe80::47%eno1
# where 'eno1' is replaced by your own machine's network # where 'eno1' is replaced by your own machine's network
@ -14,5 +13,5 @@
boot.loader.systemd-boot.enable = true; boot.loader.systemd-boot.enable = true;
# will be overridden by the bootstrapIso instrumentation # will be overridden by the bootstrapIso instrumentation
fileSystems."/" = { device = "/dev/disk/by-label/nixos"; }; fileSystems."/" = {device = "/dev/disk/by-label/nixos";};
} }

View File

@ -1,6 +1,7 @@
let let
rev = "e7e5d481a0e15dcd459396e55327749989e04ce0"; rev = "e7e5d481a0e15dcd459396e55327749989e04ce0";
flake = (import flake =
import
( (
fetchTarball { fetchTarball {
url = "https://github.com/edolstra/flake-compat/archive/${rev}.tar.gz"; url = "https://github.com/edolstra/flake-compat/archive/${rev}.tar.gz";
@ -9,6 +10,6 @@ let
) )
{ {
src = ../../.; src = ../../.;
}); };
in in
flake flake

View File

@ -1,5 +1,4 @@
{ ... }: {...}: let
let
inherit (default.inputs.nixos) lib; inherit (default.inputs.nixos) lib;
host = configs.${hostname} or configs.NixOS; host = configs.${hostname} or configs.NixOS;
@ -7,4 +6,4 @@ let
default = (import ../.).defaultNix; default = (import ../.).defaultNix;
hostname = lib.fileContents /etc/hostname; hostname = lib.fileContents /etc/hostname;
in in
host host

View File

@ -1,2 +1,2 @@
{ lib }: {lib}:
lib.makeExtensible (self: { }) lib.makeExtensible (self: {})

View File

@ -1,4 +1,4 @@
{ config, ... }: { {config, ...}: {
home-manager.sharedModules = [ home-manager.sharedModules = [
{ {
home.sessionVariables = { home.sessionVariables = {

View File

@ -1,4 +1,8 @@
{ channel, inputs, ... }: { {
channel,
inputs,
...
}: {
nix.nixPath = [ nix.nixPath = [
"nixpkgs=${channel.input}" "nixpkgs=${channel.input}"
"nixos-config=${../lib/compat/nixos}" "nixos-config=${../lib/compat/nixos}"

View File

@ -1,5 +1,5 @@
final: prev: { final: prev: {
manix = prev.manix.overrideAttrs (o: rec{ manix = prev.manix.overrideAttrs (o: rec {
inherit (prev.sources.manix) pname version src; inherit (prev.sources.manix) pname version src;
}); });
} }

View File

@ -1,8 +1,8 @@
channels: final: prev: { channels: final: prev: {
__dontExport = true; # overrides clutter up actual creations __dontExport = true; # overrides clutter up actual creations
inherit (channels.latest) inherit
(channels.latest)
cachix cachix
dhall dhall
discord discord
@ -15,15 +15,17 @@ channels: final: prev: {
deploy-rs deploy-rs
; ;
haskellPackages = prev.haskellPackages.override haskellPackages =
prev.haskellPackages.override
(old: { (old: {
overrides = prev.lib.composeExtensions (old.overrides or (_: _: { })) (hfinal: hprev: overrides = prev.lib.composeExtensions (old.overrides or (_: _: {})) (hfinal: hprev: let
let version = prev.lib.replaceChars [ "." ] [ "" ] prev.ghc.version; version = prev.lib.replaceChars ["."] [""] prev.ghc.version;
in in {
{ # same for haskell packages, matching ghc versions
# same for haskell packages, matching ghc versions inherit
inherit (channels.latest.haskell.packages."ghc${version}") (channels.latest.haskell.packages."ghc${version}")
haskell-language-server; haskell-language-server
}); ;
});
}); });
} }

View File

@ -1,6 +1,8 @@
# This file was generated by nvfetcher, please do not modify it manually. # This file was generated by nvfetcher, please do not modify it manually.
{ fetchgit, fetchurl }:
{ {
fetchgit,
fetchurl,
}: {
manix = { manix = {
pname = "manix"; pname = "manix";
version = "d08e7ca185445b929f097f8bfb1243a8ef3e10e4"; version = "d08e7ca185445b929f097f8bfb1243a8ef3e10e4";

View File

@ -1,5 +1,5 @@
final: prev: { final: prev: {
# keep sources this first # keep sources this first
sources = prev.callPackage (import ./_sources/generated.nix) { }; sources = prev.callPackage (import ./_sources/generated.nix) {};
# then, call packages with `final.callPackage` # then, call packages with `final.callPackage`
} }

View File

@ -1,11 +1,13 @@
{ pkgs, lib, ... }: {
let pkgs,
lib,
...
}: let
folder = ./.; folder = ./.;
toImport = name: value: folder + ("/" + name); toImport = name: value: folder + ("/" + name);
filterCaches = key: value: value == "regular" && lib.hasSuffix ".nix" key && key != "default.nix"; filterCaches = key: value: value == "regular" && lib.hasSuffix ".nix" key && key != "default.nix";
imports = lib.mapAttrsToList toImport (lib.filterAttrs filterCaches (builtins.readDir folder)); imports = lib.mapAttrsToList toImport (lib.filterAttrs filterCaches (builtins.readDir folder));
in in {
{
inherit imports; inherit imports;
nix.binaryCaches = [ "https://cache.nixos.org/" ]; nix.binaryCaches = ["https://cache.nixos.org/"];
} }

View File

@ -1,9 +1,14 @@
{ self, config, lib, pkgs, ... }:
let inherit (lib) fileContents;
in
{ {
self,
config,
lib,
pkgs,
...
}: let
inherit (lib) fileContents;
in {
# Sets nrdxp.cachix.org binary cache which just speeds up some builds # Sets nrdxp.cachix.org binary cache which just speeds up some builds
imports = [ ../cachix ]; imports = [../cachix];
# For rage encryption, all hosts need a ssh key pair # For rage encryption, all hosts need a ssh key pair
services.openssh = { services.openssh = {
@ -12,10 +17,9 @@ in
}; };
# This is just a representation of the nix default # This is just a representation of the nix default
nix.systemFeatures = [ "nixos-test" "benchmark" "big-parallel" "kvm" ]; nix.systemFeatures = ["nixos-test" "benchmark" "big-parallel" "kvm"];
environment = { environment = {
# Selection of sysadmin tools that can come in handy # Selection of sysadmin tools that can come in handy
systemPackages = with pkgs; [ systemPackages = with pkgs; [
binutils binutils
@ -51,79 +55,74 @@ in
} }
''; '';
shellAliases = shellAliases = let
let ifSudo = lib.mkIf config.security.sudo.enable; ifSudo = lib.mkIf config.security.sudo.enable;
in in {
{ # quick cd
# quick cd ".." = "cd ..";
".." = "cd .."; "..." = "cd ../..";
"..." = "cd ../.."; "...." = "cd ../../..";
"...." = "cd ../../.."; "....." = "cd ../../../..";
"....." = "cd ../../../..";
# git # git
g = "git"; g = "git";
# grep # grep
grep = "rg"; grep = "rg";
gi = "grep -i"; gi = "grep -i";
# internet ip # internet ip
myip = "dig +short myip.opendns.com @208.67.222.222 2>&1"; myip = "dig +short myip.opendns.com @208.67.222.222 2>&1";
# nix # nix
n = "nix"; n = "nix";
np = "n profile"; np = "n profile";
ni = "np install"; ni = "np install";
nr = "np remove"; nr = "np remove";
ns = "n search --no-update-lock-file"; ns = "n search --no-update-lock-file";
nf = "n flake"; nf = "n flake";
nepl = "n repl '<nixpkgs>'"; nepl = "n repl '<nixpkgs>'";
srch = "ns nixos"; srch = "ns nixos";
orch = "ns override"; orch = "ns override";
nrb = ifSudo "sudo nixos-rebuild"; nrb = ifSudo "sudo nixos-rebuild";
mn = '' mn = ''
manix "" | grep '^# ' | sed 's/^# \(.*\) (.*/\1/;s/ (.*//;s/^# //' | sk --preview="manix '{}'" | xargs manix manix "" | grep '^# ' | sed 's/^# \(.*\) (.*/\1/;s/ (.*//;s/^# //' | sk --preview="manix '{}'" | xargs manix
''; '';
# fix nixos-option # fix nixos-option
nixos-option = "nixos-option -I nixpkgs=${self}/lib/compat"; nixos-option = "nixos-option -I nixpkgs=${self}/lib/compat";
# sudo # sudo
s = ifSudo "sudo -E "; s = ifSudo "sudo -E ";
si = ifSudo "sudo -i"; si = ifSudo "sudo -i";
se = ifSudo "sudoedit"; se = ifSudo "sudoedit";
# top # top
top = "btm"; top = "btm";
# systemd # systemd
ctl = "systemctl"; ctl = "systemctl";
stl = ifSudo "s systemctl"; stl = ifSudo "s systemctl";
utl = "systemctl --user"; utl = "systemctl --user";
ut = "systemctl --user start"; ut = "systemctl --user start";
un = "systemctl --user stop"; un = "systemctl --user stop";
up = ifSudo "s systemctl start"; up = ifSudo "s systemctl start";
dn = ifSudo "s systemctl stop"; dn = ifSudo "s systemctl stop";
jtl = "journalctl"; jtl = "journalctl";
};
};
}; };
fonts = { fonts = {
fonts = with pkgs; [ powerline-fonts dejavu_fonts ]; fonts = with pkgs; [powerline-fonts dejavu_fonts];
fontconfig.defaultFonts = { fontconfig.defaultFonts = {
monospace = ["DejaVu Sans Mono for Powerline"];
monospace = [ "DejaVu Sans Mono for Powerline" ]; sansSerif = ["DejaVu Sans"];
sansSerif = [ "DejaVu Sans" ];
}; };
}; };
nix = { nix = {
# Improve nix store disk usage # Improve nix store disk usage
autoOptimiseStore = true; autoOptimiseStore = true;
gc.automatic = true; gc.automatic = true;
@ -133,7 +132,7 @@ in
useSandbox = true; useSandbox = true;
# give root and @wheel special privileges with nix # give root and @wheel special privileges with nix
trustedUsers = [ "root" "@wheel" ]; trustedUsers = ["root" "@wheel"];
# Generally useful nix option defaults # Generally useful nix option defaults
extraOptions = '' extraOptions = ''
@ -142,7 +141,6 @@ in
keep-derivations = true keep-derivations = true
fallback = true fallback = true
''; '';
}; };
programs.bash = { programs.bash = {
@ -158,5 +156,4 @@ in
# Service that makes Out of Memory Killer more effective # Service that makes Out of Memory Killer more effective
services.earlyoom.enable = true; services.earlyoom.enable = true;
} }

View File

@ -2,8 +2,7 @@ let
# set ssh public keys here for your system and user # set ssh public keys here for your system and user
system = ""; system = "";
user = ""; user = "";
allKeys = [ system user ]; allKeys = [system user];
in in {
{
"secret.age".publicKeys = allKeys; "secret.age".publicKeys = allKeys;
} }

View File

@ -1,5 +1,8 @@
{ self, inputs, ... }:
{ {
self,
inputs,
...
}: {
modules = with inputs; [ modules = with inputs; [
bud.devshellModules.bud bud.devshellModules.bud
]; ];
@ -7,4 +10,3 @@
./devos.nix ./devos.nix
]; ];
} }

View File

@ -1,19 +1,20 @@
{ pkgs, extraModulesPath, inputs, ... }: {
let pkgs,
extraModulesPath,
inputs,
...
}: let
hooks = import ./hooks; hooks = import ./hooks;
pkgWithCategory = category: package: { inherit package category; }; pkgWithCategory = category: package: {inherit package category;};
linter = pkgWithCategory "linter"; linter = pkgWithCategory "linter";
docs = pkgWithCategory "docs"; docs = pkgWithCategory "docs";
devos = pkgWithCategory "devos"; devos = pkgWithCategory "devos";
in {
in
{
_file = toString ./.; _file = toString ./.;
imports = [ "${extraModulesPath}/git/hooks.nix" ]; imports = ["${extraModulesPath}/git/hooks.nix"];
git = { inherit hooks; }; git = {inherit hooks;};
# tempfix: remove when merged https://github.com/numtide/devshell/pull/123 # tempfix: remove when merged https://github.com/numtide/devshell/pull/123
devshell.startup.load_profiles = pkgs.lib.mkForce (pkgs.lib.noDepEntry '' devshell.startup.load_profiles = pkgs.lib.mkForce (pkgs.lib.noDepEntry ''
@ -30,26 +31,26 @@ in
unset _PATH unset _PATH
''); '');
commands = with pkgs; [ commands = with pkgs;
(devos nixUnstable) [
(devos agenix) (devos nixUnstable)
{ (devos agenix)
category = "devos"; {
name = pkgs.nvfetcher-bin.pname; category = "devos";
help = pkgs.nvfetcher-bin.meta.description; name = pkgs.nvfetcher-bin.pname;
command = "cd $PRJ_ROOT/pkgs; ${pkgs.nvfetcher-bin}/bin/nvfetcher -c ./sources.toml $@"; help = pkgs.nvfetcher-bin.meta.description;
} command = "cd $PRJ_ROOT/pkgs; ${pkgs.nvfetcher-bin}/bin/nvfetcher -c ./sources.toml $@";
(linter alejandra) }
(linter editorconfig-checker) (linter alejandra)
# (docs python3Packages.grip) too many deps (linter editorconfig-checker)
(docs mdbook) # (docs python3Packages.grip) too many deps
(devos inputs.deploy.packages.${pkgs.system}.deploy-rs) (docs mdbook)
] (devos inputs.deploy.packages.${pkgs.system}.deploy-rs)
++ lib.optional ]
++ lib.optional
(system != "i686-linux") (system != "i686-linux")
(devos cachix) (devos cachix)
++ lib.optional ++ lib.optional
(system != "aarch64-darwin") (system != "aarch64-darwin")
(devos inputs.nixos-generators.defaultPackage.${pkgs.system}) (devos inputs.nixos-generators.defaultPackage.${pkgs.system});
;
} }

View File

@ -1,11 +1,10 @@
{ hmUsers, ... }: {hmUsers, ...}: {
{ home-manager.users = {inherit (hmUsers) nixos;};
home-manager.users = { inherit (hmUsers) nixos; };
users.users.nixos = { users.users.nixos = {
password = "nixos"; password = "nixos";
description = "default"; description = "default";
isNormalUser = true; isNormalUser = true;
extraGroups = [ "wheel" ]; extraGroups = ["wheel"];
}; };
} }

View File

@ -30,12 +30,9 @@
h1rd = "hard HEAD~1"; h1rd = "hard HEAD~1";
# logging # logging
lg = lg = "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit";
"log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"; plog = "log --graph --pretty='format:%C(red)%d%C(reset) %C(yellow)%h%C(reset) %ar %C(green)%aN%C(reset) %s'";
plog = tlog = "log --stat --since='1 Day Ago' --graph --pretty=oneline --abbrev-commit --date=relative";
"log --graph --pretty='format:%C(red)%d%C(reset) %C(yellow)%h%C(reset) %ar %C(green)%aN%C(reset) %s'";
tlog =
"log --stat --since='1 Day Ago' --graph --pretty=oneline --abbrev-commit --date=relative";
rank = "shortlog -sn --no-merges"; rank = "shortlog -sn --no-merges";
# delete merged branches # delete merged branches

View File

@ -1,4 +1,4 @@
{ ... }: {...}:
# recommend using `hashedPassword` # recommend using `hashedPassword`
{ {
users.users.root.password = ""; users.users.root.password = "";

View File

@ -1,4 +1,3 @@
{ self, ... }: {self, ...}: {
{ exportedModules = [./python.toml];
exportedModules = [ ./python.toml ];
} }

View File

@ -1,29 +1,31 @@
{ {
description = "A DevOS example. And also a digga test bed."; description = "A DevOS example. And also a digga test bed.";
inputs = inputs = {
{ # Track channels with commits tested and built by hydra
# Track channels with commits tested and built by hydra nixos.url = "github:nixos/nixpkgs/nixos-21.11";
nixos.url = "github:nixos/nixpkgs/nixos-21.11";
digga = { digga = {
url = "github:divnix/digga"; url = "github:divnix/digga";
inputs.nixpkgs.follows = "nixos"; inputs.nixpkgs.follows = "nixos";
};
home.url = "github:nix-community/home-manager";
home.inputs.nixpkgs.follows = "nixos";
}; };
home.url = "github:nix-community/home-manager";
home.inputs.nixpkgs.follows = "nixos";
};
outputs = inputs @ { self, nixos, digga, home }: outputs = inputs @ {
self,
nixos,
digga,
home,
}:
digga.lib.mkFlake { digga.lib.mkFlake {
inherit self inputs; inherit self inputs;
channels.nixos = { }; channels.nixos = {};
nixos = ./nixos; nixos = ./nixos;
home = ./home; home = ./home;
devshell = ./devshell; devshell = ./devshell;
}; };
} }

View File

@ -1,7 +1,5 @@
{ self, ... }: {self, ...}: let
let
lib = self.inputs.digga.lib; lib = self.inputs.digga.lib;
in in {
{ imports = [(lib.importExportableModules ./modules)];
imports = [ (lib.importExportableModules ./modules) ];
} }

View File

@ -30,12 +30,9 @@
h1rd = "hard HEAD~1"; h1rd = "hard HEAD~1";
# logging # logging
lg = lg = "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit";
"log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"; plog = "log --graph --pretty='format:%C(red)%d%C(reset) %C(yellow)%h%C(reset) %ar %C(green)%aN%C(reset) %s'";
plog = tlog = "log --stat --since='1 Day Ago' --graph --pretty=oneline --abbrev-commit --date=relative";
"log --graph --pretty='format:%C(red)%d%C(reset) %C(yellow)%h%C(reset) %ar %C(green)%aN%C(reset) %s'";
tlog =
"log --stat --since='1 Day Ago' --graph --pretty=oneline --abbrev-commit --date=relative";
rank = "shortlog -sn --no-merges"; rank = "shortlog -sn --no-merges";
# delete merged branches # delete merged branches

View File

@ -1,6 +1,11 @@
{ lib, pkgs, config, ... }: { {
lib,
pkgs,
config,
...
}: {
boot.loader.systemd-boot.enable = true; boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true; boot.loader.efi.canTouchEfiVariables = true;
fileSystems."/" = { device = "/dev/disk/by-label/One"; }; fileSystems."/" = {device = "/dev/disk/by-label/One";};
users.users.root.password = ""; users.users.root.password = "";
} }

View File

@ -1,16 +1,18 @@
{ self, inputs, ... }:
let
inherit (inputs.digga.lib) allProfilesTest;
in
{ {
self,
inputs,
...
}: let
inherit (inputs.digga.lib) allProfilesTest;
in {
hostDefaults.channelName = "nixos"; hostDefaults.channelName = "nixos";
hosts = { hosts = {
Morty.modules = [ ./Morty.nix ]; Morty.modules = [./Morty.nix];
Morty.tests = [ allProfilesTest ]; Morty.tests = [allProfilesTest];
}; };
importables = rec { importables = rec {
suites = rec { suites = rec {
base = [ ]; base = [];
}; };
}; };
} }

View File

@ -1,26 +1,28 @@
{ {
description = "A DevOS example. And also a digga test bed."; description = "A DevOS example. And also a digga test bed.";
inputs = inputs = {
{ nixos.url = "github:nixos/nixpkgs/nixos-21.11";
nixos.url = "github:nixos/nixpkgs/nixos-21.11"; digga.url = "github:divnix/digga";
digga.url = "github:divnix/digga"; digga.inputs.nixpkgs.follows = "nixos";
digga.inputs.nixpkgs.follows = "nixos"; digga.inputs.home-manager.follows = "home";
digga.inputs.home-manager.follows = "home"; home.url = "github:nix-community/home-manager/release-21.11";
home.url = "github:nix-community/home-manager/release-21.11"; home.inputs.nixpkgs.follows = "nixos";
home.inputs.nixpkgs.follows = "nixos"; };
};
outputs = inputs @ { self, nixos, digga, home }: outputs = inputs @ {
self,
nixos,
digga,
home,
}:
digga.lib.mkFlake { digga.lib.mkFlake {
inherit self inputs; inherit self inputs;
channels.nixos = { }; channels.nixos = {};
nixos.hostDefaults.channelName = "nixos"; nixos.hostDefaults.channelName = "nixos";
home = ./home; home = ./home;
}; };
} }

View File

@ -1,14 +1,16 @@
{ self, inputs, ... }:
let
lib = inputs.digga.lib;
in
{ {
imports = [ (lib.importExportableModules ./modules) ]; self,
modules = [ ]; inputs,
...
}: let
lib = inputs.digga.lib;
in {
imports = [(lib.importExportableModules ./modules)];
modules = [];
importables = rec { importables = rec {
profiles = lib.rakeLeaves ./profiles; profiles = lib.rakeLeaves ./profiles;
suites = with profiles; { suites = with profiles; {
shell = with shell; [ direnv ]; shell = with shell; [direnv];
}; };
}; };
users = lib.rakeLeaves ./users; users = lib.rakeLeaves ./users;

View File

@ -1,12 +1,14 @@
{ pkgs, suites, ... }: {
let pkgs,
suites,
...
}: let
name = "Test User"; name = "Test User";
email = "test@example.com"; email = "test@example.com";
in in {
{
imports = suites.shell; imports = suites.shell;
home.packages = [ pkgs.hello ]; home.packages = [pkgs.hello];
programs.browserpass.enable = true; programs.browserpass.enable = true;
programs.starship.enable = true; programs.starship.enable = true;
@ -15,4 +17,3 @@ in
userEmail = email; userEmail = email;
}; };
} }

207
flake.nix
View File

@ -5,129 +5,124 @@
nixConfig.extra-substituters = "https://nrdxp.cachix.org https://nix-community.cachix.org"; nixConfig.extra-substituters = "https://nrdxp.cachix.org https://nix-community.cachix.org";
nixConfig.extra-trusted-public-keys = "nrdxp.cachix.org-1:Fc5PSqY2Jm1TrWfm88l6cvGWwz3s93c6IOifQWnhNW4= nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="; nixConfig.extra-trusted-public-keys = "nrdxp.cachix.org-1:Fc5PSqY2Jm1TrWfm88l6cvGWwz3s93c6IOifQWnhNW4= nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=";
inputs = inputs = {
{ # Track channels with commits tested and built by hydra
# Track channels with commits tested and built by hydra nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
nixlib.url = "github:nix-community/nixpkgs.lib"; nixlib.url = "github:nix-community/nixpkgs.lib";
blank.url = "github:divnix/blank"; blank.url = "github:divnix/blank";
deploy.url = "github:serokell/deploy-rs"; deploy.url = "github:serokell/deploy-rs";
deploy.inputs.nixpkgs.follows = "nixpkgs"; deploy.inputs.nixpkgs.follows = "nixpkgs";
home-manager.url = "github:nix-community/home-manager/release-21.11"; home-manager.url = "github:nix-community/home-manager/release-21.11";
home-manager.inputs.nixpkgs.follows = "nixlib"; home-manager.inputs.nixpkgs.follows = "nixlib";
devshell.url = "github:numtide/devshell"; devshell.url = "github:numtide/devshell";
flake-utils-plus.url = "github:gytis-ivaskevicius/flake-utils-plus"; flake-utils-plus.url = "github:gytis-ivaskevicius/flake-utils-plus";
flake-compat = { flake-compat = {
url = "github:edolstra/flake-compat"; url = "github:edolstra/flake-compat";
flake = false; flake = false;
}; };
};
outputs = {
self,
nixlib,
nixpkgs,
deploy,
devshell,
flake-utils-plus,
home-manager,
...
} @ inputs: let
tests = import ./src/tests.nix {inherit (nixlib) lib;};
internal-modules = import ./src/modules.nix {
inherit (nixlib) lib;
}; };
outputs = importers = import ./src/importers.nix {
{ self inherit (nixlib) lib;
, nixlib };
, nixpkgs
, deploy
, devshell
, flake-utils-plus
, home-manager
, ...
}@inputs:
let
tests = import ./src/tests.nix { inherit (nixlib) lib; }; generators = import ./src/generators.nix {
inherit (nixlib) lib;
inherit deploy;
};
internal-modules = import ./src/modules.nix { mkFlake = let
mkFlake' = import ./src/mkFlake {
inherit (nixlib) lib; inherit (nixlib) lib;
inherit (flake-utils-plus.inputs) flake-utils;
inherit deploy devshell home-manager flake-utils-plus internal-modules tests;
}; };
in {
__functor = _: args: (mkFlake' args).flake;
options = args: (mkFlake' args).options;
};
importers = import ./src/importers.nix { # Unofficial Flakes Roadmap - Polyfills
inherit (nixlib) lib; # This project is committed to the Unofficial Flakes Roadmap!
}; # .. see: https://demo.hedgedoc.org/s/_W6Ve03GK#
generators = import ./src/generators.nix { # Super Stupid Flakes (ssf) / System As an Input - Style:
inherit (nixlib) lib; supportedSystems = ["x86_64-linux" "aarch64-linux" "x86_64-darwin"];
inherit deploy;
};
mkFlake = # Pass this flake(self) as "digga"
let polyfillInputs = self.inputs // {digga = self;};
mkFlake' = import ./src/mkFlake { polyfillOutput = loc:
inherit (nixlib) lib; nixlib.lib.genAttrs supportedSystems (
inherit (flake-utils-plus.inputs) flake-utils; system:
inherit deploy devshell home-manager flake-utils-plus internal-modules tests; import loc {
}; inherit system;
in inputs = polyfillInputs;
{ }
__functor = _: args: (mkFlake' args).flake;
options = args: (mkFlake' args).options;
};
# Unofficial Flakes Roadmap - Polyfills
# This project is committed to the Unofficial Flakes Roadmap!
# .. see: https://demo.hedgedoc.org/s/_W6Ve03GK#
# Super Stupid Flakes (ssf) / System As an Input - Style:
supportedSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" ];
# Pass this flake(self) as "digga"
polyfillInputs = self.inputs // { digga = self; };
polyfillOutput = loc: nixlib.lib.genAttrs supportedSystems (system:
import loc { inherit system; inputs = polyfillInputs; }
); );
# .. we hope you like this style. # .. we hope you like this style.
# .. it's adopted by a growing number of projects. # .. it's adopted by a growing number of projects.
# Please consider adopting it if you want to help to improve flakes. # Please consider adopting it if you want to help to improve flakes.
# DEPRECATED - will be removed timely
deprecated = import ./deprecated.nix {
inherit (nixlib) lib;
inherit (self) nixosModules;
inherit flake-utils-plus internal-modules importers;
};
in {
# what you came for ...
lib = {
inherit (flake-utils-plus.inputs.flake-utils.lib) defaultSystems eachSystem eachDefaultSystem filterPackages;
inherit (flake-utils-plus.lib) exportModules exportOverlays exportPackages;
inherit mkFlake;
inherit (tests) mkTest allProfilesTest;
inherit (importers) flattenTree rakeLeaves importOverlays importExportableModules importHosts;
inherit (generators) mkDeployNodes mkHomeConfigurations;
# DEPRECATED - will be removed soon
# DEPRECATED - will be removed timely inherit
deprecated = import ./deprecated.nix { (deprecated)
inherit (nixlib) lib; # Place any deprecated lib functions here
inherit (self) nixosModules;
inherit flake-utils-plus internal-modules importers; ;
};
in
{
# what you came for ...
lib = {
inherit (flake-utils-plus.inputs.flake-utils.lib) defaultSystems eachSystem eachDefaultSystem filterPackages;
inherit (flake-utils-plus.lib) exportModules exportOverlays exportPackages;
inherit mkFlake;
inherit (tests) mkTest allProfilesTest;
inherit (importers) flattenTree rakeLeaves importOverlays importExportableModules importHosts;
inherit (generators) mkDeployNodes mkHomeConfigurations;
# DEPRECATED - will be removed soon
inherit (deprecated)
# Place any deprecated lib functions here
;
};
# a little extra service ...
overlays = import ./overlays { inherit inputs; };
nixosModules = import ./modules;
defaultTemplate = self.templates.devos;
templates.devos.path = ./examples/devos;
templates.devos.description = ''
an awesome template for NixOS users, with consideration for common tools like home-manager, devshell, and more.
'';
# digga-local use
formatter = nixlib.lib.genAttrs supportedSystems (s: nixpkgs.legacyPackages.${s}.alejandra);
# system-space and pass sytem and input to each file
jobs = polyfillOutput ./jobs;
checks = polyfillOutput ./checks;
devShell = polyfillOutput ./devShell.nix;
}; };
# a little extra service ...
overlays = import ./overlays {inherit inputs;};
nixosModules = import ./modules;
defaultTemplate = self.templates.devos;
templates.devos.path = ./examples/devos;
templates.devos.description = ''
an awesome template for NixOS users, with consideration for common tools like home-manager, devshell, and more.
'';
# digga-local use
formatter = nixlib.lib.genAttrs supportedSystems (s: nixpkgs.legacyPackages.${s}.alejandra);
# system-space and pass sytem and input to each file
jobs = polyfillOutput ./jobs;
checks = polyfillOutput ./checks;
devShell = polyfillOutput ./devShell.nix;
};
} }

View File

@ -1,13 +1,15 @@
{ system ? builtins.currentSystem {
, inputs ? (import ../.).inputs system ? builtins.currentSystem,
}: inputs ? (import ../.).inputs,
let }: let
inherit (inputs) digga; inherit (inputs) digga;
pkgs = inputs.nixpkgs.legacyPackages.${system}; pkgs = inputs.nixpkgs.legacyPackages.${system};
docOptions = digga.lib.mkFlake.options { self = { }; inputs = { }; }; docOptions = digga.lib.mkFlake.options {
evaledOptions = (pkgs.lib.evalModules { modules = [ docOptions ]; }).options; self = {};
inputs = {};
};
evaledOptions = (pkgs.lib.evalModules {modules = [docOptions];}).options;
mkDocPartMd = part: title: intro: mkDocPartMd = part: title: intro:
pkgs.writeText "api-reference-${part}.md" '' pkgs.writeText "api-reference-${part}.md" ''
@ -15,13 +17,11 @@ let
${intro} ${intro}
${( ${(
pkgs.nixosOptionsDoc { options = evaledOptions.${part}; } pkgs.nixosOptionsDoc {options = evaledOptions.${part};}
).optionsMDDoc} )
.optionsMDDoc}
''; '';
in {
in
{
mkApiReferenceTopLevel = pkgs.writeText "api-reference.md" '' mkApiReferenceTopLevel = pkgs.writeText "api-reference.md" ''
# Top Level API # Top Level API
`digga`'s top level API. API Containers are documented in their respective sub-chapter: `digga`'s top level API. API Containers are documented in their respective sub-chapter:
@ -31,17 +31,19 @@ in
- [Devshell](./api-reference-devshell.md) - [Devshell](./api-reference-devshell.md)
- [NixOS](./api-reference-nixos.md) - [NixOS](./api-reference-nixos.md)
${( pkgs.nixosOptionsDoc { ${(pkgs.nixosOptionsDoc {
options = { options = {
inherit (evaledOptions) inherit
(evaledOptions)
channelsConfig channelsConfig
self self
inputs inputs
outputsBuilder outputsBuilder
supportedSystems supportedSystems
; ;
}; };
}).optionsMDDoc} })
.optionsMDDoc}
''; '';
mkApiReferenceChannels = mkDocPartMd "channels" "Channels API Container" '' mkApiReferenceChannels = mkDocPartMd "channels" "Channels API Container" ''
@ -60,5 +62,4 @@ in
mkApiReferenceNixos = mkDocPartMd "nixos" "NixOS API Container" '' mkApiReferenceNixos = mkDocPartMd "nixos" "NixOS API Container" ''
Configure your nixos modules, profiles & suites. Configure your nixos modules, profiles & suites.
''; '';
} }

View File

@ -1,29 +1,39 @@
let let
getFqdn = config: getFqdn = config: let
let net = config.networking;
net = config.networking; fqdn =
fqdn = if net.domain != null
if net.domain != null then "${net.hostName}.${net.domain}"
then "${net.hostName}.${net.domain}" else net.hostName;
else net.hostName; in
in
fqdn; fqdn;
protoModule = fullHostConfig: { config, lib, modulesPath, suites, self, inputs, ... }@args: { protoModule = fullHostConfig: {
config,
imports = [ "${modulesPath}/installer/cd-dvd/installation-cd-minimal.nix" ]; lib,
modulesPath,
suites,
self,
inputs,
...
} @ args: {
imports = ["${modulesPath}/installer/cd-dvd/installation-cd-minimal.nix"];
isoImage.isoBaseName = "bootstrap-" + (getFqdn config); isoImage.isoBaseName = "bootstrap-" + (getFqdn config);
isoImage.contents = [{ isoImage.contents = [
source = self; {
target = "/devos/"; source = self;
}]; target = "/devos/";
isoImage.storeContents = [ }
self.devShell.${config.nixpkgs.system} ];
# include also closures that are "switched off" by the isoImage.storeContents =
# above profile filter on the local config attribute [
fullHostConfig.system.build.toplevel self.devShell.${config.nixpkgs.system}
] ++ builtins.attrValues inputs; # include also closures that are "switched off" by the
# above profile filter on the local config attribute
fullHostConfig.system.build.toplevel
]
++ builtins.attrValues inputs;
# still pull in tools of deactivated profiles # still pull in tools of deactivated profiles
environment.systemPackages = fullHostConfig.environment.systemPackages; environment.systemPackages = fullHostConfig.environment.systemPackages;
@ -63,12 +73,16 @@ let
}; };
}; };
in in
{ config, ... }: {config, ...}: {
{ system.build = {
system.build = { bootstrapIso =
bootstrapIso = (config.lib.digga.mkBuild (
(protoModule config) config.lib.digga.mkBuild
).config.system.build.isoImage; (protoModule config)
}; )
} .config
.system
.build
.isoImage;
};
}

View File

@ -1,6 +1,4 @@
{ lib, ... }: {lib, ...}: let
let
experimental-features = [ experimental-features = [
"flakes" "flakes"
"nix-command" "nix-command"
@ -13,16 +11,14 @@ let
"nrdxp.cachix.org-1:Fc5PSqY2Jm1TrWfm88l6cvGWwz3s93c6IOifQWnhNW4=" "nrdxp.cachix.org-1:Fc5PSqY2Jm1TrWfm88l6cvGWwz3s93c6IOifQWnhNW4="
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
]; ];
in {
in
{
# package and option is from fup # package and option is from fup
nix.generateRegistryFromInputs = lib.mkDefault true; nix.generateRegistryFromInputs = lib.mkDefault true;
# missing merge semantics in this option force us to use extra-* for now # missing merge semantics in this option force us to use extra-* for now
nix.extraOptions = '' nix.extraOptions = ''
extra-experimental-features = ${lib.concatStringsSep " " experimental-features } extra-experimental-features = ${lib.concatStringsSep " " experimental-features}
extra-substituters = ${lib.concatStringsSep " " substituters } extra-substituters = ${lib.concatStringsSep " " substituters}
extra-trusted-public-keys = ${lib.concatStringsSep " " trusted-public-keys } extra-trusted-public-keys = ${lib.concatStringsSep " " trusted-public-keys}
''; '';
} }

View File

@ -1,3 +1,2 @@
{ inputs }: { {inputs}: {
} }

View File

@ -1 +1 @@
import ./devShell.nix { } import ./devShell.nix {}

View File

@ -1,74 +1,75 @@
{ lib, deploy }:
let
getFqdn = c:
let
net = c.config.networking;
fqdn =
if net.domain != null
then "${net.hostName}.${net.domain}"
else net.hostName;
in
fqdn;
in
{ {
lib,
deploy,
}: let
getFqdn = c: let
net = c.config.networking;
fqdn =
if net.domain != null
then "${net.hostName}.${net.domain}"
else net.hostName;
in
fqdn;
in {
mkHomeConfigurations = nixosConfigurations: mkHomeConfigurations = nixosConfigurations:
/** /*
Synopsis: mkHomeConfigurations _nixosConfigurations_ *
Synopsis: mkHomeConfigurations _nixosConfigurations_
Generate the `homeConfigurations` attribute expected by
`home-manager` cli from _nixosConfigurations_ in the form Generate the `homeConfigurations` attribute expected by
_user@hostname_. `home-manager` cli from _nixosConfigurations_ in the form
**/ _user@hostname_.
let *
op = attrs: c: */
attrs let
// op = attrs: c:
( attrs
lib.mapAttrs' // (
(user: v: { lib.mapAttrs'
name = "${user}@${getFqdn c}"; (user: v: {
value = v.home; name = "${user}@${getFqdn c}";
}) value = v.home;
c.config.home-manager.users })
) c.config.home-manager.users
; );
mkHmConfigs = lib.foldl op { }; mkHmConfigs = lib.foldl op {};
in in
mkHmConfigs (builtins.attrValues nixosConfigurations); mkHmConfigs (builtins.attrValues nixosConfigurations);
mkDeployNodes = hosts: extraConfig: mkDeployNodes = hosts: extraConfig:
/** /*
Synopsis: mkNodes _nixosConfigurations_ *
Synopsis: mkNodes _nixosConfigurations_
Generate the `nodes` attribute expected by deploy-rs
where _nixosConfigurations_ are `nodes`. Generate the `nodes` attribute expected by deploy-rs
where _nixosConfigurations_ are `nodes`.
Example input:
``` Example input:
{ ```
hostname-1 = { {
fastConnection = true; hostname-1 = {
sshOpts = [ "-p" "25" ]; fastConnection = true;
}; sshOpts = [ "-p" "25" ];
hostname-2 = { };
sshOpts = [ "-p" "19999" ]; hostname-2 = {
sshUser = "root"; sshOpts = [ "-p" "19999" ];
}; sshUser = "root";
} };
``` }
**/ ```
*
*/
lib.recursiveUpdate lib.recursiveUpdate
(lib.mapAttrs (lib.mapAttrs
(_: c: (
{ _: c: {
hostname = getFqdn c; hostname = getFqdn c;
profiles.system = { profiles.system = {
user = "root"; user = "root";
path = deploy.lib.${c.config.nixpkgs.system}.activate.nixos c; path = deploy.lib.${c.config.nixpkgs.system}.activate.nixos c;
}; };
} }
) )
hosts) hosts)
extraConfig; extraConfig;
} }

View File

@ -1,108 +1,108 @@
{ lib }: {lib}: let
let
flattenTree = flattenTree =
/** /*
Synopsis: flattenTree _tree_ *
Synopsis: flattenTree _tree_
Flattens a _tree_ of the shape that is produced by rakeLeaves.
Flattens a _tree_ of the shape that is produced by rakeLeaves.
Output Format:
An attrset with names in the spirit of the Reverse DNS Notation form Output Format:
that fully preserve information about grouping from nesting. An attrset with names in the spirit of the Reverse DNS Notation form
that fully preserve information about grouping from nesting.
Example input:
``` Example input:
{ ```
a = { {
b = { a = {
c = <path>; b = {
}; c = <path>;
}; };
} };
``` }
```
Example output:
``` Example output:
{ ```
"a.b.c" = <path>; {
} "a.b.c" = <path>;
``` }
**/ ```
tree: *
let */
op = sum: path: val: tree: let
let op = sum: path: val: let
pathStr = builtins.concatStringsSep "." path; # dot-based reverse DNS notation pathStr = builtins.concatStringsSep "." path; # dot-based reverse DNS notation
in in
if builtins.isPath val then if builtins.isPath val
# builtins.trace "${toString val} is a path" then
(sum // { # builtins.trace "${toString val} is a path"
"${pathStr}" = val; (sum
}) // {
else if builtins.isAttrs val then "${pathStr}" = val;
# builtins.trace "${builtins.toJSON val} is an attrset" })
# recurse into that attribute set else if builtins.isAttrs val
then
# builtins.trace "${builtins.toJSON val} is an attrset"
# recurse into that attribute set
(recurse sum path val) (recurse sum path val)
else else
# ignore that value # ignore that value
# builtins.trace "${toString path} is something else" # builtins.trace "${toString path} is something else"
sum sum;
;
recurse = sum: path: val: recurse = sum: path: val:
builtins.foldl' builtins.foldl'
(sum: key: op sum (path ++ [ key ]) val.${key}) (sum: key: op sum (path ++ [key]) val.${key})
sum sum
(builtins.attrNames val) (builtins.attrNames val);
;
in in
recurse { } [ ] tree; recurse {} [] tree;
rakeLeaves = rakeLeaves =
/** /*
Synopsis: rakeLeaves _path_ *
Synopsis: rakeLeaves _path_
Recursively collect the nix files of _path_ into attrs.
Recursively collect the nix files of _path_ into attrs.
Output Format:
An attribute set where all `.nix` files and directories with `default.nix` in them Output Format:
are mapped to keys that are either the file with .nix stripped or the folder name. An attribute set where all `.nix` files and directories with `default.nix` in them
All other directories are recursed further into nested attribute sets with the same format. are mapped to keys that are either the file with .nix stripped or the folder name.
All other directories are recursed further into nested attribute sets with the same format.
Example file structure:
``` Example file structure:
./core/default.nix ```
./base.nix ./core/default.nix
./main/dev.nix ./base.nix
./main/os/default.nix ./main/dev.nix
``` ./main/os/default.nix
```
Example output:
``` Example output:
{ ```
core = ./core; {
base = base.nix; core = ./core;
main = { base = base.nix;
dev = ./main/dev.nix; main = {
os = ./main/os; dev = ./main/dev.nix;
}; os = ./main/os;
} };
``` }
**/ ```
dirPath: *
let */
dirPath: let
seive = file: type: seive = file: type:
# Only rake `.nix` files or directories # Only rake `.nix` files or directories
(type == "regular" && lib.hasSuffix ".nix" file) || (type == "directory") (type == "regular" && lib.hasSuffix ".nix" file) || (type == "directory");
;
collect = file: type: { collect = file: type: {
name = lib.removeSuffix ".nix" file; name = lib.removeSuffix ".nix" file;
value = value = let
let path = dirPath + "/${file}";
path = dirPath + "/${file}"; in
in if
if (type == "regular") (type == "regular")
|| (type == "directory" && builtins.pathExists (path + "/default.nix")) || (type == "directory" && builtins.pathExists (path + "/default.nix"))
then path then path
# recurse on directories that don't contain a `default.nix` # recurse on directories that don't contain a `default.nix`
@ -111,34 +111,28 @@ let
files = lib.filterAttrs seive (builtins.readDir dirPath); files = lib.filterAttrs seive (builtins.readDir dirPath);
in in
lib.filterAttrs (n: v: v != { }) (lib.mapAttrs' collect files); lib.filterAttrs (n: v: v != {}) (lib.mapAttrs' collect files);
in {
in
{
inherit rakeLeaves flattenTree; inherit rakeLeaves flattenTree;
importOverlays = dir: importOverlays = dir: {
{ # Meant to output a module that sets the overlays option
# Meant to output a module that sets the overlays option # overlays order matters. mkAfter ensures those in-house
# overlays order matters. mkAfter ensures those in-house # overlays are loaded later (after external ones), so the latter
# overlays are loaded later (after external ones), so the latter # can be modified via internal overlays
# can be modified via internal overlays overlays = lib.mkAfter (builtins.attrValues (flattenTree (rakeLeaves dir)));
overlays = lib.mkAfter (builtins.attrValues (flattenTree (rakeLeaves dir))); };
};
importExportableModules = dir: importExportableModules = dir: {
{ # Meant to output a module that sets the modules option
# Meant to output a module that sets the modules option exportedModules = builtins.attrValues (flattenTree (rakeLeaves dir));
exportedModules = builtins.attrValues (flattenTree (rakeLeaves dir)); };
};
importHosts = dir:
{
# Meant to output a module that sets the hosts option (including constructed host names)
hosts = lib.mapAttrs
(n: v: { modules = [ v ]; })
(flattenTree (rakeLeaves dir));
};
importHosts = dir: {
# Meant to output a module that sets the hosts option (including constructed host names)
hosts =
lib.mapAttrs
(n: v: {modules = [v];})
(flattenTree (rakeLeaves dir));
};
} }

View File

@ -1,28 +1,34 @@
{ lib, deploy, devshell, home-manager, flake-utils-plus, flake-utils, internal-modules, tests } @ injectedDeps: {
lib,
{ self, inputs, ... } @ args: deploy,
let devshell,
home-manager,
flake-utils-plus,
flake-utils,
internal-modules,
tests,
} @ injectedDeps: {
self,
inputs,
...
} @ args: let
# avoid infinite recursions w.r.t. using self or inputs in imports # avoid infinite recursions w.r.t. using self or inputs in imports
injectedDeps' = injectedDeps // { inherit self inputs; }; injectedDeps' = injectedDeps // {inherit self inputs;};
options' = import ./options.nix injectedDeps'; options' = import ./options.nix injectedDeps';
fupAdapter' = import ./fup-adapter.nix injectedDeps'; fupAdapter' = import ./fup-adapter.nix injectedDeps';
defaultOutputsBuilder' = import ./outputs-builder.nix injectedDeps'; defaultOutputsBuilder' = import ./outputs-builder.nix injectedDeps';
evaled = lib.evalModules { modules = [ args options' ]; }; evaled = lib.evalModules {modules = [args options'];};
defaultOutputsBuilder = defaultOutputsBuilder' evaled.config; defaultOutputsBuilder = defaultOutputsBuilder' evaled.config;
extraArgs = removeAttrs args (builtins.attrNames evaled.options); extraArgs = removeAttrs args (builtins.attrNames evaled.options);
in {
in
{
flake = fupAdapter' { flake = fupAdapter' {
inherit (evaled) config; inherit (evaled) config;
inherit extraArgs defaultOutputsBuilder; inherit extraArgs defaultOutputsBuilder;
}; };
options = options'; options = options';
} }

View File

@ -1,17 +1,19 @@
# constructor dependencies # constructor dependencies
{ lib, self, inputs, flake-utils-plus, internal-modules, ... }:
{ {
lib,
self,
inputs,
flake-utils-plus,
internal-modules,
...
}: {
# evaluated digga configuration # evaluated digga configuration
config config,
# extra arguments that are passed down to fup # extra arguments that are passed down to fup
, extraArgs extraArgs,
# pass a custom default fup outputs builder # pass a custom default fup outputs builder
, defaultOutputsBuilder defaultOutputsBuilder,
}: }: let
let
sharedOverlays = [ sharedOverlays = [
(final: prev: { (final: prev: {
__dontExport = true; __dontExport = true;
@ -24,59 +26,72 @@ let
defaultHostModules = [ defaultHostModules = [
(internal-modules.hmNixosDefaults { (internal-modules.hmNixosDefaults {
specialArgs = config.home.importables // { inherit self inputs; }; specialArgs = config.home.importables // {inherit self inputs;};
modules = config.home.modules ++ config.home.exportedModules; modules = config.home.modules ++ config.home.exportedModules;
}) })
(internal-modules.globalDefaults { (internal-modules.globalDefaults {
hmUsers = config.home.users; hmUsers = config.home.users;
}) })
({ ... }@args: { ({...} @ args: {
lib.specialArgs = args.specialArgs or (builtins.trace '' lib.specialArgs =
WARNING: specialArgs is not accessibly by the module system which means you args.specialArgs
are likely using NixOS 20.09. Profiles testing and custom builds (ex: iso) or (builtins.trace ''
are not supported in 20.09 and using them could result in infinite WARNING: specialArgs is not accessibly by the module system which means you
recursion errors. It is recommended to update to 21.05 to use either feature. are likely using NixOS 20.09. Profiles testing and custom builds (ex: iso)
'' are not supported in 20.09 and using them could result in infinite
{ }); recursion errors. It is recommended to update to 21.05 to use either feature.
''
{});
}) })
]; ];
unifyOverlays = channels: map (o: if builtins.isFunction (o null null) then o channels else o); unifyOverlays = channels:
map (o:
if builtins.isFunction (o null null)
then o channels
else o);
stripChannel = channel: removeAttrs channel [ stripChannel = channel:
# arguments in our channels api that shouldn't be passed to fup removeAttrs channel [
"overlays" # arguments in our channels api that shouldn't be passed to fup
]; "overlays"
];
# evalArgs sets channelName and system to null by default # evalArgs sets channelName and system to null by default
# but for proper default handling in fup, null args have to be removed # but for proper default handling in fup, null args have to be removed
stripHost = args: removeAttrs (lib.filterAttrs (_: arg: arg != null) args) [ stripHost = args:
# arguments in our hosts/hostDefaults api that shouldn't be passed to fup removeAttrs (lib.filterAttrs (_: arg: arg != null) args) [
"externalModules" # TODO: remove deprecated option # arguments in our hosts/hostDefaults api that shouldn't be passed to fup
"exportedModules" "externalModules" # TODO: remove deprecated option
"tests" "exportedModules"
]; "tests"
];
diggaFupArgs = { diggaFupArgs = {
inherit (config) inherit
(config)
channelsConfig channelsConfig
supportedSystems; supportedSystems
;
inherit self inputs sharedOverlays; inherit self inputs sharedOverlays;
hosts = builtins.mapAttrs (_: stripHost) config.nixos.hosts; hosts = builtins.mapAttrs (_: stripHost) config.nixos.hosts;
channels = builtins.mapAttrs channels =
(name: channel: builtins.mapAttrs
stripChannel (channel // { (
# pass channels if "overlay" has three arguments name: channel:
overlaysBuilder = channels: unifyOverlays channels channel.overlays; stripChannel (channel
}) // {
# pass channels if "overlay" has three arguments
overlaysBuilder = channels: unifyOverlays channels channel.overlays;
})
) )
config.channels; config.channels;
hostDefaults = flake-utils-plus.lib.mergeAny (stripHost config.nixos.hostDefaults) { hostDefaults = flake-utils-plus.lib.mergeAny (stripHost config.nixos.hostDefaults) {
# add `self` & `inputs` as specialargs so their libs can be used in imports # add `self` & `inputs` as specialargs so their libs can be used in imports
specialArgs = config.nixos.importables // { inherit self inputs; }; specialArgs = config.nixos.importables // {inherit self inputs;};
modules = config.nixos.hostDefaults.exportedModules ++ defaultHostModules; modules = config.nixos.hostDefaults.exportedModules ++ defaultHostModules;
}; };
@ -96,13 +111,11 @@ let
outputsBuilder = channels: outputsBuilder = channels:
flake-utils-plus.lib.mergeAny (defaultOutputsBuilder channels) (config.outputsBuilder channels); flake-utils-plus.lib.mergeAny (defaultOutputsBuilder channels) (config.outputsBuilder channels);
}; };
in in
flake-utils-plus.lib.mkFlake flake-utils-plus.lib.mkFlake
( (
flake-utils-plus.lib.mergeAny flake-utils-plus.lib.mergeAny
diggaFupArgs diggaFupArgs
extraArgs # for overlays list order extraArgs # for overlays list order
) )

View File

@ -1,452 +1,485 @@
# constructor dependencies # constructor dependencies
{ lib, devshell, flake-utils, self, inputs, ... }:
with lib;
{ config, ... }:
let
cfg = config;
# #############
# Resolver
# #############
/**
Synopsis: maybeImport <path|string or obj>
Returns an imported path or string or the object otherwise.
Use when you want to allow specifying an object directly or a path to it.
It saves the end user the additional import statement.
**/
maybeImport = obj:
if (builtins.isPath obj || builtins.isString obj) then
import obj
else obj
;
/**
Synopsis: maybeImportDevshellToml <path|string or obj>
Returns an imported path or string if the filename ends in `toml` or the object or path otherwise.
Use only for devshell modules, as an apply function.
**/
maybeImportDevshellToml = obj:
if ((builtins.isPath obj || builtins.isString obj) && lib.hasSuffix ".toml" obj) then
devshell.lib.importTOML obj
else obj
;
/**
Synopsis: pathToOr <type>
Type resolver: types maybeImport's <obj>.
Use in type declarations.
**/
pathToOr = elemType: with types; coercedTo path maybeImport elemType;
/**
Synopsis: coercedListOf <type>
Type resolver & list flattner: flattens a (evtl. arbitrarily nested) list of type <type>.
Use in type declarations.
**/
coercedListOf = elemType: with types;
coercedTo anything (x: flatten (singleton x)) (listOf elemType);
# #############
# Custom Types
# #############
nixosTestType = pathToOr (mkOptionType {
name = "test";
check = x: builtins.isFunction x || builtins.isAttrs x;
description = "valid NixOS test";
});
moduleType = mkOptionType {
name = "module";
inherit (types.submodule { }) check;
description = "valid module";
};
devshellModuleType = with types; coercedTo path maybeImportDevshellToml moduleType;
overlayType = pathToOr (mkOptionType {
name = "overlay";
check = builtins.isFunction;
description = "valid Nixpkgs overlay";
});
systemType = (types.enum config.supportedSystems) // {
description = "system defined in `supportedSystems`";
};
channelType = (types.enum (builtins.attrNames config.channels)) // {
description = "channel defined in `channels`";
};
flakeType = with types; (addCheck attrs lib.isStorePath) // {
description = "nix flake";
};
userType = with types; pathToOr moduleType // {
description = "HM user config";
};
overlaysType = with types; coercedListOf overlayType;
modulesType = with types; coercedListOf moduleType;
nixosTestsType = with types; coercedListOf nixosTestType;
devshellModulesType = with types; coercedListOf devshellModuleType;
legacyProfilesType = with types; listOf path;
legacySuitesType = with types; functionTo attrs;
suitesType = with types; attrsOf (coercedListOf path);
usersType = with types; attrsOf userType;
inputsType = with types; attrsOf flakeType;
# #############
# Options
# #############
systemOpt = {
system = mkOption {
type = with types; nullOr systemType;
default = null;
description = ''
system for this host
'';
};
};
channelNameOpt = required: {
channelName = mkOption
{
description = ''
Channel this host should follow
'';
}
//
(
if required then {
type = with types; channelType;
} else {
type = with types; nullOr channelType;
default = null;
}
);
};
nixosTestOpt = {
tests = mkOption {
type = with types; nixosTestsType;
default = [ ];
description = ''
tests to run
'';
example = literalExample ''
[
{
name = "testname1";
machine = { ... };
testScript = '''
# ...
''';
}
({ corutils, writers, ... }: {
name = "testname2";
machine = { ... };
testScript = '''
# ...
''';
})
./path/to/test.nix
];
'';
};
};
modulesOpt = {
modules = mkOption {
type = with types; pathToOr modulesType;
default = [ ];
description = ''
modules to include
'';
};
};
exportedModulesOpt' = name: {
type = with types; pathToOr modulesType;
default = [ ];
description = ''
modules to include in all hosts and export to ${name}Modules output
'';
};
exportedModulesOpt = name: { exportedModules = mkOption (exportedModulesOpt' name); };
exportedDevshellModulesOpt = {
exportedModules = mkOption (
(exportedModulesOpt' "devshell") // {
type = with types; devshellModulesType;
}
);
};
# This is only needed for hostDefaults
# modules in each host don't get exported
regularModulesOpt = {
modules = mkOption {
type = with types; pathToOr modulesType;
default = [ ];
description = ''
modules to include that won't be exported
meant importing modules from external flakes
'';
};
};
externalModulesDeprecationMessage = ''
The `externalModules` option has been removed.
Any modules that should be exported should be defined with the `exportedModules`
option and all other modules should just go into the `modules` option.
'';
legacyExternalModulesMod = { config, options, ... }: {
options = {
externalModules = mkOption {
type = with types; modulesType;
default = [ ];
description = externalModulesDeprecationMessage;
};
};
config = mkIf (config.externalModules != [ ]) {
modules = throw ''
ERROR: ${externalModulesDeprecationMessage}
'';
};
};
hostDefaultsOpt = name: {
hostDefaults = mkOption {
type = with types; hostDefaultsType name;
default = { };
description = ''
Defaults for all hosts.
the modules passed under hostDefaults will be exported
to the '${name}Modules' flake output.
They will also be added to all hosts.
'';
};
};
hostsOpt = name: {
hosts = mkOption {
type = with types; hostType;
default = { };
description = ''
configurations to include in the ${name}Configurations output
'';
};
};
inputOpt = name: {
input = mkOption {
type = flakeType;
default = self.inputs.${name};
defaultText = "self.inputs.<name>";
description = ''
nixpkgs flake input to use for this channel
'';
};
};
overlaysOpt = {
overlays = mkOption {
type = with types; pathToOr overlaysType;
default = [ ];
description = escape [ "<" ">" ] ''
overlays to apply to this channel
these will get exported under the 'overlays' flake output
as <channel>/<name> and any overlay pulled from ''\${inputs}
will be filtered out
'';
};
};
patchesOpt = {
patches = mkOption {
type = with types; listOf path;
default = [ ];
description = ''
patches to apply to this channel
'';
};
};
configOpt = {
config = mkOption {
type = with types; pathToOr attrs;
default = { };
apply = lib.recursiveUpdate cfg.channelsConfig;
description = ''
nixpkgs config for this channel
'';
};
};
importablesOpt = {
importables = mkOption {
type = with types; submoduleWith {
modules = [{
freeformType = attrs;
options = {
suites = mkOption {
type = nullOr (pathToOr suitesType);
default = null;
description = ''
collections of profiles
'';
};
};
}];
};
default = { };
description = ''
Packages of paths to be passed to modules as `specialArgs`.
'';
};
};
usersOpt = {
users = mkOption {
type = with types; usersType;
default = { };
description = ''
HM users that can be deployed portably without a host.
'';
};
};
# #############
# Aggreagate types
# #############
hostType = with types; attrsOf (submoduleWith {
modules = [
# per-host modules not exported, no external modules
{ options = systemOpt // (channelNameOpt false) // modulesOpt // nixosTestOpt; }
];
});
hostDefaultsType = name: with types; submoduleWith {
modules = [
{ options = systemOpt // (channelNameOpt true) // regularModulesOpt // (exportedModulesOpt name); }
legacyExternalModulesMod
];
};
nixosType = with types; submoduleWith {
specialArgs = { inherit self inputs; };
modules = [
{ options = (hostsOpt "nixos") // (hostDefaultsOpt "nixos") // importablesOpt; }
];
};
homeType = with types; submoduleWith {
specialArgs = { inherit self inputs; };
modules = [
{ options = regularModulesOpt // (exportedModulesOpt "home") // importablesOpt // usersOpt; }
legacyExternalModulesMod
];
};
devshellType = with types; submoduleWith {
specialArgs = { inherit self inputs; };
modules = [
{ options = regularModulesOpt // exportedDevshellModulesOpt; }
legacyExternalModulesMod
];
};
channelsType = with types; attrsOf (submoduleWith {
modules = [
({ name, ... }: { options = overlaysOpt // configOpt // (inputOpt name) // patchesOpt; })
];
});
outputsBuilderType = with types; functionTo attrs;
in
{ {
# this does not get propagated to submodules lib,
# to allow passing flake outputs directly to mkFlake devshell,
config._module.check = false; flake-utils,
self,
inputs,
...
}:
with lib;
{config, ...}: let
cfg = config;
options = with types; { # #############
self = mkOption { # Resolver
type = flakeType; # #############
readOnly = true;
description = "The flake to create the DevOS outputs for"; /*
*
Synopsis: maybeImport <path|string or obj>
Returns an imported path or string or the object otherwise.
Use when you want to allow specifying an object directly or a path to it.
It saves the end user the additional import statement.
*
*/
maybeImport = obj:
if (builtins.isPath obj || builtins.isString obj)
then import obj
else obj;
/*
*
Synopsis: maybeImportDevshellToml <path|string or obj>
Returns an imported path or string if the filename ends in `toml` or the object or path otherwise.
Use only for devshell modules, as an apply function.
*
*/
maybeImportDevshellToml = obj:
if ((builtins.isPath obj || builtins.isString obj) && lib.hasSuffix ".toml" obj)
then devshell.lib.importTOML obj
else obj;
/*
*
Synopsis: pathToOr <type>
Type resolver: types maybeImport's <obj>.
Use in type declarations.
*
*/
pathToOr = elemType: with types; coercedTo path maybeImport elemType;
/*
*
Synopsis: coercedListOf <type>
Type resolver & list flattner: flattens a (evtl. arbitrarily nested) list of type <type>.
Use in type declarations.
*
*/
coercedListOf = elemType:
with types;
coercedTo anything (x: flatten (singleton x)) (listOf elemType);
# #############
# Custom Types
# #############
nixosTestType = pathToOr (mkOptionType {
name = "test";
check = x: builtins.isFunction x || builtins.isAttrs x;
description = "valid NixOS test";
});
moduleType = mkOptionType {
name = "module";
inherit (types.submodule {}) check;
description = "valid module";
}; };
inputs = mkOption {
type = inputsType; devshellModuleType = with types; coercedTo path maybeImportDevshellToml moduleType;
readOnly = true;
description = "The flake's inputs"; overlayType = pathToOr (mkOptionType {
name = "overlay";
check = builtins.isFunction;
description = "valid Nixpkgs overlay";
});
systemType =
(types.enum config.supportedSystems)
// {
description = "system defined in `supportedSystems`";
};
channelType =
(types.enum (builtins.attrNames config.channels))
// {
description = "channel defined in `channels`";
};
flakeType = with types;
(addCheck attrs lib.isStorePath)
// {
description = "nix flake";
};
userType = with types;
pathToOr moduleType
// {
description = "HM user config";
};
overlaysType = with types; coercedListOf overlayType;
modulesType = with types; coercedListOf moduleType;
nixosTestsType = with types; coercedListOf nixosTestType;
devshellModulesType = with types; coercedListOf devshellModuleType;
legacyProfilesType = with types; listOf path;
legacySuitesType = with types; functionTo attrs;
suitesType = with types; attrsOf (coercedListOf path);
usersType = with types; attrsOf userType;
inputsType = with types; attrsOf flakeType;
# #############
# Options
# #############
systemOpt = {
system = mkOption {
type = with types; nullOr systemType;
default = null;
description = ''
system for this host
'';
};
}; };
supportedSystems = mkOption {
type = listOf str; channelNameOpt = required: {
default = flake-utils.lib.defaultSystems; channelName =
mkOption
{
description = ''
Channel this host should follow
'';
}
// (
if required
then {
type = with types; channelType;
}
else {
type = with types; nullOr channelType;
default = null;
}
);
};
nixosTestOpt = {
tests = mkOption {
type = with types; nixosTestsType;
default = [];
description = ''
tests to run
'';
example = literalExample ''
[
{
name = "testname1";
machine = { ... };
testScript = '''
# ...
''';
}
({ corutils, writers, ... }: {
name = "testname2";
machine = { ... };
testScript = '''
# ...
''';
})
./path/to/test.nix
];
'';
};
};
modulesOpt = {
modules = mkOption {
type = with types; pathToOr modulesType;
default = [];
description = ''
modules to include
'';
};
};
exportedModulesOpt' = name: {
type = with types; pathToOr modulesType;
default = [];
description = '' description = ''
The systems supported by this flake modules to include in all hosts and export to ${name}Modules output
''; '';
}; };
channelsConfig = mkOption {
type = pathToOr attrs; exportedModulesOpt = name: {exportedModules = mkOption (exportedModulesOpt' name);};
default = { }; exportedDevshellModulesOpt = {
description = '' exportedModules = mkOption (
nixpkgs config for all channels (exportedModulesOpt' "devshell")
''; // {
type = with types; devshellModulesType;
}
);
}; };
channels = mkOption {
type = pathToOr channelsType; # This is only needed for hostDefaults
default = { }; # modules in each host don't get exported
description = '' regularModulesOpt = {
nixpkgs channels to create modules = mkOption {
''; type = with types; pathToOr modulesType;
default = [];
description = ''
modules to include that won't be exported
meant importing modules from external flakes
'';
};
}; };
outputsBuilder = mkOption {
type = pathToOr outputsBuilderType; externalModulesDeprecationMessage = ''
default = channels: { }; The `externalModules` option has been removed.
defaultText = "channels: { }"; Any modules that should be exported should be defined with the `exportedModules`
description = '' option and all other modules should just go into the `modules` option.
builder for flake system-spaced outputs '';
The builder gets passed an attrset of all channels legacyExternalModulesMod = {
''; config,
options,
...
}: {
options = {
externalModules = mkOption {
type = with types; modulesType;
default = [];
description = externalModulesDeprecationMessage;
};
};
config = mkIf (config.externalModules != []) {
modules = throw ''
ERROR: ${externalModulesDeprecationMessage}
'';
};
}; };
nixos = mkOption {
type = pathToOr nixosType; hostDefaultsOpt = name: {
default = { }; hostDefaults = mkOption {
description = '' type = with types; hostDefaultsType name;
hosts, modules, suites, and profiles for NixOS default = {};
''; description = ''
Defaults for all hosts.
the modules passed under hostDefaults will be exported
to the '${name}Modules' flake output.
They will also be added to all hosts.
'';
};
}; };
home = mkOption {
type = pathToOr homeType; hostsOpt = name: {
default = { }; hosts = mkOption {
description = '' type = with types; hostType;
hosts, modules, suites, and profiles for home-manager default = {};
''; description = ''
configurations to include in the ${name}Configurations output
'';
};
}; };
devshell = mkOption {
type = pathToOr devshellType; inputOpt = name: {
default = { }; input = mkOption {
description = '' type = flakeType;
Modules to include in your DevOS shell. the `modules` argument default = self.inputs.${name};
will be exported under the `devshellModules` output defaultText = "self.inputs.<name>";
''; description = ''
nixpkgs flake input to use for this channel
'';
};
}; };
};
} overlaysOpt = {
overlays = mkOption {
type = with types; pathToOr overlaysType;
default = [];
description = escape ["<" ">"] ''
overlays to apply to this channel
these will get exported under the 'overlays' flake output
as <channel>/<name> and any overlay pulled from ''\${inputs}
will be filtered out
'';
};
};
patchesOpt = {
patches = mkOption {
type = with types; listOf path;
default = [];
description = ''
patches to apply to this channel
'';
};
};
configOpt = {
config = mkOption {
type = with types; pathToOr attrs;
default = {};
apply = lib.recursiveUpdate cfg.channelsConfig;
description = ''
nixpkgs config for this channel
'';
};
};
importablesOpt = {
importables = mkOption {
type = with types;
submoduleWith {
modules = [
{
freeformType = attrs;
options = {
suites = mkOption {
type = nullOr (pathToOr suitesType);
default = null;
description = ''
collections of profiles
'';
};
};
}
];
};
default = {};
description = ''
Packages of paths to be passed to modules as `specialArgs`.
'';
};
};
usersOpt = {
users = mkOption {
type = with types; usersType;
default = {};
description = ''
HM users that can be deployed portably without a host.
'';
};
};
# #############
# Aggreagate types
# #############
hostType = with types;
attrsOf (submoduleWith {
modules = [
# per-host modules not exported, no external modules
{options = systemOpt // (channelNameOpt false) // modulesOpt // nixosTestOpt;}
];
});
hostDefaultsType = name:
with types;
submoduleWith {
modules = [
{options = systemOpt // (channelNameOpt true) // regularModulesOpt // (exportedModulesOpt name);}
legacyExternalModulesMod
];
};
nixosType = with types;
submoduleWith {
specialArgs = {inherit self inputs;};
modules = [
{options = (hostsOpt "nixos") // (hostDefaultsOpt "nixos") // importablesOpt;}
];
};
homeType = with types;
submoduleWith {
specialArgs = {inherit self inputs;};
modules = [
{options = regularModulesOpt // (exportedModulesOpt "home") // importablesOpt // usersOpt;}
legacyExternalModulesMod
];
};
devshellType = with types;
submoduleWith {
specialArgs = {inherit self inputs;};
modules = [
{options = regularModulesOpt // exportedDevshellModulesOpt;}
legacyExternalModulesMod
];
};
channelsType = with types;
attrsOf (submoduleWith {
modules = [
({name, ...}: {options = overlaysOpt // configOpt // (inputOpt name) // patchesOpt;})
];
});
outputsBuilderType = with types; functionTo attrs;
in {
# this does not get propagated to submodules
# to allow passing flake outputs directly to mkFlake
config._module.check = false;
options = with types; {
self = mkOption {
type = flakeType;
readOnly = true;
description = "The flake to create the DevOS outputs for";
};
inputs = mkOption {
type = inputsType;
readOnly = true;
description = "The flake's inputs";
};
supportedSystems = mkOption {
type = listOf str;
default = flake-utils.lib.defaultSystems;
description = ''
The systems supported by this flake
'';
};
channelsConfig = mkOption {
type = pathToOr attrs;
default = {};
description = ''
nixpkgs config for all channels
'';
};
channels = mkOption {
type = pathToOr channelsType;
default = {};
description = ''
nixpkgs channels to create
'';
};
outputsBuilder = mkOption {
type = pathToOr outputsBuilderType;
default = channels: {};
defaultText = "channels: { }";
description = ''
builder for flake system-spaced outputs
The builder gets passed an attrset of all channels
'';
};
nixos = mkOption {
type = pathToOr nixosType;
default = {};
description = ''
hosts, modules, suites, and profiles for NixOS
'';
};
home = mkOption {
type = pathToOr homeType;
default = {};
description = ''
hosts, modules, suites, and profiles for home-manager
'';
};
devshell = mkOption {
type = pathToOr devshellType;
default = {};
description = ''
Modules to include in your DevOS shell. the `modules` argument
will be exported under the `devshellModules` output
'';
};
};
}

View File

@ -1,142 +1,153 @@
# constructor dependencies # constructor dependencies
{ lib, self, inputs, deploy, devshell, home-manager, flake-utils-plus, tests, ... }: {
config: channels: lib,
let self,
inputs,
deploy,
devshell,
home-manager,
flake-utils-plus,
tests,
...
}: config: channels: let
pkgs = channels.${config.nixos.hostDefaults.channelName}; pkgs = channels.${config.nixos.hostDefaults.channelName};
system = pkgs.system; system = pkgs.system;
mkPortableHomeManagerConfiguration = mkPortableHomeManagerConfiguration = {
{ username username,
, configuration configuration,
, pkgs pkgs,
, system ? pkgs.system system ? pkgs.system,
}: }: let
let homeDirectoryPrefix =
homeDirectoryPrefix = if pkgs.stdenv.hostPlatform.isDarwin
if pkgs.stdenv.hostPlatform.isDarwin then "/Users" else "/home"; then "/Users"
homeDirectory = "${homeDirectoryPrefix}/${username}"; else "/home";
in homeDirectory = "${homeDirectoryPrefix}/${username}";
in
home-manager.lib.homeManagerConfiguration { home-manager.lib.homeManagerConfiguration {
inherit username homeDirectory pkgs system; inherit username homeDirectory pkgs system;
extraModules = config.home.modules ++ config.home.exportedModules; extraModules = config.home.modules ++ config.home.exportedModules;
extraSpecialArgs = config.home.importables // { inherit self inputs; }; extraSpecialArgs = config.home.importables // {inherit self inputs;};
configuration = { configuration =
imports = [ configuration ]; {
} // ( imports = [configuration];
if pkgs.stdenv.hostPlatform.isLinux }
then { targets.genericLinux.enable = true; } // (
else { } if pkgs.stdenv.hostPlatform.isLinux
); then {targets.genericLinux.enable = true;}
else {}
);
}; };
homeConfigurationsPortable = homeConfigurationsPortable =
builtins.mapAttrs builtins.mapAttrs
(n: v: mkPortableHomeManagerConfiguration { (n: v:
mkPortableHomeManagerConfiguration {
username = n; username = n;
configuration = v; configuration = v;
inherit pkgs system; inherit pkgs system;
}) })
config.home.users; config.home.users;
in {
in
{
inherit homeConfigurationsPortable; inherit homeConfigurationsPortable;
packages = flake-utils-plus.lib.exportPackages self.overlays channels; packages = flake-utils-plus.lib.exportPackages self.overlays channels;
devShell = devShell = let
let eval = import "${devshell}/modules" pkgs;
eval = import "${devshell}/modules" pkgs; configuration = {
configuration = { name = lib.mkDefault config.nixos.hostDefaults.channelName;
name = lib.mkDefault config.nixos.hostDefaults.channelName; imports = config.devshell.modules ++ config.devshell.exportedModules;
imports = config.devshell.modules ++ config.devshell.exportedModules; };
}; in
in
(eval { (eval {
inherit configuration; inherit configuration;
extraSpecialArgs = { inherit self inputs; }; extraSpecialArgs = {inherit self inputs;};
}).shell; })
.shell;
checks = checks =
( (
# for self.homeConfigurations if present & non empty # for self.homeConfigurations if present & non empty
if ( if
(builtins.hasAttr "homeConfigurations" self) && (
(self.homeConfigurations != { }) (builtins.hasAttr "homeConfigurations" self)
) then && (self.homeConfigurations != {})
let )
seive = _: v: v.system == system; # only test for the appropriate system then let
collectActivationPackages = n: v: { name = "user-" + n; value = v.activationPackage; }; seive = _: v: v.system == system; # only test for the appropriate system
in collectActivationPackages = n: v: {
name = "user-" + n;
value = v.activationPackage;
};
in
lib.filterAttrs seive (lib.mapAttrs' collectActivationPackages self.homeConfigurations) lib.filterAttrs seive (lib.mapAttrs' collectActivationPackages self.homeConfigurations)
else { } else {}
) )
// // (
(
# for portableHomeConfigurations if present & non empty # for portableHomeConfigurations if present & non empty
if ( if (homeConfigurationsPortable != {})
(homeConfigurationsPortable != { }) then let
) then collectActivationPackages = n: v: {
let name = "user-" + n;
collectActivationPackages = n: v: { name = "user-" + n; value = v.activationPackage; }; value = v.activationPackage;
in };
in
lib.mapAttrs' collectActivationPackages homeConfigurationsPortable lib.mapAttrs' collectActivationPackages homeConfigurationsPortable
else { } else {}
) )
// // (
(
# for self.deploy if present & non-empty # for self.deploy if present & non-empty
if ( if
(builtins.hasAttr "deploy" self) && (
(self.deploy != { }) (builtins.hasAttr "deploy" self)
) then && (self.deploy != {})
let )
deployChecks = deploy.lib.${system}.deployChecks self.deploy; then let
renameOp = n: v: { name = "deploy-" + n; value = deployChecks.${n}; }; deployChecks = deploy.lib.${system}.deployChecks self.deploy;
in renameOp = n: v: {
name = "deploy-" + n;
value = deployChecks.${n};
};
in
lib.mapAttrs' renameOp deployChecks lib.mapAttrs' renameOp deployChecks
else { } else {}
) )
// // (
(
# for self.nixosConfigurations if present & non-empty # for self.nixosConfigurations if present & non-empty
if ( if
(builtins.hasAttr "nixosConfigurations" self) && (
(self.nixosConfigurations != { }) (builtins.hasAttr "nixosConfigurations" self)
) then && (self.nixosConfigurations != {})
let )
systemSieve = _: host: host.config.nixpkgs.system == system; then let
hostConfigsOnThisSystem = lib.filterAttrs systemSieve self.nixosConfigurations; systemSieve = _: host: host.config.nixpkgs.system == system;
hostConfigsOnThisSystem = lib.filterAttrs systemSieve self.nixosConfigurations;
createCustomTestOp = n: host: test: createCustomTestOp = n: host: test:
lib.warnIf (!(test ? name)) '' lib.warnIf (!(test ? name)) ''
'${n}' has a test without a name. To distinguish tests in the flake output '${n}' has a test without a name. To distinguish tests in the flake output
all nixos tests must have names. all nixos tests must have names.
'' ''
{ {
name = "customTestFor-${n}-${test.name}"; name = "customTestFor-${n}-${test.name}";
value = tests.mkTest host test; value = tests.mkTest host test;
}; };
createCustomTestsOp = n: host:
let
op = createCustomTestOp n host;
in
builtins.listToAttrs (map op config.nixos.hosts.${n}.tests);
customTests =
if (hostConfigsOnThisSystem != [ ])
then lib.foldl (a: b: a // b) { } (lib.attrValues (lib.mapAttrs createCustomTestsOp hostConfigsOnThisSystem))
else { };
createCustomTestsOp = n: host: let
op = createCustomTestOp n host;
in in
customTests builtins.listToAttrs (map op config.nixos.hosts.${n}.tests);
else { }
)
;
customTests =
if (hostConfigsOnThisSystem != [])
then lib.foldl (a: b: a // b) {} (lib.attrValues (lib.mapAttrs createCustomTestsOp hostConfigsOnThisSystem))
else {};
in
customTests
else {}
);
} }

View File

@ -1,39 +1,44 @@
{ lib }: {lib}: {
{ hmNixosDefaults = {
hmNixosDefaults = { specialArgs, modules }: specialArgs,
{ options, ... }: { modules,
config = lib.optionalAttrs (options ? home-manager) { }: {options, ...}: {
home-manager = { config = lib.optionalAttrs (options ? home-manager) {
# always use the system nixpkgs from the host's channel home-manager = {
useGlobalPkgs = true; # always use the system nixpkgs from the host's channel
# and use the possible future default (see manual) useGlobalPkgs = true;
useUserPackages = lib.mkDefault true; # and use the possible future default (see manual)
useUserPackages = lib.mkDefault true;
extraSpecialArgs = specialArgs; extraSpecialArgs = specialArgs;
sharedModules = modules; sharedModules = modules;
};
}; };
}; };
};
globalDefaults = { hmUsers }: globalDefaults = {hmUsers}: {
{ config, pkgs, self, ... }: { config,
users.mutableUsers = lib.mkDefault false; pkgs,
self,
...
}: {
users.mutableUsers = lib.mkDefault false;
hardware.enableRedistributableFirmware = lib.mkDefault true; hardware.enableRedistributableFirmware = lib.mkDefault true;
# digga lib can be accessed in modules directly as config.lib.digga # digga lib can be accessed in modules directly as config.lib.digga
lib = { lib = {
inherit (pkgs.lib) digga; inherit (pkgs.lib) digga;
};
_module.args = {
inherit hmUsers;
hosts = throw ''
The `hosts` module argument has been removed, you should instead use
`self.nixosConfigurations`, with the `self` module argument.
'';
};
system.configurationRevision = lib.mkIf (self ? rev) self.rev;
}; };
_module.args = {
inherit hmUsers;
hosts = throw ''
The `hosts` module argument has been removed, you should instead use
`self.nixosConfigurations`, with the `self` module argument.
'';
};
system.configurationRevision = lib.mkIf (self ? rev) self.rev;
};
} }

View File

@ -1,42 +1,35 @@
{ lib }: {lib}: let
let
maybeImport = obj: maybeImport = obj:
if (builtins.isPath obj || builtins.isString obj) then if (builtins.isPath obj || builtins.isString obj)
import obj then import obj
else obj else obj;
;
maybeCallTest = pkgs: obj: maybeCallTest = pkgs: obj:
if lib.isFunction obj then if lib.isFunction obj
pkgs.callPackage obj { } then pkgs.callPackage obj {}
else obj else obj;
;
mkTest = host: test: let
mkTest = host: test: pkgs = host._module.args.pkgs;
let nixosTesting = import "${toString pkgs.path}/nixos/lib/testing-python.nix" {
pkgs = host._module.args.pkgs; inherit pkgs;
nixosTesting = inherit (pkgs) system;
(import "${toString pkgs.path}/nixos/lib/testing-python.nix" { inherit (host.config.lib) specialArgs;
inherit pkgs; extraConfigurations = host._module.args.modules;
inherit (pkgs) system; };
inherit (host.config.lib) specialArgs; in
extraConfigurations = host._module.args.modules;
});
in
nixosTesting.makeTest (maybeCallTest pkgs (maybeImport test)); nixosTesting.makeTest (maybeCallTest pkgs (maybeImport test));
allProfilesTest = { allProfilesTest = {
name = "allProfiles"; name = "allProfiles";
machine = { suites ? null, ... }: { machine = {suites ? null, ...}: {
imports = imports = let
let allProfiles =
allProfiles = lib.foldl lib.foldl
(lhs: rhs: lhs ++ rhs) [ ] (lhs: rhs: lhs ++ rhs) []
(builtins.attrValues suites); (builtins.attrValues suites);
in in
allProfiles; allProfiles;
}; };
@ -44,5 +37,4 @@ let
machines[0].systemctl("is-system-running --wait") machines[0].systemctl("is-system-running --wait")
''; '';
}; };
in in {inherit mkTest allProfilesTest;}
{ inherit mkTest allProfilesTest; }