Skip to content

Commit fad056f

Browse files
authored
pkg: fix bug where multiple conflicts causes conlficts to be ignored (#11492)
Conflicts were being combined as a conjunction bet they should have been combined with a disjunction. Fixes #11265 Signed-off-by: Stephen Sherratt <[email protected]>
1 parent caac8a4 commit fad056f

File tree

6 files changed

+29
-18
lines changed

6 files changed

+29
-18
lines changed

src/dune_pkg/dependency_formula.ml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ open Import
22

33
type t = OpamTypes.filtered_formula
44

5-
let of_dependencies deps = Package_dependency.list_to_opam_filtered_formula deps
5+
let of_dependencies deps =
6+
List.map deps ~f:Package_dependency.to_opam_filtered_formula |> OpamFormula.ands
7+
;;
8+
69
let to_filtered_formula v = v
710
let of_filtered_formula v = v
811
let to_dyn = Opam_dyn.filtered_formula

src/dune_pkg/local_package.ml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,13 @@ module For_solver = struct
6565
|> OpamFile.OPAM.with_name (Package_name.to_opam_package_name name)
6666
|> OpamFile.OPAM.with_depends (Dependency_formula.to_filtered_formula dependencies)
6767
|> OpamFile.OPAM.with_conflicts
68-
(Package_dependency.list_to_opam_filtered_formula conflicts)
68+
(List.map conflicts ~f:Package_dependency.to_opam_filtered_formula
69+
|> OpamFormula.ors)
6970
|> OpamFile.OPAM.with_conflict_class
7071
(List.map conflict_class ~f:Package_name.to_opam_package_name)
7172
|> OpamFile.OPAM.with_depopts
72-
(Package_dependency.list_to_opam_filtered_formula depopts)
73+
(List.map depopts ~f:Package_dependency.to_opam_filtered_formula
74+
|> OpamFormula.ands)
7375
;;
7476

7577
let non_local_dependencies local_deps =

src/dune_pkg/opam_solver.ml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,9 @@ module Context = struct
109109
List.map constraints ~f:(fun (constraint_ : Package_dependency.t) ->
110110
constraint_.name, constraint_)
111111
|> Package_name.Map.of_list_multi
112-
|> Package_name.Map.map ~f:Package_dependency.list_to_opam_filtered_formula
112+
|> Package_name.Map.map ~f:(fun formulae ->
113+
List.map formulae ~f:Package_dependency.to_opam_filtered_formula
114+
|> OpamFormula.ands)
113115
in
114116
let available_cache =
115117
Table.create

src/dune_pkg/package_dependency.ml

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -210,16 +210,14 @@ let opam_depend { name; constraint_ } =
210210
| Some c -> nopos (OpamParserTypes.FullPos.Option (pkg, nopos [ c ]))
211211
;;
212212

213-
let list_to_opam_filtered_formula ts =
214-
List.map ts ~f:(fun { name; constraint_ } ->
215-
let opam_package_name = Package_name.to_opam_package_name name in
216-
let condition =
217-
match constraint_ with
218-
| None -> OpamTypes.Empty
219-
| Some constraint_ -> Constraint.to_opam_condition constraint_
220-
in
221-
OpamFormula.Atom (opam_package_name, condition))
222-
|> OpamFormula.ands
213+
let to_opam_filtered_formula { name; constraint_ } =
214+
let opam_package_name = Package_name.to_opam_package_name name in
215+
let condition =
216+
match constraint_ with
217+
| None -> OpamTypes.Empty
218+
| Some constraint_ -> Constraint.to_opam_condition constraint_
219+
in
220+
OpamFormula.Atom (opam_package_name, condition)
223221
;;
224222

225223
let list_of_opam_filtered_formula loc kind filtered_formula =

src/dune_pkg/package_dependency.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ type t = Dune_lang.Package_dependency.t =
2525
include module type of Dune_lang.Package_dependency with type t := t
2626

2727
val opam_depend : t -> OpamParserTypes.FullPos.value
28-
val list_to_opam_filtered_formula : t list -> OpamTypes.filtered_formula
28+
val to_opam_filtered_formula : t -> OpamTypes.filtered_formula
2929

3030
(** Attempt to interpret a [OpamTypes.filtered_formula] as a list of [t]s by
3131
treating the formula as a conjunction of packages with constraints. *)

test/blackbox-tests/test-cases/pkg/gh11265.t

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ A package which depends on a single package and also conflicts with the same pac
2222
bar.0.0.1: Package does not satisfy constraints of local package foo
2323
[1]
2424

25-
Now add an additional conflict on a non-existant package "baz". Dune will choose the package "bar" despite it being a conflict:
25+
Now add an additional conflict on a non-existant package "baz". Dune should continue to fail to find a solution due to the conflict with "bar".
2626
$ solve_project << EOF
2727
> (lang dune 3.11)
2828
> (package
@@ -31,6 +31,12 @@ Now add an additional conflict on a non-existant package "baz". Dune will choose
3131
> (depends bar)
3232
> (conflicts bar baz))
3333
> EOF
34-
Solution for dune.lock:
35-
- bar.0.0.1
34+
Error: Unable to solve dependencies for the following lock directories:
35+
Lock directory dune.lock:
36+
Couldn't solve the package dependency formula.
37+
Selected candidates: foo.dev
38+
- bar -> (problem)
39+
No usable implementations:
40+
bar.0.0.1: Package does not satisfy constraints of local package foo
41+
[1]
3642

0 commit comments

Comments
 (0)