diff options
author | Robert Helgesson <robert@rycee.net> | 2017-11-06 18:00:25 +0100 |
---|---|---|
committer | Robert Helgesson <robert@rycee.net> | 2017-11-07 17:18:00 +0100 |
commit | 54043df8fbb07e34fac69d103873823c050e4a6b (patch) | |
tree | 31f5c315f2e86fa6f3ab5c19be09c80768d1ae66 | |
parent | fad1e108d835bc4408634da11bff8e0fdb8d0cda (diff) |
files: support recursive linking of directory
-rw-r--r-- | modules/files.nix | 13 | ||||
-rw-r--r-- | modules/lib/file-type.nix | 17 |
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 = { |