aboutsummaryrefslogtreecommitdiffstats
path: root/pkgs/populate/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/populate/default.nix')
-rw-r--r--pkgs/populate/default.nix68
1 files changed, 49 insertions, 19 deletions
diff --git a/pkgs/populate/default.nix b/pkgs/populate/default.nix
index c259b15..f0b3411 100644
--- a/pkgs/populate/default.nix
+++ b/pkgs/populate/default.nix
@@ -1,24 +1,54 @@
# Populate, which delivers sources to a target directory. Given populate's
-# arguments, it returns the command delivering them. implementation selects
-# how: "shell" generates a script from the arguments, "rust" runs the
-# program in this directory with the arguments as JSON. rustProgram is that
-# program, e.g. one built with cargo during development.
-{ coreutils, dash, findutils, git, jq, nix, openssh, pass, passage, rsync
-, writers
-, implementation ? "shell"
+# arguments, it checks them, and returns a script running the program in
+# this directory with them as JSON. rustProgram is that program, e.g. one
+# built with cargo during development. dash, jq, and implementation are
+# unused, and stay for overrides that set them.
+{ coreutils, dash ? null, findutils, git, jq ? null, nix, openssh, pass
+, passage, rsync, writers
+, implementation ? null
, rustPlatform ? null
, rustProgram ? import ./program.nix { inherit rustPlatform; }
}:
-if implementation == "shell" then
- import ./shell.nix {
- inherit coreutils dash findutils git jq nix openssh pass passage rsync
- writers;
- }
-else if implementation == "rust" then
- import ./rust.nix {
- inherit coreutils findutils git nix openssh pass passage rsync writers;
- program = rustProgram;
- }
-else
- throw "populate: unknown implementation ${builtins.toJSON implementation}"
+with import ../../lib;
+
+let
+ checks = import ./checks.nix;
+in
+
+{ backup ? false, force ? false, prune ? false, source, target }:
+assert checks.checkTargetPath target.path;
+assert all checks.checkSourceName (attrNames source);
+assert checks.checkInputs source;
+assert checks.checkCopyingWithSudo target source;
+let
+ # Store paths in the arguments stay dependencies of the script, so
+ # building it builds them.
+ spec = toJSON {
+ version = 1;
+ inherit backup force prune source;
+ target = {
+ inherit (target) host path;
+ user = target.user or null;
+ port = if target.port or null == null then null else toString target.port;
+ sudo = target.sudo or false;
+ extraOptions = target.extraOptions or [];
+ # Decided during evaluation, like the other functions of krops do.
+ local = isLocalTarget target;
+ };
+ };
+in
+writers.writeDash "populate.${target.host}" /* sh */ ''
+ set -efu
+ echo + "$0" >&2
+ # The tools populate depends on, in front of others of the same name.
+ PATH=${makeBinPath [
+ coreutils findutils git nix openssh pass passage rsync
+ ]}''${PATH:+:$PATH}
+ export PATH
+ # On a file descriptor of its own, so the commands populate runs keep
+ # standard input. The JSON is a single line, which can't be the delimiter.
+ exec ${rustProgram}/bin/populate /dev/fd/3 3<<'EOF'
+ ${spec}
+ EOF
+''