File tree Expand file tree Collapse file tree
cabal-install-solver/src/Distribution/Solver/Types
cabal-install/src/Distribution/Client Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -22,6 +22,8 @@ module Distribution.Solver.Types.PackageIndex (
2222 -- * Updates
2323 merge ,
2424 override ,
25+ OverrideOrMerge (.. ),
26+ overrideOrMerge ,
2527 insert ,
2628 deletePackageName ,
2729 deletePackageId ,
@@ -181,6 +183,28 @@ override i1@(PackageIndex m1) i2@(PackageIndex m2) =
181183 expensiveAssert (invariant i1 && invariant i2) $
182184 mkPackageIndex (Map. unionWith (\ _l r -> r) m1 m2)
183185
186+ data OverrideOrMerge = Override | Merge
187+ deriving (Eq , Show )
188+
189+ -- | Combined override-or-merge of two indexes.
190+ --
191+ -- For any package, either 'override' or 'merge' the packages from the second
192+ -- index into the first based on the supplied predicate.
193+ --
194+ overrideOrMerge ::
195+ Package pkg
196+ => (PackageName -> OverrideOrMerge )
197+ -> PackageIndex pkg
198+ -> PackageIndex pkg
199+ -> PackageIndex pkg
200+ overrideOrMerge strategy i1@ (PackageIndex m1) i2@ (PackageIndex m2) =
201+ expensiveAssert (invariant i1 && invariant i2) $
202+ mkPackageIndex (Map. unionWithKey overridePkg m1 m2)
203+ where
204+ overridePkg name l r = case strategy name of
205+ Override -> r
206+ Merge -> mergeBuckets l r
207+
184208-- | Inserts a single package into the index.
185209--
186210-- This is equivalent to (but slightly quicker than) using 'mappend' or
Original file line number Diff line number Diff line change @@ -391,7 +391,21 @@ getSourcePackagesAtIndexState verbosity repoCtxt mb_idxState mb_activeRepos = do
391391 -> PackageIndex UnresolvedSourcePackage
392392 addIndex acc (RepoData _ _ _ _, CombineStrategySkip ) = acc
393393 addIndex acc (RepoData _ _ idx _, CombineStrategyMerge ) = PackageIndex. merge acc idx
394- addIndex acc (RepoData _ _ idx _, CombineStrategyOverride ) = PackageIndex. override acc idx
394+ addIndex acc (RepoData _ _ idx prefs, CombineStrategyOverride ) =
395+ PackageIndex. overrideOrMerge strategy acc idx
396+ where
397+ strategy pkgname
398+ -- We only want to merge a package when no version in idx is marked
399+ -- as preferred/when all versions are deprecated.
400+ | Just pkgPrefs <- Map. lookup pkgname prefsByPkg
401+ , null $ PackageIndex. lookupDependency idx pkgname pkgPrefs =
402+ PackageIndex. Merge
403+ | otherwise = PackageIndex. Override
404+
405+ prefsByPkg =
406+ Map. fromListWith
407+ intersectVersionRanges
408+ [(name, range) | Dependency name range _ <- prefs]
395409
396410 let pkgs :: PackageIndex UnresolvedSourcePackage
397411 pkgs = foldl' addIndex mempty pkgss'
You can’t perform that action at this time.
0 commit comments