Skip to content

Commit 6eb681c

Browse files
committed
Alternate implementation
1 parent 5e6fe4a commit 6eb681c

3 files changed

Lines changed: 52 additions & 27 deletions

File tree

src/core/opamCompat.ml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,15 @@ module Stdlib = Pervasives
130130
#else
131131
module Stdlib = Stdlib
132132
#endif
133+
134+
module Lazy =
135+
#if OCAML_VERSION >= (4, 13, 0)
136+
Lazy
137+
#else
138+
struct
139+
include Lazy
140+
141+
let map f x =
142+
lazy (f (force x))
143+
end
144+
#endif

src/core/opamCompat.mli

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,14 @@ module Stdlib = Pervasives
9797
#else
9898
module Stdlib = Stdlib
9999
#endif
100+
101+
module Lazy
102+
#if OCAML_VERSION >= (4, 13, 0)
103+
= Lazy
104+
#else
105+
: sig
106+
include module type of struct include Lazy end
107+
108+
val map : ('a -> 'b) -> 'a t -> 'b t
109+
end
110+
#endif

src/state/opamSwitchState.ml

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -34,25 +34,28 @@ let load_switch_config ?lock_kind gt switch =
3434
(OpamSwitch.to_string switch);
3535
OpamFile.Switch_config.empty)
3636

37-
let get_available_packages gt switch switch_config ~opams =
38-
OpamPackage.Map.filter (fun package opam ->
39-
OpamFilter.eval_to_bool ~default:false
40-
(OpamPackageVar.resolve_switch_raw ~package gt switch switch_config)
41-
(OpamFile.OPAM.available opam))
42-
opams
43-
44-
let filter_pinned_packages ~pinned ~opams =
37+
let filter_available_packages gt switch switch_config ~opams =
38+
OpamPackage.keys @@
39+
OpamPackage.Map.filter (fun package opam ->
40+
OpamFilter.eval_to_bool ~default:false
41+
(OpamPackageVar.resolve_switch_raw ~package gt switch switch_config)
42+
(OpamFile.OPAM.available opam))
43+
opams
44+
45+
let compute_available_and_pinned_packages gt switch switch_config ~pinned ~opams =
4546
(* remove all versions of pinned packages, but the pinned-to version *)
4647
let pinned_names = OpamPackage.names_of_packages pinned in
47-
OpamPackage.Map.filter
48-
(fun nv _ ->
49-
not (OpamPackage.Name.Set.mem nv.name pinned_names) ||
50-
OpamPackage.Set.mem nv pinned)
51-
opams
48+
let (opams, pinned) =
49+
OpamPackage.Map.partition
50+
(fun nv _ ->
51+
not (OpamPackage.Name.Set.mem nv.name pinned_names) ||
52+
OpamPackage.Set.mem nv pinned)
53+
opams
54+
in
55+
(filter_available_packages gt switch switch_config ~opams, pinned)
5256

5357
let compute_available_packages gt switch switch_config ~pinned ~opams =
54-
let opams = filter_pinned_packages ~pinned ~opams in
55-
OpamPackage.keys @@ get_available_packages gt switch switch_config ~opams
58+
fst @@ compute_available_and_pinned_packages gt switch switch_config ~pinned ~opams
5659

5760
let repos_list_raw rt switch_config =
5861
let global, repos =
@@ -116,7 +119,7 @@ let infer_switch_invariant_raw
116119
deps dmap
117120
in
118121
dmap)
119-
(OpamPackage.packages_of_names (Lazy.force available_packages) @@
122+
(OpamPackage.packages_of_names available_packages @@
120123
OpamPackage.names_of_packages @@
121124
compiler)
122125
OpamPackage.Map.empty
@@ -134,7 +137,7 @@ let infer_switch_invariant_raw
134137
match List.sort (fun (_, c1) (_, c2) -> compare c1 c2) counts with
135138
| (nv, _) :: _ ->
136139
let versions =
137-
OpamPackage.packages_of_name (Lazy.force available_packages) nv.name
140+
OpamPackage.packages_of_name available_packages nv.name
138141
in
139142
let n = OpamPackage.Set.cardinal versions in
140143
if n <= 1 then
@@ -154,9 +157,10 @@ let infer_switch_invariant st =
154157
st.installed
155158
else st.compiler_packages
156159
in
160+
let lazy available_packages = st.available_packages in
157161
infer_switch_invariant_raw
158162
st.switch_global st.switch st.switch_config st.opams
159-
st.packages compiler_packages st.installed_roots st.available_packages
163+
st.packages compiler_packages st.installed_roots available_packages
160164

161165
let depexts_raw ~env nv opams =
162166
try
@@ -331,7 +335,8 @@ let load lock_kind gt rt switch =
331335
OpamPackage.Map.union (fun _ x -> x) repos_package_index pinned_opams
332336
in
333337
let available_packages =
334-
lazy (get_available_packages gt switch switch_config ~opams)
338+
lazy (compute_available_and_pinned_packages gt switch switch_config
339+
~pinned ~opams)
335340
in
336341
let opams =
337342
(* Keep definitions of installed packages, but lowest priority, and after
@@ -402,8 +407,10 @@ let load lock_kind gt rt switch =
402407
match switch_config.invariant with
403408
| Some invariant -> switch_config, invariant
404409
| None ->
405-
let available_packages = lazy (
406-
OpamPackage.keys (Lazy.force available_packages))
410+
let available_packages =
411+
let lazy (available_packages, pinned) = available_packages in
412+
OpamPackage.Set.union available_packages @@
413+
filter_available_packages gt switch switch_config ~opams:pinned
407414
in
408415
let invariant =
409416
infer_switch_invariant_raw
@@ -430,12 +437,6 @@ let load lock_kind gt rt switch =
430437
switch_config;
431438
switch_config, invariant
432439
in
433-
let available_packages = lazy (
434-
let available_without_pinned_alternates =
435-
filter_pinned_packages ~pinned ~opams:(Lazy.force available_packages)
436-
in
437-
OpamPackage.keys available_without_pinned_alternates)
438-
in
439440
let conf_files =
440441
let conf_files =
441442
OpamFilename.files (OpamPath.Switch.config_dir gt.root switch)
@@ -508,6 +509,7 @@ let load lock_kind gt rt switch =
508509
OpamPackage.Set.empty
509510
) in
510511
(* depext check *)
512+
let available_packages = OpamCompat.Lazy.map fst available_packages in
511513
let sys_packages =
512514
if not (OpamFile.Config.depext gt.config)
513515
|| OpamStateConfig.(!r.no_depexts) then

0 commit comments

Comments
 (0)