btw i use nix
1{ pkgs, lib, ... }:
2
3{
4 listFilesInDir =
5 src: lib.attrsets.mapAttrsToList (name: value: "${src}/${name}") (builtins.readDir src);
6 inDirReplace =
7 src: dst: replacements:
8 lib.pipe src [
9 # get filenames in src directory
10 builtins.readDir
11 (lib.attrsets.mapAttrsToList (name: value: "${name}"))
12 # call `substituteAll` on all files
13 (
14 let
15 substitutedSource = file: {
16 source = (
17 pkgs.substituteAll (
18 {
19 src = "/${src}/${file}";
20 isExecutable = true;
21 }
22 // replacements
23 )
24 );
25 };
26 in
27 builtins.map (file: lib.attrsets.nameValuePair "${dst}/${file}" (substitutedSource file))
28 )
29 builtins.listToAttrs
30 ];
31 concatFilesReplace =
32 filenames: replacements:
33 let
34 fromStrings = lib.attrsets.mapAttrsToList (name: value: "@${name}@") replacements;
35 in
36 let
37 toStrings = lib.attrsets.mapAttrsToList (name: value: "${value}") replacements;
38 in
39 let
40 fileToString = file: builtins.replaceStrings fromStrings toStrings (builtins.readFile file);
41 in
42 builtins.concatStringsSep "\n" (builtins.map fileToString filenames);
43}