mirror of
https://github.com/nix-community/home-manager
synced 2024-11-16 16:19:44 +01:00
files: add onChange
option
This option allows execution of arbitrary shell code when a file that is linked into the home directory has been changed between generations.
This commit is contained in:
parent
dda65c0877
commit
30cba446f2
4 changed files with 46 additions and 33 deletions
|
@ -197,6 +197,24 @@ in
|
||||||
''
|
''
|
||||||
);
|
);
|
||||||
|
|
||||||
|
home.activation.checkFilesChanged = dag.entryBefore ["linkGeneration"] (
|
||||||
|
''
|
||||||
|
declare -A changedFiles
|
||||||
|
'' + concatMapStrings (v: ''
|
||||||
|
cmp --quiet "${v.source}" "${config.home.homeDirectory}/${v.target}" \
|
||||||
|
&& changedFiles["${v.target}"]=0 \
|
||||||
|
|| changedFiles["${v.target}"]=1
|
||||||
|
'') (filter (v: v.onChange != "") (attrValues cfg))
|
||||||
|
);
|
||||||
|
|
||||||
|
home.activation.onFilesChange = dag.entryAfter ["linkGeneration"] (
|
||||||
|
concatMapStrings (v: ''
|
||||||
|
if [[ ${"$\{changedFiles"}["${v.target}"]} -eq 1 ]]; then
|
||||||
|
${v.onChange}
|
||||||
|
fi
|
||||||
|
'') (filter (v: v.onChange != "") (attrValues cfg))
|
||||||
|
);
|
||||||
|
|
||||||
home-files = pkgs.stdenv.mkDerivation {
|
home-files = pkgs.stdenv.mkDerivation {
|
||||||
name = "home-manager-files";
|
name = "home-manager-files";
|
||||||
|
|
||||||
|
|
|
@ -95,6 +95,17 @@ in
|
||||||
are symbolic links to the files of the source directory.
|
are symbolic links to the files of the source directory.
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
onChange = mkOption {
|
||||||
|
type = types.lines;
|
||||||
|
default = "";
|
||||||
|
description = ''
|
||||||
|
Shell commands to run when file has changed between
|
||||||
|
generations. The script will be run
|
||||||
|
<emphasis>after</emphasis> the new files have been linked
|
||||||
|
into place.
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
|
|
|
@ -771,23 +771,16 @@ in
|
||||||
{
|
{
|
||||||
home.packages = [ cfg.package ];
|
home.packages = [ cfg.package ];
|
||||||
xsession.windowManager.command = "${cfg.package}/bin/i3";
|
xsession.windowManager.command = "${cfg.package}/bin/i3";
|
||||||
xdg.configFile."i3/config".source = configFile;
|
xdg.configFile."i3/config" = {
|
||||||
|
source = configFile;
|
||||||
home.activation.checkI3 = dag.entryBefore [ "linkGeneration" ] ''
|
onChange = ''
|
||||||
if ! cmp --quiet \
|
i3Socket=''${XDG_RUNTIME_DIR:-/run/user/$UID}/i3/ipc-socket.*
|
||||||
"${configFile}" \
|
if [ -S $i3Socket ]; then
|
||||||
"${config.xdg.configHome}/i3/config"; then
|
|
||||||
i3Changed=1
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
|
|
||||||
home.activation.reloadI3 = dag.entryAfter [ "linkGeneration" ] ''
|
|
||||||
SOCKET=''${XDG_RUNTIME_DIR:-/run/user/$UID}/i3/ipc-socket.*
|
|
||||||
if [ -v i3Changed ] && [ -S $SOCKET ]; then
|
|
||||||
echo "Reloading i3"
|
echo "Reloading i3"
|
||||||
${cfg.package}/bin/i3-msg -s $SOCKET reload 1>/dev/null
|
$DRY_RUN_CMD ${cfg.package}/bin/i3-msg -s $i3Socket reload 1>/dev/null
|
||||||
fi
|
fi
|
||||||
'';
|
'';
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
(mkIf (cfg.config != null) {
|
(mkIf (cfg.config != null) {
|
||||||
|
|
|
@ -90,23 +90,14 @@ in
|
||||||
|
|
||||||
(mkIf (cfg.config != null) {
|
(mkIf (cfg.config != null) {
|
||||||
home.file.".xmonad/xmonad.hs".source = cfg.config;
|
home.file.".xmonad/xmonad.hs".source = cfg.config;
|
||||||
|
home.file.".xmonad/xmonad.hs".onChange = ''
|
||||||
home.activation.checkXmonad = dag.entryBefore [ "linkGeneration" ] ''
|
|
||||||
if ! cmp --quiet "${cfg.config}" "$HOME/.xmonad/xmonad.hs"; then
|
|
||||||
xmonadChanged=1
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
|
|
||||||
home.activation.applyXmonad = dag.entryAfter [ "linkGeneration" ] ''
|
|
||||||
if [[ -v xmonadChanged ]]; then
|
|
||||||
echo "Recompiling xmonad"
|
echo "Recompiling xmonad"
|
||||||
${config.xsession.windowManager.command} --recompile
|
$DRY_RUN_CMD ${config.xsession.windowManager.command} --recompile
|
||||||
|
|
||||||
# Attempt to restart xmonad if X is running.
|
# Attempt to restart xmonad if X is running.
|
||||||
if [[ -v DISPLAY ]] ; then
|
if [[ -v DISPLAY ]] ; then
|
||||||
echo "Restarting xmonad"
|
echo "Restarting xmonad"
|
||||||
${config.xsession.windowManager.command} --restart
|
$DRY_RUN_CMD ${config.xsession.windowManager.command} --restart
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
'';
|
'';
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in a new issue