2024-02-23 05:24:13 +00:00
|
|
|
{ lib, sane-lib, ... }:
|
2023-01-06 15:38:29 +00:00
|
|
|
|
2024-02-23 05:24:13 +00:00
|
|
|
let
|
|
|
|
sane-path = sane-lib.path;
|
|
|
|
in rec {
|
2023-01-09 03:11:14 +00:00
|
|
|
wanted = lib.attrsets.unionOfDisjoint { wantedBeforeBy = [ "multi-user.target" ]; };
|
2023-01-27 01:51:35 +00:00
|
|
|
wantedDir = wanted { dir = {}; };
|
2023-01-07 01:41:56 +00:00
|
|
|
wantedSymlink = symlink: wanted { inherit symlink; };
|
2023-01-06 15:38:29 +00:00
|
|
|
wantedSymlinkTo = target: wantedSymlink { inherit target; };
|
|
|
|
wantedText = text: wantedSymlink { inherit text; };
|
2024-02-23 05:24:13 +00:00
|
|
|
|
2024-05-13 07:47:43 +00:00
|
|
|
# Type: derefSymlinkOrNull :: config.sane.fs.type -> str -> (str|null)
|
|
|
|
# the returned path is always absolute (even if the original symlink was relative),
|
|
|
|
# and in canonical form.
|
2024-02-23 05:24:13 +00:00
|
|
|
derefSymlinkOrNull = fs: logical: let
|
|
|
|
symlinkedPrefixes = lib.filter
|
|
|
|
(p: ((fs."${p}" or {}).symlink or null) != null)
|
|
|
|
(sane-path.walk "/" logical);
|
|
|
|
firstSymlink = builtins.head symlinkedPrefixes;
|
2024-02-24 05:36:44 +00:00
|
|
|
firstSymlinkDest = fs."${firstSymlink}".symlink.target;
|
2024-02-23 05:24:13 +00:00
|
|
|
firstSymlinkParent = sane-path.parent firstSymlink;
|
|
|
|
firstSymlinkDestAbs = if lib.hasPrefix "/" firstSymlinkDest then
|
|
|
|
firstSymlinkDest
|
|
|
|
else
|
|
|
|
sane-path.join [ firstSymlinkParent firstSymlinkDest ];
|
|
|
|
in
|
|
|
|
if symlinkedPrefixes != [] then
|
2024-05-13 07:47:43 +00:00
|
|
|
sane-path.realpath firstSymlinkDestAbs
|
2024-02-23 05:24:13 +00:00
|
|
|
else
|
|
|
|
null
|
|
|
|
;
|
|
|
|
derefSymlink = fs: logical:
|
|
|
|
if derefSymlinkOrNull fs logical != null then
|
|
|
|
derefSymlinkOrNull fs logical
|
|
|
|
else
|
|
|
|
logical
|
|
|
|
;
|
2023-01-06 15:38:29 +00:00
|
|
|
}
|
|
|
|
|