Added output support for graphviz - select by passing 'text'/'dot' before opam-switch file
This commit is contained in:
parent
3a738d9299
commit
8440053608
3 changed files with 47 additions and 5 deletions
11
app/main.ml
11
app/main.ml
|
@ -13,10 +13,17 @@ let read_file file =
|
||||||
|
|
||||||
let () =
|
let () =
|
||||||
match Sys.argv with
|
match Sys.argv with
|
||||||
| [| _ ; file |] ->
|
| [| _ ; output_format; file |] -> (
|
||||||
let switch = read_file file in
|
let switch = read_file file in
|
||||||
let data = OpamFile.SwitchExport.read_from_string switch in
|
let data = OpamFile.SwitchExport.read_from_string switch in
|
||||||
Opam_graph.dependencies data
|
let graph = Opam_graph.dependencies data in
|
||||||
|
match output_format with
|
||||||
|
| "text" -> Format.printf "%a" Opam_graph.pp_graph graph
|
||||||
|
| "dot" ->
|
||||||
|
let dot = Opam_graph.Dot.of_graph graph in
|
||||||
|
Format.printf "%a" Opam_graph.Dot.pp dot
|
||||||
|
| _ -> failwith "Unsupported output format"
|
||||||
|
)
|
||||||
| _ ->
|
| _ ->
|
||||||
print_endline "expecting exactly one argument";
|
print_endline "expecting exactly one argument";
|
||||||
exit 1
|
exit 1
|
||||||
|
|
4
src/dune
4
src/dune
|
@ -1,4 +1,6 @@
|
||||||
(library
|
(library
|
||||||
(name opam_graph)
|
(name opam_graph)
|
||||||
(public_name opam-graph)
|
(public_name opam-graph)
|
||||||
(libraries opam-core opam-format))
|
(libraries opam-core opam-format dot)
|
||||||
|
(flags (:standard (-w -27-26)))
|
||||||
|
)
|
||||||
|
|
|
@ -74,5 +74,38 @@ let dependencies (switch : OpamFile.SwitchExport.t) =
|
||||||
in
|
in
|
||||||
find_deps graph work
|
find_deps graph work
|
||||||
in
|
in
|
||||||
let graph = find_deps graph (Name_set.singleton top) in
|
find_deps graph (Name_set.singleton top)
|
||||||
Format.printf "%a" pp_graph graph
|
|
||||||
|
module Dot = struct
|
||||||
|
|
||||||
|
type t = Odot.graph
|
||||||
|
|
||||||
|
let of_graph (graph:graph) : t =
|
||||||
|
let open Odot in
|
||||||
|
let stmt_list =
|
||||||
|
Name_map.fold (fun pkg deps acc ->
|
||||||
|
let stmt =
|
||||||
|
let pkg_id = Double_quoted_id (OpamPackage.Name.to_string pkg) in
|
||||||
|
let pkg_point = Edge_node_id (pkg_id, None) in
|
||||||
|
let deps_points =
|
||||||
|
Name_set.elements deps
|
||||||
|
|> List.map (fun p ->
|
||||||
|
let id = Double_quoted_id (OpamPackage.Name.to_string p) in
|
||||||
|
Edge_node_id (id, None)
|
||||||
|
)
|
||||||
|
in
|
||||||
|
let edge = pkg_point, deps_points, [] in
|
||||||
|
Stmt_edge edge
|
||||||
|
in
|
||||||
|
stmt :: acc
|
||||||
|
) graph.nodes []
|
||||||
|
in
|
||||||
|
{ strict = false; (*todo test params*)
|
||||||
|
kind = Digraph;
|
||||||
|
id = None;
|
||||||
|
stmt_list }
|
||||||
|
|
||||||
|
let pp ppf dot =
|
||||||
|
Format.fprintf ppf "%s" (Odot.string_of_graph dot)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in a new issue