Skip to content

Commit 3e56902

Browse files
authored
fix(pkg): do not lock unreachable packages (#10814)
unreachable packages are those that aren't reachable via the dependencies of local packages typically, such packages are included when solving via post deps Signed-off-by: Rudi Grinberg <me@rgrinberg.com>
1 parent 230e480 commit 3e56902

File tree

3 files changed

+55
-9
lines changed

3 files changed

+55
-9
lines changed

src/dune_pkg/opam_solver.ml

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,53 @@ module Solver_result = struct
758758
}
759759
end
760760

761+
let reject_unreachable_packages =
762+
let reachable deps_of_package ~roots =
763+
let seen = ref Package_name.Set.empty in
764+
let rec loop = function
765+
| [] -> ()
766+
| pkg :: rest ->
767+
if Package_name.Set.mem !seen pkg
768+
then loop rest
769+
else (
770+
seen := Package_name.Set.add !seen pkg;
771+
let deps =
772+
match Package_name.Map.find deps_of_package pkg with
773+
| None -> []
774+
| Some deps -> deps
775+
in
776+
loop (List.rev_append deps rest))
777+
in
778+
loop roots;
779+
!seen
780+
in
781+
fun ~local_packages ~pkgs_by_name ->
782+
let roots = Package_name.Map.keys local_packages in
783+
let pkgs_by_name =
784+
Package_name.Map.merge pkgs_by_name local_packages ~f:(fun name lhs rhs ->
785+
match lhs, rhs with
786+
| None, None -> assert false
787+
| Some _, Some _ ->
788+
Code_error.raise
789+
"package is both local and returned by solver"
790+
[ "name", Package_name.to_dyn name ]
791+
| Some (pkg : Lock_dir.Pkg.t), None -> Some (List.map pkg.depends ~f:snd)
792+
| None, Some (pkg : Local_package.For_solver.t) ->
793+
let deps =
794+
List.map pkg.dependencies ~f:(fun (d : Package_dependency.t) -> d.name)
795+
in
796+
let depopts =
797+
List.filter_map pkg.depopts ~f:(fun (d : Package_dependency.t) ->
798+
Option.some_if
799+
(Package_name.Map.mem local_packages d.name
800+
|| Package_name.Map.mem pkgs_by_name d.name)
801+
d.name)
802+
in
803+
Some (deps @ depopts))
804+
in
805+
reachable pkgs_by_name ~roots
806+
;;
807+
761808
let solve_lock_dir
762809
solver_env
763810
version_preference
@@ -860,6 +907,11 @@ let solve_lock_dir
860907
(Package_name.to_string name)
861908
(Package_name.to_string dep_name)
862909
]));
910+
let reachable = reject_unreachable_packages ~local_packages ~pkgs_by_name in
911+
let pkgs_by_name =
912+
Package_name.Map.filteri pkgs_by_name ~f:(fun name _ ->
913+
Package_name.Set.mem reachable name)
914+
in
863915
Lock_dir.create_latest_version
864916
pkgs_by_name
865917
~local_packages:(Package_name.Map.values local_packages)

test/blackbox-tests/test-cases/pkg/compiler-post-dependencies.t

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@ lists to prevent circular dependencies at package build time.
4444

4545
$ solve ocaml-base-compiler
4646
Solution for dune.lock:
47-
- host-system-other.0.0.1
48-
- ocaml.0.0.1
4947
- ocaml-base-compiler.0.0.1
5048

5149
Ensure that packages can be resolved at build time. This checks that

test/blackbox-tests/test-cases/pkg/post-deps-solving.t

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,13 @@ Solving for post dependencies:
99
> depends: [ "bar" {post} ]
1010
> EOF
1111

12-
We don't need bar, but we still include it:
12+
We don't need bar, so we skip it
1313

1414
$ solve foo
1515
Solution for dune.lock:
16-
- bar.0.0.1
1716
- foo.0.0.1
1817

19-
$ cat dune.lock/foo.pkg dune.lock/bar.pkg
20-
(version 0.0.1)
18+
$ cat dune.lock/foo.pkg
2119
(version 0.0.1)
2220

2321
Self dependency
@@ -66,11 +64,9 @@ post "cycle":
6664

6765
$ solve foo
6866
Solution for dune.lock:
69-
- bar.0.0.1
7067
- foo.0.0.1
7168

72-
$ cat dune.lock/foo.pkg dune.lock/bar.pkg
73-
(version 0.0.1)
69+
$ cat dune.lock/foo.pkg
7470
(version 0.0.1)
7571

7672
In depopts:

0 commit comments

Comments
 (0)