1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
(** This module compute the difference between a cudf universe and a cudf solution *)
open ExtLib
open CudfAdd
type changeset = Cudf_set.t * Cudf_set.t
type difference = (string, changeset) Hashtbl.t
let to_set univ l =
List.fold_left
(fun s p ->
let q = Cudf.lookup_package univ (p.Cudf.package, p.Cudf.version) in
Cudf_set.add q s)
Cudf_set.empty
l
let make_solution ~universe ~solution =
let is_installed p = p.Cudf.installed in
let before =
CudfAdd.to_set (Cudf.get_packages ~filter:is_installed universe)
in
let after =
CudfAdd.to_set (Cudf.get_packages ~filter:is_installed solution)
in
let install = Cudf_set.diff after before in
let remove = Cudf_set.diff before after in
(install, remove)
(** [make_difference univ sol] for each pkgname returns the list of all
versions that were installed (in the solution) or removed (from the
universe) *)
let make_difference ~universe ~solution =
let pkgnames = CudfAdd.pkgnames universe in
let h = Hashtbl.create (StringSet.cardinal pkgnames) in
StringSet.iter
(fun pkgname ->
let were_installed =
to_set universe (Cudf.get_installed universe pkgname)
in
let are_installed =
to_set universe (Cudf.get_installed solution pkgname)
in
let remove = Cudf_set.diff were_installed are_installed in
let install = Cudf_set.diff are_installed were_installed in
Hashtbl.add h pkgname (install, remove))
pkgnames ;
h
(**
[all] : all versions of a package in the universe .
[s] : the set of version for version of a package in a solution
returns a list that contains for each version its status : installed,
removed, upgraded, etc
*)
type tmp_summary =
{ mutable i : Cudf.package list;
mutable r : Cudf.package list;
mutable u : (Cudf.package * Cudf.package) option;
mutable d : (Cudf.package * Cudf.package) option;
mutable nc : Cudf.package list
}
let uniqueversion all (install, remove) =
let l = { u = None; d = None; i = []; r = []; nc = [] } in
let i = Cudf_set.filter (fun pkg -> pkg.Cudf.installed) all in
if Cudf_set.cardinal i <= 1 && Cudf_set.cardinal install <= 1 then (
if Cudf_set.cardinal install = 1 then
if Cudf_set.cardinal i = 1 then
let np = Cudf_set.choose i in
let op = Cudf_set.choose install in
if np.Cudf.version < op.Cudf.version then l.u <- Some (np, op)
else l.d <- Some (op, np)
else l.i <- Cudf_set.elements install
else if not (Cudf_set.is_empty remove) then l.r <- Cudf_set.elements remove)
else (
if not (Cudf_set.is_empty remove) then l.r <- Cudf_set.elements remove ;
if not (Cudf_set.is_empty install) then l.i <- Cudf_set.elements install) ;
l.nc <- Cudf_set.elements (Cudf_set.diff i (Cudf_set.union install remove)) ;
l
type summary =
{ install : Cudf.package list;
remove : Cudf.package list;
upgrade : (Cudf.package * Cudf.package) list;
downgrade : (Cudf.package * Cudf.package) list;
notchange : Cudf.package list
}
let make_summary univ diff =
let i = ref [] and u = ref [] and d = ref [] and r = ref [] and nc = ref [] in
let names = CudfAdd.pkgnames univ in
StringSet.iter
(fun pkgname ->
let all = CudfAdd.to_set (Cudf.lookup_packages univ pkgname) in
let s = Hashtbl.find diff pkgname in
let l = uniqueversion all s in
i := l.i @ !i ;
r := l.r @ !r ;
if not (Option.is_none l.u) then u := Option.get l.u :: !u ;
if not (Option.is_none l.d) then d := Option.get l.d :: !d ;
nc := l.nc @ !nc)
names ;
{ install = !i; remove = !r; upgrade = !u; downgrade = !d; notchange = !nc }