Skip to content

Commit

Permalink
pkg: dedup package names in dependencies (#10544)
Browse files Browse the repository at this point in the history
Fixes a bug where depending on a package with a constraint involving a
conjunction would lead to the package appearing in the "depends"
lockfile field multiple times.

Signed-off-by: Stephen Sherratt <stephen@sherra.tt>
  • Loading branch information
gridbugs committed May 20, 2024
1 parent b45626f commit eee9a67
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 6 deletions.
26 changes: 23 additions & 3 deletions src/dune_pkg/resolve_opam_formula.ml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,19 @@ end
type unsatisfied_formula =
[ `Formula_could_not_be_satisfied of Unsatisfied_formula_hint.t list ]

let dedup_package_names package_names =
let ret_reversed, _ =
List.fold_left
package_names
~init:([], Package_name.Set.empty)
~f:(fun (ret_reversed, seen) x ->
if Package_name.Set.mem seen x
then ret_reversed, seen
else x :: ret_reversed, Package_name.Set.add seen x)
in
List.rev ret_reversed
;;

let formula_to_package_names version_by_package_name opam_formula =
let check_conjunction conjunction =
Result.List.map conjunction ~f:(fun (opam_package_name, version_constraint_opt) ->
Expand Down Expand Up @@ -129,9 +142,16 @@ let formula_to_package_names version_by_package_name opam_formula =
match satisfied_or_error_hint_per_conjunction with
| Error hints -> Error (`Formula_could_not_be_satisfied hints)
| Ok satisfied_conjunction ->
Ok
(List.map satisfied_conjunction ~f:(fun (opam_package_name, _) ->
Package_name.of_opam_package_name opam_package_name))
let package_names_from_conjunctions =
List.map satisfied_conjunction ~f:(fun (opam_package_name, _) ->
Package_name.of_opam_package_name opam_package_name)
in
let package_names =
(* If a package name appeared in multiple conjunctions then it
will be duplicated in [package_names_from_conjunctions]. *)
dedup_package_names package_names_from_conjunctions
in
Ok package_names
;;

let filtered_formula_to_package_names env ~with_test version_by_package_name formula =
Expand Down
4 changes: 1 addition & 3 deletions test/blackbox-tests/test-cases/pkg/constraint-conjunction.t
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,7 @@ constraints.
- a.0.0.1
- foo.0.0.1
Note that this is currently incorrect as the package "a" is duplicated
in the "depends" field.
$ cat dune.lock/foo.pkg
(version 0.0.1)
(depends a a)
(depends a)

0 comments on commit eee9a67

Please sign in to comment.