opam-graph/app/main.ml

70 lines
2.2 KiB
OCaml
Raw Normal View History

2021-12-20 13:25:23 +00:00
let read_file file =
try
let fh = open_in file in
try
let content = really_input_string fh (in_channel_length fh) in
close_in_noerr fh ;
content
with _ ->
close_in_noerr fh;
invalid_arg ("Error reading file: " ^ file)
with _ -> invalid_arg ("Error opening file " ^ file)
2022-01-27 11:58:01 +00:00
let jump () transitive file output_format =
let switch = read_file file in
let data = OpamFile.SwitchExport.read_from_string switch in
match output_format with
| `Text ->
let graph = Opam_graph.dependencies ~transitive data in
Format.printf "%a" Opam_graph.pp_graph graph
| `Dot ->
let graph = Opam_graph.dependencies ~transitive data in
let dot = Opam_graph.Render.Dot.of_graph graph in
Format.printf "%a" Opam_graph.Render.Dot.pp dot
| `Dot_ui ->
let graph = Opam_graph.Ui.dependencies ~transitive data in
let dot = Opam_graph.Render.Dot.of_assoc graph in
Format.printf "%a" Opam_graph.Render.Dot.pp dot
| `Html ->
let graph = Opam_graph.Ui.dependencies ~transitive data in
let html = Opam_graph.Render.Html.of_assoc graph in
Format.printf "%a" Opam_graph.Render.Html.pp html
2021-12-20 13:25:23 +00:00
2022-01-27 11:58:01 +00:00
let setup_log style_renderer level =
Fmt_tty.setup_std_outputs ?style_renderer ();
Logs.set_level level;
Logs.set_reporter (Logs_fmt.reporter ~dst:Format.std_formatter ())
open Cmdliner
let setup_log =
Term.(const setup_log
$ Fmt_cli.style_renderer ()
$ Logs_cli.level ())
let transitive =
let doc = "Transitive dependencies" in
Arg.(value & flag & info [ "transitive" ] ~doc)
let formats = [ "html", `Html ; "dot", `Dot ; "dot-ui", `Dot_ui ; "text", `Text ]
let output_format =
let doc =
let formats_str =
formats |> List.map fst |> String.concat ", "
in
Printf.sprintf "Output format. Can be one of: %s." formats_str in
2022-01-27 11:58:01 +00:00
Arg.(value & opt (Arg.enum formats) `Text & info [ "output-format" ] ~doc)
let file =
let doc = "The opam switch export to graph" in
Arg.(required & pos 0 (some file) None & info [ ] ~doc ~docv:"FILE")
let cmd =
let term = Term.(const jump $ setup_log $ transitive $ file $ output_format) in
let info = Cmd.info "opam_graph" ~version:"%%VERSION%%" in
Cmd.v info term
2022-01-27 11:58:01 +00:00
let () = Cmd.eval cmd |> exit