aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Helgesson <robert@rycee.net>2017-11-06 18:00:25 +0100
committerRobert Helgesson <robert@rycee.net>2017-11-07 17:18:00 +0100
commit54043df8fbb07e34fac69d103873823c050e4a6b (patch)
tree31f5c315f2e86fa6f3ab5c19be09c80768d1ae66
parentfad1e108d835bc4408634da11bff8e0fdb8d0cda (diff)
files: support recursive linking of directory
-rw-r--r--modules/files.nix13
-rw-r--r--modules/lib/file-type.nix17
2 files changed, 28 insertions, 2 deletions
diff --git a/modules/files.nix b/modules/files.nix
index c61560c5bdd..42ef02d8eb8 100644
--- a/modules/files.nix
+++ b/modules/files.nix
@@ -186,6 +186,8 @@ in
home-files = pkgs.stdenv.mkDerivation {
name = "home-manager-files";
+ nativeBuildInputs = [ pkgs.xlibs.lndir ];
+
# Symlink directories and files that have the right execute bit.
# Copy files that need their execute bit changed or use the
# deprecated 'mode' option.
@@ -197,6 +199,7 @@ in
local relTarget="$2"
local executable="$3"
local mode="$4" # For backwards compatibility.
+ local recursive="$5"
# Figure out the real absolute path to the target.
local target
@@ -210,7 +213,12 @@ in
mkdir -p "$(dirname "$target")"
if [[ -d $source ]]; then
- ln -s "$source" "$target"
+ if [[ $recursive ]]; then
+ mkdir -p "$target"
+ lndir -silent "$source" "$target"
+ else
+ ln -s "$source" "$target"
+ fi
elif [[ $mode ]]; then
install -m "$mode" "$source" "$target"
else
@@ -234,7 +242,8 @@ in
"${if v.executable == null
then "symlink"
else builtins.toString v.executable}" \
- "${builtins.toString v.mode}"
+ "${builtins.toString v.mode}" \
+ "${builtins.toString v.recursive}"
'') cfg
);
};
diff --git a/modules/lib/file-type.nix b/modules/lib/file-type.nix
index ebdcb774165..d8622d0c8ca 100644
--- a/modules/lib/file-type.nix
+++ b/modules/lib/file-type.nix
@@ -89,6 +89,23 @@ in
for files created through the <varname>text</varname> option.
'';
};
+
+ recursive = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ If the file source is a directory, then this option
+ determines whether the directory should be recursively
+ linked to the target location. This option has no effect
+ if the source is a file.
+ </para><para>
+ If <literal>false</literal> (the default) then the target
+ will be a symbolic link to the source directory. If
+ <literal>true</literal> then the target will be a
+ directory structure matching the source's but whose leafs
+ are symbolic links to the files of the source directory.
+ '';
+ };
};
config = {