open Core; module Unix = Core_unix; module Util = Flake_env__util; module Watches = Flake_env__watches; module Versions = Flake_env__versions; let print_cur_cache = profile_rc => { In_channel.read_all(profile_rc) |> Printf.printf("%s"); }; let clean_old_gcroots = layout_dir => { Util.rmrf(layout_dir ++ "/flake-inputs/"); Util.rmrf(layout_dir); Unix.mkdir_p(layout_dir ++ "/flake-inputs/"); }; let add_gcroot = (store_path, symlink) => { switch (Util.nix(["build", "--out-link", symlink, store_path])) { | (Ok (), _) => Ok() | (err, _) => err }; }; let freshen_cache = (layout_dir, hash, flake_specifier, other_args) => { clean_old_gcroots(layout_dir); let tmp_profile = layout_dir ++ "flake-tmp-profile." ++ Core.Pid.to_string(Core_unix.getpid()); let pde_args = [ "print-dev-env", "--profile", tmp_profile, flake_specifier, ...other_args, ]; let (exit_code, stdout_content) = Util.nix(pde_args); let profile = layout_dir ++ "/flake-profile-" ++ hash; let profile_rc = profile ++ ".rc"; switch (exit_code) { | Ok () => Out_channel.with_file( ~f=f => Out_channel.output_string(f, stdout_content), profile_rc, ); switch (add_gcroot(tmp_profile, profile)) { | Ok () => Sys_unix.remove(tmp_profile); let flake_input_cache_path = layout_dir ++ "/flake-inputs/"; let flake_inputs = Watches.get_input_paths(); flake_inputs |> List.iter(~f=inpt => { switch ( add_gcroot("/nix/store/" ++ inpt, flake_input_cache_path ++ inpt) ) { | Ok () => () | err => Printf.eprintf( "Failed creating flake-input gcroot: %s\n", Core_unix.Exit_or_signal.to_string_hum(err), ) } }); print_cur_cache(profile_rc); | err => Printf.eprintf( "Failed creating gcroot: %s\n", Core_unix.Exit_or_signal.to_string_hum(err), ); exit(1); }; | err => Printf.eprintf( "Failed evaluating flake: %s\n", Core_unix.Exit_or_signal.to_string_hum(err), ); exit(1); }; }; let preflight = layout_directory => { switch ( Versions.preflight_versions(), Sys_unix.is_directory(layout_directory), ) { | (Ok(_), `Yes) => Ok() | (Ok(_), _) => Unix.mkdir_p(layout_directory); Ok(); | (err, _) => err }; };