Skip to content

Commit 619c098

Browse files
fix: Add or remove dune from package sets to allow resolving packages depending on it (#11103)
* fix: Add `dune` to existing packages to allow resolving Signed-off-by: Marek Kubica <[email protected]> * Alternate solution which removes `dune` from formulas Signed-off-by: Marek Kubica <[email protected]> * chore: leave a comment Signed-off-by: Rudi Grinberg <[email protected]> * fix(pkg): use correct dune version to evaluate Signed-off-by: Rudi Grinberg <[email protected]> --------- Signed-off-by: Marek Kubica <[email protected]> Signed-off-by: Rudi Grinberg <[email protected]> Co-authored-by: Rudi Grinberg <[email protected]>
1 parent 3995bb5 commit 619c098

File tree

5 files changed

+26
-15
lines changed

5 files changed

+26
-15
lines changed

src/dune_pkg/dune_dep.ml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,8 @@
1+
open Stdune
2+
13
let name = Package_name.of_string "dune"
4+
5+
let version =
6+
let major, minor = Dune_lang.Stanza.latest_version in
7+
OpamPackage.Version.of_string @@ sprintf "%d.%d" major minor
8+
;;

src/dune_pkg/dune_dep.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
val name : Package_name.t
2+
val version : OpamPackage.Version.t

src/dune_pkg/lock_dir.ml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,8 @@ let validate_packages packages =
351351
Package_name.Map.values packages
352352
|> List.concat_map ~f:(fun (dependant_package : Pkg.t) ->
353353
List.filter_map dependant_package.depends ~f:(fun (loc, dependency) ->
354+
(* CR-someday rgrinberg: do we need the dune check? aren't
355+
we supposed to filter these upfront? *)
354356
if Package_name.Map.mem packages dependency
355357
|| Package_name.equal dependency Dune_dep.name
356358
then None

src/dune_pkg/opam_solver.ml

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -111,10 +111,6 @@ module Context_for_dune = struct
111111
~stats_updater
112112
~constraints
113113
=
114-
let dune_version =
115-
let major, minor = Dune_lang.Stanza.latest_version in
116-
OpamPackage.Version.of_string @@ sprintf "%d.%d" major minor
117-
in
118114
let candidates_cache = Fiber_cache.create (module Package_name) in
119115
let constraints =
120116
List.map constraints ~f:(fun (constraint_ : Package_dependency.t) ->
@@ -136,7 +132,7 @@ module Context_for_dune = struct
136132
; local_packages
137133
; pinned_packages
138134
; solver_env
139-
; dune_version
135+
; dune_version = Dune_dep.version
140136
; stats_updater
141137
; candidates_cache
142138
; available_cache
@@ -785,7 +781,7 @@ let reject_unreachable_packages =
785781
loop roots;
786782
!seen
787783
in
788-
fun solver_env ~local_packages ~pkgs_by_name ->
784+
fun solver_env ~dune_version ~local_packages ~pkgs_by_name ->
789785
let roots = Package_name.Map.keys local_packages in
790786
let pkgs_by_version =
791787
Package_name.Map.merge pkgs_by_name local_packages ~f:(fun name lhs rhs ->
@@ -810,7 +806,7 @@ let reject_unreachable_packages =
810806
[ "name", Package_name.to_dyn name ]
811807
| Some (pkg : Lock_dir.Pkg.t), None -> Some (List.map pkg.depends ~f:snd)
812808
| None, Some (pkg : Local_package.For_solver.t) ->
813-
let formula = pkg.dependencies |> Dependency_formula.to_filtered_formula in
809+
let formula = Dependency_formula.to_filtered_formula pkg.dependencies in
814810
(* Use `dev` because at this point we don't have any version *)
815811
let opam_package =
816812
OpamPackage.of_string (sprintf "%s.dev" (Package_name.to_string pkg.name))
@@ -820,14 +816,15 @@ let reject_unreachable_packages =
820816
Resolve_opam_formula.filtered_formula_to_package_names
821817
env
822818
~with_test:true
823-
pkgs_by_version
819+
(Package_name.Map.set pkgs_by_version Dune_dep.name dune_version)
824820
formula
825821
in
826822
let deps =
827823
match resolved with
828-
| Ok { regular; post = _ } ->
829-
(* discard post deps *)
830-
regular
824+
| Ok { regular; post = _ (* discard post deps *) } ->
825+
(* remove Dune from the formula as we remove it from solutions *)
826+
List.filter regular ~f:(fun pkg ->
827+
not (Package_name.equal Dune_dep.name pkg))
831828
| Error _ ->
832829
Code_error.raise
833830
"can't find a valid solution for the dependencies"
@@ -948,7 +945,11 @@ let solve_lock_dir
948945
(Package_name.to_string dep_name)
949946
]));
950947
let reachable =
951-
reject_unreachable_packages solver_env ~local_packages ~pkgs_by_name
948+
reject_unreachable_packages
949+
solver_env
950+
~dune_version:(Package_version.of_opam_package_version context.dune_version)
951+
~local_packages
952+
~pkgs_by_name
952953
in
953954
let pkgs_by_name =
954955
Package_name.Map.filteri pkgs_by_name ~f:(fun name _ ->

test/blackbox-tests/test-cases/pkg/implicit-dune-constraint.t

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,6 @@ Create a fake project and ensure `dune` can be used as a dependency:
3838
> (allow_empty)
3939
> (depends dune))
4040
> EOF
41-
$ dune pkg lock 2>&1 | head -2
42-
Internal error, please report upstream including the contents of _build/log.
43-
Description:
41+
$ dune pkg lock
42+
Solution for dune.lock:
43+
(no dependencies to lock)

0 commit comments

Comments
 (0)