Add: jbuilder installed-libraries --not-available
This commit is contained in:
parent
1814fc4299
commit
b2a9d6dc51
39
bin/main.ml
39
bin/main.ml
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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 =
|
||||||
|
|
|
@ -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
|
||||||
|
|
11
src/main.ml
11
src/main.ml
|
@ -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 *)
|
||||||
|
|
Loading…
Reference in New Issue