diff --git a/modules/files.nix b/modules/files.nix index b8efd886f..c4978a1ae 100644 --- a/modules/files.nix +++ b/modules/files.nix @@ -1,12 +1,13 @@ { pkgs, config, lib, ... }: with lib; -with import ./lib/dag.nix { inherit lib; }; let cfg = config.home.file; + dag = config.lib.dag; + homeDirectory = config.home.homeDirectory; fileType = (import lib/file-type.nix { @@ -51,7 +52,7 @@ in # This verifies that the links we are about to create will not # overwrite an existing file. - home.activation.checkLinkTargets = dagEntryBefore ["writeBoundary"] ( + home.activation.checkLinkTargets = dag.entryBefore ["writeBoundary"] ( let check = pkgs.writeText "check" '' . ${./lib-bash/color-echo.sh} @@ -107,7 +108,7 @@ in # and a failure during the intermediate state FA ∩ FB will not # result in lost links because this set of links are in both the # source and target generation. - home.activation.linkGeneration = dagEntryAfter ["writeBoundary"] ( + home.activation.linkGeneration = dag.entryAfter ["writeBoundary"] ( let link = pkgs.writeText "link" '' newGenFiles="$1" diff --git a/modules/home-environment.nix b/modules/home-environment.nix index 24f40c74e..b761594ac 100644 --- a/modules/home-environment.nix +++ b/modules/home-environment.nix @@ -1,12 +1,13 @@ { config, lib, pkgs, ... }: with lib; -with import ./lib/dag.nix { inherit lib; }; let cfg = config.home; + dag = config.lib.dag; + languageSubModule = types.submodule { options = { base = mkOption { @@ -241,9 +242,9 @@ in # A dummy entry acting as a boundary between the activation # script's "check" and the "write" phases. - home.activation.writeBoundary = dagEntryAnywhere ""; + home.activation.writeBoundary = dag.entryAnywhere ""; - home.activation.installPackages = dagEntryAfter ["writeBoundary"] '' + home.activation.installPackages = dag.entryAfter ["writeBoundary"] '' $DRY_RUN_CMD nix-env -i ${cfg.path} ''; @@ -253,7 +254,7 @@ in noteEcho Activating ${res.name} ${res.data} ''; - sortedCommands = dagTopoSort cfg.activation; + sortedCommands = dag.topoSort cfg.activation; activationCmds = if sortedCommands ? result then concatStringsSep "\n" (map mkCmd sortedCommands.result) diff --git a/modules/lib/default.nix b/modules/lib/default.nix new file mode 100644 index 000000000..5c273f15d --- /dev/null +++ b/modules/lib/default.nix @@ -0,0 +1,18 @@ +{ lib }: + +{ + dag = + let + d = import ./dag.nix { inherit lib; }; + in + { + empty = d.emptyDag; + isDag = d.isDag; + topoSort = d.dagTopoSort; + map = d.dagMap; + entryAnywhere = d.dagEntryAnywhere; + entryBetween = d.dagEntryBetween; + entryAfter = d.dagEntryAfter; + entryBefore = d.dagEntryBefore; + }; +} diff --git a/modules/modules.nix b/modules/modules.nix index 83cc59294..7fd76147b 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -75,6 +75,7 @@ let config._module.args.baseModules = modules; config._module.args.pkgs = lib.mkDefault pkgs; config._module.check = check; + config.lib = import ./lib { inherit lib; }; config.nixpkgs.system = mkDefault pkgs.system; }; diff --git a/modules/programs/gnome-terminal.nix b/modules/programs/gnome-terminal.nix index fff11a82a..fa3794643 100644 --- a/modules/programs/gnome-terminal.nix +++ b/modules/programs/gnome-terminal.nix @@ -1,12 +1,13 @@ { config, lib, pkgs, ... }: with lib; -with import ../lib/dag.nix { inherit lib; }; let cfg = config.programs.gnome-terminal; + dag = config.lib.dag; + profileColorsSubModule = types.submodule ( { ... }: { options = { @@ -181,7 +182,7 @@ in home.packages = [ pkgs.gnome3.gnome_terminal ]; # The dconf service needs to be installed and prepared. - home.activation.gnomeTerminal = dagEntryAfter ["installPackages"] ( + home.activation.gnomeTerminal = dag.entryAfter ["installPackages"] ( let iniText = toDconfIni (buildIniSet cfg); iniFile = pkgs.writeText "gnome-terminal.ini" iniText; diff --git a/modules/programs/home-manager.nix b/modules/programs/home-manager.nix index b27be1dbc..306b14a21 100644 --- a/modules/programs/home-manager.nix +++ b/modules/programs/home-manager.nix @@ -1,12 +1,13 @@ { config, lib, pkgs, ... }: with lib; -with import ../lib/dag.nix { inherit lib; }; let cfg = config.programs.home-manager; + dag = config.lib.dag; + in { @@ -42,7 +43,7 @@ in # Uninstall manually installed home-manager, if such exists. # Without this a file collision error will be printed. home.activation.uninstallHomeManager = - dagEntryBetween [ "installPackages" ] [ "writeBoundary" ] '' + dag.entryBetween [ "installPackages" ] [ "writeBoundary" ] '' if nix-env -q | grep -q "^home-manager$" ; then $DRY_RUN_CMD nix-env -e home-manager diff --git a/modules/programs/info.nix b/modules/programs/info.nix index 5f75ec927..5884bb19e 100644 --- a/modules/programs/info.nix +++ b/modules/programs/info.nix @@ -21,12 +21,13 @@ { config, lib, pkgs, ... }: with lib; -with import ../lib/dag.nix { inherit lib; }; let cfg = config.programs.info; + dag = config.lib.dag; + # Indexes info files found in this location homeInfoPath = "$HOME/.nix-profile/share/info"; @@ -63,7 +64,7 @@ in home.sessionVariables.INFOPATH = "${cfg.homeInfoDirLocation}\${INFOPATH:+:}\${INFOPATH}"; - home.activation.createHomeInfoDir = dagEntryAfter ["installPackages"] '' + home.activation.createHomeInfoDir = dag.entryAfter ["installPackages"] '' oPATH=$PATH export PATH="${lib.makeBinPath [ pkgs.gzip ]}''${PATH:+:}$PATH" $DRY_RUN_CMD mkdir -p "${cfg.homeInfoDirLocation}" diff --git a/modules/services/polybar.nix b/modules/services/polybar.nix index 2e24f2a94..b218c6c61 100644 --- a/modules/services/polybar.nix +++ b/modules/services/polybar.nix @@ -1,12 +1,13 @@ { config, lib, pkgs, ... }: with lib; -with import ../lib/dag.nix { inherit lib; }; let cfg = config.services.polybar; + dag = config.lib.dag; + toPolybarIni = generators.toINI { mkKeyValue = key: value: let @@ -131,7 +132,7 @@ in }; }; - home.activation.checkPolybar = dagEntryBefore [ "linkGeneration" ] '' + home.activation.checkPolybar = dag.entryBefore [ "linkGeneration" ] '' if ! cmp --quiet \ "${configFile}" \ "$HOME/.config/polybar/config"; then @@ -139,7 +140,7 @@ in fi ''; - home.activation.applyPolybar = dagEntryAfter [ "reloadSystemD" ] '' + home.activation.applyPolybar = dag.entryAfter [ "reloadSystemD" ] '' if [[ -v polybarChanged && -v DISPLAY ]]; then echo "Restarting polybar" ${config.systemd.user.systemctlPath} --user restart polybar.service diff --git a/modules/services/window-managers/i3.nix b/modules/services/window-managers/i3.nix index 96842788a..a40f7462e 100644 --- a/modules/services/window-managers/i3.nix +++ b/modules/services/window-managers/i3.nix @@ -1,12 +1,13 @@ { config, lib, pkgs, ... }: with lib; -with import ../../lib/dag.nix { inherit lib; }; let cfg = config.xsession.windowManager.i3; + dag = config.lib.dag; + startupModule = types.submodule { options = { command = mkOption { @@ -621,7 +622,7 @@ in xsession.windowManager.command = "${cfg.package}/bin/i3"; xdg.configFile."i3/config".source = configFile; - home.activation.checkI3 = dagEntryBefore [ "linkGeneration" ] '' + home.activation.checkI3 = dag.entryBefore [ "linkGeneration" ] '' if ! cmp --quiet \ "${configFile}" \ "${config.xdg.configHome}/i3/config"; then @@ -629,7 +630,7 @@ in fi ''; - home.activation.reloadI3 = dagEntryAfter [ "linkGeneration" ] '' + home.activation.reloadI3 = dag.entryAfter [ "linkGeneration" ] '' if [[ -v i3Changed && -v DISPLAY ]]; then echo "Reloading i3" ${cfg.package}/bin/i3-msg reload 1>/dev/null diff --git a/modules/services/window-managers/xmonad.nix b/modules/services/window-managers/xmonad.nix index 660a60965..d4643b091 100644 --- a/modules/services/window-managers/xmonad.nix +++ b/modules/services/window-managers/xmonad.nix @@ -1,12 +1,13 @@ { config, lib, pkgs, ... }: with lib; -with import ../../lib/dag.nix { inherit lib; }; let cfg = config.xsession.windowManager.xmonad; + dag = config.lib.dag; + xmonad = pkgs.xmonad-with-packages.override { ghcWithPackages = cfg.haskellPackages.ghcWithPackages; packages = self: @@ -90,13 +91,13 @@ in (mkIf (cfg.config != null) { home.file.".xmonad/xmonad.hs".source = cfg.config; - home.activation.checkXmonad = dagEntryBefore [ "linkGeneration" ] '' + home.activation.checkXmonad = dag.entryBefore [ "linkGeneration" ] '' if ! cmp --quiet "${cfg.config}" "$HOME/.xmonad/xmonad.hs"; then xmonadChanged=1 fi ''; - home.activation.applyXmonad = dagEntryAfter [ "linkGeneration" ] '' + home.activation.applyXmonad = dag.entryAfter [ "linkGeneration" ] '' if [[ -v xmonadChanged ]]; then echo "Recompiling xmonad" ${config.xsession.windowManager.command} --recompile diff --git a/modules/systemd.nix b/modules/systemd.nix index 49ad82a01..3ee5ccc8e 100644 --- a/modules/systemd.nix +++ b/modules/systemd.nix @@ -1,12 +1,13 @@ { config, lib, pkgs, ... }: with lib; -with import ./lib/dag.nix { inherit lib; }; let cfg = config.systemd.user; + dag = config.lib.dag; + enabled = cfg.services != {} || cfg.sockets != {} || cfg.targets != {} @@ -144,7 +145,7 @@ in (buildServices "timer" cfg.timers) ); - home.activation.reloadSystemD = dagEntryAfter ["linkGeneration"] ( + home.activation.reloadSystemD = dag.entryAfter ["linkGeneration"] ( if cfg.startServices then '' PATH=${dirOf cfg.systemctlPath} \