@@ -758,6 +758,53 @@ module Solver_result = struct
758
758
}
759
759
end
760
760
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
+
761
808
let solve_lock_dir
762
809
solver_env
763
810
version_preference
@@ -860,6 +907,11 @@ let solve_lock_dir
860
907
(Package_name. to_string name)
861
908
(Package_name. to_string dep_name)
862
909
]));
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
863
915
Lock_dir. create_latest_version
864
916
pkgs_by_name
865
917
~local_packages: (Package_name.Map. values local_packages)
0 commit comments