Add: jbuilder installed-libraries --not-available

This commit is contained in:
Jeremie Dimino 2017-05-17 14:54:50 +01:00
parent 1814fc4299
commit b2a9d6dc51
4 changed files with 61 additions and 22 deletions

View File

@ -256,24 +256,39 @@ let common =
let installed_libraries =
let doc = "Print out libraries installed on the system." in
let go common =
let go common na =
set_common common;
Future.Scheduler.go ~log:(Log.create ())
(Context.default () >>= fun ctx ->
let findlib = ctx.findlib in
let pkgs = Findlib.all_packages findlib in
let max_len = List.longest_map pkgs ~f:(fun p -> p.name) in
List.iter pkgs ~f:(fun pkg ->
let ver =
match pkg.Findlib.version with
| "" -> "n/a"
| v -> v
in
Printf.printf "%-*s (version: %s)\n" max_len pkg.name ver);
Future.return ())
if na then begin
let pkgs = Findlib.all_unavailable_packages findlib in
let longest = List.longest_map pkgs ~f:(fun na -> na.package) in
let ppf = Format.std_formatter in
List.iter pkgs ~f:(fun (na : Findlib.Package_not_available.t) ->
Format.fprintf ppf "%-*s -> %a@\n" longest na.package
Findlib.Package_not_available.explain na.reason);
Format.pp_print_flush ppf ();
Future.return ()
end else begin
let pkgs = Findlib.all_packages findlib in
let max_len = List.longest_map pkgs ~f:(fun p -> p.name) in
List.iter pkgs ~f:(fun pkg ->
let ver =
match pkg.Findlib.version with
| "" -> "n/a"
| v -> v
in
Printf.printf "%-*s (version: %s)\n" max_len pkg.name ver);
Future.return ()
end)
in
( Term.(const go
$ common)
$ common
$ Arg.(value
& flag
& info ["na"; "not-available"]
~doc:"List libraries that are not available and explain why"))
, Term.info "installed-libraries" ~doc
)

View File

@ -177,6 +177,23 @@ module Package_not_available = struct
(all_names ts
|> List.map ~f:(sprintf "- %s")
|> String.concat ~sep:"\n")
let explain ppf reason =
match reason with
| Not_found ->
Format.fprintf ppf "not found"
| Hidden ->
Format.fprintf ppf "hidden (unsatisfied 'exist_if')"
| Dependencies_unavailable deps ->
Format.fprintf ppf
"@[<2>unavailable dependencies:@ %t@]"
(fun ppf ->
match deps with
| [] -> ()
| t :: rest ->
Format.fprintf ppf "%s" t.package;
List.iter rest ~f:(fun t ->
Format.fprintf ppf ",@ %s" t.package))
end
type present_or_not_available =
@ -532,10 +549,20 @@ let all_packages t =
ignore (find t pkg ~required_by:[] : package option));
Hashtbl.fold t.packages ~init:[] ~f:(fun ~key:_ ~data acc ->
match data with
| Present p -> p :: acc
| Present p -> p :: acc
| Not_available _ -> acc)
|> List.sort ~cmp:(fun a b -> String.compare a.name b.name)
let all_unavailable_packages t =
List.iter (root_packages t) ~f:(fun pkg ->
ignore (find t pkg ~required_by:[] : package option));
Hashtbl.fold t.packages ~init:[] ~f:(fun ~key:_ ~data acc ->
match data with
| Present _ -> acc
| Not_available n -> n :: acc)
|> List.sort ~cmp:(fun a b ->
String.compare a.Package_not_available.package b.package)
let stdlib_with_archives t =
let x = find_exn t ~required_by:[] "stdlib" in
let archives =

View File

@ -17,6 +17,9 @@ module Package_not_available : sig
(** At least one dependency is unavailable *)
val top_closure : t list -> t list
(** Explain why a package is not available *)
val explain : Format.formatter -> reason -> unit
end
exception Package_not_available of Package_not_available.t
@ -77,5 +80,6 @@ val closed_ppx_runtime_deps_of
val root_packages : t -> string list
val all_packages : t -> package list
val all_unavailable_packages : t -> Package_not_available.t list
val stdlib_with_archives : t -> package

View File

@ -108,15 +108,8 @@ let report_error ?(map_fname=fun x->x) ppf exn ~backtrace =
let deps = Findlib.Package_not_available.top_closure deps in
let longest = List.longest_map deps ~f:(fun na -> na.package) in
List.iter deps ~f:(fun (na : Findlib.Package_not_available.t) ->
match na.reason with
| Not_found ->
Format.fprintf ppf "- %-*s -> not found\n" longest na.package
| Hidden ->
Format.fprintf ppf "- %-*s -> hidden (unsatisfied 'exist_if')\n"
longest na.package
| Dependencies_unavailable _ ->
Format.fprintf ppf "- %s%-*s -> unavailable dependencies\n"
na.package longest "")
Format.fprintf ppf "- %-*s -> %a@\n" longest na.package
Findlib.Package_not_available.explain na.reason)
end;
let cmdline_suggestion =
(* CR-someday jdimino: this is ugly *)