From f5e25b30077afe8b7dab03c1059932ac981c47bb Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Sat, 10 Mar 2012 13:15:19 +0000 Subject: [PATCH] Implement 'whenjobs --test' to test the effect of variable setting. --- tools/whenjobs.ml | 35 +++++++++++++++++++++++++++++++++-- tools/whenjobs.pod | 11 +++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/tools/whenjobs.ml b/tools/whenjobs.ml index 582f259..e0f3cc9 100644 --- a/tools/whenjobs.ml +++ b/tools/whenjobs.ml @@ -110,6 +110,7 @@ let rec main () = "--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"; @@ -119,8 +120,9 @@ let rec main () = (* 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 @@ -189,6 +191,10 @@ Options: 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"; @@ -359,6 +365,31 @@ and set_variables argtypes = ); 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 diff --git a/tools/whenjobs.pod b/tools/whenjobs.pod index 7c9e8ee..120608b 100644 --- a/tools/whenjobs.pod +++ b/tools/whenjobs.pod @@ -202,6 +202,17 @@ may cause unexpected results, so use with caution. 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 run, I 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. -- 1.8.3.1