Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions service/domain_worker.mli
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,7 @@ type reply = ((OpamPackage.t list, string) result * float, [`Msg of string]) res
[Ok (Error msg)] if there is no solution.
[Error msg] if the request was invalid. *)

val env : Solver_service_api.Worker.Vars.t -> string -> OpamVariable.variable_contents option
(** [env vars name] is the value of [name] in [vars]. *)

val solve : request -> reply
7 changes: 7 additions & 0 deletions service/solver.ml
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,19 @@ let compatible_with ~ocaml_version (dep_name, filter) =
OpamFormula.eval check_ocaml filter
else true

let env vars v =
if List.mem v OpamPackageVar.predefined_depends_variables then None
else Domain_worker.env vars (OpamVariable.Full.to_string v)

let solve_for_platform ?cancelled t ~log ~opam_repository_commits ~packages ~root_pkgs ~pinned_pkgs ~pins ~vars id =
let ocaml_version = OpamPackage.Version.of_string vars.Worker.Vars.ocaml_version in
let root_pkgs =
root_pkgs
|> List.filter (fun (_name, (_version, opam)) ->
let avail = OpamFile.OPAM.available opam in
let deps = OpamFile.OPAM.depends opam in
let env = env vars in
OpamFilter.eval_to_bool ~default:true env avail &&
OpamFormula.eval (compatible_with ~ocaml_version) deps)
in
if root_pkgs = [] then (
Expand Down
19 changes: 19 additions & 0 deletions test/test.expected
Original file line number Diff line number Diff line change
Expand Up @@ -227,3 +227,22 @@ platforms: [debian-12-ocaml-5]
Need to update opam-repo.git to get new commit 1bc28b8e8d98db6e524822c6f28bddebbc3504a3
results:
Cancelled

# Available

## foo-linux is only selected on Linux platform, but foo is selected for both ##

commits: [(opam-repo.git, [ocaml-base-compiler.5.0])]
root_pkgs: [foo.dev; foo-linux.dev]
platforms: [linux; mac]
results:
[linux:
compat_pkgs: [foo.dev; foo-linux.dev]
packages: [foo.dev; foo-linux.dev; ocaml-base-compiler.5.0]
commits: [(opam-repo.git, 1bc28b8e8d98db6e524822c6f28bddebbc3504a3)]
lower_bound: false;
mac:
compat_pkgs: [foo.dev]
packages: [foo.dev; ocaml-base-compiler.5.0]
commits: [(opam-repo.git, 1bc28b8e8d98db6e524822c6f28bddebbc3504a3)]
lower_bound: false]
18 changes: 18 additions & 0 deletions test/test.ml
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,23 @@ let test_cancel t =
~commits:[opam_repo, opam_packages]
~platforms

let test_available t =
let opam_repo = Opam_repo.create "opam-repo.git" in
let opam_packages = [
"ocaml-base-compiler.5.0", "";
] in
let root_pkgs = [
"foo.dev", "";
"foo-linux.dev", {| available: os = "linux" |};
] in
solve t "foo-linux is only selected on Linux platform, but foo is selected for both"
~root_pkgs
~commits:[opam_repo, opam_packages]
~platforms:[
"linux", debian_12_ocaml_5;
"mac", { debian_12_ocaml_5 with os = "macos" };
]

let () =
Eio_main.run @@ fun env ->
let domain_mgr = env#domain_mgr in
Expand All @@ -232,6 +249,7 @@ let () =
"Multiple roots", test_multiple_roots;
"Pinned", test_pinned;
"Cancel", test_cancel;
"Available", test_available;
]
|> List.iter (fun (name, fn) ->
Fmt.pr "@.# %s@." name;
Expand Down