diff --git a/modules/files.nix b/modules/files.nix index c61560c5b..42ef02d8e 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 ebdcb7741..d8622d0c8 100644 --- a/modules/lib/file-type.nix +++ b/modules/lib/file-type.nix @@ -89,6 +89,23 @@ in for files created through the text 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. + + If false (the default) then the target + will be a symbolic link to the source directory. If + true 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 = {