Most of the ecosystem has moved to this formatter, and many people configured their editors to autoformat it with this formatter. Closes: https://git.snix.dev/snix/snix/issues/62 Change-Id: Icf39e7836c91fc2ae49fbe22a40a639105bfb0bd Reviewed-on: https://cl.snix.dev/c/snix/+/30671 Reviewed-by: Florian Klink <flokli@flokli.de> Tested-by: besadii Autosubmit: Ilan Joselevich <personal@ilanjoselevich.com>
58 lines
1.2 KiB
Nix
58 lines
1.2 KiB
Nix
{
|
|
depot,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}:
|
|
let
|
|
inherit (lib)
|
|
fix
|
|
pipe
|
|
mapAttrsToList
|
|
isAttrs
|
|
concatLines
|
|
isString
|
|
isDerivation
|
|
isPath
|
|
;
|
|
inherit (depot.nix.utils) isReferencablePath;
|
|
|
|
esc =
|
|
s:
|
|
lib.escapeShellArg # ensure paths import into store
|
|
"${s}";
|
|
|
|
writeTreeAtPath =
|
|
path: tree:
|
|
''
|
|
mkdir -p "$out/"${esc path}
|
|
''
|
|
+ pipe tree [
|
|
(mapAttrsToList (
|
|
k: v:
|
|
if isReferencablePath v then
|
|
"cp -R --reflink=auto ${esc "${v}"} \"$out/\"${esc path}/${esc k}"
|
|
else if lib.isAttrs v then
|
|
writeTreeAtPath (path + "/" + k) v
|
|
else
|
|
throw "invalid type (expected path, derivation, string with context, or attrs)"
|
|
))
|
|
concatLines
|
|
];
|
|
|
|
/*
|
|
Create a directory tree specified by a Nix attribute set structure.
|
|
|
|
Each value in `tree` should either be a file, a directory, or another tree
|
|
attribute set. Those paths will be written to a directory tree
|
|
corresponding to the structure of the attribute set.
|
|
|
|
Type: string -> attrSet -> derivation
|
|
*/
|
|
writeTree = name: tree: pkgs.runCommandLocal name { } (writeTreeAtPath "" tree);
|
|
in
|
|
|
|
# __functor trick so readTree can add the tests attribute
|
|
{
|
|
__functor = _: writeTree;
|
|
}
|