Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions cabal-install-solver/src/Distribution/Solver/Types/PackageIndex.hs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ module Distribution.Solver.Types.PackageIndex (
-- * Updates
merge,
override,
OverrideOrMerge(..),
overrideOrMerge,
insert,
deletePackageName,
deletePackageId,
Expand Down Expand Up @@ -181,6 +183,28 @@ override i1@(PackageIndex m1) i2@(PackageIndex m2) =
expensiveAssert (invariant i1 && invariant i2) $
mkPackageIndex (Map.unionWith (\_l r -> r) m1 m2)

data OverrideOrMerge = Override | Merge
deriving (Eq, Show)

-- | Combined override-or-merge of two indexes.
--
-- For any package, either 'override' or 'merge' the packages from the second
-- index into the first based on the supplied predicate.
--
overrideOrMerge ::
Package pkg
=> (PackageName -> OverrideOrMerge)
-> PackageIndex pkg
-> PackageIndex pkg
-> PackageIndex pkg
overrideOrMerge strategy i1@(PackageIndex m1) i2@(PackageIndex m2) =
expensiveAssert (invariant i1 && invariant i2) $
mkPackageIndex (Map.unionWithKey overridePkg m1 m2)
where
overridePkg name l r = case strategy name of
Override -> r
Merge -> mergeBuckets l r

-- | Inserts a single package into the index.
--
-- This is equivalent to (but slightly quicker than) using 'mappend' or
Expand Down
16 changes: 15 additions & 1 deletion cabal-install/src/Distribution/Client/IndexUtils.hs
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,21 @@ getSourcePackagesAtIndexState verbosity repoCtxt mb_idxState mb_activeRepos = do
-> PackageIndex UnresolvedSourcePackage
addIndex acc (RepoData _ _ _ _, CombineStrategySkip) = acc
addIndex acc (RepoData _ _ idx _, CombineStrategyMerge) = PackageIndex.merge acc idx
addIndex acc (RepoData _ _ idx _, CombineStrategyOverride) = PackageIndex.override acc idx
addIndex acc (RepoData _ _ idx prefs, CombineStrategyOverride) =
PackageIndex.overrideOrMerge strategy acc idx
where
strategy pkgname
-- We only want to merge a package when no version in idx is marked
-- as preferred/when all versions are deprecated.
| Just pkgPrefs <- Map.lookup pkgname prefsByPkg
, null $ PackageIndex.lookupDependency idx pkgname pkgPrefs =
PackageIndex.Merge
| otherwise = PackageIndex.Override

prefsByPkg =
Map.fromListWith
intersectVersionRanges
[(name, range) | Dependency name range _ <- prefs]

let pkgs :: PackageIndex UnresolvedSourcePackage
pkgs = foldl' addIndex mempty pkgss'
Expand Down
Loading