Skip to content

Commit 6d1e608

Browse files
authored
fix(pkg): use available local package version for =version opam constraints (#11517)
Signed-off-by: ArthurW <[email protected]>
1 parent 0a80aa3 commit 6d1e608

File tree

7 files changed

+61
-10
lines changed

7 files changed

+61
-10
lines changed

bin/lock_dev_tool.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ let make_local_package_wrapping_dev_tool ~dev_tool ~dev_tool_version ~extra_depe
5353
Package_name.of_string (Package_name.to_string dev_tool_pkg_name ^ "_dev_tool_wrapper")
5454
in
5555
{ Dune_pkg.Local_package.name = local_package_name
56-
; version = None
56+
; version = Dune_pkg.Lock_dir.Pkg_info.default_version
5757
; dependencies =
5858
Dune_pkg.Dependency_formula.of_dependencies (dependency :: extra_dependencies)
5959
; conflicts = []

src/dune_pkg/local_package.ml

+7-3
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ type command_source =
2121

2222
type t =
2323
{ name : Package_name.t
24-
; version : Package_version.t option
24+
; version : Package_version.t
2525
; dependencies : Dependency_formula.t
2626
; conflicts : Package_dependency.t list
2727
; conflict_class : Package_name.t list
@@ -59,6 +59,7 @@ end
5959
module For_solver = struct
6060
type t =
6161
{ name : Package_name.t
62+
; version : Package_version.t
6263
; dependencies : Dependency_formula.t
6364
; conflicts : Package_dependency.t list
6465
; depopts : Package_dependency.t list
@@ -70,6 +71,7 @@ module For_solver = struct
7071

7172
let to_opam_file
7273
{ name
74+
; version
7375
; dependencies
7476
; conflicts
7577
; conflict_class
@@ -83,6 +85,7 @@ module For_solver = struct
8385
them *)
8486
OpamFile.OPAM.empty
8587
|> OpamFile.OPAM.with_name (Package_name.to_opam_package_name name)
88+
|> OpamFile.OPAM.with_version (Package_version.to_opam_package_version version)
8689
|> OpamFile.OPAM.with_depends (Dependency_formula.to_filtered_formula dependencies)
8790
|> OpamFile.OPAM.with_conflicts
8891
(List.map conflicts ~f:Package_dependency.to_opam_filtered_formula
@@ -108,7 +111,7 @@ end
108111

109112
let for_solver
110113
{ name
111-
; version = _
114+
; version
112115
; dependencies
113116
; conflicts
114117
; conflict_class
@@ -124,6 +127,7 @@ let for_solver
124127
| Opam_file { build; install } -> build, install
125128
in
126129
{ For_solver.name
130+
; version
127131
; dependencies
128132
; conflicts
129133
; conflict_class
@@ -137,7 +141,7 @@ let for_solver
137141
let of_package (t : Dune_lang.Package.t) =
138142
let module Package = Dune_lang.Package in
139143
let loc = Package.loc t in
140-
let version = Package.version t in
144+
let version = Package.version t |> Option.value ~default:Package_version.dev in
141145
let name = Package.name t in
142146
match Package.original_opam_file t with
143147
| None ->

src/dune_pkg/local_package.mli

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ type command_source =
3131
it can use to represent local packages. *)
3232
type t =
3333
{ name : Package_name.t
34-
; version : Package_version.t option
34+
; version : Package_version.t
3535
; dependencies : Dependency_formula.t
3636
; conflicts : Package_dependency.t list
3737
; conflict_class : Package_name.t list
@@ -56,6 +56,7 @@ module For_solver : sig
5656
(** The minimum set of fields about a package needed by the solver. *)
5757
type t =
5858
{ name : Package_name.t
59+
; version : Package_version.t
5960
; dependencies : Dependency_formula.t
6061
; conflicts : Package_dependency.t list
6162
; depopts : Package_dependency.t list

src/dune_pkg/lock_dir.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ module Pkg_info = struct
4242
]
4343
;;
4444

45-
let default_version = Package_version.of_string "dev"
45+
let default_version = Package_version.dev
4646

4747
let variables t =
4848
let module Variable = OpamVariable in

src/dune_pkg/opam_solver.ml

+2-3
Original file line numberDiff line numberDiff line change
@@ -1987,7 +1987,7 @@ let reject_unreachable_packages =
19871987
"package is both local and returned by solver"
19881988
[ "name", Package_name.to_dyn name ]
19891989
| Some (lock_dir_pkg : Lock_dir.Pkg.t), None -> Some lock_dir_pkg.info.version
1990-
| None, Some _pkg -> Some Package_version.dev)
1990+
| None, Some (pkg : Local_package.For_solver.t) -> Some pkg.version)
19911991
in
19921992
let pkgs_by_name =
19931993
Package_name.Map.merge pkgs_by_name local_packages ~f:(fun name lhs rhs ->
@@ -2005,8 +2005,7 @@ let reject_unreachable_packages =
20052005
let opam_package =
20062006
OpamPackage.create
20072007
(Package_name.to_opam_package_name pkg.name)
2008-
(* Use [dev] because at this point we don't have any version *)
2009-
(Package_version.to_opam_package_version Package_version.dev)
2008+
(Package_version.to_opam_package_version pkg.version)
20102009
in
20112010
Solver_env.to_env solver_env |> add_self_to_filter_env opam_package
20122011
in

src/dune_pkg/package_universe.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ let lockdir_regenerate_hints =
2121
let version_by_package_name local_packages (lock_dir : Lock_dir.t) =
2222
let from_local_packages =
2323
Package_name.Map.map local_packages ~f:(fun (local_package : Local_package.t) ->
24-
Option.value local_package.version ~default:Lock_dir.Pkg_info.default_version)
24+
local_package.version)
2525
in
2626
let from_lock_dir =
2727
Package_name.Map.map lock_dir.packages ~f:(fun pkg -> pkg.info.version)

test/blackbox-tests/test-cases/pkg/self-version-constraint.t

+47
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,50 @@ The version of foo that should be selected is 1.0.0
2424
Solution for dune.lock:
2525
- bar.1.0.0
2626
- foo.1.0.0
27+
28+
By default, local packages have version `dev` so the following version
29+
constraint on `foo` will fail:
30+
31+
$ solve_project <<EOF
32+
> (lang dune 3.11)
33+
> (package
34+
> (name x)
35+
> (depends (foo (= :version))))
36+
> EOF
37+
Error: Unable to solve dependencies for the following lock directories:
38+
Lock directory dune.lock:
39+
Couldn't solve the package dependency formula.
40+
Selected candidates: x.dev
41+
- foo -> (problem)
42+
No usable implementations:
43+
foo.1.0.0: Package does not satisfy constraints of local package x
44+
[1]
45+
46+
But specifying a version for the local package `x` yields a solution:
47+
48+
$ solve_project <<EOF
49+
> (lang dune 3.11)
50+
> (generate_opam_files true)
51+
> (version 1.0.0)
52+
> (package
53+
> (name x)
54+
> (depends (foo (= :version))))
55+
> EOF
56+
Solution for dune.lock:
57+
- bar.1.0.0
58+
- foo.1.0.0
59+
60+
Same result if the version of package `x` is specified by the opam file instead
61+
of the dune-project:
62+
63+
$ dune build x.opam
64+
$ grep '^version' x.opam
65+
version: "1.0.0"
66+
67+
$ mkpkg dune 3.11
68+
$ solve_project <<EOF
69+
> (lang dune 3.11)
70+
> EOF
71+
Solution for dune.lock:
72+
- bar.1.0.0
73+
- foo.1.0.0

0 commit comments

Comments
 (0)