Skip to content

Commit 61088b4

Browse files
committed
Driver: Check for missing/unknown opam packages
Closes ocaml#1302, closes ocaml#1296
1 parent 07d0800 commit 61088b4

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

src/driver/bin/odoc_driver.ml

+14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,19 @@
11
(* Odoc driver *)
22
open Odoc_driver_lib
33

4+
let check_packages packages =
5+
match packages with
6+
| [] -> ()
7+
| _ -> (
8+
match Opam.check packages with
9+
| Ok () -> ()
10+
| Error missing ->
11+
Logs.err (fun m ->
12+
m "Error: Unknown/uninstalled packages: %a"
13+
Fmt.Dump.(list string)
14+
(Util.StringSet.elements missing));
15+
exit 1)
16+
417
let run_inner ~odoc_dir ~odocl_dir ~index_dir ~mld_dir ~compile_grep ~link_grep
518
~generate_grep ~index_grep ~remap ~index_mld packages
619
{
@@ -20,6 +33,7 @@ let run_inner ~odoc_dir ~odocl_dir ~index_dir ~mld_dir ~compile_grep ~link_grep
2033

2134
if verbose then Logs.set_level (Some Logs.Debug);
2235
Logs.set_reporter (Logs_fmt.reporter ());
36+
check_packages packages;
2337
Stats.init_nprocs nb_workers;
2438

2539
let index_mld_content =

src/driver/opam.ml

+23
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,29 @@ let dune_overrides () =
281281
[])
282282
| _ -> [])
283283

284+
let check pkgs =
285+
let cmd =
286+
Cmd.(
287+
opam % "list" % "-i" % "--columns" % "package" % "--color" % "never"
288+
% "-s")
289+
in
290+
let cmd = List.fold_left (fun cmd pkg -> Cmd.(cmd % pkg)) cmd pkgs in
291+
let out = Util.lines_of_process cmd in
292+
let res =
293+
List.filter_map
294+
(fun x ->
295+
match Astring.String.cut ~sep:"." x with
296+
| Some (name, _version) -> Some name
297+
| None -> None)
298+
out
299+
in
300+
let missing = Util.StringSet.(diff (of_list pkgs) (of_list res)) in
301+
let dune_pkgnames =
302+
Util.StringSet.of_list (List.map (fun (p, _) -> p.name) (dune_overrides ()))
303+
in
304+
let missing = Util.StringSet.(diff missing dune_pkgnames) in
305+
if Util.StringSet.cardinal missing = 0 then Ok () else Error missing
306+
284307
let pkg_to_dir_map () =
285308
let dune_overrides = dune_overrides () in
286309
let pkgs = all_opam_packages () in

src/driver/opam.mli

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ val all_opam_packages : unit -> package list
2020

2121
val classify_docs : Fpath.t -> string option -> Fpath.t list -> doc_file list
2222

23+
val check : string list -> (unit, Util.StringSet.t) Result.t
2324
val deps : string list -> package list
2425
val pkg_to_dir_map : unit -> fpaths_of_package * package_of_fpath
2526
val pp : Format.formatter -> package -> unit

0 commit comments

Comments
 (0)