"--set", Arg.Unit (set_mode `Set), " Set the variable";
"--start", Arg.Unit (set_mode `Start), "name Start a job manually";
"--tail", Arg.Unit (set_mode `Tail), "serial Tail job output";
+ "--test", Arg.Unit (set_mode `Test), " Test the effect of setting variables";
"--type", Arg.String set_type, "bool|int|float|string|.. Set the variable type";
"--upload", Arg.Unit (set_mode `Upload), " Upload the script";
"--variables", Arg.Unit (set_mode `Variables), " Display all variables and values";
(* 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 mode we need to record the type of each argument
- * as well, so we keep that in a separate list (argtypes).
+ * 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
+ * (argtypes).
*)
let argtypes = ref [] in
let anon_fun str = argtypes := (str, !typ) :: !argtypes in
if nr_args > 0 then
set_variables argtypes
+ | Some `Test ->
+ if nr_args > 0 then
+ test_variables argtypes
+
| Some `Get ->
if nr_args != 1 then (
eprintf "whenjobs --get variable\n";
);
stop_client client
+and test_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: set: 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
+ let jobnames = Whenproto_clnt.When.V1.test_variables client vars in
+ stop_client client;
+
+ Array.iter print_endline jobnames
+
and get_variable name =
let client = start_client () in
let value = Whenproto_clnt.When.V1.get_variable client name in
Tail the output of the running job identified by its serial number.
Use the I<--jobs> flag to get a list of running jobs.
+=item B<--test> variable=value [variable=value ...]
+
+This works the same way as the I<--set> option, but the difference is
+that the variables are set. Instead, it lists out the jobs that
+I<would> run, I<if> the variables were updated to these new values.
+
+The variables are not actually updated, and the jobs are not actually
+run.
+
+The output is a list of job names that would run.
+
=item B<--upload>
Compile the jobs script and upload it to the daemon, without editing.