"--variables", Arg.Unit (set_mode `Variables), " Display all variables and values";
"-V", Arg.Unit display_version, " Display version number and exit";
"--version", Arg.Unit display_version, " Display version number and exit";
+ "--whisper", Arg.Unit (set_mode `Whisper), " Set the variable, quietly";
] in
(* anon_fun normally just collects up the anonymous arguments as
* strings, and most modes just use 'args' as a list of strings.
- * However for `Set and `Test modes we need to record the type of
- * each argument as well, so we keep that in a separate list
+ * However for `Set, `Test and `Whisper modes we need to record the
+ * type of each argument as well, so we keep that in a separate list
* (argtypes).
*)
let argtypes = ref [] in
if nr_args > 0 then
test_variables argtypes
+ | Some `Whisper ->
+ if nr_args > 0 then
+ whisper_variables argtypes
+
| Some `Get ->
if nr_args != 1 then (
eprintf "whenjobs --get variable\n";
close_in chan
and upload_file () =
- (* Recompile the jobs file. *)
- let file = get_jobs_filename () in
- let cmo_file = sprintf "%s/jobs.cmo" jobsdir in
- let cmd = sprintf "ocamlfind ocamlc -I +camlp4 -I %s -package unix,camlp4.lib -pp 'camlp4o %s/pa_when.cmo' -c %s -o %s"
- !libdir !libdir file cmo_file in
- if Sys.command cmd <> 0 then (
- eprintf "whenjobs: could not compile jobs script, see earlier error messages\n";
- eprintf "compile command was:\n%s\n" cmd;
- exit 1
- );
+ (* Recompile the jobs file(s). *)
+ let files = get_multijobs_filenames () in
+ List.iter (
+ fun file ->
+ let cmd = sprintf "%s c -I +camlp4 -I %s -package unix,camlp4.lib -pp 'camlp4o %s/pa_when.cmo' -c %s"
+ Config.ocamlfind !libdir !libdir file in
+ if Sys.command cmd <> 0 then (
+ eprintf "whenjobs: %s: could not compile jobs script, see earlier errors\n"
+ file;
+ eprintf "compile command was:\n%s\n" cmd;
+ exit 1
+ )
+ ) files;
+
+ let cmo_files = List.map (
+ fun file ->
+ let n = String.length file in
+ if n < 4 then assert false;
+ String.sub file 0 (n-3) ^ ".cmo"
+ ) files in
- (* Test-load the jobs file to ensure it makes sense. *)
+ (* Test-load the jobs files to ensure they make sense. *)
Whenfile.init Whenstate.empty;
(try
- Dynlink.loadfile cmo_file
+ List.iter Dynlink.loadfile cmo_files
with
Dynlink.Error err ->
eprintf "whenjobs: %s\n" (Dynlink.error_message err);
- (* Since it failed, unlink it. *)
- (try unlink cmo_file with Unix_error _ -> ());
+ (* Since it failed, unlink the cmo files. *)
+ List.iter (
+ fun cmo_file ->
+ (try unlink cmo_file with Unix_error _ -> ())
+ ) cmo_files;
exit 1
);
let i =
try String.index def '='
with Not_found ->
- eprintf "whenjobs: set: missing = sign in variable definition\n";
+ eprintf "whenjobs: test: missing = sign in variable definition\n";
suggest_help ();
exit 1 in
let name = String.sub def 0 i in
Array.iter print_endline jobnames
+and whisper_variables argtypes =
+ let vars = List.map (
+ fun (def, typ) ->
+ (* 'def' should have the form "name=value". The value part may
+ * be missing, but the equals sign is required.
+ *)
+ let i =
+ try String.index def '='
+ with Not_found ->
+ eprintf "whenjobs: whisper: missing = sign in variable definition\n";
+ suggest_help ();
+ exit 1 in
+ let name = String.sub def 0 i in
+ let value = String.sub def (i+1) (String.length def - (i+1)) in
+ let value = value_of_string value typ in
+ { Whenproto_aux.sv_name = name; sv_value = value }
+ ) argtypes in
+ let vars = Array.of_list vars in
+
+ let client = start_client () in
+ (match Whenproto_clnt.When.V1.whisper_variables client vars with
+ | `ok -> ()
+ | `error msg ->
+ eprintf "whenjobs: whisper: %s\n" msg;
+ suggest_check_server_logs ();
+ exit 1
+ );
+ stop_client client
+
and get_variable name =
let client = start_client () in
let value = Whenproto_clnt.When.V1.get_variable client name in
stop_client client
and daemon_start () =
- assert false
+ exit (Sys.command "whenjobsd")
and daemon_stop () =
let client = start_client () in
stop_client client
and daemon_restart () =
- assert false
+ (try
+ let client = start_client_no_exit () in
+ ignore (Whenproto_clnt.When.V1.exit_daemon client ());
+ stop_client client
+ with _ -> ()
+ );
+ sleep 1;
+ daemon_start ()
and daemon_status () =
let r =
and get_jobs_filename () =
sprintf "%s/jobs.ml" jobsdir
+and get_multijobs_filenames () =
+ (* Get dir/*.ml *)
+ let files = Array.to_list (Sys.readdir jobsdir) in
+ let files = List.filter (
+ fun file ->
+ let n = String.length file in
+ n >= 4 && String.sub file (n-3) 3 = ".ml"
+ ) files in
+ let files = List.map (fun file -> jobsdir // file) files in
+ List.sort compare files
+
and create_tutorial file =
let chan = open_out file in
output_string chan Tutorial.tutorial;