From 82c8cb4b1fbc760956ff3a651b73838ad7e0bda8 Mon Sep 17 00:00:00 2001 From: matt1432 Date: Mon, 6 Jan 2025 14:41:55 -0500 Subject: [PATCH] refactor: some nix code cleanups --- .../bbsteamie/modules/desktop/steam.nix | 8 +- configurations/cluster/default.nix | 121 ++++--- .../cluster/modules/caddy/default.nix | 4 +- .../cluster/modules/headscale/completion.bash | 338 ------------------ configurations/cluster/modules/unbound.nix | 11 +- .../homie/modules/home-assistant/frontend.nix | 6 +- homeManagerModules/firefox/default.nix | 4 +- homeManagerModules/neovim/langs/default.nix | 96 +++-- .../neovim/langs/web/default.nix | 13 +- homeManagerModules/shell/misc/default.nix | 4 +- lib/attrs/default.nix | 23 +- lib/default.nix | 2 +- lib/flake/default.nix | 3 +- modules/ags/packages.nix | 17 +- modules/base/locale/default.nix | 21 +- modules/base/packages/default.nix | 214 +++++------ modules/borgbackup/module.nix | 4 +- modules/desktop/environment/default.nix | 48 +-- modules/desktop/environment/home/mpv.nix | 4 +- .../desktop/environment/modules/dolphin.nix | 4 +- .../desktop/environment/modules/packages.nix | 148 ++++---- .../desktop/environment/modules/printer.nix | 4 +- modules/kmscon/default.nix | 6 +- modules/nvidia/default.nix | 4 +- 24 files changed, 392 insertions(+), 715 deletions(-) delete mode 100644 configurations/cluster/modules/headscale/completion.bash diff --git a/configurations/bbsteamie/modules/desktop/steam.nix b/configurations/bbsteamie/modules/desktop/steam.nix index cc9fc4fb..9df55e4e 100644 --- a/configurations/bbsteamie/modules/desktop/steam.nix +++ b/configurations/bbsteamie/modules/desktop/steam.nix @@ -5,7 +5,9 @@ defaultSession: { pkgs, self, ... -}: { +}: let + inherit (lib) attrValues makeSearchPathOutput; +in { config = { # Normal Steam Stuff programs.steam = { @@ -27,7 +29,7 @@ defaultSession: { environment = { STEAM_EXTRA_COMPAT_TOOLS_PATHS = - lib.makeSearchPathOutput + makeSearchPathOutput "steamcompattool" "" config.programs.steam.extraCompatPackages; @@ -43,7 +45,7 @@ defaultSession: { stateDir = "/home/${mainUser}/.local/share/decky"; # Keep scoped to user # https://github.com/Jovian-Experiments/Jovian-NixOS/blob/1171169117f63f1de9ef2ea36efd8dcf377c6d5a/modules/decky-loader.nix#L80-L84 - extraPackages = builtins.attrValues { + extraPackages = attrValues { inherit (pkgs) curl diff --git a/configurations/cluster/default.nix b/configurations/cluster/default.nix index 0f96f0da..8a7d4eaf 100644 --- a/configurations/cluster/default.nix +++ b/configurations/cluster/default.nix @@ -19,74 +19,79 @@ in { self.nixosModules.server ]; - # State Version: DO NOT CHANGE - system.stateVersion = "24.05"; + config = { + # State Version: DO NOT CHANGE + system.stateVersion = "24.05"; - # ------------------------------------------------ - # User Settings - # ------------------------------------------------ - users.users.${mainUser} = { - isNormalUser = true; - extraGroups = [ - "wheel" - "adm" - ]; - }; + # ------------------------------------------------ + # User Settings + # ------------------------------------------------ + users.users.${mainUser} = { + isNormalUser = true; + extraGroups = [ + "wheel" + "adm" + ]; + }; - networking = { - hostName = deviceName; - resolvconf.enable = true; - nameservers = [ - clusterIP - "1.0.0.1" - ]; - extraHosts = '' - 10.0.0.244 thingone - 10.0.0.159 thingtwo - ''; - firewall.enable = false; - }; + networking = { + hostName = deviceName; + resolvconf.enable = true; + nameservers = [ + clusterIP + "1.0.0.1" + ]; + extraHosts = '' + 10.0.0.244 thingone + 10.0.0.159 thingtwo + ''; + firewall.enable = false; + }; - time.timeZone = "America/Montreal"; + time.timeZone = "America/Montreal"; - # ------------------------------------------------ - # `Self` Modules configuration - # ------------------------------------------------ - roles.base = { - enable = true; - user = mainUser; - }; + # ------------------------------------------------ + # `Self` Modules configuration + # ------------------------------------------------ + roles.base = { + enable = true; + user = mainUser; + }; - roles.server = { - enable = true; - user = mainUser; - tailscale.enable = true; - sshd.enable = true; - }; + roles.server = { + enable = true; + user = mainUser; + tailscale.enable = true; + sshd.enable = true; + }; - services.kmscon.enable = true; + services.kmscon.enable = true; - home-manager.users.${mainUser} = { - imports = [ - self.homeManagerModules.neovim - self.homeManagerModules.shell - ]; + home-manager.users.${mainUser} = { + imports = [ + self.homeManagerModules.neovim + self.homeManagerModules.shell + ]; - programs = { - bash = { - enable = true; - promptMainColor = - if deviceName == "thingone" - then "green" - else if deviceName == "thingtwo" - then "red" - else "purple"; - }; + programs = { + bash = { + enable = true; + promptMainColor = + if deviceName == "thingone" + then "green" + else if deviceName == "thingtwo" + then "red" + else "purple"; + }; - neovim = { - enable = true; - user = mainUser; + neovim = { + enable = true; + user = mainUser; + }; }; }; }; + + # For accurate stack trace + _file = ./default.nix; } diff --git a/configurations/cluster/modules/caddy/default.nix b/configurations/cluster/modules/caddy/default.nix index c7b7601e..39ab0a9c 100644 --- a/configurations/cluster/modules/caddy/default.nix +++ b/configurations/cluster/modules/caddy/default.nix @@ -6,7 +6,7 @@ self, ... }: let - inherit (lib) attrValues; + inherit (lib) attrValues removeAttrs; inherit (config.sops) secrets; inherit (config.networking) hostName; @@ -53,7 +53,7 @@ in { listenAddresses = [clusterIP]; extraConfig = tlsConf + (extraConf.extraConfig or ""); } - // (builtins.removeAttrs extraConf ["extraConfig"]); + // (removeAttrs extraConf ["extraConfig"]); in { # Public "Home-Assistant" = mkPublicReverseProxy "homie" "${homieIP}:8123" {}; diff --git a/configurations/cluster/modules/headscale/completion.bash b/configurations/cluster/modules/headscale/completion.bash deleted file mode 100644 index ed608597..00000000 --- a/configurations/cluster/modules/headscale/completion.bash +++ /dev/null @@ -1,338 +0,0 @@ -# bash completion V2 for headscale -*- shell-script -*- - -__headscale_debug() -{ - if [[ -n ${BASH_COMP_DEBUG_FILE-} ]]; then - echo "$*" >> "${BASH_COMP_DEBUG_FILE}" - fi -} - -# Macs have bash3 for which the bash-completion package doesn't include -# _init_completion. This is a minimal version of that function. -__headscale_init_completion() -{ - COMPREPLY=() - _get_comp_words_by_ref "$@" cur prev words cword -} - -# This function calls the headscale program to obtain the completion -# results and the directive. It fills the 'out' and 'directive' vars. -__headscale_get_completion_results() { - local requestComp lastParam lastChar args - - # Prepare the command to request completions for the program. - # Calling ${words[0]} instead of directly headscale allows handling aliases - args=("${words[@]:1}") - requestComp="${words[0]} __complete ${args[*]}" - - lastParam=${words[$((${#words[@]}-1))]} - lastChar=${lastParam:$((${#lastParam}-1)):1} - __headscale_debug "lastParam ${lastParam}, lastChar ${lastChar}" - - if [[ -z ${cur} && ${lastChar} != = ]]; then - # If the last parameter is complete (there is a space following it) - # We add an extra empty parameter so we can indicate this to the go method. - __headscale_debug "Adding extra empty parameter" - requestComp="${requestComp} ''" - fi - - # When completing a flag with an = (e.g., headscale -n=) - # bash focuses on the part after the =, so we need to remove - # the flag part from $cur - if [[ ${cur} == -*=* ]]; then - cur="${cur#*=}" - fi - - __headscale_debug "Calling ${requestComp}" - # Use eval to handle any environment variables and such - out=$(eval "${requestComp}" 2>/dev/null) - - # Extract the directive integer at the very end of the output following a colon (:) - directive=${out##*:} - # Remove the directive - out=${out%:*} - if [[ ${directive} == "${out}" ]]; then - # There is not directive specified - directive=0 - fi - __headscale_debug "The completion directive is: ${directive}" - __headscale_debug "The completions are: ${out}" -} - -__headscale_process_completion_results() { - local shellCompDirectiveError=1 - local shellCompDirectiveNoSpace=2 - local shellCompDirectiveNoFileComp=4 - local shellCompDirectiveFilterFileExt=8 - local shellCompDirectiveFilterDirs=16 - local shellCompDirectiveKeepOrder=32 - - if (((directive & shellCompDirectiveError) != 0)); then - # Error code. No completion. - __headscale_debug "Received error from custom completion go code" - return - else - if (((directive & shellCompDirectiveNoSpace) != 0)); then - if [[ $(type -t compopt) == builtin ]]; then - __headscale_debug "Activating no space" - compopt -o nospace - else - __headscale_debug "No space directive not supported in this version of bash" - fi - fi - if (((directive & shellCompDirectiveKeepOrder) != 0)); then - if [[ $(type -t compopt) == builtin ]]; then - # no sort isn't supported for bash less than < 4.4 - if [[ ${BASH_VERSINFO[0]} -lt 4 || ( ${BASH_VERSINFO[0]} -eq 4 && ${BASH_VERSINFO[1]} -lt 4 ) ]]; then - __headscale_debug "No sort directive not supported in this version of bash" - else - __headscale_debug "Activating keep order" - compopt -o nosort - fi - else - __headscale_debug "No sort directive not supported in this version of bash" - fi - fi - if (((directive & shellCompDirectiveNoFileComp) != 0)); then - if [[ $(type -t compopt) == builtin ]]; then - __headscale_debug "Activating no file completion" - compopt +o default - else - __headscale_debug "No file completion directive not supported in this version of bash" - fi - fi - fi - - # Separate activeHelp from normal completions - local completions=() - local activeHelp=() - __headscale_extract_activeHelp - - if (((directive & shellCompDirectiveFilterFileExt) != 0)); then - # File extension filtering - local fullFilter filter filteringCmd - - # Do not use quotes around the $completions variable or else newline - # characters will be kept. - for filter in ${completions[*]}; do - fullFilter+="$filter|" - done - - filteringCmd="_filedir $fullFilter" - __headscale_debug "File filtering command: $filteringCmd" - $filteringCmd - elif (((directive & shellCompDirectiveFilterDirs) != 0)); then - # File completion for directories only - - local subdir - subdir=${completions[0]} - if [[ -n $subdir ]]; then - __headscale_debug "Listing directories in $subdir" - pushd "$subdir" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 || return - else - __headscale_debug "Listing directories in ." - _filedir -d - fi - else - __headscale_handle_completion_types - fi - - __headscale_handle_special_char "$cur" : - __headscale_handle_special_char "$cur" = - - # Print the activeHelp statements before we finish - if ((${#activeHelp[*]} != 0)); then - printf "\n"; - printf "%s\n" "${activeHelp[@]}" - printf "\n" - - # The prompt format is only available from bash 4.4. - # We test if it is available before using it. - if (x=${PS1@P}) 2> /dev/null; then - printf "%s" "${PS1@P}${COMP_LINE[@]}" - else - # Can't print the prompt. Just print the - # text the user had typed, it is workable enough. - printf "%s" "${COMP_LINE[@]}" - fi - fi -} - -# Separate activeHelp lines from real completions. -# Fills the $activeHelp and $completions arrays. -__headscale_extract_activeHelp() { - local activeHelpMarker="_activeHelp_ " - local endIndex=${#activeHelpMarker} - - while IFS='' read -r comp; do - if [[ ${comp:0:endIndex} == $activeHelpMarker ]]; then - comp=${comp:endIndex} - __headscale_debug "ActiveHelp found: $comp" - if [[ -n $comp ]]; then - activeHelp+=("$comp") - fi - else - # Not an activeHelp line but a normal completion - completions+=("$comp") - fi - done <<<"${out}" -} - -__headscale_handle_completion_types() { - __headscale_debug "__headscale_handle_completion_types: COMP_TYPE is $COMP_TYPE" - - case $COMP_TYPE in - 37|42) - # Type: menu-complete/menu-complete-backward and insert-completions - # If the user requested inserting one completion at a time, or all - # completions at once on the command-line we must remove the descriptions. - # https://github.com/spf13/cobra/issues/1508 - local tab=$'\t' comp - while IFS='' read -r comp; do - [[ -z $comp ]] && continue - # Strip any description - comp=${comp%%$tab*} - # Only consider the completions that match - if [[ $comp == "$cur"* ]]; then - COMPREPLY+=("$comp") - fi - done < <(printf "%s\n" "${completions[@]}") - ;; - - *) - # Type: complete (normal completion) - __headscale_handle_standard_completion_case - ;; - esac -} - -__headscale_handle_standard_completion_case() { - local tab=$'\t' comp - - # Short circuit to optimize if we don't have descriptions - if [[ "${completions[*]}" != *$tab* ]]; then - IFS=$'\n' read -ra COMPREPLY -d '' < <(compgen -W "${completions[*]}" -- "$cur") - return 0 - fi - - local longest=0 - local compline - # Look for the longest completion so that we can format things nicely - while IFS='' read -r compline; do - [[ -z $compline ]] && continue - # Strip any description before checking the length - comp=${compline%%$tab*} - # Only consider the completions that match - [[ $comp == "$cur"* ]] || continue - COMPREPLY+=("$compline") - if ((${#comp}>longest)); then - longest=${#comp} - fi - done < <(printf "%s\n" "${completions[@]}") - - # If there is a single completion left, remove the description text - if ((${#COMPREPLY[*]} == 1)); then - __headscale_debug "COMPREPLY[0]: ${COMPREPLY[0]}" - comp="${COMPREPLY[0]%%$tab*}" - __headscale_debug "Removed description from single completion, which is now: ${comp}" - COMPREPLY[0]=$comp - else # Format the descriptions - __headscale_format_comp_descriptions $longest - fi -} - -__headscale_handle_special_char() -{ - local comp="$1" - local char=$2 - if [[ "$comp" == *${char}* && "$COMP_WORDBREAKS" == *${char}* ]]; then - local word=${comp%"${comp##*${char}}"} - local idx=${#COMPREPLY[*]} - while ((--idx >= 0)); do - COMPREPLY[idx]=${COMPREPLY[idx]#"$word"} - done - fi -} - -__headscale_format_comp_descriptions() -{ - local tab=$'\t' - local comp desc maxdesclength - local longest=$1 - - local i ci - for ci in ${!COMPREPLY[*]}; do - comp=${COMPREPLY[ci]} - # Properly format the description string which follows a tab character if there is one - if [[ "$comp" == *$tab* ]]; then - __headscale_debug "Original comp: $comp" - desc=${comp#*$tab} - comp=${comp%%$tab*} - - # $COLUMNS stores the current shell width. - # Remove an extra 4 because we add 2 spaces and 2 parentheses. - maxdesclength=$(( COLUMNS - longest - 4 )) - - # Make sure we can fit a description of at least 8 characters - # if we are to align the descriptions. - if ((maxdesclength > 8)); then - # Add the proper number of spaces to align the descriptions - for ((i = ${#comp} ; i < longest ; i++)); do - comp+=" " - done - else - # Don't pad the descriptions so we can fit more text after the completion - maxdesclength=$(( COLUMNS - ${#comp} - 4 )) - fi - - # If there is enough space for any description text, - # truncate the descriptions that are too long for the shell width - if ((maxdesclength > 0)); then - if ((${#desc} > maxdesclength)); then - desc=${desc:0:$(( maxdesclength - 1 ))} - desc+="…" - fi - comp+=" ($desc)" - fi - COMPREPLY[ci]=$comp - __headscale_debug "Final comp: $comp" - fi - done -} - -__start_headscale() -{ - local cur prev words cword split - - COMPREPLY=() - - # Call _init_completion from the bash-completion package - # to prepare the arguments properly - if declare -F _init_completion >/dev/null 2>&1; then - _init_completion -n =: || return - else - __headscale_init_completion -n =: || return - fi - - __headscale_debug - __headscale_debug "========= starting completion logic ==========" - __headscale_debug "cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}, cword is $cword" - - # The user could have moved the cursor backwards on the command-line. - # We need to trigger completion from the $cword location, so we need - # to truncate the command-line ($words) up to the $cword location. - words=("${words[@]:0:$cword+1}") - __headscale_debug "Truncated words[*]: ${words[*]}," - - local out directive - __headscale_get_completion_results - __headscale_process_completion_results -} - -if [[ $(type -t compopt) = "builtin" ]]; then - complete -o default -F __start_headscale headscale -else - complete -o default -o nospace -F __start_headscale headscale -fi - -# ex: ts=4 sw=4 et filetype=sh diff --git a/configurations/cluster/modules/unbound.nix b/configurations/cluster/modules/unbound.nix index b64a7201..f8ceb08a 100644 --- a/configurations/cluster/modules/unbound.nix +++ b/configurations/cluster/modules/unbound.nix @@ -2,15 +2,12 @@ config, lib, mainUser, + self, ... }: let - inherit (lib) foldl isList mapAttrsToList mergeAttrsWithFunc remove unique; - mergeAttrsList = list: - foldl (mergeAttrsWithFunc (a: b: - if isList a && isList b - then unique (a ++ b) - else b)) {} - list; + inherit (self.lib) mergeAttrsList; + + inherit (lib) mapAttrsToList remove; inherit (config.networking) hostName; diff --git a/configurations/homie/modules/home-assistant/frontend.nix b/configurations/homie/modules/home-assistant/frontend.nix index 9f8bc929..fd6d96ad 100644 --- a/configurations/homie/modules/home-assistant/frontend.nix +++ b/configurations/homie/modules/home-assistant/frontend.nix @@ -7,7 +7,7 @@ self, ... }: let - inherit (lib) singleton; + inherit (lib) attrValues singleton; inherit (pkgs.writers) writeYAML; in { services.home-assistant = { @@ -81,14 +81,14 @@ in { }; }; - customComponents = builtins.attrValues { + customComponents = attrValues { inherit (self.scopedPackages.${pkgs.system}.hass-components) material-symbols ; }; - customLovelaceModules = builtins.attrValues { + customLovelaceModules = attrValues { inherit (pkgs.home-assistant-custom-lovelace-modules) card-mod diff --git a/homeManagerModules/firefox/default.nix b/homeManagerModules/firefox/default.nix index be09e9b3..a207ba00 100644 --- a/homeManagerModules/firefox/default.nix +++ b/homeManagerModules/firefox/default.nix @@ -6,7 +6,7 @@ self: { }: let inherit (self.scopedPackages.${pkgs.system}) firefoxAddons; - inherit (lib) mkIf mkOption types; + inherit (lib) attrValues mkIf mkOption types; cfg = config.programs.firefox; @@ -205,7 +205,7 @@ in { ]; }; - extensions = builtins.attrValues { + extensions = attrValues { inherit (firefoxAddons) auto-refresh-page diff --git a/homeManagerModules/neovim/langs/default.nix b/homeManagerModules/neovim/langs/default.nix index 63b50cbc..62826ab3 100644 --- a/homeManagerModules/neovim/langs/default.nix +++ b/homeManagerModules/neovim/langs/default.nix @@ -7,7 +7,7 @@ self: { inherit (self.inputs) nix-develop-nvim-src; inherit (self.lib.${pkgs.system}) mkVersion; - inherit (lib) fileContents mkBefore mkIf; + inherit (lib) attrValues fileContents mkBefore mkIf; cfg = config.programs.neovim; in { @@ -59,58 +59,56 @@ in { }); ''; - plugins = - (builtins.attrValues { - inherit - (pkgs.vimPlugins) - # lsp plugins - nvim-lspconfig - lsp-status-nvim - # completion plugins - cmp-buffer - cmp-nvim-lsp - cmp-path - cmp-spell - vim-vsnip - ; - }) - ++ [ - (pkgs.vimPlugins.nix-develop-nvim.overrideAttrs (o: { - name = "vimplugin-${o.pname}-${mkVersion nix-develop-nvim-src}"; - src = nix-develop-nvim-src; - })) + plugins = attrValues { + inherit + (pkgs.vimPlugins) + # lsp plugins + nvim-lspconfig + lsp-status-nvim + # completion plugins + cmp-buffer + cmp-nvim-lsp + cmp-path + cmp-spell + vim-vsnip + ; - { - plugin = pkgs.vimPlugins.nvim-cmp; - type = "lua"; - config = fileContents ./config/cmp.lua; - } + nix-develop-nvim = pkgs.vimPlugins.nix-develop-nvim.overrideAttrs (o: { + name = "vimplugin-${o.pname}-${mkVersion nix-develop-nvim-src}"; + src = nix-develop-nvim-src; + }); - { - plugin = pkgs.vimPlugins.nvim-autopairs; - type = "lua"; - config = - # lua - '' - require('nvim-autopairs').setup({}); - ''; - } + nvim-cmp = { + plugin = pkgs.vimPlugins.nvim-cmp; + type = "lua"; + config = fileContents ./config/cmp.lua; + }; - { - plugin = pkgs.vimPlugins.lsp_lines-nvim; - type = "lua"; - config = - # lua - '' - -- Disable virtual_text since it's redundant due to lsp_lines. - vim.diagnostic.config({ - virtual_text = false, - }); + nvim-autopairs = { + plugin = pkgs.vimPlugins.nvim-autopairs; + type = "lua"; + config = + # lua + '' + require('nvim-autopairs').setup({}); + ''; + }; - require('lsp_lines').setup(); - ''; - } - ]; + lsp-lines = { + plugin = pkgs.vimPlugins.lsp_lines-nvim; + type = "lua"; + config = + # lua + '' + -- Disable virtual_text since it's redundant due to lsp_lines. + vim.diagnostic.config({ + virtual_text = false, + }); + + require('lsp_lines').setup(); + ''; + }; + }; }; }; diff --git a/homeManagerModules/neovim/langs/web/default.nix b/homeManagerModules/neovim/langs/web/default.nix index 51b0ea88..2a145c15 100644 --- a/homeManagerModules/neovim/langs/web/default.nix +++ b/homeManagerModules/neovim/langs/web/default.nix @@ -25,14 +25,13 @@ in { local default_capabilities = require('cmp_nvim_lsp').default_capabilities(); local loadDevShell = function() + if (devShells['web'] == nil) then + devShells['web'] = 1; - if (devShells['web'] == nil) then - devShells['web'] = 1; - - require('nix-develop').nix_develop({'${flakeEnv}#web'}, function() - vim.cmd[[LspStart]]; - end); - end + require('nix-develop').nix_develop({'${flakeEnv}#web'}, function() + vim.cmd[[LspStart]]; + end); + end end; vim.api.nvim_create_autocmd('FileType', { diff --git a/homeManagerModules/shell/misc/default.nix b/homeManagerModules/shell/misc/default.nix index 28c7603b..42aa4353 100644 --- a/homeManagerModules/shell/misc/default.nix +++ b/homeManagerModules/shell/misc/default.nix @@ -4,7 +4,7 @@ self: { pkgs, ... }: let - inherit (lib) mkIf; + inherit (lib) attrValues mkIf; cfg = config.programs.bash; in { @@ -50,7 +50,7 @@ in { config.theme = "dracula-bat"; themes.dracula-bat.src = self.scopedPackages.${pkgs.system}.dracula.bat; - extraPackages = builtins.attrValues { + extraPackages = attrValues { inherit (pkgs.bat-extras) batman; }; }; diff --git a/lib/attrs/default.nix b/lib/attrs/default.nix index 5b78eb9d..546a70e2 100644 --- a/lib/attrs/default.nix +++ b/lib/attrs/default.nix @@ -1,9 +1,20 @@ -{...}: let - inherit (builtins) hasAttr isAttrs tryEval; - inputsLib = import ../../inputs/lib.nix; -in { - inherit (inputsLib) recursiveUpdateList; +{ + foldl, + hasAttr, + isAttrs, + isList, + mergeAttrsWithFunc, + unique, + ... +}: { + inherit (import ../../inputs/lib.nix) recursiveUpdateList; - throws = x: !(tryEval x).success; + throws = x: !(builtins.tryEval x).success; hasVersion = x: isAttrs x && hasAttr "version" x; + mergeAttrsList = list: + foldl (mergeAttrsWithFunc (a: b: + if isList a && isList b + then unique (a ++ b) + else b)) {} + list; } diff --git a/lib/default.nix b/lib/default.nix index 432dce25..6e459e00 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -2,7 +2,7 @@ perSystem, inputs, }: let - attrs = import ./attrs {}; + attrs = import ./attrs inputs.nixpkgs.lib; flake = import ./flake inputs; hypr = import ./hypr inputs.nixpkgs.lib; strings = import ./strings inputs.nixpkgs.lib; diff --git a/lib/flake/default.nix b/lib/flake/default.nix index e9f581f8..73abea47 100644 --- a/lib/flake/default.nix +++ b/lib/flake/default.nix @@ -20,7 +20,8 @@ inputs: rec { inherit cudaSupport; allowUnfree = true; - # FIXME: Roslyn-ls uses dotnet6 https://github.com/NixOS/nixpkgs/blob/d3c42f187194c26d9f0309a8ecc469d6c878ce33/pkgs/by-name/ro/roslyn-ls/package.nix#L21 + # FIXME: Roslyn-ls uses dotnet6 + # https://github.com/NixOS/nixpkgs/blob/d3c42f187194c26d9f0309a8ecc469d6c878ce33/pkgs/by-name/ro/roslyn-ls/package.nix#L21 permittedInsecurePackages = [ "dotnet-core-combined" diff --git a/modules/ags/packages.nix b/modules/ags/packages.nix index 8c7ec3a4..549d186f 100644 --- a/modules/ags/packages.nix +++ b/modules/ags/packages.nix @@ -7,9 +7,6 @@ self: { }: let inherit (self.inputs) ags astal gtk-session-lock kompass; - gtkSessionLock = gtk-session-lock.packages.${pkgs.system}.default; - libKompass = kompass.packages.${pkgs.system}.libkompass; - inherit (lib) attrValues boolToString filter getExe mkIf optionalAttrs optionals; inherit (osConfig.networking) hostName; @@ -23,9 +20,9 @@ self: { runtimeInputs = [cfg.package]; text = '' if [ "$#" == 0 ]; then - exec ags run ~/${cfg.configDir} -a ${hostName} + exec ags run ~/${cfg.configDir} -a ${hostName} else - exec ags "$@" + exec ags "$@" fi ''; }; @@ -56,10 +53,8 @@ in { wireplumber ; - inherit - gtkSessionLock - libKompass - ; + gtkSessionLock = gtk-session-lock.packages.${pkgs.system}.default; + libKompass = kompass.packages.${pkgs.system}.libkompass; # libkompass dependencies inherit @@ -80,9 +75,9 @@ in { runtimeInputs = [cfg.package]; text = '' if [ "$#" == 0 ]; then - exec ags run ~/${cfg.configDir} -a lock + exec ags run ~/${cfg.configDir} -a lock else - exec ags "$@" -i lock + exec ags "$@" -i lock fi ''; }; diff --git a/modules/base/locale/default.nix b/modules/base/locale/default.nix index c0500401..144b4b95 100644 --- a/modules/base/locale/default.nix +++ b/modules/base/locale/default.nix @@ -4,7 +4,7 @@ pkgs, ... }: let - inherit (lib) mkIf; + inherit (lib) attrValues mkIf; cfg = config.roles.base; in { @@ -20,26 +20,31 @@ in { }; }; - packages = with pkgs; - [ + packages = attrValues { + jetbrainsMono = pkgs.jetbrains-mono; + jetbrainsMonoNF = pkgs.nerd-fonts.jetbrains-mono; + + inherit + (pkgs) noto-fonts noto-fonts-cjk-sans noto-fonts-emoji liberation_ttf font-awesome meslo-lgs-nf - jetbrains-mono ubuntu_font_family - ] - ++ (with pkgs.nerd-fonts; [ - jetbrains-mono + ; + + inherit + (pkgs.nerd-fonts) go-mono iosevka symbols-only space-mono ubuntu noto - ]); + ; + }; }; # Select internationalisation properties. diff --git a/modules/base/packages/default.nix b/modules/base/packages/default.nix index c9ec318c..5efc9289 100644 --- a/modules/base/packages/default.nix +++ b/modules/base/packages/default.nix @@ -4,7 +4,7 @@ self: { pkgs, ... }: let - inherit (lib) attrValues makeBinPath mkIf optional; + inherit (lib) attrValues makeBinPath mkIf remove; cfg = config.roles.base; in { @@ -22,115 +22,117 @@ in { ; }); - environment.systemPackages = - (optional (cfg.user != "nixos") (self.inputs.nurl.packages.${pkgs.system}.default.overrideAttrs { - postInstall = '' - wrapProgram $out/bin/nurl \ - --prefix PATH : ${makeBinPath [ - (config.home-manager.users.${cfg.user}.programs.git.package or pkgs.gitMinimal) - (config.nix.package or pkgs.nix) - pkgs.mercurial - ]} - installManPage artifacts/nurl.1 - installShellCompletion artifacts/nurl.{bash,fish} --zsh artifacts/_nurl + environment.systemPackages = remove null (attrValues { + inherit + (self.packages.${pkgs.system}) + pokemon-colorscripts + repl + ; + + nurl = + if (cfg.user != "nixos") + then + self.inputs.nurl.packages.${pkgs.system}.default.overrideAttrs { + postInstall = '' + wrapProgram $out/bin/nurl --prefix PATH : ${makeBinPath [ + (config.home-manager.users.${cfg.user}.programs.git.package or pkgs.gitMinimal) + (config.nix.package or pkgs.nix) + pkgs.mercurial + ]} + installManPage artifacts/nurl.1 + installShellCompletion artifacts/nurl.{bash,fish} --zsh artifacts/_nurl + ''; + } + else null; + + inherit + (pkgs.nodePackages) + undollar + ; + + inherit (pkgs) alejandra; + + # Archiving + inherit + (pkgs) + zip + unzip + p7zip + bzip2 + gzip + gnutar + xz + ; + + # File management + inherit + (pkgs) + findutils + diffutils + util-linux + which + imagemagick + ; + + # Networking + inherit (pkgs.dig) dnsutils; + inherit + (pkgs) + arp-scan + openssh + rsync + wget + gnupg + ; + + # Misc CLI stuff + inherit + (pkgs) + hydra-check + killall + nix-output-monitor + nix-melt + progress + tree + gnugrep + gnused + ; + + # Expected Stuff + inherit + (pkgs) + hostname + man + perl + tzdata + ; + + # TODO: `depOf` program that looks through `nix derivation show -r /run/current-system` + listDerivs = pkgs.writeShellApplication { + name = "listDerivs"; + text = '' + exec nix-store --query --requisites /run/current-system | cut -d- -f2- | sort -u ''; - })) - ++ (attrValues { - inherit - (self.packages.${pkgs.system}) - pokemon-colorscripts - repl - ; + }; - inherit - (pkgs.nodePackages) - undollar - ; + from = pkgs.writeShellApplication { + name = "from"; - inherit (pkgs) alejandra; + runtimeInputs = attrValues { + inherit + (pkgs) + coreutils + which + ; + }; - # Archiving - inherit - (pkgs) - zip - unzip - p7zip - bzip2 - gzip - gnutar - xz - ; - - # File management - inherit - (pkgs) - findutils - diffutils - util-linux - which - imagemagick - ; - - # Networking - inherit (pkgs.dig) dnsutils; - inherit - (pkgs) - arp-scan - openssh - rsync - wget - gnupg - ; - - # Misc CLI stuff - inherit - (pkgs) - hydra-check - killall - nix-output-monitor - nix-melt - progress - tree - gnugrep - gnused - ; - - # Expected Stuff - inherit - (pkgs) - hostname - man - perl - tzdata - ; - }) - ++ [ - # TODO: `depOf` program that looks through `nix derivation show -r /run/current-system` - (pkgs.writeShellApplication { - name = "listDerivs"; - text = '' - exec nix-store --query --requisites /run/current-system | cut -d- -f2- | sort -u - ''; - }) - - (pkgs.writeShellApplication { - name = "from"; - - runtimeInputs = attrValues { - inherit - (pkgs) - coreutils - which - ; - }; - - text = '' - for var do - realpath "$(which "$var")" - done - ''; - }) - ]; + text = '' + for var do + realpath "$(which "$var")" + done + ''; + }; + }); }; # For accurate stack trace diff --git a/modules/borgbackup/module.nix b/modules/borgbackup/module.nix index 3b0eaa95..a22f7c2d 100644 --- a/modules/borgbackup/module.nix +++ b/modules/borgbackup/module.nix @@ -31,7 +31,7 @@ in { default = null; }; dumpCommand = mkOption { - type = with types; nullOr path; + type = types.nullOr types.path; default = null; }; repo = mkOption { @@ -104,7 +104,7 @@ in { default = []; }; readWritePaths = mkOption { - type = with types; listOf path; + type = types.listOf types.path; default = []; }; privateTmp = mkOption { diff --git a/modules/desktop/environment/default.nix b/modules/desktop/environment/default.nix index ad81e899..1162d9d8 100644 --- a/modules/desktop/environment/default.nix +++ b/modules/desktop/environment/default.nix @@ -7,7 +7,7 @@ self: { inherit (self.inputs) hyprland; inherit (self.lib.hypr) mkBind; - inherit (lib) concatStringsSep mkIf optionals; + inherit (lib) attrValues concatStringsSep mkIf optionals; cfg = config.roles.desktop; @@ -210,28 +210,30 @@ in { }; # libs - home.packages = - (builtins.attrValues { - inherit - (pkgs) - bluez-tools - brightnessctl - pulseaudio - alsa-utils - libayatana-appindicator - xdg-utils - evtest - glib - libinput - xclip - libnotify - ; - }) - ++ [ - pkgs.qt5.qtwayland - pkgs.qt6.qtwayland - pkgs.xorg.xrandr - ]; + home.packages = attrValues { + inherit + (pkgs) + bluez-tools + brightnessctl + pulseaudio + alsa-utils + libayatana-appindicator + xdg-utils + evtest + glib + libinput + xclip + libnotify + ; + + qt5Wayland = pkgs.qt5.qtwayland; + qt6Wayland = pkgs.qt6.qtwayland; + + inherit + (pkgs.xorg) + xrandr + ; + }; }; }; diff --git a/modules/desktop/environment/home/mpv.nix b/modules/desktop/environment/home/mpv.nix index cfaf85b9..67f22ee6 100644 --- a/modules/desktop/environment/home/mpv.nix +++ b/modules/desktop/environment/home/mpv.nix @@ -6,7 +6,7 @@ self: { }: let inherit (self.scopedPackages.${pkgs.system}) mpvScripts; - inherit (lib) mkIf; + inherit (lib) attrValues mkIf; cfg = osConfig.roles.desktop; in { @@ -20,7 +20,7 @@ in { enable = true; # https://github.com/mpv-player/mpv/wiki/User-Scripts - scripts = builtins.attrValues { + scripts = attrValues { inherit (mpvScripts) modernx diff --git a/modules/desktop/environment/modules/dolphin.nix b/modules/desktop/environment/modules/dolphin.nix index 6de51fda..852e6fa6 100644 --- a/modules/desktop/environment/modules/dolphin.nix +++ b/modules/desktop/environment/modules/dolphin.nix @@ -4,7 +4,7 @@ pkgs, ... }: let - inherit (lib) mkIf; + inherit (lib) attrValues mkIf; cfg = config.roles.desktop; in { @@ -29,7 +29,7 @@ in { }; }; - home-manager.users.${cfg.user}.home.packages = builtins.attrValues { + home-manager.users.${cfg.user}.home.packages = attrValues { inherit (pkgs) gnome-calculator diff --git a/modules/desktop/environment/modules/packages.nix b/modules/desktop/environment/modules/packages.nix index b01c61e1..61233702 100644 --- a/modules/desktop/environment/modules/packages.nix +++ b/modules/desktop/environment/modules/packages.nix @@ -7,7 +7,7 @@ self: { inherit (self.lib.hypr) mkBind; inherit (self.inputs) jellyfin-flake; - inherit (lib) getExe mkIf optionals; + inherit (lib) attrValues getExe mkIf optionals; inherit (pkgs.writers) writeTOML; cfg = config.roles.desktop; @@ -77,86 +77,84 @@ in { }; }; - home.packages = - (builtins.attrValues { - # School - inherit (pkgs.hunspellDicts) en_CA; - inherit - (pkgs) - xournalpp - virt-manager - libreoffice-fresh # TODO: declarative conf? - hunspell - ; + home.packages = attrValues { + # School + inherit (pkgs.hunspellDicts) en_CA; + inherit + (pkgs) + xournalpp + virt-manager + libreoffice-fresh # TODO: declarative conf? + hunspell + ; - # Apps - inherit - (pkgs) - protonmail-desktop - spotifywm - swayimg - nextcloud-client - prismlauncher - ; + # Apps + inherit + (pkgs) + protonmail-desktop + spotifywm + swayimg + nextcloud-client + prismlauncher + ; - # tools - inherit - (pkgs) - grim-hyprland - wl-color-picker - wl-clipboard - cliphist - slurp - satty - ; - }) - ++ [ - (jellyfin-flake - .packages - .${pkgs.system} - .jellyfin-media-player - .override {isNvidiaWayland = isNvidia;}) + # tools + inherit + (pkgs) + grim-hyprland + wl-color-picker + wl-clipboard + cliphist + slurp + satty + ; - /* - Discord themes for Vencord - https://markchan0225.github.io/RoundedDiscord/RoundedDiscord.theme.css - https://raw.githubusercontent.com/dracula/BetterDiscord/master/Dracula_Official.theme.css - */ - (pkgs.discord.override {withVencord = true;}) - pkgs.vesktop + jellyfinMediaPlayer = + jellyfin-flake + .packages + .${pkgs.system} + .jellyfin-media-player + .override {isNvidiaWayland = isNvidia;}; - # GParted - (let - inherit (pkgs) writeShellScriptBin libsForQt5 gparted makeWrapper symlinkJoin; + /* + Discord themes for Vencord + https://markchan0225.github.io/RoundedDiscord/RoundedDiscord.theme.css + https://raw.githubusercontent.com/dracula/BetterDiscord/master/Dracula_Official.theme.css + */ + discord = pkgs.discord.override {withVencord = true;}; + inherit (pkgs) vesktop; - newWrapper = writeShellScriptBin "Gparted" '' - ( - sleep 1.5 - while killall -r -0 ksshaskpass > /dev/null 2>&1 - do - sleep 0.1 - if [[ $(hyprctl activewindow | grep Ksshaskpass) == "" ]]; then - killall -r ksshaskpass - fi - done - ) & - exec env SUDO_ASKPASS="${libsForQt5.ksshaskpass}/bin/ksshaskpass" sudo -k -EA "${getExe gparted}" "$@" + GParted = let + inherit (pkgs) writeShellScriptBin libsForQt5 gparted makeWrapper symlinkJoin; + + newWrapper = writeShellScriptBin "Gparted" '' + ( + sleep 1.5 + while killall -r -0 ksshaskpass > /dev/null 2>&1 + do + sleep 0.1 + if [[ $(hyprctl activewindow | grep Ksshaskpass) == "" ]]; then + killall -r ksshaskpass + fi + done + ) & + exec env SUDO_ASKPASS="${libsForQt5.ksshaskpass}/bin/ksshaskpass" sudo -k -EA "${getExe gparted}" "$@" + ''; + in + symlinkJoin { + name = "gparted"; + paths = [gparted]; + buildInputs = [makeWrapper]; + postBuild = let + in '' + mkdir $out/.wrapped + mv $out/bin/gparted $out/.wrapped + cp ${getExe newWrapper} $out/bin/gparted + + sed -i "s#Exec.*#Exec=$out/bin/gparted %f#" $out/share/applications/gparted.desktop ''; - in - symlinkJoin { - name = "gparted"; - paths = [gparted]; - buildInputs = [makeWrapper]; - postBuild = let - in '' - mkdir $out/.wrapped - mv $out/bin/gparted $out/.wrapped - cp ${getExe newWrapper} $out/bin/gparted - - sed -i "s#Exec.*#Exec=$out/bin/gparted %f#" $out/share/applications/gparted.desktop - ''; - }) - ]; + }; + }; wayland.windowManager.hyprland = { settings = { diff --git a/modules/desktop/environment/modules/printer.nix b/modules/desktop/environment/modules/printer.nix index c030f2fe..2bae944f 100644 --- a/modules/desktop/environment/modules/printer.nix +++ b/modules/desktop/environment/modules/printer.nix @@ -4,7 +4,7 @@ pkgs, ... }: let - inherit (lib) mkIf; + inherit (lib) attrValues mkIf; cfg = config.roles.desktop; in { @@ -14,7 +14,7 @@ in { printing = { enable = true; - drivers = builtins.attrValues { + drivers = attrValues { inherit (pkgs) hplip diff --git a/modules/kmscon/default.nix b/modules/kmscon/default.nix index 367b1666..c4322866 100644 --- a/modules/kmscon/default.nix +++ b/modules/kmscon/default.nix @@ -3,7 +3,7 @@ lib, ... }: let - inherit (lib) elemAt mkIf mkOption types; + inherit (lib) concatStringsSep elemAt mkIf mkOption types; cfg = config.services.kmscon; in { @@ -29,8 +29,8 @@ in { useXkbConfig = true; hwRender = false; - # FIXME: https://github.com/Aetf/kmscon/issues/18 // Icons not rendering properly - extraOptions = builtins.concatStringsSep " " [ + # FIXME: https://github.com/Aetf/kmscon/issues/18 Icons not rendering properly + extraOptions = concatStringsSep " " [ "--font-size ${toString cfg.fontSize}" "--font-dpi ${toString cfg.fontDpi}" "--font-name '${cfg.fontName}'" diff --git a/modules/nvidia/default.nix b/modules/nvidia/default.nix index e65ec984..b9eaa0bd 100644 --- a/modules/nvidia/default.nix +++ b/modules/nvidia/default.nix @@ -4,8 +4,8 @@ pkgs, ... }: let - inherit (builtins) attrValues toJSON; - inherit (lib) mkIf mkEnableOption mkOption optionals optionalString types; + inherit (builtins) toJSON; + inherit (lib) attrValues mkIf mkEnableOption mkOption optionals optionalString types; cfg = config.nvidia; in {