1{ lib, pkgs, ... }:
2
3with lib;
4{
5 mkSymlinks = name: symlinks:
6 pkgs.writeShellScript "${name}-symlinks"
7 (concatStringsSep "\n"
8 (mapAttrsToList
9 (n: v: ''
10 if [[ -L "${n}" ]]; then
11 unlink "${n}"
12 elif [[ -e "${n}" ]]; then
13 echo "${n} already exists, moving"
14 mv "${n}" "${n}.bak"
15 fi
16 mkdir -p "$(dirname "${n}")"
17 ln -sf "${v}" "${n}"
18 '')
19 symlinks));
20
21 mkFiles = name: files:
22 pkgs.writeShellScript "${name}-files"
23 (concatStringsSep "\n"
24 (mapAttrsToList
25 (n: v: ''
26 if [[ -L "${n}" ]]; then
27 unlink "${n}"
28 elif ${pkgs.diffutils}/bin/cmp -s "${n}" "${v}"; then
29 rm "${n}"
30 elif [[ -e "${n}" ]]; then
31 echo "${n} already exists, moving"
32 mv "${n}" "${n}.bak"
33 fi
34 mkdir -p $(dirname "${n}")
35 ${pkgs.gawk}/bin/awk '{
36 for(varname in ENVIRON)
37 gsub("@"varname"@", ENVIRON[varname])
38 print
39 }' "${v}" > "${n}"
40 chmod --reference="${v}" "${n}"
41 '')
42 files));
43
44 mkDirs = name: dirs:
45 pkgs.writeShellScript "${name}-dirs"
46 (concatStringsSep "\n"
47 (mapAttrsToList
48 (n: v: ''
49 if [[ -L "${n}" ]]; then
50 unlink "${n}"
51 elif [[ ! -d "${n}" ]]; then
52 echo "${n} already exists and isn't a directory, moving"
53 mv "${n}" "${n}.bak"
54 fi
55 ${pkgs.rsync}/bin/rsync -avu "${v}/" "${n}"
56 chmod -R u+w "${n}"
57 '')
58 dirs));
59
60 rmSymlinks = name: symlinks:
61 pkgs.writeShellScript "${name}-rm-symlinks"
62 (
63 concatStringsSep "\n"
64 (mapAttrsToList (n: _v: "unlink \"${n}\"") symlinks)
65 );
66
67 rmFiles = name: files:
68 pkgs.writeShellScript "${name}-rm-symlinks"
69 (
70 concatStringsSep "\n"
71 (mapAttrsToList (n: _v: "rm \"${n}\"") files)
72 );
73}