packages: allow specifying multiple dir and private paths

This commit is contained in:
2022-12-26 03:02:19 +00:00
parent c0496b25b5
commit 2c6629a658
2 changed files with 40 additions and 24 deletions

View File

@@ -12,8 +12,8 @@ let
# extract package from `sane.packages.enabledUserPkgs` # extract package from `sane.packages.enabledUserPkgs`
pkg-list = pkgspec: builtins.map (e: e.pkg or e) pkgspec; pkg-list = pkgspec: builtins.map (e: e.pkg or e) pkgspec;
# extract `dir` from `sane.packages.enabledUserPkgs` # extract `dir` from `sane.packages.enabledUserPkgs`
dir-list = pkgspec: builtins.concatLists (builtins.map (e: if e ? "dir" then [ e.dir ] else []) pkgspec); dir-list = pkgspec: builtins.concatLists (builtins.map (e: e.dir or []) pkgspec);
private-list = pkgspec: builtins.concatLists (builtins.map (e: if e ? "private" then [ e.private ] else []) pkgspec); private-list = pkgspec: builtins.concatLists (builtins.map (e: e.private or []) pkgspec);
feeds = import ./feeds.nix { inherit lib; }; feeds = import ./feeds.nix { inherit lib; };
in in
{ {

View File

@@ -66,18 +66,18 @@ let
celluloid # mpv frontend celluloid # mpv frontend
chromium chromium
clinfo clinfo
{ pkg = dino; private = ".local/share/dino"; } { pkg = dino; private = [ ".local/share/dino" ]; }
electrum electrum
# creds/session keys, etc # creds/session keys, etc
{ pkg = element-desktop; private = ".config/Element"; } { pkg = element-desktop; private = [ ".config/Element" ]; }
# `emote` will show a first-run dialog based on what's in this directory. # `emote` will show a first-run dialog based on what's in this directory.
# mostly, it just keeps a LRU of previously-used emotes to optimize display order. # mostly, it just keeps a LRU of previously-used emotes to optimize display order.
# TODO: package [smile](https://github.com/mijorus/smile) for probably a better mobile experience. # TODO: package [smile](https://github.com/mijorus/smile) for probably a better mobile experience.
{ pkg = emote; dir = ".local/share/Emote"; } { pkg = emote; dir = [ ".local/share/Emote" ]; }
evince # works on phosh evince # works on phosh
# { pkg = fluffychat-moby; dir = ".local/share/chat.fluffy.fluffychat"; } # TODO: ship normal fluffychat on non-moby? # { pkg = fluffychat-moby; dir = [ ".local/share/chat.fluffy.fluffychat" ]; } # TODO: ship normal fluffychat on non-moby?
foliate foliate
font-manager font-manager
@@ -85,8 +85,8 @@ let
# XXX by default fractal stores its state in ~/.local/share/<UUID>. # XXX by default fractal stores its state in ~/.local/share/<UUID>.
# after logging in, manually change ~/.local/share/keyrings/... to point it to some predictable subdir. # after logging in, manually change ~/.local/share/keyrings/... to point it to some predictable subdir.
# then reboot (so that libsecret daemon re-loads the keyring...?) # then reboot (so that libsecret daemon re-loads the keyring...?)
{ pkg = fractal-latest; private = ".local/share/fractal"; } { pkg = fractal-latest; private = [ ".local/share/fractal" ]; }
# { pkg = fractal-next; private = ".local/share/fractal"; } # { pkg = fractal-next; private = [ ".local/share/fractal" ]; }
gajim # XMPP client gajim # XMPP client
gimp # broken on phosh gimp # broken on phosh
@@ -102,7 +102,7 @@ let
gnome.gnome-terminal # works on phosh gnome.gnome-terminal # works on phosh
gnome.gnome-weather gnome.gnome-weather
{ pkg = gpodder-configured; dir = "gPodder/Downloads"; } { pkg = gpodder-configured; dir = [ "gPodder/Downloads" ]; }
gthumb gthumb
handbrake handbrake
@@ -115,15 +115,15 @@ let
lollypop lollypop
mesa-demos mesa-demos
{ pkg = mpv; dir = ".config/mpv/watch_later"; } { pkg = mpv; dir = [ ".config/mpv/watch_later" ]; }
networkmanagerapplet networkmanagerapplet
# not strictly necessary, but allows caching articles; offline use, etc. # not strictly necessary, but allows caching articles; offline use, etc.
{ pkg = newsflash; dir = ".local/share/news-flash"; } { pkg = newsflash; dir = [ ".local/share/news-flash" ]; }
# settings (electron app). TODO: can i manage these settings with home-manager? # settings (electron app). TODO: can i manage these settings with home-manager?
{ pkg = obsidian; dir = ".config/obsidian"; } { pkg = obsidian; dir = [ ".config/obsidian" ]; }
pavucontrol pavucontrol
# picard # music tagging # picard # music tagging
@@ -136,14 +136,14 @@ let
# it doesn't obey a conventional ~/Music/{Artist}/{Album}/{Track} notation, so no symlinking # it doesn't obey a conventional ~/Music/{Artist}/{Album}/{Track} notation, so no symlinking
# config (e.g. server connection details) is persisted in ~/.config/sublime-music/config.json # config (e.g. server connection details) is persisted in ~/.config/sublime-music/config.json
# possible to pass config as a CLI arg (sublime-music -c config.json) # possible to pass config as a CLI arg (sublime-music -c config.json)
# { pkg = sublime-music; dir = ".local/share/sublime-music"; } # { pkg = sublime-music; dir = [ ".local/share/sublime-music" ]; }
{ pkg = sublime-music-mobile; dir = ".local/share/sublime-music"; } { pkg = sublime-music-mobile; dir = [ ".local/share/sublime-music" ]; }
tdesktop # broken on phosh tdesktop # broken on phosh
{ pkg = tokodon; dir = ".cache/KDE/tokodon"; } { pkg = tokodon; dir = [ ".cache/KDE/tokodon" ]; }
# vlc remembers play position in ~/.config/vlc/vlc-qt-interface.conf # vlc remembers play position in ~/.config/vlc/vlc-qt-interface.conf
{ pkg = vlc; dir = ".config/vlc"; } { pkg = vlc; dir = [ ".config/vlc" ]; }
whalebird # pleroma client. input is broken on phosh whalebird # pleroma client. input is broken on phosh
xdg-utils # for xdg-open xdg-utils # for xdg-open
@@ -158,7 +158,7 @@ let
# XXX 2022-07-31: fix to allow links to open in default web-browser: # XXX 2022-07-31: fix to allow links to open in default web-browser:
# https://github.com/NixOS/nixpkgs/issues/78961 # https://github.com/NixOS/nixpkgs/issues/78961
nss = pkgs.nss_latest; nss = pkgs.nss_latest;
}); in { pkg = discord; dir = ".config/discord"; }) }); in { pkg = discord; dir = [ ".config/discord" ]; })
# kaiteki # Pleroma client # kaiteki # Pleroma client
# gnome.zenity # for kaiteki (it will use qarma, kdialog, or zenity) # gnome.zenity # for kaiteki (it will use qarma, kdialog, or zenity)
@@ -169,19 +169,19 @@ let
makemkv makemkv
# actual monero blockchain (not wallet/etc; safe to delete, just slow to regenerate) # actual monero blockchain (not wallet/etc; safe to delete, just slow to regenerate)
{ pkg = monero-gui; dir = ".bitmonero"; } { pkg = monero-gui; dir = [ ".bitmonero" ]; }
# creds, media # creds, media
{ pkg = signal-desktop; dir = ".config/Signal"; } { pkg = signal-desktop; dir = [ ".config/Signal" ]; }
# creds. TODO: can i manage this with home-manager? # creds. TODO: can i manage this with home-manager?
{ pkg = spotify; dir = ".config/spotify"; } { pkg = spotify; dir = [ ".config/spotify" ]; }
# hardenedMalloc solves a crash at startup # hardenedMalloc solves a crash at startup
(tor-browser-bundle-bin.override { useHardenedMalloc = false; }) (tor-browser-bundle-bin.override { useHardenedMalloc = false; })
# zcash coins. safe to delete, just slow to regenerate (10-60 minutes) # zcash coins. safe to delete, just slow to regenerate (10-60 minutes)
{ pkg = zecwallet-lite; private = ".zcash"; } { pkg = zecwallet-lite; private = [ ".zcash" ]; }
] else []); ] else []);
# general-purpose utilities that we want any user to be able to access # general-purpose utilities that we want any user to be able to access
@@ -240,15 +240,31 @@ let
rustup rustup
swig swig
]; ];
pkgSpec = types.submodule {
options = {
pkg = mkOption {
type = types.package;
};
dir = mkOption {
type = types.listOf types.str;
default = [];
description = "list of home-relative paths to persist for this package";
};
private = mkOption {
type = types.listOf types.str;
default = [];
description = "list of home-relative paths to persist (in encrypted format) for this package";
};
};
};
in in
{ {
options = { options = {
# packages to deploy to the user's home # packages to deploy to the user's home
sane.packages.extraUserPkgs = mkOption { sane.packages.extraUserPkgs = mkOption {
default = [ ]; default = [ ];
# each entry can be either a package, or attrs: type = types.listOf (types.either types.package pkgSpec);
# { pkg = package; dir = optional string; private = optional string };
type = types.listOf (types.either types.package types.attrs);
}; };
sane.packages.enableConsolePkgs = mkOption { sane.packages.enableConsolePkgs = mkOption {
default = false; default = false;