From ccd90bcbf6cdf8ad1c1b9bfeb04b53841e37d22c Mon Sep 17 00:00:00 2001 From: Denis Merigoux Date: Mon, 14 Feb 2022 14:43:38 +0100 Subject: [PATCH] Display nice finish message when ending --- build_system/clerk.ml | 40 ++++++++++++++++++++---------------- build_system/ninja_utils.ml | 3 +++ build_system/ninja_utils.mli | 3 +++ 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/build_system/clerk.ml b/build_system/clerk.ml index be0a732a..b4bc3f7d 100644 --- a/build_system/clerk.ml +++ b/build_system/clerk.ml @@ -314,10 +314,16 @@ let add_test_rules (catala_exe_opts : string) (rules : Rule.t Nj.RuleMap.t) : Ru Lit "TEST on file"; Var "tested_file"; Lit "with the"; Var "catala_cmd"; Lit "command"; ]) in + let run_and_display_final_message = + Nj.Rule.make "run_and_display_final_message" + ~command:Nj.Expr.(Seq [ Lit ":" ]) + ~description:Nj.Expr.(Seq [ Lit "All tests"; Var "test_file_or_folder"; Lit "passed!" ]) + in Nj.RuleMap.( rules |> add test_with_scope_rule.name test_with_scope_rule - |> add test_without_scope_rule.name test_without_scope_rule) + |> add test_without_scope_rule.name test_without_scope_rule + |> add run_and_display_final_message.name run_and_display_final_message) (** [ninja_start catala_exe] returns the inital [ninja] data structure with rules needed to reset and test files. *) @@ -409,10 +415,12 @@ let collect_all_ninja_build (ninja : ninja) (tested_file : string) (reset_test_o ninja.builds; } ) -(** [add_root_test_build ninja re_test_file_or_dir] collects all build outputs matching the - [re_test_file_or_dir] regexp and concates them into the 'test' build declaration -- the root of - the build declarations. *) -let add_root_test_build (ninja : ninja) (re_test_file_or_dir : Re.Pcre.regexp) : ninja = +(** [add_root_test_build ninja re_test_file_or_dir test_file_or_dir] collects all build outputs + matching the [re_test_file_or_dir] regexp and concates them into the 'test' build declaration -- + the root of the build declarations. The [test_file_or_dir] parameter is only used for + pretty-printing purposes. *) +let add_root_test_build (ninja : ninja) (re_test_file_or_dir : Re.Pcre.regexp) + (test_file_or_dir_msg : string) : ninja = let all_test_files = Nj.BuildMap.bindings ninja.builds |> List.filter_map (fun (name, _) -> @@ -426,8 +434,9 @@ let add_root_test_build (ninja : ninja) (re_test_file_or_dir : Re.Pcre.regexp) : ninja with builds = Nj.BuildMap.add "test" - (Nj.Build.make_with_inputs ~outputs:[ Nj.Expr.Lit "test" ] ~rule:"phony" - ~inputs:[ Nj.Expr.Lit all_test_files ]) + (Nj.Build.make_with_vars_and_inputs ~outputs:[ Nj.Expr.Lit "test" ] + ~rule:"run_and_display_final_message" ~inputs:[ Nj.Expr.Lit all_test_files ] + ~vars:[ ("test_file_or_folder", Nj.Expr.Lit test_file_or_dir_msg) ]) ninja.builds; } @@ -505,20 +514,15 @@ let driver (file_or_folder : string) (command : string) (catala_exe : string opt | Some ninja -> let out = open_out "build.ninja" in Cli.debug_print "writing build.ninja..."; - let ninja = add_root_test_build ninja re_test_file_or_dir in + let ninja = + add_root_test_build ninja re_test_file_or_dir + (if Sys.is_directory file_or_folder then "in folder \"" ^ file_or_folder ^ "\"" + else "for file \"" ^ file_or_folder ^ "\"") + in Nj.write out ninja; close_out out; Cli.debug_print "executing 'ninja test'..."; - - if 0 == Sys.command "ninja test" then ( - Cli.result_print - (Format.asprintf "for all tests in %s: %s " - (Cli.print_with_style - [ ANSITerminal.magenta; ANSITerminal.Bold ] - "%s" file_or_folder) - (Cli.print_with_style [ ANSITerminal.green; ANSITerminal.Bold ] "PASS")); - 0) - else -1 + Sys.command "ninja test" | None -> -1) | "run" -> ( match scope with diff --git a/build_system/ninja_utils.ml b/build_system/ninja_utils.ml index 64819630..1beac38e 100644 --- a/build_system/ninja_utils.ml +++ b/build_system/ninja_utils.ml @@ -49,6 +49,9 @@ module Build = struct let make_with_inputs ~outputs ~rule ~inputs = { outputs; rule; inputs = Option.some inputs; vars = [] } + let make_with_vars_and_inputs ~outputs ~rule ~inputs ~vars = + { outputs; rule; inputs = Option.some inputs; vars } + let empty = make ~outputs:[ Expr.Lit "empty" ] ~rule:"phony" let unpath path = Re.Pcre.(substitute ~rex:(regexp "/") ~subst:(fun _ -> "-")) path diff --git a/build_system/ninja_utils.mli b/build_system/ninja_utils.mli index 3ad2de05..6c11afc8 100644 --- a/build_system/ninja_utils.mli +++ b/build_system/ninja_utils.mli @@ -76,6 +76,9 @@ module Build : sig val make_with_inputs : outputs:Expr.t list -> rule:string -> inputs:Expr.t list -> t + val make_with_vars_and_inputs : + outputs:Expr.t list -> rule:string -> inputs:Expr.t list -> vars:(string * Expr.t) list -> t + val empty : t (** [empty] is the minimal ninja build. *)