let minimize roots l =
let module H = Hashtbl in
let h = H.create (List.length l) in
List.iter (fun p -> H.add h p.Cudf.package p) l;
let acc = H.create 1023 in
let rec visit pkg =
if not (H.mem acc pkg) then begin
H.add acc pkg ();
List.iter (fun vpkgformula ->
List.iter (fun (name,constr) ->
try
let p = H.find h name in
if Cudf.version_matches p.Cudf.version constr then
visit p
with Not_found -> ()
) vpkgformula
) pkg.Cudf.depends
end
in
begin match roots with
|Package r -> visit r
|PackageList rl -> List.iter visit l end;
H.fold (fun k _ l -> k::l) acc []