Skip to content

Commit a3020cf

Browse files
committed
Don't override a package if all versions are deprecated
Consider active-repositories: , repo-a , repo-b:override and a package mypkg of which all versions in repo-b are deprecated (i.e. none is preferred). Before this patch, the solver would ignore all versions of mypkg in repo-a. After this patch, it considers versions of mypkg in both repo-a and repo-b. See #8502 for motivation
1 parent fb1678b commit a3020cf

2 files changed

Lines changed: 39 additions & 1 deletion

File tree

cabal-install-solver/src/Distribution/Solver/Types/PackageIndex.hs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff 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

cabal-install/src/Distribution/Client/IndexUtils.hs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff 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'

0 commit comments

Comments
 (0)