Files
Geneweb/bin/gwrepl/gwrepl.ml
2024-03-05 22:01:20 +01:00

63 lines
2.2 KiB
OCaml

let root = Filename.concat (Filename.get_temp_dir_name ()) ("gwrepl." ^ Data.md5)
let path = Filename.concat root
let mkdir_p ~verbose x =
if verbose then print_string ("mkdir: " ^ x ^ "...");
let rec loop x =
let y = Filename.dirname x in
if y <> x && String.length y < String.length x then loop y;
try Unix.mkdir x 0o755 with Unix.Unix_error (_, _, _) -> ()
in
loop x;
if verbose then print_endline "OK!"
let output_file ~verbose (file, contents) =
if verbose then print_string ("unpacking: " ^ file ^ "...");
let oc = open_out_bin (path file) in
output_string oc contents;
close_out oc;
if verbose then print_endline "OK!"
let unpack ~force_unpack ~verbose =
if force_unpack || not (Sys.file_exists root) then (
Array.iter (fun dir -> mkdir_p ~verbose (path dir)) Data.directories;
Array.iter (output_file ~verbose) Data.cmas;
Array.iter (output_file ~verbose) Data.cmis;
Array.iter (output_file ~verbose) Data.shared)
let run ~ppf ~verbose ~noprompt =
Clflags.noversion := true;
Clflags.noinit := true;
if Array.length Sys.argv <> 1 || noprompt then Clflags.noprompt := true;
Array.iter
(fun dir ->
if verbose then print_endline ("directory: " ^ dir);
path dir |> Topdirs.dir_directory)
Data.directories;
Array.iter
(fun (file, _) ->
if verbose then print_endline ("load: " ^ file);
path file |> Topdirs.dir_load ppf)
Data.cmas;
Toploop.loop ppf
(** For script execution, run:
cat <script.ml> | [ GWREPL_PPF=/dev/null ] [ GWREPL_VERBOSE=1 ] [ GWREPL_FORCE_UNPACK=1 ] [ GWREPL_NOPROMPT=1 ] gwrepl.exe [scrip_arg1] ...
For interactive toplevel, run:
gwrepl.exe *)
let () =
let ppf =
match Sys.getenv_opt "GWREPL_PPF" with
| None | Some ("STD" | "std") -> Format.std_formatter
| Some ("ERR" | "err") -> Format.err_formatter
| Some path ->
let oc = open_out path in
Format.make_formatter (Stdlib.output_substring oc) (fun () ->
Stdlib.flush oc)
in
let verbose = Sys.getenv_opt "GWREPL_VERBOSE" <> None in
let force_unpack = Sys.getenv_opt "GWREPL_FORCE_UNPACK" <> None in
let noprompt = Sys.getenv_opt "GWREPL_NOPROMPT" <> None in
unpack ~force_unpack ~verbose;
run ~ppf ~verbose ~noprompt