From c3f715d01024da20a91565a3a256451580ef2ee2 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Fri, 11 Apr 2025 17:45:47 -0400 Subject: [PATCH 01/17] Add the install_file module from the steam deck config. --- nix/configuration/configuration.nix | 1 + .../util/install_files/default.nix | 101 ++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 nix/configuration/util/install_files/default.nix diff --git a/nix/configuration/configuration.nix b/nix/configuration/configuration.nix index bf55f68..35e5d7c 100644 --- a/nix/configuration/configuration.nix +++ b/nix/configuration/configuration.nix @@ -74,6 +74,7 @@ ./roles/zfs ./roles/zrepl ./roles/zsh + ./util/install_files ./util/unfree_polyfill ]; diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix new file mode 100644 index 0000000..ce20bf4 --- /dev/null +++ b/nix/configuration/util/install_files/default.nix @@ -0,0 +1,101 @@ +{ + config, + lib, + pkgs, + home-manager, + ... +}: + +let + inherit (lib) + filter + attrNames + ; +in +{ + imports = [ ]; + + options.me = { + install.file = lib.mkOption { + type = lib.types.attrsOf ( + lib.types.submodule ( + { name, config, ... }: + { + options = { + enable = lib.mkOption { + type = lib.types.bool; + default = true; + defaultText = "me.install.file.‹name›.enable"; + example = false; + description = "Whether we want to install this file."; + }; + mode = lib.mkOption { + type = lib.types.str; + default = "0444"; + defaultText = "me.install.file.‹name›.mode"; + example = "0750"; + description = "The read, write, execute permission flags."; + }; + source = lib.mkOption { + type = lib.types.path; + defaultText = "me.install.file.‹name›.source"; + example = ./files/foo.txt; + description = "The source file to install into the destination."; + }; + target = lib.mkOption { + type = lib.types.str; + defaultText = "me.install.file.‹name›.target"; + example = ".local/share/foo/bar.txt"; + description = "The path where the file should be written."; + }; + }; + + config = { + target = lib.mkDefault name; + }; + } + ) + ); + defaultText = "me.install.file.‹name›"; + default = { }; + example = lib.literalExpression '' + { + ".config/foo/bar.txt" = { + source = ./files/bar.txt + }; + } + ''; + }; + }; + + config = lib.mkMerge [ + (lib.mkIf (config.me.install.file != { }) ( + let + cfg = config.me.install.file; + install_file_targets = filter (target: config.me.install.file."${target}".enable) (attrNames cfg); + in + { + home.activation = { + installFiles = home-manager.lib.hm.dag.entryAfter [ "writeBoundary" ] ( + let + install_commands = builtins.map ( + target: + let + target_config = config.me.install.file."${target}"; + source = lib.strings.escapeShellArg "${target_config.source}"; + destination = lib.strings.escapeShellArg target; + mode = lib.strings.escapeShellArg "${target_config.mode}"; + in + # $DRY_RUN_CMD ${pkgs.toyboy}/bin/install $VERBOSE_ARG -D -m ${mode} ${source} ${destination} + '' + $DRY_RUN_CMD install $VERBOSE_ARG -D --compare -m ${mode} ${source} ${destination} + '' + ) install_file_targets; + in + (lib.strings.concatStringsSep "\n" install_commands) + ); + }; + } + )) + ]; +} From c26d6f34eaa2d2584ba62ff9a2f6e6678bb27e33 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Fri, 11 Apr 2025 18:00:36 -0400 Subject: [PATCH 02/17] Start a user-specific variant of the install file command. --- .../util/install_files/default.nix | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index ce20bf4..2e21bb4 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -15,8 +15,40 @@ in { imports = [ ]; - options.me = { - install.file = lib.mkOption { + options.me.install = { + user = lib.mkOption { + type = lib.types.attrsOf ( + lib.types.submodule ( + { username, config, ... }: + { + options = { + enable = lib.mkOption { + type = lib.types.bool; + default = true; + defaultText = "me.install.file.‹username›.enable"; + example = false; + description = "Whether we want to install files in this user's home directory."; + }; + target_username = lib.mkOption { + type = lib.types.str; + defaultText = "me.install.file.‹username›.target_username"; + example = "root"; + description = "The username for the user whose home directory will contain the file."; + }; + }; + + config = { + target_username = lib.mkDefault username; + }; + } + ) + ); + + defaultText = "me.install.user.‹username›"; + default = { }; + # TODO: example + }; + file = lib.mkOption { type = lib.types.attrsOf ( lib.types.submodule ( { name, config, ... }: From 6284ce8d8642e043b623317af348c7446e33a7da Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Fri, 11 Apr 2025 18:09:52 -0400 Subject: [PATCH 03/17] Add method parameter. --- .../util/install_files/default.nix | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index 2e21bb4..18962ed 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -51,44 +51,55 @@ in file = lib.mkOption { type = lib.types.attrsOf ( lib.types.submodule ( - { name, config, ... }: + { path, config, ... }: { options = { enable = lib.mkOption { type = lib.types.bool; default = true; - defaultText = "me.install.file.‹name›.enable"; + defaultText = "me.install.file.‹path›.enable"; example = false; description = "Whether we want to install this file."; }; + method = lib.mkOption { + type = lib.types.enum [ + "symlink" + "overwrite" + # "bind_mount" TODO: for directories? + ]; + default = "symlink"; + defaultText = "me.install.file.‹path›.method"; + example = "overwrite"; + description = "The way in which the file should be installed."; + }; mode = lib.mkOption { type = lib.types.str; default = "0444"; - defaultText = "me.install.file.‹name›.mode"; + defaultText = "me.install.file.‹path›.mode"; example = "0750"; description = "The read, write, execute permission flags."; }; source = lib.mkOption { type = lib.types.path; - defaultText = "me.install.file.‹name›.source"; + defaultText = "me.install.file.‹path›.source"; example = ./files/foo.txt; description = "The source file to install into the destination."; }; target = lib.mkOption { type = lib.types.str; - defaultText = "me.install.file.‹name›.target"; + defaultText = "me.install.file.‹path›.target"; example = ".local/share/foo/bar.txt"; description = "The path where the file should be written."; }; }; config = { - target = lib.mkDefault name; + target = lib.mkDefault path; }; } ) ); - defaultText = "me.install.file.‹name›"; + defaultText = "me.install.file.‹path›"; default = { }; example = lib.literalExpression '' { From 83eaba357f466346e2b82099c630b24d462ff60c Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Fri, 11 Apr 2025 18:14:51 -0400 Subject: [PATCH 04/17] Fix bug where it used the path in the option name rather than the target value inside the option. --- nix/configuration/util/install_files/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index 18962ed..b9340aa 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -126,7 +126,7 @@ in let target_config = config.me.install.file."${target}"; source = lib.strings.escapeShellArg "${target_config.source}"; - destination = lib.strings.escapeShellArg target; + destination = lib.strings.escapeShellArg "${target_config.target}"; mode = lib.strings.escapeShellArg "${target_config.mode}"; in # $DRY_RUN_CMD ${pkgs.toyboy}/bin/install $VERBOSE_ARG -D -m ${mode} ${source} ${destination} From f667c9daa6925be224dbe8504ae613103f830243 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Fri, 11 Apr 2025 18:34:27 -0400 Subject: [PATCH 05/17] Switch to a systemd unit file to remove the need for home-manager. --- .../util/install_files/default.nix | 50 ++++++++++++------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index b9340aa..239e79f 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -116,27 +116,39 @@ in let cfg = config.me.install.file; install_file_targets = filter (target: config.me.install.file."${target}".enable) (attrNames cfg); + install_commands = builtins.map ( + target: + let + target_config = config.me.install.file."${target}"; + source = lib.strings.escapeShellArg "${target_config.source}"; + destination = lib.strings.escapeShellArg "${target_config.target}"; + mode = lib.strings.escapeShellArg "${target_config.mode}"; + in + # $DRY_RUN_CMD ${pkgs.toyboy}/bin/install $VERBOSE_ARG -D -m ${mode} ${source} ${destination} + '' + $DRY_RUN_CMD install $VERBOSE_ARG -D --compare -m ${mode} ${source} ${destination} + '' + ) install_file_targets; in { - home.activation = { - installFiles = home-manager.lib.hm.dag.entryAfter [ "writeBoundary" ] ( - let - install_commands = builtins.map ( - target: - let - target_config = config.me.install.file."${target}"; - source = lib.strings.escapeShellArg "${target_config.source}"; - destination = lib.strings.escapeShellArg "${target_config.target}"; - mode = lib.strings.escapeShellArg "${target_config.mode}"; - in - # $DRY_RUN_CMD ${pkgs.toyboy}/bin/install $VERBOSE_ARG -D -m ${mode} ${source} ${destination} - '' - $DRY_RUN_CMD install $VERBOSE_ARG -D --compare -m ${mode} ${source} ${destination} - '' - ) install_file_targets; - in - (lib.strings.concatStringsSep "\n" install_commands) - ); + systemd.services.me-install-file = { + enable = true; + description = "me-install-file"; + wantedBy = [ "multi-user.target" ]; + wants = [ "multi-user.target" ]; + after = [ "multi-user.target" ]; + # path = with pkgs; [ + # zfs + # ]; + unitConfig.DefaultDependencies = "no"; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = "yes"; + }; + script = (lib.strings.concatStringsSep "\n" install_commands); + # preStop = '' + # rm -f /home/talexander/.docker/config.json + # ''; }; } )) From 146dc5f79a74c1a945581ca15be63a0fb072a0dc Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 9 Aug 2025 14:37:25 -0400 Subject: [PATCH 06/17] Switch to nested attrsets. --- nix/configuration/configuration.nix | 5 + .../util/install_files/default.nix | 232 +++++++++--------- 2 files changed, 119 insertions(+), 118 deletions(-) diff --git a/nix/configuration/configuration.nix b/nix/configuration/configuration.nix index 35e5d7c..cfc094a 100644 --- a/nix/configuration/configuration.nix +++ b/nix/configuration/configuration.nix @@ -78,6 +78,11 @@ ./util/unfree_polyfill ]; + # me.install.user.file.talexander.".local/nixcfg" = ./README.org; + me.install.user.talexander.file.".local/nixcfg" = { + source = ./flake.lock; + }; + nix.settings.experimental-features = [ "nix-command" "flakes" diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index 239e79f..8f06105 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -7,10 +7,23 @@ }: let + cfg = config.me.install; inherit (lib) filter attrNames ; + + install_user_file = + target: + let + source = lib.strings.escapeShellArg "${target.source}"; + destination = lib.strings.escapeShellArg "${target.target}"; + mode = lib.strings.escapeShellArg "${target.mode}"; + in + # $DRY_RUN_CMD ${pkgs.toyboy}/bin/install $VERBOSE_ARG -D -m ${mode} ${source} ${destination} + '' + $DRY_RUN_CMD install $VERBOSE_ARG -D --compare -m ${mode} ${source} ${destination} + ''; in { imports = [ ]; @@ -19,138 +32,121 @@ in user = lib.mkOption { type = lib.types.attrsOf ( lib.types.submodule ( - { username, config, ... }: + { name, config, ... }: + let + username = name; + in { options = { enable = lib.mkOption { type = lib.types.bool; default = true; - defaultText = "me.install.file.‹username›.enable"; - example = false; + defaultText = "enable"; + example = lib.literalExpression false; description = "Whether we want to install files in this user's home directory."; }; - target_username = lib.mkOption { - type = lib.types.str; - defaultText = "me.install.file.‹username›.target_username"; - example = "root"; - description = "The username for the user whose home directory will contain the file."; - }; - }; - config = { - target_username = lib.mkDefault username; + file = lib.mkOption { + type = lib.types.attrsOf ( + lib.types.submodule ( + { name, config, ... }: + let + path = name; + in + { + options = { + enable = lib.mkOption { + type = lib.types.bool; + default = true; + defaultText = "enable"; + example = lib.literalExpression false; + description = "Whether we want to install this file in this user's home directory."; + }; + username = lib.mkOption { + type = lib.types.str; + defaultText = "username"; + example = "root"; + description = "The username for the user whose home directory will contain the file."; + }; + target = lib.mkOption { + type = lib.types.str; + defaultText = "target"; + example = ".local/share/foo/bar.txt"; + description = "The path where the file should be written."; + }; + method = lib.mkOption { + type = lib.types.enum [ + "symlink" + "overwrite" + # "bind_mount" TODO: for directories? + ]; + default = "symlink"; + defaultText = "me.install.file.‹path›.method"; + example = "overwrite"; + description = "The way in which the file should be installed."; + }; + mode = lib.mkOption { + type = lib.types.str; + default = "0444"; + defaultText = "me.install.file.‹path›.mode"; + example = "0750"; + description = "The read, write, execute permission flags."; + }; + source = lib.mkOption { + type = lib.types.path; + defaultText = "me.install.file.‹path›.source"; + example = ./files/foo.txt; + description = "The source file to install into the destination."; + }; + }; + + config = { + username = lib.mkDefault username; + target = lib.mkDefault path; + }; + } + ) + ); + }; }; } ) ); - - defaultText = "me.install.user.‹username›"; - default = { }; - # TODO: example - }; - file = lib.mkOption { - type = lib.types.attrsOf ( - lib.types.submodule ( - { path, config, ... }: - { - options = { - enable = lib.mkOption { - type = lib.types.bool; - default = true; - defaultText = "me.install.file.‹path›.enable"; - example = false; - description = "Whether we want to install this file."; - }; - method = lib.mkOption { - type = lib.types.enum [ - "symlink" - "overwrite" - # "bind_mount" TODO: for directories? - ]; - default = "symlink"; - defaultText = "me.install.file.‹path›.method"; - example = "overwrite"; - description = "The way in which the file should be installed."; - }; - mode = lib.mkOption { - type = lib.types.str; - default = "0444"; - defaultText = "me.install.file.‹path›.mode"; - example = "0750"; - description = "The read, write, execute permission flags."; - }; - source = lib.mkOption { - type = lib.types.path; - defaultText = "me.install.file.‹path›.source"; - example = ./files/foo.txt; - description = "The source file to install into the destination."; - }; - target = lib.mkOption { - type = lib.types.str; - defaultText = "me.install.file.‹path›.target"; - example = ".local/share/foo/bar.txt"; - description = "The path where the file should be written."; - }; - }; - - config = { - target = lib.mkDefault path; - }; - } - ) - ); - defaultText = "me.install.file.‹path›"; - default = { }; - example = lib.literalExpression '' - { - ".config/foo/bar.txt" = { - source = ./files/bar.txt - }; - } - ''; }; }; - config = lib.mkMerge [ - (lib.mkIf (config.me.install.file != { }) ( - let - cfg = config.me.install.file; - install_file_targets = filter (target: config.me.install.file."${target}".enable) (attrNames cfg); - install_commands = builtins.map ( - target: - let - target_config = config.me.install.file."${target}"; - source = lib.strings.escapeShellArg "${target_config.source}"; - destination = lib.strings.escapeShellArg "${target_config.target}"; - mode = lib.strings.escapeShellArg "${target_config.mode}"; - in - # $DRY_RUN_CMD ${pkgs.toyboy}/bin/install $VERBOSE_ARG -D -m ${mode} ${source} ${destination} - '' - $DRY_RUN_CMD install $VERBOSE_ARG -D --compare -m ${mode} ${source} ${destination} - '' - ) install_file_targets; - in - { - systemd.services.me-install-file = { - enable = true; - description = "me-install-file"; - wantedBy = [ "multi-user.target" ]; - wants = [ "multi-user.target" ]; - after = [ "multi-user.target" ]; - # path = with pkgs; [ - # zfs - # ]; - unitConfig.DefaultDependencies = "no"; - serviceConfig = { - Type = "oneshot"; - RemainAfterExit = "yes"; - }; - script = (lib.strings.concatStringsSep "\n" install_commands); - # preStop = '' - # rm -f /home/talexander/.docker/config.json - # ''; + config = + let + all_users = builtins.map (username: cfg.user."${username}") (attrNames cfg.user); + enabled_users = filter (user: user.enable) all_users; + all_file_targets = lib.flatten ( + builtins.map (user: (builtins.map (path: user.file."${path}") (attrNames user.file))) enabled_users + ); + enabled_file_targets = filter (target: target.enable) all_file_targets; + install_commands = builtins.map install_user_file enabled_file_targets; + in + { + systemd.services.me-install-file = { + enable = true; + description = "me-install-file"; + wantedBy = [ "multi-user.target" ]; + wants = [ "multi-user.target" ]; + after = [ "multi-user.target" ]; + # path = with pkgs; [ + # zfs + # ]; + unitConfig.DefaultDependencies = "no"; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = "yes"; }; - } - )) - ]; + script = (lib.strings.concatStringsSep "\n" install_commands); + # preStop = '' + # rm -f /home/talexander/.docker/config.json + # ''; + }; + + # environment.etc."install_out".text = builtins.toJSON enabled_file_targets; + environment.etc."install_out".text = (lib.strings.concatStringsSep "\n" install_commands); + }; } From 1cb4fa4234d8df81a344d9c967c13de64dc7fdde Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 9 Aug 2025 19:57:09 -0400 Subject: [PATCH 07/17] Add support for symlinking. --- .../util/install_files/default.nix | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index 8f06105..486a74a 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -14,6 +14,14 @@ let ; install_user_file = + let + constructors = { + "overwrite" = install_user_file_overwrite; + "symlink" = install_user_file_symlink; + }; + in + (target: (constructors."${target.method}" target)); + install_user_file_overwrite = target: let source = lib.strings.escapeShellArg "${target.source}"; @@ -24,6 +32,16 @@ let '' $DRY_RUN_CMD install $VERBOSE_ARG -D --compare -m ${mode} ${source} ${destination} ''; + install_user_file_symlink = + target: + let + source = lib.strings.escapeShellArg "${target.source}"; + destination = lib.strings.escapeShellArg "${target.target}"; + mode = lib.strings.escapeShellArg "${target.mode}"; + in + '' + $DRY_RUN_CMD ln $VERBOSE_ARG -s ${source} ${destination} + ''; in { imports = [ ]; @@ -146,7 +164,6 @@ in # ''; }; - # environment.etc."install_out".text = builtins.toJSON enabled_file_targets; - environment.etc."install_out".text = (lib.strings.concatStringsSep "\n" install_commands); + environment.etc."install_out".text = config.systemd.services.me-install-file.script; }; } From eb5815048f1be578e72ece4a4fd8d5525e00d467 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 9 Aug 2025 20:27:27 -0400 Subject: [PATCH 08/17] Add a check and uninstall phase. --- .../util/install_files/default.nix | 68 ++++++++++++------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index 486a74a..ecdee39 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -14,6 +14,14 @@ let ; install_user_file = + let + constructors = { + "overwrite" = install_user_file_overwrite; + "symlink" = install_user_file_symlink; + }; + in + stage: target: (constructors."${target.method}"."${stage}" target); + old_install_user_file = let constructors = { "overwrite" = install_user_file_overwrite; @@ -21,27 +29,35 @@ let }; in (target: (constructors."${target.method}" target)); - install_user_file_overwrite = - target: - let - source = lib.strings.escapeShellArg "${target.source}"; - destination = lib.strings.escapeShellArg "${target.target}"; - mode = lib.strings.escapeShellArg "${target.mode}"; - in - # $DRY_RUN_CMD ${pkgs.toyboy}/bin/install $VERBOSE_ARG -D -m ${mode} ${source} ${destination} - '' - $DRY_RUN_CMD install $VERBOSE_ARG -D --compare -m ${mode} ${source} ${destination} - ''; - install_user_file_symlink = - target: - let - source = lib.strings.escapeShellArg "${target.source}"; - destination = lib.strings.escapeShellArg "${target.target}"; - mode = lib.strings.escapeShellArg "${target.mode}"; - in - '' - $DRY_RUN_CMD ln $VERBOSE_ARG -s ${source} ${destination} - ''; + install_user_file_overwrite = { + "check" = (target: ""); + "install" = ( + target: + let + source = lib.strings.escapeShellArg "${target.source}"; + destination = lib.strings.escapeShellArg "${target.target}"; + mode = lib.strings.escapeShellArg "${target.mode}"; + in + '' + $DRY_RUN_CMD install $VERBOSE_ARG -D --compare -m ${mode} ${source} ${destination} + '' + ); + "uninstall" = (target: ""); + }; + install_user_file_symlink = { + "check" = (target: ""); + "install" = ( + target: + let + source = lib.strings.escapeShellArg "${target.source}"; + destination = lib.strings.escapeShellArg "${target.target}"; + in + '' + $DRY_RUN_CMD ln $VERBOSE_ARG -s ${source} ${destination} + '' + ); + "uninstall" = (target: ""); + }; in { imports = [ ]; @@ -141,7 +157,9 @@ in builtins.map (user: (builtins.map (path: user.file."${path}") (attrNames user.file))) enabled_users ); enabled_file_targets = filter (target: target.enable) all_file_targets; - install_commands = builtins.map install_user_file enabled_file_targets; + check_commands = builtins.map (install_user_file "check") enabled_file_targets; + install_commands = builtins.map (install_user_file "install") enabled_file_targets; + uninstall_commands = builtins.map (install_user_file "uninstall") enabled_file_targets; in { systemd.services.me-install-file = { @@ -158,10 +176,8 @@ in Type = "oneshot"; RemainAfterExit = "yes"; }; - script = (lib.strings.concatStringsSep "\n" install_commands); - # preStop = '' - # rm -f /home/talexander/.docker/config.json - # ''; + script = (lib.strings.concatStringsSep "\n" (check_commands ++ install_commands)); + preStop = (lib.strings.concatStringsSep "\n" uninstall_commands); }; environment.etc."install_out".text = config.systemd.services.me-install-file.script; From 6b42a0946826ca35bbf9b8ad97d938701e7d2c9d Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 9 Aug 2025 20:43:01 -0400 Subject: [PATCH 09/17] Make the paths relative to the user's home directory. --- .../util/install_files/default.nix | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index ecdee39..2d730f4 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -21,28 +21,30 @@ let }; in stage: target: (constructors."${target.method}"."${stage}" target); - old_install_user_file = - let - constructors = { - "overwrite" = install_user_file_overwrite; - "symlink" = install_user_file_symlink; - }; - in - (target: (constructors."${target.method}" target)); install_user_file_overwrite = { "check" = (target: ""); "install" = ( target: let source = lib.strings.escapeShellArg "${target.source}"; - destination = lib.strings.escapeShellArg "${target.target}"; + homedir = config.users.users."${target.username}".home; + destination = lib.strings.escapeShellArg "${homedir}/${target.target}"; mode = lib.strings.escapeShellArg "${target.mode}"; in '' $DRY_RUN_CMD install $VERBOSE_ARG -D --compare -m ${mode} ${source} ${destination} '' ); - "uninstall" = (target: ""); + "uninstall" = ( + target: + let + homedir = config.users.users."${target.username}".home; + destination = lib.strings.escapeShellArg "${homedir}/${target.target}"; + in + '' + $DRY_RUN_CMD echo rm -f ${destination} + '' + ); }; install_user_file_symlink = { "check" = (target: ""); @@ -50,13 +52,23 @@ let target: let source = lib.strings.escapeShellArg "${target.source}"; - destination = lib.strings.escapeShellArg "${target.target}"; + homedir = config.users.users."${target.username}".home; + destination = lib.strings.escapeShellArg "${homedir}/${target.target}"; in '' $DRY_RUN_CMD ln $VERBOSE_ARG -s ${source} ${destination} '' ); - "uninstall" = (target: ""); + "uninstall" = ( + target: + let + homedir = config.users.users."${target.username}".home; + destination = lib.strings.escapeShellArg "${homedir}/${target.target}"; + in + '' + $DRY_RUN_CMD echo rm -f ${destination} + '' + ); }; in { From 2c3e5483e973d8873e854d179b81298dd6c42ea0 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 9 Aug 2025 20:54:54 -0400 Subject: [PATCH 10/17] Centralize the logic for escaping the shell values. --- nix/configuration/configuration.nix | 1 + .../util/install_files/default.nix | 32 ++++++++++++------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/nix/configuration/configuration.nix b/nix/configuration/configuration.nix index cfc094a..8c34538 100644 --- a/nix/configuration/configuration.nix +++ b/nix/configuration/configuration.nix @@ -81,6 +81,7 @@ # me.install.user.file.talexander.".local/nixcfg" = ./README.org; me.install.user.talexander.file.".local/nixcfg" = { source = ./flake.lock; + method = "overwrite"; }; nix.settings.experimental-features = [ diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index 2d730f4..d179bd2 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -13,6 +13,12 @@ let attrNames ; + get_shell_values = target: rec { + source = lib.strings.escapeShellArg "${target.source}"; + homedir = config.users.users."${target.username}".home; + destination = lib.strings.escapeShellArg "${homedir}/${target.target}"; + mode = lib.strings.escapeShellArg "${target.mode}"; + }; install_user_file = let constructors = { @@ -26,10 +32,11 @@ let "install" = ( target: let - source = lib.strings.escapeShellArg "${target.source}"; - homedir = config.users.users."${target.username}".home; - destination = lib.strings.escapeShellArg "${homedir}/${target.target}"; - mode = lib.strings.escapeShellArg "${target.mode}"; + inherit (get_shell_values target) + source + destination + mode + ; in '' $DRY_RUN_CMD install $VERBOSE_ARG -D --compare -m ${mode} ${source} ${destination} @@ -38,8 +45,9 @@ let "uninstall" = ( target: let - homedir = config.users.users."${target.username}".home; - destination = lib.strings.escapeShellArg "${homedir}/${target.target}"; + inherit (get_shell_values target) + destination + ; in '' $DRY_RUN_CMD echo rm -f ${destination} @@ -51,9 +59,10 @@ let "install" = ( target: let - source = lib.strings.escapeShellArg "${target.source}"; - homedir = config.users.users."${target.username}".home; - destination = lib.strings.escapeShellArg "${homedir}/${target.target}"; + inherit (get_shell_values target) + source + destination + ; in '' $DRY_RUN_CMD ln $VERBOSE_ARG -s ${source} ${destination} @@ -62,8 +71,9 @@ let "uninstall" = ( target: let - homedir = config.users.users."${target.username}".home; - destination = lib.strings.escapeShellArg "${homedir}/${target.target}"; + inherit (get_shell_values target) + destination + ; in '' $DRY_RUN_CMD echo rm -f ${destination} From 03e389195cf5c7b57f02d197de506024bacf1664 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 9 Aug 2025 20:57:50 -0400 Subject: [PATCH 11/17] Filter out blank lines. --- nix/configuration/util/install_files/default.nix | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index d179bd2..8777add 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -2,7 +2,6 @@ config, lib, pkgs, - home-manager, ... }: @@ -198,8 +197,10 @@ in Type = "oneshot"; RemainAfterExit = "yes"; }; - script = (lib.strings.concatStringsSep "\n" (check_commands ++ install_commands)); - preStop = (lib.strings.concatStringsSep "\n" uninstall_commands); + script = ( + lib.strings.concatStringsSep "\n" (filter (cmd: cmd != "") (check_commands ++ install_commands)) + ); + preStop = (lib.strings.concatStringsSep "\n" (filter (cmd: cmd != "") uninstall_commands)); }; environment.etc."install_out".text = config.systemd.services.me-install-file.script; From 6db8e0130982161308ad00cec0819c878b347dc1 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 9 Aug 2025 21:19:13 -0400 Subject: [PATCH 12/17] Honor ownership. --- nix/configuration/configuration.nix | 2 +- .../util/install_files/default.nix | 37 +++++++++++++++---- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/nix/configuration/configuration.nix b/nix/configuration/configuration.nix index 8c34538..3b36f76 100644 --- a/nix/configuration/configuration.nix +++ b/nix/configuration/configuration.nix @@ -81,7 +81,7 @@ # me.install.user.file.talexander.".local/nixcfg" = ./README.org; me.install.user.talexander.file.".local/nixcfg" = { source = ./flake.lock; - method = "overwrite"; + # method = "overwrite"; }; nix.settings.experimental-features = [ diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index 8777add..341250a 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -12,12 +12,19 @@ let attrNames ; - get_shell_values = target: rec { - source = lib.strings.escapeShellArg "${target.source}"; - homedir = config.users.users."${target.username}".home; - destination = lib.strings.escapeShellArg "${homedir}/${target.target}"; - mode = lib.strings.escapeShellArg "${target.mode}"; - }; + get_shell_values = + target: + let + homedir = config.users.users."${target.username}".home; + group = config.users.users."${target.username}".group; + in + { + source = lib.strings.escapeShellArg "${target.source}"; + destination = lib.strings.escapeShellArg "${homedir}/${target.target}"; + mode = lib.strings.escapeShellArg "${target.mode}"; + username = lib.strings.escapeShellArg "${target.username}"; + group = lib.strings.escapeShellArg "${group}"; + }; install_user_file = let constructors = { @@ -35,10 +42,17 @@ let source destination mode + username + group ; + flags = lib.strings.concatStringsSep " " [ + (if mode != "" then "-m ${mode}" else "") + (if username != "" then "-o ${username}" else "") + (if group != "" then "-g ${group}" else "") + ]; in '' - $DRY_RUN_CMD install $VERBOSE_ARG -D --compare -m ${mode} ${source} ${destination} + $DRY_RUN_CMD install $VERBOSE_ARG -D --compare ${flags} ${source} ${destination} '' ); "uninstall" = ( @@ -61,10 +75,19 @@ let inherit (get_shell_values target) source destination + username + group ; + owner = lib.strings.concatStringsSep ":" ( + filter (val: val != "") [ + username + group + ] + ); in '' $DRY_RUN_CMD ln $VERBOSE_ARG -s ${source} ${destination} + $DRY_RUN_CMD chown $VERBOSE_ARG -h ${owner} ${destination} '' ); "uninstall" = ( From 2b485f7f1d725af01c93fe03e355f6ea4d5dcf31 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 9 Aug 2025 22:28:24 -0400 Subject: [PATCH 13/17] Support recursive. --- nix/configuration/configuration.nix | 5 +- .../util/install_files/default.nix | 132 +++++++++++++++--- 2 files changed, 115 insertions(+), 22 deletions(-) diff --git a/nix/configuration/configuration.nix b/nix/configuration/configuration.nix index 3b36f76..09a85e0 100644 --- a/nix/configuration/configuration.nix +++ b/nix/configuration/configuration.nix @@ -80,8 +80,9 @@ # me.install.user.file.talexander.".local/nixcfg" = ./README.org; me.install.user.talexander.file.".local/nixcfg" = { - source = ./flake.lock; - # method = "overwrite"; + source = ./roles; + recursive = true; + method = "overwrite"; }; nix.settings.experimental-features = [ diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index 341250a..0f9391c 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -51,20 +51,51 @@ let (if group != "" then "-g ${group}" else "") ]; in - '' - $DRY_RUN_CMD install $VERBOSE_ARG -D --compare ${flags} ${source} ${destination} - '' + if target.recursive then + [ + '' + find ${source} -type f -print0 | while read -r -d "" file; do + relative_path=$(realpath -s --relative-to ${source} "$file") + full_dest=${destination}/"$relative_path" + containing_directory=$(dirname "$full_dest") + if [ ! -e "$containing_directory" ]; then + $DRY_RUN_CMD install $VERBOSE_ARG -d "$containing_directory" + fi + $DRY_RUN_CMD install $VERBOSE_ARG -D --compare ${flags} "$file" "$full_dest" + done + '' + ] + else + [ + '' + $DRY_RUN_CMD install $VERBOSE_ARG -D --compare ${flags} ${source} ${destination} + '' + ] ); "uninstall" = ( target: let inherit (get_shell_values target) + source destination ; in - '' - $DRY_RUN_CMD echo rm -f ${destination} - '' + if target.recursive then + [ + '' + find ${source} -type f -print0 | while read -r -d "" file; do + relative_path=$(realpath -s --relative-to ${source} "$file") + full_dest=${destination}/"$relative_path" + $DRY_RUN_CMD echo rm -f "$full_dest" + done + '' + ] + else + [ + '' + $DRY_RUN_CMD echo rm -f ${destination} + '' + ] ); }; install_user_file_symlink = { @@ -75,6 +106,7 @@ let inherit (get_shell_values target) source destination + mode username group ; @@ -84,22 +116,59 @@ let group ] ); + flags = lib.strings.concatStringsSep " " [ + (if mode != "" then "-m ${mode}" else "") + (if username != "" then "-o ${username}" else "") + (if group != "" then "-g ${group}" else "") + ]; in - '' - $DRY_RUN_CMD ln $VERBOSE_ARG -s ${source} ${destination} - $DRY_RUN_CMD chown $VERBOSE_ARG -h ${owner} ${destination} - '' + if target.recursive then + [ + '' + find ${source} -type f -print0 | while read -r -d "" file; do + relative_path=$(realpath -s --relative-to ${source} "$file") + full_dest=${destination}/"$relative_path" + containing_directory=$(dirname "$full_dest") + if [ ! -e "$containing_directory" ]; then + $DRY_RUN_CMD install $VERBOSE_ARG -d ${flags} "$containing_directory" + fi + $DRY_RUN_CMD ln $VERBOSE_ARG -s "$file" "$full_dest" + $DRY_RUN_CMD chown $VERBOSE_ARG -h ${owner} "$full_dest" + done + '' + ] + else + [ + '' + $DRY_RUN_CMD ln $VERBOSE_ARG -s ${source} ${destination} + $DRY_RUN_CMD chown $VERBOSE_ARG -h ${owner} ${destination} + '' + ] ); "uninstall" = ( target: let inherit (get_shell_values target) + source destination ; in - '' - $DRY_RUN_CMD echo rm -f ${destination} - '' + if target.recursive then + [ + '' + find ${source} -type f -print0 | while read -r -d "" file; do + relative_path=$(realpath -s --relative-to ${source} "$file") + full_dest=${destination}/"$relative_path" + $DRY_RUN_CMD echo rm -f "$full_dest" + done + '' + ] + else + [ + '' + $DRY_RUN_CMD echo rm -f ${destination} + '' + ] ); }; in @@ -176,6 +245,13 @@ in example = ./files/foo.txt; description = "The source file to install into the destination."; }; + recursive = lib.mkOption { + type = lib.types.bool; + default = false; + defaultText = "recursive"; + example = lib.literalExpression false; + description = "Whether we want to recurse through the directory doing individual installs for each file."; + }; }; config = { @@ -201,9 +277,11 @@ in builtins.map (user: (builtins.map (path: user.file."${path}") (attrNames user.file))) enabled_users ); enabled_file_targets = filter (target: target.enable) all_file_targets; - check_commands = builtins.map (install_user_file "check") enabled_file_targets; - install_commands = builtins.map (install_user_file "install") enabled_file_targets; - uninstall_commands = builtins.map (install_user_file "uninstall") enabled_file_targets; + check_commands = lib.flatten (builtins.map (install_user_file "check") enabled_file_targets); + install_commands = lib.flatten (builtins.map (install_user_file "install") enabled_file_targets); + uninstall_commands = lib.flatten ( + builtins.map (install_user_file "uninstall") enabled_file_targets + ); in { systemd.services.me-install-file = { @@ -220,12 +298,26 @@ in Type = "oneshot"; RemainAfterExit = "yes"; }; - script = ( - lib.strings.concatStringsSep "\n" (filter (cmd: cmd != "") (check_commands ++ install_commands)) - ); - preStop = (lib.strings.concatStringsSep "\n" (filter (cmd: cmd != "") uninstall_commands)); + script = + '' + set -o pipefail + IFS=$'\n\t' + '' + + (lib.strings.concatStringsSep "\n" ( + [ + ] + ++ check_commands + ++ install_commands + )); + preStop = + '' + set -o pipefail + IFS=$'\n\t' + '' + + (lib.strings.concatStringsSep "\n" uninstall_commands); }; environment.etc."install_out".text = config.systemd.services.me-install-file.script; + environment.etc."uninstall_out".text = config.systemd.services.me-install-file.preStop; }; } From f1eaaf12b31dfde90bbefdc79a895ec3b3a0d97d Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 10 Aug 2025 11:52:55 -0400 Subject: [PATCH 14/17] Support separate permissions for containing directories. --- .../util/install_files/default.nix | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index 0f9391c..b2d606e 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -22,6 +22,7 @@ let source = lib.strings.escapeShellArg "${target.source}"; destination = lib.strings.escapeShellArg "${homedir}/${target.target}"; mode = lib.strings.escapeShellArg "${target.mode}"; + dir_mode = lib.strings.escapeShellArg "${target.dir_mode}"; username = lib.strings.escapeShellArg "${target.username}"; group = lib.strings.escapeShellArg "${group}"; }; @@ -42,6 +43,7 @@ let source destination mode + dir_mode username group ; @@ -50,6 +52,11 @@ let (if username != "" then "-o ${username}" else "") (if group != "" then "-g ${group}" else "") ]; + dir_flags = lib.strings.concatStringsSep " " [ + (if dir_mode != "" then "-m ${dir_mode}" else "") + (if username != "" then "-o ${username}" else "") + (if group != "" then "-g ${group}" else "") + ]; in if target.recursive then [ @@ -59,7 +66,8 @@ let full_dest=${destination}/"$relative_path" containing_directory=$(dirname "$full_dest") if [ ! -e "$containing_directory" ]; then - $DRY_RUN_CMD install $VERBOSE_ARG -d "$containing_directory" + echo "" + $DRY_RUN_CMD install $VERBOSE_ARG -d ${dir_flags} "$containing_directory" fi $DRY_RUN_CMD install $VERBOSE_ARG -D --compare ${flags} "$file" "$full_dest" done @@ -107,6 +115,7 @@ let source destination mode + dir_mode username group ; @@ -116,8 +125,8 @@ let group ] ); - flags = lib.strings.concatStringsSep " " [ - (if mode != "" then "-m ${mode}" else "") + dir_flags = lib.strings.concatStringsSep " " [ + (if dir_mode != "" then "-m ${dir_mode}" else "") (if username != "" then "-o ${username}" else "") (if group != "" then "-g ${group}" else "") ]; @@ -130,7 +139,7 @@ let full_dest=${destination}/"$relative_path" containing_directory=$(dirname "$full_dest") if [ ! -e "$containing_directory" ]; then - $DRY_RUN_CMD install $VERBOSE_ARG -d ${flags} "$containing_directory" + $DRY_RUN_CMD install $VERBOSE_ARG -d ${dir_flags} "$containing_directory" fi $DRY_RUN_CMD ln $VERBOSE_ARG -s "$file" "$full_dest" $DRY_RUN_CMD chown $VERBOSE_ARG -h ${owner} "$full_dest" @@ -239,6 +248,13 @@ in example = "0750"; description = "The read, write, execute permission flags."; }; + dir_mode = lib.mkOption { + type = lib.types.str; + default = "0755"; + defaultText = "dir_mode"; + example = "0755"; + description = "The read, write, execute permission flags for any parent directories that need to be created."; + }; source = lib.mkOption { type = lib.types.path; defaultText = "me.install.file.‹path›.source"; From c947def321b2cf1dabeb6490196029e935c8bba6 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 10 Aug 2025 12:54:34 -0400 Subject: [PATCH 15/17] Fix handling ownership of parent directories. --- .../util/install_files/default.nix | 15 +++----- .../util/install_files/files/lib.bash | 38 +++++++++++++++++++ 2 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 nix/configuration/util/install_files/files/lib.bash diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index b2d606e..928b838 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -64,12 +64,8 @@ let find ${source} -type f -print0 | while read -r -d "" file; do relative_path=$(realpath -s --relative-to ${source} "$file") full_dest=${destination}/"$relative_path" - containing_directory=$(dirname "$full_dest") - if [ ! -e "$containing_directory" ]; then - echo "" - $DRY_RUN_CMD install $VERBOSE_ARG -d ${dir_flags} "$containing_directory" - fi - $DRY_RUN_CMD install $VERBOSE_ARG -D --compare ${flags} "$file" "$full_dest" + create_containing_directories "$full_dest" ${dir_flags} + $DRY_RUN_CMD install $VERBOSE_ARG --compare ${flags} "$file" "$full_dest" done '' ] @@ -137,10 +133,7 @@ let find ${source} -type f -print0 | while read -r -d "" file; do relative_path=$(realpath -s --relative-to ${source} "$file") full_dest=${destination}/"$relative_path" - containing_directory=$(dirname "$full_dest") - if [ ! -e "$containing_directory" ]; then - $DRY_RUN_CMD install $VERBOSE_ARG -d ${dir_flags} "$containing_directory" - fi + create_containing_directories "$full_dest" ${dir_flags} $DRY_RUN_CMD ln $VERBOSE_ARG -s "$file" "$full_dest" $DRY_RUN_CMD chown $VERBOSE_ARG -h ${owner} "$full_dest" done @@ -318,6 +311,7 @@ in '' set -o pipefail IFS=$'\n\t' + source ${./files/lib.bash} '' + (lib.strings.concatStringsSep "\n" ( [ @@ -329,6 +323,7 @@ in '' set -o pipefail IFS=$'\n\t' + source ${./files/lib.bash} '' + (lib.strings.concatStringsSep "\n" uninstall_commands); }; diff --git a/nix/configuration/util/install_files/files/lib.bash b/nix/configuration/util/install_files/files/lib.bash new file mode 100644 index 0000000..1a5c178 --- /dev/null +++ b/nix/configuration/util/install_files/files/lib.bash @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +# + +############## Setup ######################### + +function die { + local status_code="$1" + shift + (>&2 echo "${@}") + exit "$status_code" +} + +function log { + (>&2 echo "${@}") +} + +############## Program ######################### + +function create_containing_directories { + local full_dest="$1" + shift 1 + local dirs_to_create=() + local containing_directory="$full_dest" + while true; do + containing_directory=$(dirname "$containing_directory") + if [ -e "$containing_directory" ] || [ "$containing_directory" = "/" ]; then + break + fi + dirs_to_create+=($containing_directory) + done + + for (( idx=${#dirs_to_create[@]}-1 ; idx>=0 ; idx-- )) ; do + local containing_directory="${dirs_to_create[idx]}" + log "Creating $containing_directory" + $DRY_RUN_CMD install $VERBOSE_ARG -d "${@}" "$containing_directory" + done + +} From f4338ec8df9871f7d8d584f94025af6158d9b63a Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 10 Aug 2025 15:34:29 -0400 Subject: [PATCH 16/17] Replace uses of home-manager. --- nix/configuration/configuration.nix | 26 +++--------- nix/configuration/flake.lock | 21 ---------- nix/configuration/flake.nix | 8 ---- nix/configuration/roles/alacritty/default.nix | 10 ++--- nix/configuration/roles/emacs/default.nix | 12 +++--- nix/configuration/roles/git/default.nix | 10 ++--- nix/configuration/roles/gpg/default.nix | 11 ++--- nix/configuration/roles/kanshi/default.nix | 12 ++---- nix/configuration/roles/kodi/default.nix | 18 +++------ nix/configuration/roles/media/default.nix | 10 ++--- nix/configuration/roles/pcsx2/default.nix | 10 ++--- nix/configuration/roles/rpcs3/default.nix | 40 +++++++++---------- nix/configuration/roles/rust/default.nix | 18 ++++----- nix/configuration/roles/shadps4/default.nix | 10 ++--- nix/configuration/roles/shikane/default.nix | 12 ++---- nix/configuration/roles/ssh/default.nix | 21 ++++------ nix/configuration/roles/sway/default.nix | 30 +++++--------- nix/configuration/roles/vscode/default.nix | 16 ++++---- nix/configuration/roles/waybar/default.nix | 18 ++++----- nix/configuration/roles/zsh/default.nix | 10 ++--- .../util/install_files/default.nix | 6 ++- 21 files changed, 114 insertions(+), 215 deletions(-) diff --git a/nix/configuration/configuration.nix b/nix/configuration/configuration.nix index 09a85e0..01b0504 100644 --- a/nix/configuration/configuration.nix +++ b/nix/configuration/configuration.nix @@ -2,7 +2,6 @@ config, lib, pkgs, - home-manager, ... }: @@ -79,11 +78,11 @@ ]; # me.install.user.file.talexander.".local/nixcfg" = ./README.org; - me.install.user.talexander.file.".local/nixcfg" = { - source = ./roles; - recursive = true; - method = "overwrite"; - }; + # me.install.user.talexander.file.".local/nixcfg" = { + # source = ./roles; + # # recursive = true; + # # method = "overwrite"; + # }; nix.settings.experimental-features = [ "nix-command" @@ -130,21 +129,6 @@ ]; }; users.groups.talexander.gid = 11235; - home-manager.users.talexander = - { pkgs, ... }: - { - # The state version is required and should stay at the version you - # originally installed. - home.stateVersion = "24.11"; - }; - - home-manager.users.root = - { pkgs, ... }: - { - # The state version is required and should stay at the version you - # originally installed. - home.stateVersion = "24.11"; - }; # Automatic garbage collection nix.gc = lib.mkIf (!config.me.buildingIso) { diff --git a/nix/configuration/flake.lock b/nix/configuration/flake.lock index a5eaabe..455a82b 100644 --- a/nix/configuration/flake.lock +++ b/nix/configuration/flake.lock @@ -147,26 +147,6 @@ "type": "github" } }, - "home-manager": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1751549056, - "narHash": "sha256-miKaJ4SFNxhZ/WVDADae2jNd9zka5bV9hKmXspAzvxo=", - "owner": "nix-community", - "repo": "home-manager", - "rev": "1fa73bb2cc39e250eb01e511ae6ac83bfbf9f38c", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "home-manager", - "type": "github" - } - }, "impermanence": { "locked": { "lastModified": 1737831083, @@ -303,7 +283,6 @@ "inputs": { "ansible-sshjail": "ansible-sshjail", "disko": "disko", - "home-manager": "home-manager", "impermanence": "impermanence", "lanzaboote": "lanzaboote", "nixpkgs": "nixpkgs", diff --git a/nix/configuration/flake.nix b/nix/configuration/flake.nix index dec37cf..54b2c84 100644 --- a/nix/configuration/flake.nix +++ b/nix/configuration/flake.nix @@ -45,8 +45,6 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; nixpkgs-dda3dcd3f.url = "github:NixOS/nixpkgs/dda3dcd3fe03e991015e9a74b22d35950f264a54"; nixpkgs-unoptimized.url = "github:NixOS/nixpkgs/nixos-unstable"; - home-manager.url = "github:nix-community/home-manager"; - home-manager.inputs.nixpkgs.follows = "nixpkgs"; lanzaboote = { url = "github:nix-community/lanzaboote/v0.4.2"; @@ -78,7 +76,6 @@ nixpkgs-unoptimized, nixpkgs-dda3dcd3f, impermanence, - home-manager, lanzaboote, zsh-histdb, ansible-sshjail, @@ -99,13 +96,8 @@ }; modules = [ impermanence.nixosModules.impermanence - home-manager.nixosModules.home-manager lanzaboote.nixosModules.lanzaboote inputs.disko.nixosModules.disko - { - home-manager.useGlobalPkgs = true; - home-manager.useUserPackages = true; - } { nixpkgs.overlays = [ zsh-histdb.overlays.default diff --git a/nix/configuration/roles/alacritty/default.nix b/nix/configuration/roles/alacritty/default.nix index e691ad8..e6e85f7 100644 --- a/nix/configuration/roles/alacritty/default.nix +++ b/nix/configuration/roles/alacritty/default.nix @@ -24,13 +24,11 @@ xdg-utils # for xdg-open ]; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file.".config/alacritty/alacritty.toml" = { - source = ./files/alacritty.toml; - }; + me.install.user.talexander.file = { + ".config/alacritty/alacritty.toml" = { + source = ./files/alacritty.toml; }; + }; }) ] ); diff --git a/nix/configuration/roles/emacs/default.nix b/nix/configuration/roles/emacs/default.nix index 4fd70ee..8689db6 100644 --- a/nix/configuration/roles/emacs/default.nix +++ b/nix/configuration/roles/emacs/default.nix @@ -141,14 +141,12 @@ in }) ]; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file.".config/emacs" = { - source = ./files/emacs; - recursive = true; - }; + me.install.user.talexander.file = { + ".config/emacs" = { + source = ./files/emacs; + recursive = true; }; + }; }) (lib.mkIf (config.me.emacs_flavor == "plainmacs") { nixpkgs.overlays = [ diff --git a/nix/configuration/roles/git/default.nix b/nix/configuration/roles/git/default.nix index 5f0e57d..db65e52 100644 --- a/nix/configuration/roles/git/default.nix +++ b/nix/configuration/roles/git/default.nix @@ -36,13 +36,11 @@ in ]; } (lib.mkIf (config.me.git.config != null) { - home-manager.users.talexander = - { pkgs, ... }: - { - home.file.".gitconfig" = { - source = config.me.git.config; - }; + me.install.user.talexander.file = { + ".gitconfig" = { + source = config.me.git.config; }; + }; }) (lib.mkIf (config.me.graphical) { nixpkgs.overlays = [ diff --git a/nix/configuration/roles/gpg/default.nix b/nix/configuration/roles/gpg/default.nix index cb8b4b2..eeab4d3 100644 --- a/nix/configuration/roles/gpg/default.nix +++ b/nix/configuration/roles/gpg/default.nix @@ -57,14 +57,11 @@ in # disable-ccid = true; # }; - # .gnupg/scdaemon.conf - home-manager.users.talexander = - { pkgs, ... }: - { - home.file.".gnupg/scdaemon.conf" = { - source = ./files/scdaemon.conf; - }; + me.install.user.talexander.file = { + ".gnupg/scdaemon.conf" = { + source = ./files/scdaemon.conf; }; + }; # programs.gnupg.dirmngr.enable = true; programs.gnupg.agent = { diff --git a/nix/configuration/roles/kanshi/default.nix b/nix/configuration/roles/kanshi/default.nix index b1fdbb9..be886c4 100644 --- a/nix/configuration/roles/kanshi/default.nix +++ b/nix/configuration/roles/kanshi/default.nix @@ -41,15 +41,11 @@ in exec_kanshi ]; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file = { - ".config/kanshi/config" = { - source = ./files/config_kanshi; - }; - }; + me.install.user.talexander.file = { + ".config/kanshi/config" = { + source = ./files/config_kanshi; }; + }; }) ] ); diff --git a/nix/configuration/roles/kodi/default.nix b/nix/configuration/roles/kodi/default.nix index b37bf06..d67e3fd 100644 --- a/nix/configuration/roles/kodi/default.nix +++ b/nix/configuration/roles/kodi/default.nix @@ -78,21 +78,13 @@ }; }; - home-manager.users.kodi = - { pkgs, ... }: - { - # home.file.".kodi/userdata/mediasources.xml".source = ./files/mediasources.xml; + # home.file.".kodi/userdata/mediasources.xml".source = ./files/mediasources.xml; - # home.file.".kodi/userdata/addon_data/peripheral.joystick/resources/buttonmaps/xml/linux/DualSense_Wireless_Controller_13b_8a.xml".source = - # ./files/DualSense_Wireless_Controller_13b_8a.xml; + # home.file.".kodi/userdata/addon_data/peripheral.joystick/resources/buttonmaps/xml/linux/DualSense_Wireless_Controller_13b_8a.xml".source = + # ./files/DualSense_Wireless_Controller_13b_8a.xml; - # TODO: Maybe .kodi/userdata/sources.xml - # TODO: ./userdata/guisettings.xml:303: 128 - - # The state version is required and should stay at the version you - # originally installed. - home.stateVersion = "24.11"; - }; + # TODO: Maybe .kodi/userdata/sources.xml + # TODO: ./userdata/guisettings.xml:303: 128 }) ] ); diff --git a/nix/configuration/roles/media/default.nix b/nix/configuration/roles/media/default.nix index 7fd4e67..e121fc0 100644 --- a/nix/configuration/roles/media/default.nix +++ b/nix/configuration/roles/media/default.nix @@ -52,13 +52,11 @@ in imv ]; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file.".config/mpv/mpv.conf" = { - source = ./files/mpv.conf; - }; + me.install.user.talexander.file = { + ".config/mpv/mpv.conf" = { + source = ./files/mpv.conf; }; + }; }) (lib.mkIf (config.me.graphics_card_type == "amd" || config.me.graphics_card_type == "intel") { environment.systemPackages = with pkgs; [ diff --git a/nix/configuration/roles/pcsx2/default.nix b/nix/configuration/roles/pcsx2/default.nix index 2af42ea..a5866da 100644 --- a/nix/configuration/roles/pcsx2/default.nix +++ b/nix/configuration/roles/pcsx2/default.nix @@ -82,13 +82,11 @@ }; }; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file.".config/PCSX2/inis/PCSX2.ini" = { - source = ./files/PCSX2.ini; - }; + me.install.user.talexander.file = { + ".config/PCSX2/inis/PCSX2.ini" = { + source = ./files/PCSX2.ini; }; + }; }) ] ); diff --git a/nix/configuration/roles/rpcs3/default.nix b/nix/configuration/roles/rpcs3/default.nix index 2182cd3..7d2d074 100644 --- a/nix/configuration/roles/rpcs3/default.nix +++ b/nix/configuration/roles/rpcs3/default.nix @@ -70,28 +70,26 @@ in } ]; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file.".config/rpcs3/config.yml" = lib.mkIf (config.me.rpcs3.config != null) { - source = rpcs3_config_yaml; - }; - home.file.".config/rpcs3/GuiConfigs/CurrentSettings.ini" = { - source = ./files/CurrentSettings.ini; - }; - home.file.".config/rpcs3/custom_configs/config_BLUS30443.yml" = { - # Demon's Souls per-game config. - source = ./files/config_BLUS30443.yml; - }; - home.file.".config/rpcs3/patches/patch.yml" = { - # All of the available patches. - source = ./files/patch.yml; - }; - home.file.".config/rpcs3/patch_config.yml" = { - # Patches that I have enabled. - source = ./files/patch_config.yml; - }; + me.install.user.talexander.file = { + ".config/rpcs3/config.yml" = lib.mkIf (config.me.rpcs3.config != null) { + source = rpcs3_config_yaml; }; + ".config/rpcs3/GuiConfigs/CurrentSettings.ini" = { + source = ./files/CurrentSettings.ini; + }; + ".config/rpcs3/custom_configs/config_BLUS30443.yml" = { + # Demon's Souls per-game config. + source = ./files/config_BLUS30443.yml; + }; + ".config/rpcs3/patches/patch.yml" = { + # All of the available patches. + source = ./files/patch.yml; + }; + ".config/rpcs3/patch_config.yml" = { + # Patches that I have enabled. + source = ./files/patch_config.yml; + }; + }; environment.persistence."/persist" = lib.mkIf (!config.me.buildingIso) { hideMounts = true; diff --git a/nix/configuration/roles/rust/default.nix b/nix/configuration/roles/rust/default.nix index 8482484..4ac6cb2 100644 --- a/nix/configuration/roles/rust/default.nix +++ b/nix/configuration/roles/rust/default.nix @@ -48,18 +48,14 @@ in # ? cargo-public-api ]; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file = { - ".cargo/config.toml" = { - source = ./files/cargo_config.toml; - }; - ".rustup/settings.toml" = { - source = ./files/rustup_settings.toml; - }; - }; + me.install.user.talexander.file = { + ".cargo/config.toml" = { + source = ./files/cargo_config.toml; }; + ".rustup/settings.toml" = { + source = ./files/rustup_settings.toml; + }; + }; environment.persistence."/state" = lib.mkIf (!config.me.buildingIso) { hideMounts = true; diff --git a/nix/configuration/roles/shadps4/default.nix b/nix/configuration/roles/shadps4/default.nix index 8615466..08bc049 100644 --- a/nix/configuration/roles/shadps4/default.nix +++ b/nix/configuration/roles/shadps4/default.nix @@ -24,13 +24,11 @@ shadps4 ]; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file.".local/share/shadPS4/config.toml" = { - source = ./files/config.toml; - }; + me.install.user.talexander.file = { + ".local/share/shadPS4/config.toml" = { + source = ./files/config.toml; }; + }; environment.persistence."/persist" = lib.mkIf (!config.me.buildingIso) { hideMounts = true; diff --git a/nix/configuration/roles/shikane/default.nix b/nix/configuration/roles/shikane/default.nix index 728bb4f..1d79348 100644 --- a/nix/configuration/roles/shikane/default.nix +++ b/nix/configuration/roles/shikane/default.nix @@ -36,15 +36,11 @@ in exec_shikane ]; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file = { - ".config/shikane/config.toml" = { - source = ./files/config.toml; - }; - }; + me.install.user.talexander.file = { + ".config/shikane/config.toml" = { + source = ./files/config.toml; }; + }; }) ] ); diff --git a/nix/configuration/roles/ssh/default.nix b/nix/configuration/roles/ssh/default.nix index f4c1d8b..3c7dc68 100644 --- a/nix/configuration/roles/ssh/default.nix +++ b/nix/configuration/roles/ssh/default.nix @@ -27,19 +27,14 @@ }; }; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file.".ssh/config" = { - source = ./files/ssh_config; - }; + me.install.user.root.file = { + ".ssh/config" = { + source = ./files/ssh_config_root; }; - - home-manager.users.root = - { pkgs, ... }: - { - home.file.".ssh/config" = { - source = ./files/ssh_config_root; - }; + }; + me.install.user.talexander.file = { + ".ssh/config" = { + source = ./files/ssh_config; }; + }; } diff --git a/nix/configuration/roles/sway/default.nix b/nix/configuration/roles/sway/default.nix index 6100cab..04a636a 100644 --- a/nix/configuration/roles/sway/default.nix +++ b/nix/configuration/roles/sway/default.nix @@ -376,26 +376,18 @@ in }; }; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file = { - # Configure default programs (for example, default browser) - ".config/mimeapps.list" = { - source = ./files/mimeapps.list; - }; - }; - home.file = { - ".config/gtk-3.0/settings.ini" = { - source = ./files/settings.ini; - }; - }; - home.file = { - ".icons/default" = { - source = "${pkgs.adwaita-icon-theme}/share/icons/Adwaita"; - }; - }; + me.install.user.talexander.file = { + ".config/mimeapps.list" = { + # Configure default programs (for example, default browser) + source = ./files/mimeapps.list; }; + ".config/gtk-3.0/settings.ini" = { + source = ./files/settings.ini; + }; + ".icons/default" = { + source = "${pkgs.adwaita-icon-theme}/share/icons/Adwaita"; + }; + }; # For mounting drives in pcmanfm services.gvfs.enable = true; diff --git a/nix/configuration/roles/vscode/default.nix b/nix/configuration/roles/vscode/default.nix index af50003..b37b0e0 100644 --- a/nix/configuration/roles/vscode/default.nix +++ b/nix/configuration/roles/vscode/default.nix @@ -48,16 +48,14 @@ }) ]; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file.".config/Code/User/settings.json" = { - source = ./files/settings.json; - }; - home.file.".config/Code/User/keybindings.json" = { - source = ./files/keybindings.json; - }; + me.install.user.talexander.file = { + ".config/Code/User/settings.json" = { + source = ./files/settings.json; }; + ".config/Code/User/keybindings.json" = { + source = ./files/keybindings.json; + }; + }; }) ] ); diff --git a/nix/configuration/roles/waybar/default.nix b/nix/configuration/roles/waybar/default.nix index ea03b4f..b2ef5d3 100644 --- a/nix/configuration/roles/waybar/default.nix +++ b/nix/configuration/roles/waybar/default.nix @@ -113,18 +113,14 @@ in services.upower.enable = true; # for battery - home-manager.users.talexander = - { pkgs, ... }: - { - home.file = { - ".config/waybar/config" = { - source = ./files/waybar_config.json; - }; - ".config/waybar/style.css" = { - source = ./files/style.css; - }; - }; + me.install.user.talexander.file = { + ".config/waybar/config" = { + source = ./files/waybar_config.json; }; + ".config/waybar/style.css" = { + source = ./files/style.css; + }; + }; }) ] ); diff --git a/nix/configuration/roles/zsh/default.nix b/nix/configuration/roles/zsh/default.nix index 518fdda..2a4fdfe 100644 --- a/nix/configuration/roles/zsh/default.nix +++ b/nix/configuration/roles/zsh/default.nix @@ -90,13 +90,11 @@ in enable = true; }; - home-manager.users.talexander = - { pkgs, ... }: - { - home.file.".zshrc" = { - source = "${zshrc}"; - }; + me.install.user.talexander.file = { + ".zshrc" = { + source = "${zshrc}"; }; + }; environment.persistence."/persist" = lib.mkIf (!config.me.buildingIso) { hideMounts = true; diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index 928b838..6d7333f 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -72,7 +72,8 @@ let else [ '' - $DRY_RUN_CMD install $VERBOSE_ARG -D --compare ${flags} ${source} ${destination} + create_containing_directories ${destination} ${dir_flags} + $DRY_RUN_CMD install $VERBOSE_ARG --compare ${flags} ${source} ${destination} '' ] ); @@ -142,6 +143,7 @@ let else [ '' + create_containing_directories ${destination} ${dir_flags} $DRY_RUN_CMD ln $VERBOSE_ARG -s ${source} ${destination} $DRY_RUN_CMD chown $VERBOSE_ARG -h ${owner} ${destination} '' @@ -298,7 +300,7 @@ in description = "me-install-file"; wantedBy = [ "multi-user.target" ]; wants = [ "multi-user.target" ]; - after = [ "multi-user.target" ]; + before = [ "multi-user.target" ]; # path = with pkgs; [ # zfs # ]; From 64e8903ae4bcbc02be260563ac69a09f430bd977 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sun, 10 Aug 2025 16:19:13 -0400 Subject: [PATCH 17/17] Remove test code. --- nix/configuration/configuration.nix | 7 ------- nix/configuration/util/install_files/default.nix | 3 --- 2 files changed, 10 deletions(-) diff --git a/nix/configuration/configuration.nix b/nix/configuration/configuration.nix index 01b0504..383b40d 100644 --- a/nix/configuration/configuration.nix +++ b/nix/configuration/configuration.nix @@ -77,13 +77,6 @@ ./util/unfree_polyfill ]; - # me.install.user.file.talexander.".local/nixcfg" = ./README.org; - # me.install.user.talexander.file.".local/nixcfg" = { - # source = ./roles; - # # recursive = true; - # # method = "overwrite"; - # }; - nix.settings.experimental-features = [ "nix-command" "flakes" diff --git a/nix/configuration/util/install_files/default.nix b/nix/configuration/util/install_files/default.nix index 6d7333f..7be496d 100644 --- a/nix/configuration/util/install_files/default.nix +++ b/nix/configuration/util/install_files/default.nix @@ -329,8 +329,5 @@ in '' + (lib.strings.concatStringsSep "\n" uninstall_commands); }; - - environment.etc."install_out".text = config.systemd.services.me-install-file.script; - environment.etc."uninstall_out".text = config.systemd.services.me-install-file.preStop; }; }