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 installed_libraries =
let doc = "Print out libraries installed on the system." in let doc = "Print out libraries installed on the system." in
let go common = let go common na =
set_common common; set_common common;
Future.Scheduler.go ~log:(Log.create ()) Future.Scheduler.go ~log:(Log.create ())
(Context.default () >>= fun ctx -> (Context.default () >>= fun ctx ->
let findlib = ctx.findlib in let findlib = ctx.findlib in
let pkgs = Findlib.all_packages findlib in if na then begin
let max_len = List.longest_map pkgs ~f:(fun p -> p.name) in let pkgs = Findlib.all_unavailable_packages findlib in
List.iter pkgs ~f:(fun pkg -> let longest = List.longest_map pkgs ~f:(fun na -> na.package) in
let ver = let ppf = Format.std_formatter in
match pkg.Findlib.version with List.iter pkgs ~f:(fun (na : Findlib.Package_not_available.t) ->
| "" -> "n/a" Format.fprintf ppf "%-*s -> %a@\n" longest na.package
| v -> v Findlib.Package_not_available.explain na.reason);
in Format.pp_print_flush ppf ();
Printf.printf "%-*s (version: %s)\n" max_len pkg.name ver); Future.return ()
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 in
( Term.(const go ( 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 , Term.info "installed-libraries" ~doc
) )

View File

@ -177,6 +177,23 @@ module Package_not_available = struct
(all_names ts (all_names ts
|> List.map ~f:(sprintf "- %s") |> List.map ~f:(sprintf "- %s")
|> String.concat ~sep:"\n") |> 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 end
type present_or_not_available = type present_or_not_available =
@ -532,10 +549,20 @@ let all_packages t =
ignore (find t pkg ~required_by:[] : package option)); ignore (find t pkg ~required_by:[] : package option));
Hashtbl.fold t.packages ~init:[] ~f:(fun ~key:_ ~data acc -> Hashtbl.fold t.packages ~init:[] ~f:(fun ~key:_ ~data acc ->
match data with match data with
| Present p -> p :: acc | Present p -> p :: acc
| Not_available _ -> acc) | Not_available _ -> acc)
|> List.sort ~cmp:(fun a b -> String.compare a.name b.name) |> 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 stdlib_with_archives t =
let x = find_exn t ~required_by:[] "stdlib" in let x = find_exn t ~required_by:[] "stdlib" in
let archives = let archives =

View File

@ -17,6 +17,9 @@ module Package_not_available : sig
(** At least one dependency is unavailable *) (** At least one dependency is unavailable *)
val top_closure : t list -> t list val top_closure : t list -> t list
(** Explain why a package is not available *)
val explain : Format.formatter -> reason -> unit
end end
exception Package_not_available of Package_not_available.t 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 root_packages : t -> string list
val all_packages : t -> package list val all_packages : t -> package list
val all_unavailable_packages : t -> Package_not_available.t list
val stdlib_with_archives : t -> package 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 deps = Findlib.Package_not_available.top_closure deps in
let longest = List.longest_map deps ~f:(fun na -> na.package) in let longest = List.longest_map deps ~f:(fun na -> na.package) in
List.iter deps ~f:(fun (na : Findlib.Package_not_available.t) -> List.iter deps ~f:(fun (na : Findlib.Package_not_available.t) ->
match na.reason with Format.fprintf ppf "- %-*s -> %a@\n" longest na.package
| Not_found -> Findlib.Package_not_available.explain na.reason)
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 "")
end; end;
let cmdline_suggestion = let cmdline_suggestion =
(* CR-someday jdimino: this is ugly *) (* CR-someday jdimino: this is ugly *)