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.

67 lines
2.2 KiB

(*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)
open! IStd
open PolyVariantEqual
type zip_library = {zip_filename: string; zip_channel: Zip.in_file Lazy.t}
let load_from_zip serializer zip_path zip_library =
let (lazy zip_channel) = zip_library.zip_channel in
let deserialize = Serialization.read_from_string serializer in
match deserialize (Zip.read_entry zip_channel (Zip.find_entry zip_channel zip_path)) with
| Some data ->
Some data
| None ->
None
| exception Caml.Not_found ->
None
let load_data serializer path zip_library =
let zip_path = Filename.concat Config.default_in_zip_results_dir path in
load_from_zip serializer zip_path zip_library
(** list of the zip files to search for specs files *)
let zip_libraries =
(* delay until load is called, to avoid stating/opening files at init time *)
lazy
(let mk_zip_lib zip_filename = {zip_filename; zip_channel= lazy (Zip.open_in zip_filename)} in
let zip_libs =
let load_zip fname =
if Filename.check_suffix fname ".jar" then
(* fname is a zip of specs *)
Some (mk_zip_lib fname)
else (* fname is a dir of specs *)
None
in
(* Order matters: jar files should appear in the order in which they should be searched for
specs files. [Config.specs_library] is in reverse order of appearance on the command
line. *)
List.rev_filter_map Config.specs_library ~f:load_zip
in
if
Config.biabduction
&& (not Config.biabduction_models_mode)
&& Sys.file_exists Config.biabduction_models_jar = `Yes
then mk_zip_lib Config.biabduction_models_jar :: zip_libs
else zip_libs )
(** Search path in the list of zip libraries and use a cache directory to save already deserialized
data *)
let load serializer path =
let rec loop = function
| [] ->
None
| zip_library :: other_libraries ->
let opt = load_data serializer path zip_library in
if Option.is_some opt then opt else loop other_libraries
in
loop (Lazy.force zip_libraries)