feat(darwin): provisioning apps
This commit is contained in:
parent
a0cf3f1a3c
commit
9fd48b2ca9
3 changed files with 107 additions and 0 deletions
68
lib/darwin/apps/common.nix
Normal file
68
lib/darwin/apps/common.nix
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
{ wget, lib, ... }:
|
||||||
|
|
||||||
|
rec {
|
||||||
|
download = {
|
||||||
|
url,
|
||||||
|
params ? "",
|
||||||
|
var ? "DOWNLOADED_FILE"
|
||||||
|
}: ''
|
||||||
|
echo "Downloading" ${lib.escapeShellArg url}"..."
|
||||||
|
${var}=$(mktemp)
|
||||||
|
${wget}/bin/wget ${lib.escapeShellArg url} ${params} -q --show-progress -O ${"$" + var}
|
||||||
|
'';
|
||||||
|
|
||||||
|
withMountedDmg = path: shell: ''
|
||||||
|
_result=$(hdiutil mount ${path} | tail -n1)
|
||||||
|
DMG_DEVICE=$(echo "$_result" | awk '{print $1}')
|
||||||
|
DMG_MOUNTPOINT=$(echo "$_result" | awk '{print $3}')
|
||||||
|
unset _result
|
||||||
|
|
||||||
|
function _unmount {
|
||||||
|
hdiutil unmount $DMG_DEVICE > /dev/null
|
||||||
|
}
|
||||||
|
trap _unmount ERR exit
|
||||||
|
|
||||||
|
${shell}
|
||||||
|
|
||||||
|
_unmount
|
||||||
|
trap - ERR exit
|
||||||
|
unset DMG_DEVICE
|
||||||
|
unset DMG_MOUNTPOINT
|
||||||
|
'';
|
||||||
|
|
||||||
|
installAppFromDmg = { dmg, filename }: withMountedDmg dmg ''
|
||||||
|
if [ ! -d "$DMG_MOUNTPOINT/"${lib.escapeShellArg filename} ]; then
|
||||||
|
echo "Error: file not found:" ${lib.escapeShellArg filename}
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp -r "$DMG_MOUNTPOINT/"${lib.escapeShellArg filename} /Applications
|
||||||
|
'';
|
||||||
|
|
||||||
|
downloadAndInstallDmgApp = {
|
||||||
|
url,
|
||||||
|
filename,
|
||||||
|
params ? "",
|
||||||
|
}: ''
|
||||||
|
if [ ! -d "/Applications/"${lib.escapeShellArg (builtins.baseNameOf filename)} ]; then
|
||||||
|
${download { inherit url params; }}
|
||||||
|
${installAppFromDmg { dmg = "$DOWNLOADED_FILE"; inherit filename; }}
|
||||||
|
rm -rf $DOWNLOADED_FILE
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
|
downloadAndInstallDmgPkg = {
|
||||||
|
url,
|
||||||
|
filename,
|
||||||
|
condition,
|
||||||
|
params ? "",
|
||||||
|
}: ''
|
||||||
|
if [ ${condition} ]; then
|
||||||
|
${download { inherit url params; }}
|
||||||
|
${withMountedDmg "$DOWNLOADED_FILE" ''
|
||||||
|
installer -pkg "$DMG_MOUNTPOINT/"${lib.escapeShellArg filename} -target /
|
||||||
|
''}
|
||||||
|
rm -rf $DOWNLOADED_FILE
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
}
|
18
lib/darwin/apps/default.nix
Normal file
18
lib/darwin/apps/default.nix
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{ callPackage, ... }:
|
||||||
|
|
||||||
|
# i want to be able to declaratively *provision* gui apps on macos,
|
||||||
|
# but have them manage themselves later on, not managed by nix-darwin,
|
||||||
|
# since most of them are auto-updating and managing them entirely through
|
||||||
|
# nix is a bit of a pain.
|
||||||
|
#
|
||||||
|
# homebrew sucks and i don't want to give it *any* recognition, so guess
|
||||||
|
# i'll just handle dmg's myself :D
|
||||||
|
|
||||||
|
{
|
||||||
|
provisionApps = apps: {
|
||||||
|
home.activation.provisionApps = ''
|
||||||
|
set -eau
|
||||||
|
${builtins.concatStringsSep "\n" apps}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
} // (callPackage ./productivity.nix {})
|
21
lib/darwin/apps/productivity.nix
Normal file
21
lib/darwin/apps/productivity.nix
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{ callPackage, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
common = callPackage ./common.nix {};
|
||||||
|
in with common; {
|
||||||
|
raycast = downloadAndInstallDmgApp {
|
||||||
|
url = "https://releases.raycast.com/download";
|
||||||
|
filename = "Raycast.app";
|
||||||
|
};
|
||||||
|
|
||||||
|
karabiner = downloadAndInstallDmgPkg {
|
||||||
|
url = "https://github.com/pqrs-org/Karabiner-Elements/releases/download/v14.13.0/Karabiner-Elements-14.13.0.dmg";
|
||||||
|
filename = "Karabiner-Elements.pkg";
|
||||||
|
condition = "! -d /Applications/Karabiner-Elements.app";
|
||||||
|
};
|
||||||
|
|
||||||
|
alacritty = downloadAndInstallDmgApp {
|
||||||
|
url = "https://github.com/alacritty/alacritty/releases/download/v0.13.2/Alacritty-v0.13.2.dmg";
|
||||||
|
filename = "Alacritty.app";
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in a new issue