summaryrefslogtreecommitdiff
path: root/modules/homebrew.nix
diff options
context:
space:
mode:
authorMalo Bourgon <mbourgon@gmail.com>2022-08-24 17:26:50 -0700
committerMalo Bourgon <mbourgon@gmail.com>2022-09-01 10:50:21 -0700
commit7710d1d7d64e67a90571828d10957d200f793127 (patch)
tree98ddf151111607e26c8c0d524426aab429675015 /modules/homebrew.nix
parentb547a7acb09d03bb6a41c6235c1d7f380981073d (diff)
Add `global` into a submodule
* Add `homebrew.global.autoUpdate` option. * Remove `homebrew.global.noLock` option, and replace it with `hombrew.global.lockfiles`.
Diffstat (limited to 'modules/homebrew.nix')
-rw-r--r--modules/homebrew.nix158
1 files changed, 109 insertions, 49 deletions
diff --git a/modules/homebrew.nix b/modules/homebrew.nix
index 2a130f0..d462aae 100644
--- a/modules/homebrew.nix
+++ b/modules/homebrew.nix
@@ -29,7 +29,10 @@ let
concatStringsSep ", " (mapAttrsToList (n: v: "${n}: ${v}") attrs);
- # Submodule helper functions ---------------------------------------------------------------------
+ # Option and submodule helper functions ----------------------------------------------------------
+
+ mkDocOptionLink = optionName:
+ ''<link xlink:href="#opt-${optionName}"><option>${optionName}</option></link>'';
mkNullOrBoolOption = args: mkOption (args // {
type = types.nullOr types.bool;
@@ -41,12 +44,11 @@ let
default = null;
});
- mkBrewfileLineOption = mkOption {
- type = types.nullOr types.str;
+ mkInternalOption = args: mkOption (args // {
visible = false;
internal = true;
readOnly = true;
- };
+ });
mkProcessedSubmodConfig = attrs: mapAttrs (_: mkBrewfileLineValueString)
(filterAttrsRecursive (n: v: n != "_module" && n != "brewfileLine" && v != null) attrs);
@@ -110,12 +112,7 @@ let
'';
};
- brewBundleCmd = mkOption {
- type = types.str;
- visible = false;
- internal = true;
- readOnly = true;
- };
+ brewBundleCmd = mkInternalOption { type = types.str; };
};
config = {
@@ -129,6 +126,90 @@ let
};
};
+ globalOptions = { config, ... }: {
+ options = {
+ brewfile = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Whether to enable Homebrew to automatically use the Brewfile that this module generates in
+ the Nix store, when you manually invoke <command>brew bundle</command>.
+
+ Enabling this option will change the default value of
+ ${mkDocOptionLink "homebrew.global.lockfiles"} to <literal>false</literal> since, with
+ this option enabled, <command>brew bundle [install]</command> will default to using the
+ Brewfile that this module generates in the Nix store, unless you explicitly point it at
+ another Brewfile using the <literal>--file</literal> flag. As a result, it will try to
+ write the lockfile in the Nix store, and complain that it can't (though the command will
+ run successfully regardless).
+
+ Implementation note: when enabled, this option sets the
+ <literal>HOMEBREW_BUNDLE_FILE</literal> environment variable to the path of the Brewfile
+ that this module generates in the Nix store, by adding it to
+ ${mkDocOptionLink "environment.variables"}.
+ '';
+ };
+ autoUpdate = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Whether to enable Homebrew to auto-update itself and all formulae when you manually invoke
+ commands like <command>brew install</command>, <command>brew upgrade</command>,
+ <command>brew tap</command>, and <command>brew bundle [install]</command>.
+
+ Note that Homebrew auto-updates when you manually invoke commands like the ones mentioned
+ above if it's been more then 5 minutes since it last updated.
+
+ You may want to consider disabling this option if you have
+ ${mkDocOptionLink "homebrew.onActivation.upgrade"} enabled, and
+ ${mkDocOptionLink "homebrew.onActivation.autoUpdate"} disabled, if you want to ensure that
+ your installed formulae will only be upgraded during <command>nix-darwin</command> system
+ activation, after you've explicitly run <command>brew update</command>.
+
+ Implementation note: when disabled, this option sets the
+ <literal>HOMEBREW_NO_AUTO_UPDATE</literal> environment variable, by adding it to
+ ${mkDocOptionLink "environment.variables"}.
+ '';
+ };
+ lockfiles = mkOption {
+ type = types.bool;
+ default = !config.brewfile;
+ defaultText = literalExpression "!config.homebrew.global.brewfile";
+ description = ''
+ Whether to enable Homebrew to generate lockfiles when you manually invoke
+ <command>brew bundle [install]</command>.
+
+ This option will default to <literal>false</literal> if
+ ${mkDocOptionLink "homebrew.global.brewfile"} is enabled since, with that option enabled,
+ <command>brew bundle [install]</command> will default to using the Brewfile that this
+ module generates in the Nix store, unless you explicitly point it at another Brewfile
+ using the <literal>--file</literal> flag. As a result, it will try to write the
+ lockfile in the Nix store, and complain that it can't (though the command will run
+ successfully regardless).
+
+ Implementation note: when disabled, this option sets the
+ <literal>HOMEBREW_BUNDLE_NO_LOCK</literal> environment variable, by adding it to
+ ${mkDocOptionLink "environment.variables"}.
+ '';
+ };
+
+ # The `noLock` option was replaced by `lockfiles`. Due to `homebrew.global` being a submodule,
+ # we can't use `mkRemovedOptionModule`, so we leave this option definition here, and trigger
+ # and error message with an assertion below if it's set by the user.
+ noLock = mkOption { visible = false; default = null; };
+
+ homebrewEnvironmentVariables = mkInternalOption { type = types.attrs; };
+ };
+
+ config = {
+ homebrewEnvironmentVariables = {
+ HOMEBREW_BUNDLE_FILE = mkIf config.brewfile "${brewfileFile}";
+ HOMEBREW_NO_AUTO_UPDATE = mkIf (!config.autoUpdate) "1";
+ HOMEBREW_BUNDLE_NO_LOCK = mkIf (!config.lockfiles) "1";
+ };
+ };
+ };
+
tapOptions = { config, ... }: {
options = {
name = mkOption {
@@ -155,7 +236,7 @@ let
'';
};
- brewfileLine = mkBrewfileLineOption;
+ brewfileLine = mkInternalOption { type = types.nullOr types.str; };
};
config =
@@ -291,7 +372,7 @@ let
description = "Whether to disable linking of helper executables.";
};
- brewfileLine = mkBrewfileLineOption;
+ brewfileLine = mkInternalOption { type = types.nullOr types.str; };
};
config =
@@ -299,7 +380,9 @@ let
sCfg = mkProcessedSubmodConfig config;
in
{
- brewfileLine = if sCfg == { } then null else "cask_args ${mkBrewfileLineOptionsListString sCfg}";
+ brewfileLine =
+ if sCfg == { } then null
+ else "cask_args ${mkBrewfileLineOptionsListString sCfg}";
};
};
@@ -353,7 +436,7 @@ let
'';
};
- brewfileLine = mkBrewfileLineOption;
+ brewfileLine = mkInternalOption { type = types.nullOr types.str; };
};
config =
@@ -393,7 +476,7 @@ let
'';
};
- brewfileLine = mkBrewfileLineOption;
+ brewfileLine = mkInternalOption { type = types.nullOr types.str; };
};
config =
@@ -449,33 +532,11 @@ in
'';
};
- global.brewfile = mkOption {
- type = types.bool;
- default = false;
- description = ''
- Whether to enable Homebrew to automatically use the Brewfile in the Nix store that this
- module generates, when you manually invoke <command>brew bundle</command>.
-
- Implementation note: when enabled, this option sets the
- <literal>HOMEBREW_BUNDLE_FILE</literal> environment variable to the path of the Brewfile in
- the Nix store that this module generates, by adding it to
- <option>environment.variables</option>.
- '';
- };
-
- global.noLock = mkOption {
- type = types.bool;
- default = false;
+ global = mkOption {
+ type = types.submodule globalOptions;
+ default = { };
description = ''
- Whether to disable lockfile generation when you manually invoke
- <command>brew bundle [install]</command>. This is often desirable when
- <option>homebrew.global.brewfile</option> is enabled, since
- <command>brew bundle [install]</command> will try to write the lockfile in the Nix store,
- and complain that it can't (though the command will run successfully regardless).
-
- Implementation note: when enabled, this option sets the
- <literal>HOMEBREW_BUNDLE_NO_LOCK</literal> environment variable, by adding it to
- <option>environment.variables</option>.
+ Options for configuring the behavior of Homebrew commands when you manually invoke them.
'';
};
@@ -633,11 +694,8 @@ in
description = "Extra lines to be added verbatim to bottom of the generated Brewfile.";
};
- brewfile = mkOption {
+ brewfile = mkInternalOption {
type = types.str;
- visible = false;
- internal = true;
- readOnly = true;
description = "String reprensentation of the generated Brewfile useful for debugging.";
};
};
@@ -647,6 +705,11 @@ in
config = {
+ assertions = [
+ # See comment above `homebrew.global.noLock` option declaration for why this is required.
+ { assertion = cfg.global.noLock == null; message = "The option `homebrew.global.noLock' was removed, use `homebrew.global.lockfiles' in it's place."; }
+ ];
+
warnings = [
(mkIf (options.homebrew.autoUpdate.isDefined || options.homebrew.cleanup.isDefined) "The `homebrew' module no longer upgrades outdated formulae and apps by default during `nix-darwin' activation. To enable upgrading, set `homebrew.onActivation.upgrade = true'.")
];
@@ -667,10 +730,7 @@ in
+ mkBrewfileSectionString "Docker containers" (map (v: ''whalebrew "${v}"'') cfg.whalebrews)
+ optionalString (cfg.extraConfig != "") ("# Extra config\n" + cfg.extraConfig);
- environment.variables = mkIf cfg.enable (
- optionalAttrs cfg.global.brewfile { HOMEBREW_BUNDLE_FILE = "${brewfileFile}"; }
- // optionalAttrs cfg.global.noLock { HOMEBREW_BUNDLE_NO_LOCK = "1"; }
- );
+ environment.variables = mkIf cfg.enable cfg.global.homebrewEnvironmentVariables;
system.activationScripts.homebrew.text = mkIf cfg.enable ''
# Homebrew Bundle