77 lines
2.4 KiB
Nix
77 lines
2.4 KiB
Nix
{ lib, stdenvNoCC }:
|
|
|
|
/**
|
|
`replaceVars` is a wrapper around the [bash function `substitute`](https://nixos.org/manual/nixpkgs/stable/#fun-substitute)
|
|
in the stdenv. It allows for terse replacement of names in the specified path, while checking
|
|
for common mistakes such as naming a replacement that does nothing or forgetting a variable which
|
|
needs to be replaced.
|
|
|
|
As with the [`--subst-var-by`](https://nixos.org/manual/nixpkgs/stable/#fun-substitute-subst-var-by)
|
|
flag, names are encoded as `@name@` in the provided file at the provided path.
|
|
|
|
Any unmatched variable names in the file at the provided path will cause a build failure.
|
|
|
|
Any remaining text that matches `@[A-Za-z_][0-9A-Za-z_'-]@` in the output after replacement
|
|
has occurred will cause a build failure.
|
|
|
|
# Inputs
|
|
|
|
`path` ([Store Path](https://nixos.org/manual/nix/latest/store/store-path.html#store-path) String)
|
|
: The file in which to replace variables.
|
|
|
|
`attrs` (AttrsOf String)
|
|
: Each entry in this set corresponds to a `--subst-var-by` entry in [`substitute`](https://nixos.org/manual/nixpkgs/stable/#fun-substitute).
|
|
|
|
# Example
|
|
|
|
```nix
|
|
{ replaceVars }:
|
|
|
|
replaceVars ./greeting.txt { world = "hello"; }
|
|
```
|
|
|
|
See `../../test/replace-vars/default.nix` for tests of this function.
|
|
*/
|
|
path: attrs:
|
|
|
|
let
|
|
# We use `--replace-fail` instead of `--subst-var-by` so that if the thing isn't there, we fail.
|
|
subst-var-by = name: value: [
|
|
"--replace-fail"
|
|
(lib.escapeShellArg "@${name}@")
|
|
(lib.escapeShellArg value)
|
|
];
|
|
|
|
replacements = lib.concatLists (lib.mapAttrsToList subst-var-by attrs);
|
|
in
|
|
|
|
stdenvNoCC.mkDerivation {
|
|
name = baseNameOf (toString path);
|
|
src = path;
|
|
doCheck = true;
|
|
dontUnpack = true;
|
|
preferLocalBuild = true;
|
|
allowSubstitutes = false;
|
|
|
|
buildPhase = ''
|
|
runHook preBuild
|
|
substitute "$src" "$out" ${lib.concatStringsSep " " replacements}
|
|
runHook postBuild
|
|
'';
|
|
|
|
# Look for Nix identifiers surrounded by `@` that aren't substituted.
|
|
checkPhase =
|
|
let
|
|
regex = lib.escapeShellArg "@[a-zA-Z_][0-9A-Za-z_'-]*@";
|
|
in
|
|
''
|
|
runHook preCheck
|
|
if grep -qe ${regex} "$out"; then
|
|
echo The following look like unsubstituted Nix identifiers that remain in "$out":
|
|
grep -oe ${regex} "$out"
|
|
echo Use the more precise '`substitute`' function if this check is in error.
|
|
exit 1
|
|
fi
|
|
runHook postCheck
|
|
'';
|
|
}
|