files: add helper function mkOutOfStoreSymlink
Using this function it is possible to make `home.file` create a symlink to a path outside the Nix store. For example, a Home Manager configuration containing home.file."foo".source = config.lib.file.mkOutOfStoreSymlink ./bar; would upon activation create a symlink `~/foo` that points to the absolute path of the `bar` file relative the configuration file. PR #1211
This commit is contained in:
parent
70f7c9f355
commit
91551c09d4
|
@ -39,6 +39,13 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
|
lib.file.mkOutOfStoreSymlink = path:
|
||||||
|
let
|
||||||
|
pathStr = toString path;
|
||||||
|
name = hm.strings.storeFileName (baseNameOf pathStr);
|
||||||
|
in
|
||||||
|
pkgs.runCommandLocal name {} ''ln -s ${escapeShellArg pathStr} $out'';
|
||||||
|
|
||||||
# This verifies that the links we are about to create will not
|
# This verifies that the links we are about to create will not
|
||||||
# overwrite an existing file.
|
# overwrite an existing file.
|
||||||
home.activation.checkLinkTargets = hm.dag.entryBefore ["writeBoundary"] (
|
home.activation.checkLinkTargets = hm.dag.entryBefore ["writeBoundary"] (
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
{
|
{
|
||||||
files-executable = ./executable.nix;
|
files-executable = ./executable.nix;
|
||||||
files-hidden-source = ./hidden-source.nix;
|
files-hidden-source = ./hidden-source.nix;
|
||||||
|
files-out-of-store-symlink = ./out-of-store-symlink.nix;
|
||||||
files-source-with-spaces = ./source-with-spaces.nix;
|
files-source-with-spaces = ./source-with-spaces.nix;
|
||||||
files-text = ./text.nix;
|
files-text = ./text.nix;
|
||||||
}
|
}
|
||||||
|
|
29
tests/modules/files/out-of-store-symlink.nix
Normal file
29
tests/modules/files/out-of-store-symlink.nix
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
filePath = ./. + "/source with spaces!";
|
||||||
|
|
||||||
|
in {
|
||||||
|
config = {
|
||||||
|
home.file."oos".source = config.lib.file.mkOutOfStoreSymlink filePath;
|
||||||
|
|
||||||
|
nmt.script = ''
|
||||||
|
assertLinkExists "home-files/oos"
|
||||||
|
|
||||||
|
storePath="$(readlink $TESTED/home-files/oos)"
|
||||||
|
|
||||||
|
if [[ ! -L $storePath ]]; then
|
||||||
|
fail "Expected $storePath to be a symbolic link, but it was not."
|
||||||
|
fi
|
||||||
|
|
||||||
|
actual="$(readlink "$storePath")"
|
||||||
|
expected="${toString filePath}"
|
||||||
|
if [[ $actual != $expected ]]; then
|
||||||
|
fail "Symlink home-files/oos should point to $expected via the Nix store, but it actually points to $actual."
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in a new issue