From bd4c2b06515fb7cdef9dda19bccd47f37aa66324 Mon Sep 17 00:00:00 2001
From: Nicolas Berbiche <nic.berbiche@gmail.com>
Date: Thu, 27 Aug 2020 13:57:56 -0400
Subject: [PATCH] nix-darwin: add missing options

Add useGlobalPkgs, verbose and backupFileExtension support
---
 doc/installation.xml   | 17 +++++++++++++++++
 nix-darwin/default.nix | 34 +++++++++++++++++++++++++++++-----
 2 files changed, 46 insertions(+), 5 deletions(-)

diff --git a/doc/installation.xml b/doc/installation.xml
index 4c5d1f735..3e1f75abb 100644
--- a/doc/installation.xml
+++ b/doc/installation.xml
@@ -313,5 +313,22 @@ home-manager.useUserPackages = true;
     value in the future.
    </para>
   </note>
+
+  <note>
+   <para>
+    By default, Home Manager uses a private <literal>pkgs</literal> instance
+    that is configured via the <option>home-manager.users.&lt;name&gt;.nixpkgs</option> options.
+    To instead use the global <literal>pkgs</literal> that is configured via
+    the system level <option>nixpkgs</option> options, set
+   </para>
+<programlisting language="nix">
+home-manager.useGlobalPkgs = true;
+</programlisting>
+  <para>
+   This saves an extra Nixpkgs evaluation, adds consistency, and removes the
+   dependency on <envar>NIX_PATH</envar>, which is otherwise used for
+   importing Nixpkgs.
+   </para>
+  </note>
  </section>
 </chapter>
diff --git a/nix-darwin/default.nix b/nix-darwin/default.nix
index ce6105d4b..12d021743 100644
--- a/nix-darwin/default.nix
+++ b/nix-darwin/default.nix
@@ -10,11 +10,12 @@ let
 
   hmModule = types.submoduleWith {
     specialArgs = { lib = extendedLib; };
-    modules = [(
-      {name, ...}: {
+    modules = [
+      ({ name, ... }: {
         imports = import ../modules/modules.nix {
           inherit pkgs;
           lib = extendedLib;
+          useNixpkgsModule = !cfg.useGlobalPkgs;
         };
 
         config = {
@@ -24,8 +25,8 @@ let
           home.username = config.users.users.${name}.name;
           home.homeDirectory = config.users.users.${name}.home;
         };
-      }
-    )];
+      })
+    ];
   };
 
 in
@@ -38,6 +39,24 @@ in
         <option>users.users.‹name?›.packages</option> option.
       '';
 
+      useGlobalPkgs = mkEnableOption ''
+        using the system configuration's <literal>pkgs</literal>
+        argument in Home Manager. This disables the Home Manager
+        options <option>nixpkgs.*</option>
+      '';
+
+      backupFileExtension = mkOption {
+        type = types.nullOr types.str;
+        default = null;
+        example = "backup";
+        description = ''
+          On activation move existing files by appending the given
+          file extension rather than exiting with an error.
+        '';
+      };
+
+      verbose = mkEnableOption "verbose output on activation";
+
       users = mkOption {
         type = types.attrsOf hmModule;
         default = {};
@@ -77,7 +96,12 @@ in
     system.activationScripts.postActivation.text =
       concatStringsSep "\n" (mapAttrsToList (username: usercfg: ''
         echo Activating home-manager configuration for ${username}
-        sudo -u ${username} -i ${usercfg.home.activationPackage}/activate
+        sudo -u ${username} -i ${pkgs.writeShellScript "activation-${username}" ''
+          ${lib.optionalString (cfg.backupFileExtension != null)
+            "export HOME_MANAGER_BACKUP_EXT=${lib.escapeShellArg cfg.backupFileExtension}"}
+          ${lib.optionalString cfg.verbose "export VERBOSE=1"}
+          exec ${usercfg.home.activationPackage}/activate
+        ''}
       '') cfg.users);
   };
 }