Skip to content

Commit 81fe878

Browse files
authored
feature: depopt selection in the workspace (#11773)
Add a [deopts] field to allow users to select depopts. The depopts are selected globally for all packages that list them. This is inline with how opam does things. Fixes #11643 <!-- ps-id: 430e82d6-3fe8-4a81-9692-c0d680a58591 --> Signed-off-by: Rudi Grinberg <[email protected]>
1 parent 6bc42be commit 81fe878

File tree

9 files changed

+115
-4
lines changed

9 files changed

+115
-4
lines changed

bin/pkg/lock.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ let solve_lock_dir
120120
~local_packages:
121121
(Package_name.Map.map local_packages ~f:Dune_pkg.Local_package.for_solver)
122122
~constraints:(constraints_of_workspace workspace ~lock_dir_path)
123+
~selected_depopts:(depopts_of_workspace workspace ~lock_dir_path)
123124
>>= function
124125
| Error (`Diagnostic_message message) -> Fiber.return (Error (lock_dir_path, message))
125126
| Ok { lock_dir; files; pinned_packages; num_expanded_packages } ->

bin/pkg/pkg_common.ml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@ let constraints_of_workspace (workspace : Workspace.t) ~lock_dir_path =
5858
| Some lock_dir -> lock_dir.constraints
5959
;;
6060

61+
let depopts_of_workspace (workspace : Workspace.t) ~lock_dir_path =
62+
match Workspace.find_lock_dir workspace lock_dir_path with
63+
| None -> []
64+
| Some lock_dir -> lock_dir.depopts |> List.map ~f:snd
65+
;;
66+
6167
let repositories_of_lock_dir workspace ~lock_dir_path =
6268
match Workspace.find_lock_dir workspace lock_dir_path with
6369
| Some lock_dir -> lock_dir.repositories

bin/pkg/pkg_common.mli

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ val constraints_of_workspace
3838
-> lock_dir_path:Path.Source.t
3939
-> Dune_lang.Package_dependency.t list
4040

41+
val depopts_of_workspace
42+
: Workspace.t
43+
-> lock_dir_path:Path.Source.t
44+
-> Package_name.t list
45+
4146
val get_repos
4247
: Dune_pkg.Pkg_workspace.Repository.t Dune_pkg.Pkg_workspace.Repository.Name.Map.t
4348
-> repositories:(Loc.t * Dune_pkg.Pkg_workspace.Repository.Name.t) list

src/dune_pkg/opam_solver.ml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1604,6 +1604,7 @@ let solve_lock_dir
16041604
~local_packages
16051605
~pins:pinned_packages
16061606
~constraints
1607+
~selected_depopts
16071608
=
16081609
let pinned_package_names = Package_name.Set.of_keys pinned_packages in
16091610
let stats_updater = Solver_stats.Updater.init () in
@@ -1638,8 +1639,8 @@ let solve_lock_dir
16381639
in
16391640
Lazy.force context
16401641
in
1641-
Package_name.Map.to_list_map local_packages ~f:(fun name _ ->
1642-
Package_name.to_opam_package_name name)
1642+
Package_name.Map.keys local_packages @ selected_depopts
1643+
|> List.map ~f:Package_name.to_opam_package_name
16431644
|> solve_package_list ~context
16441645
>>= function
16451646
| Error _ as e -> Fiber.return e

src/dune_pkg/opam_solver.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,6 @@ val solve_lock_dir
1616
-> local_packages:Local_package.For_solver.t Package_name.Map.t
1717
-> pins:Resolved_package.t Package_name.Map.t
1818
-> constraints:Dune_lang.Package_dependency.t list
19+
-> selected_depopts:Package_name.t list
1920
-> (Solver_result.t, [ `Diagnostic_message of User_message.Style.t Pp.t ]) result
2021
Fiber.t

src/dune_rules/workspace.ml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ module Lock_dir = struct
1313
; repositories : (Loc.t * Dune_pkg.Pkg_workspace.Repository.Name.t) list
1414
; constraints : Dune_lang.Package_dependency.t list
1515
; pins : (Loc.t * string) list
16+
; depopts : (Loc.t * Package.Name.t) list
1617
}
1718

1819
let to_dyn
@@ -23,6 +24,7 @@ module Lock_dir = struct
2324
; repositories
2425
; constraints
2526
; pins
27+
; depopts
2628
}
2729
=
2830
Dyn.record
@@ -37,6 +39,7 @@ module Lock_dir = struct
3739
(List.map repositories ~f:snd) )
3840
; "constraints", Dyn.list Dune_lang.Package_dependency.to_dyn constraints
3941
; "pins", (Dyn.list Dyn.string) (List.map pins ~f:snd)
42+
; "depopts", (Dyn.list Package.Name.to_dyn) (List.map ~f:snd depopts)
4043
]
4144
;;
4245

