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.

45 lines
1.5 KiB

(*
* Copyright (c) 2017 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*)
open! IStd
type t = {
introduced: Jsonbug_t.report;
fixed: Jsonbug_t.report;
preexisting: Jsonbug_t.report;
}
(** Set operations should keep duplicated issues with identical hashes *)
let of_reports ~(current_report: Jsonbug_t.report) ~(previous_report: Jsonbug_t.report) : t =
let to_map report =
List.fold_left
~f:(fun map issue -> Map.add_multi map ~key:issue.Jsonbug_t.hash ~data:issue)
~init:Int.Map.empty
report in
let fold_aux ~key:_ ~data (left, both, right) =
match data with
| `Left left' -> (List.rev_append left' left, both, right)
| `Both (both', _) -> (left, List.rev_append both' both, right)
| `Right right' -> (left, both, List.rev_append right' right) in
let introduced, preexisting, fixed =
Map.fold2 (to_map current_report) (to_map previous_report) ~f:fold_aux ~init:([],[],[]) in
{introduced; fixed; preexisting}
let to_files {introduced; fixed; preexisting} destdir =
Out_channel.write_all
(destdir ^/ "introduced.json")
~data:(Jsonbug_j.string_of_report introduced);
Out_channel.write_all
(destdir ^/ "fixed.json")
~data:(Jsonbug_j.string_of_report fixed);
Out_channel.write_all
(destdir ^/ "preexisting.json")
~data:(Jsonbug_j.string_of_report preexisting)