2024-02-18 19:57:12 +01:00
|
|
|
{ depot, lib, pkgs, ... }:
|
|
|
|
let
|
2024-02-20 17:49:17 +01:00
|
|
|
inherit (lib) fix pipe mapAttrsToList isAttrs concatLines isString isDerivation isPath;
|
2024-02-18 19:57:12 +01:00
|
|
|
|
2024-02-20 17:49:17 +01:00
|
|
|
# TODO(sterni): move to //nix/utils with clearer naming and alternative similar to lib.types.path
|
|
|
|
isPathLike = value:
|
|
|
|
isPath value
|
|
|
|
|| isDerivation value
|
|
|
|
|| (isString value && builtins.hasContext value);
|
2024-02-18 19:57:12 +01:00
|
|
|
|
|
|
|
esc = s: lib.escapeShellArg /* ensure paths import into store */ "${s}";
|
|
|
|
|
|
|
|
writeTreeAtPath = path: tree:
|
|
|
|
''
|
|
|
|
mkdir -p "$out/"${esc path}
|
|
|
|
''
|
|
|
|
+ pipe tree [
|
|
|
|
(mapAttrsToList (k: v:
|
2024-02-20 17:49:17 +01:00
|
|
|
if isPathLike v then
|
|
|
|
"cp -R --reflink=auto ${v} \"$out/\"${esc path}/${esc k}"
|
|
|
|
else if lib.isAttrs v then
|
|
|
|
writeTreeAtPath (path + "/" + k) v
|
2024-02-18 19:57:12 +01:00
|
|
|
else
|
2024-02-20 17:49:17 +01:00
|
|
|
throw "invalid type (expected path, derivation, string with context, or attrs)"))
|
2024-02-18 19:57:12 +01:00
|
|
|
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;
|
|
|
|
}
|