You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.3 KiB

(*
* Copyright (c) 2018-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open! IStd
let run_time_string = Time.now () |> Time.to_string
let state0 =
let open Runstate_t in
{ run_sequence= []
; results_dir_format=
Printf.sprintf "db_filename: %s\ndb_schema: %s" ResultsDatabase.database_filename
ResultsDatabase.schema_hum
; should_merge_capture= false }
let state : Runstate_t.t ref = ref state0
let add_run_to_sequence () =
let run =
{ Runstate_t.infer_version= Version.{Runstate_t.major; minor; patch; commit}
; date= run_time_string
; command= Config.command }
in
Runstate_t.(state := {!state with run_sequence= run :: !state.run_sequence})
let state_filename = ".infer_runstate.json"
let state_file_path = Config.results_dir ^/ state_filename
let store () =
Utils.with_file_out state_file_path ~f:(fun oc ->
Runstate_j.string_of_t !state |> Out_channel.output_string oc )
let load_and_validate () =
let error msg =
Printf.ksprintf
(fun err_msg ->
Error
(Printf.sprintf
"'%s' already exists but it is not an empty directory and it does not look like an \
infer results directory:\n\
\ %s\n\
Was it created using an older version of infer?"
Config.results_dir err_msg) )
msg
in
if Sys.file_exists state_file_path <> `Yes then
error "save state not found: '%s' does not exist" state_file_path
else
match Atdgen_runtime.Util.Json.from_file Runstate_j.read_t state_file_path with
| {Runstate_t.results_dir_format} as loaded_state
when String.equal !state.Runstate_t.results_dir_format results_dir_format ->
state := loaded_state ;
Ok ()
| {Runstate_t.results_dir_format} ->
error "Incompatible formats: found\n %s\n\nbut expected this format:\n %s\n\n"
results_dir_format !state.Runstate_t.results_dir_format
| exception e ->
error "could not read the save state '%s': %s" state_file_path (Exn.to_string e)
let reset () = state := state0
let set_merge_capture onoff = Runstate_t.(state := {!state with should_merge_capture= onoff})
let get_merge_capture () = !state.Runstate_t.should_merge_capture