@@ -48,6 +51,7 @@ module Lock_dir = struct
4851
; repositories
4952
; constraints
5053
; pins
54+
; depopts
5155
}
5256
=
5357
Poly.hash
@@ -57,7 +61,8 @@ module Lock_dir = struct
5761
, unset_solver_vars
5862
, repositories
5963
, constraints
60-
, pins )
64+
, pins
65+
, depopts )
6166
;;
6267

6368
let equal
@@ -68,6 +73,7 @@ module Lock_dir = struct
6873
; repositories
6974
; constraints
7075
; pins
76+
; depopts
7177
}
7278
t
7379
=
@@ -84,6 +90,7 @@ module Lock_dir = struct
8490
t.repositories
8591
&& List.equal Dune_lang.Package_dependency.equal constraints t.constraints
8692
&& List.equal (Tuple.T2.equal Loc.equal String.equal) pins t.pins
93+
&& List.equal (Tuple.T2.equal Loc.equal Package.Name.equal) depopts t.depopts
8794
;;
8895

8996
let decode ~dir =
@@ -108,6 +115,7 @@ module Lock_dir = struct
108115
and+ repositories = Dune_lang.Ordered_set_lang.field "repositories"
109116
and+ constraints =
110117
field ~default:[] "constraints" (repeat Dune_lang.Package_dependency.decode)
118+
and+ depopts = field ~default:[] "depopts" (repeat (located Package.Name.decode))
111119
and+ pins = field ~default:[] "pins" (repeat (located string)) in
112120
Option.iter solver_env ~f:(fun solver_env ->
113121
Option.iter
@@ -134,6 +142,7 @@ module Lock_dir = struct
134142
; repositories = repositories_of_ordered_set repositories
135143
; constraints
136144
; pins
145+
; depopts
137146
}
138147
in
139148
fields decode

src/dune_rules/workspace.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ module Lock_dir : sig
1111
; repositories : (Loc.t * Dune_pkg.Pkg_workspace.Repository.Name.t) list
1212
; constraints : Dune_lang.Package_dependency.t list
1313
; pins : (Loc.t * string) list
14+
; depopts : (Loc.t * Package.Name.t) list
1415
}
1516

1617
val equal : t -> t -> bool
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
Demonstrate how depopts can be forced in the workspace
2+
3+
$ . ../helpers.sh
4+
5+
$ mkrepo
6+
7+
$ mkpkg foo
8+
$ mkpkg bar
9+
$ mkpkg baz
10+
11+
$ solve_project <<EOF
12+
> (lang dune 3.18)
13+
> (package
14+
> (name x)
15+
> (depopts foo bar))
16+
> EOF
17+
Solution for dune.lock:
18+
(no dependencies to lock)
19+
20+
Select just foo
21+
22+
$ cat >dune-workspace <<EOF
23+
> (lang dune 3.10)
24+
> (lock_dir
25+
> (depopts foo)
26+
> (repositories mock))
27+
> (repository
28+
> (name mock)
29+
> (url "file://$PWD/mock-opam-repository"))
30+
> EOF
31+
32+
$ dune pkg lock
33+
Solution for dune.lock:
34+
- foo.0.0.1
35+
36+
Select both foo and bar
37+
38+
$ cat >dune-workspace <<EOF
39+
> (lang dune 3.10)
40+
> (lock_dir
41+
> (depopts foo bar)
42+
> (repositories mock))
43+
> (repository
44+
> (name mock)
45+
> (url "file://$PWD/mock-opam-repository"))
46+
> EOF
47+
48+
$ dune pkg lock
49+
Solution for dune.lock:
50+
- bar.0.0.1
51+
- foo.0.0.1
52+
53+
Select a package that is not listed as depopt
54+
55+
$ cat >dune-workspace <<EOF
56+
> (lang dune 3.10)
57+
> (lock_dir
58+
> (depopts baz)
59+
> (repositories mock))
60+
> (repository
61+
> (name mock)
62+
> (url "file://$PWD/mock-opam-repository"))
63+
> EOF
64+
65+
$ dune pkg lock
66+
Solution for dune.lock:
67+
(no dependencies to lock)
68+
69+
70+
Select garbage
71+
72+
$ cat >dune-workspace <<EOF
73+
> (lang dune 3.10)
74+
> (lock_dir
75+
> (depopts z)
76+
> (repositories mock))
77+
> (repository
78+
> (name mock)
79+
> (url "file://$PWD/mock-opam-repository"))
80+
> EOF
81+
82+
$ dune pkg lock
83+
Error: Unable to solve dependencies for the following lock directories:
84+
Lock directory dune.lock:
85+
Couldn't solve the package dependency formula.
86+
The following packages couldn't be found: z
87+
[1]

test/blackbox-tests/test-cases/pkg/unavailable-packages.t

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Set up two build contexts: a default one for linux and another for macos.
1515
> (solver_env
1616
> (os macos)))
1717
> (context
18-
> (default))
18+
> (default))
1919
> (context
2020
> (default
2121
> (name macos)

0 commit comments

Comments
 (0)