let main () =
let posargs = OptParse.OptParser.parse_argv Options.options in
Boilerplate.enable_debug(OptParse.Opt.get Options.verbose);
if OptParse.Opt.get Options.output_ty = "sqlite" then
output_to_sqlite posargs
else
let (preamble,universe,from_cudf,to_cudf) = Boilerplate.load_universe posargs in
let get_cudfpkg (p,v) = Cudf.lookup_package universe (to_cudf (p,v)) in
let pkg_src () = List.map get_cudfpkg (parse_pkg (OptParse.Opt.get Options.src)) in
let pkg_dst () =
let (p,v) = List.hd(parse_pkg (OptParse.Opt.get Options.dst)) in
let pid = get_cudfpkg (p,v) in
List.filter_map (fun pkg ->
if List.mem pid (Depsolver.dependency_closure universe [pkg]) then
Some(pkg)
else None
) (Cudf.get_packages universe)
in
let pkg_cone () =
List.unique (List.fold_left (fun acc (p,v) ->
let pid = get_cudfpkg (p,v) in
if OptParse.Opt.is_set Options.cone_maxdepth then
let md = OptParse.Opt.get Options.cone_maxdepth in
(Depsolver.dependency_closure ~maxdepth:md universe [pid]) @ acc
else
(Depsolver.dependency_closure universe [pid]) @ acc
) [] (parse_pkg (OptParse.Opt.get Options.cone)))
in
let pkg_reverse_cone () =
List.unique (List.fold_left (fun acc (p,v) ->
let pid = get_cudfpkg (p,v) in
if OptParse.Opt.is_set Options.cone_maxdepth then
let md = OptParse.Opt.get Options.cone_maxdepth in
(Depsolver.reverse_dependency_closure ~maxdepth:md universe [pid]) @ acc
else
(Depsolver.reverse_dependency_closure universe [pid]) @ acc
) [] (parse_pkg (OptParse.Opt.get Options.reverse_cone)))
in
let pkg_src_list = ref [] in
let pkg_dst_list = ref [] in
let plist =
if OptParse.Opt.is_set Options.src && OptParse.Opt.is_set Options.dst then begin
let (p,v) = List.hd(parse_pkg (OptParse.Opt.get Options.dst)) in
let pid = get_cudfpkg (p,v) in
pkg_src_list := pkg_src ();
pkg_dst_list := [pid];
(pid::!pkg_src_list)
end
else if OptParse.Opt.is_set Options.src then begin
pkg_src_list := pkg_src ();
!pkg_src_list
end
else if OptParse.Opt.is_set Options.dst then begin
pkg_dst_list := pkg_dst ();
!pkg_dst_list
end
else if OptParse.Opt.is_set Options.cone then
pkg_cone ()
else if OptParse.Opt.is_set Options.reverse_cone then
pkg_reverse_cone ()
else Cudf.get_packages universe
in
let output ll =
List.iter (fun l ->
let u = Cudf.load_universe l in
let oc = Options.output_ch () in
begin match OptParse.Opt.get Options.output_ty with
|"dot" ->
IFDEF HASOCAMLGRAPH THEN
DGraph.D.output_graph oc (DGraph.dependency_graph u)
ELSE
failwith ("dot not supported: needs ocamlgraph")
END
|"cnf" -> Printf.fprintf oc "%s" (Depsolver.output_clauses ~enc:Depsolver.Cnf u)
|"dimacs" -> Printf.fprintf oc "%s" (Depsolver.output_clauses ~enc:Depsolver.Dimacs u)
|"cudf" -> output_cudf oc preamble u
|"table" ->
IFDEF HASOCAMLGRAPH THEN
Printf.fprintf oc "%d\t%d\t%d\n"
(Cudf.universe_size u) (DGraph.G.nb_edges (DGraph.dependency_graph u))
(nr_conflicts u)
ELSE
failwith ("table not supported: needs ocamlgraph")
END
|_ -> assert false
end ;
close_out oc;
) ll
in output [plist]