Skip to content
Snippets Groups Projects
Commit 5b90298d authored by Duncan Coutts's avatar Duncan Coutts Committed by Mikhail Glushenkov
Browse files

Introduce a ResolverPackage type for the result of the solvers

Rather than directly reusing the InstallPlan.PlanPackage type which has
more cases and which we'd like to generalise somewhat.
parent 3138ffdf
No related branches found
No related tags found
No related merge requests found
......@@ -72,8 +72,8 @@ import Distribution.Client.Types
( SourcePackageDb(SourcePackageDb), SourcePackage(..)
, ConfiguredPackage(..), ConfiguredId(..), enableStanzas )
import Distribution.Client.Dependency.Types
( PreSolver(..), Solver(..), DependencyResolver, PackageConstraint(..)
, debugPackageConstraint
( PreSolver(..), Solver(..), DependencyResolver, ResolverPackage(..)
, PackageConstraint(..), debugPackageConstraint
, AllowNewer(..), PackagePreferences(..), InstalledPreference(..)
, PackagesPreferenceDefault(..)
, Progress(..), foldProgress )
......@@ -607,7 +607,7 @@ interpretPackagesPreference selected defaultPref prefs =
validateSolverResult :: Platform
-> CompilerInfo
-> Bool
-> [InstallPlan.PlanPackage]
-> [ResolverPackage]
-> InstallPlan
validateSolverResult platform comp indepGoals pkgs =
case planPackagesProblems platform comp pkgs of
......@@ -617,7 +617,10 @@ validateSolverResult platform comp indepGoals pkgs =
problems -> error (formatPkgProblems problems)
where
index = InstalledPackageIndex.fromList pkgs
index = InstalledPackageIndex.fromList (map toPlanPackage pkgs)
toPlanPackage (PreExisting pkg) = InstallPlan.PreExisting pkg
toPlanPackage (Configured pkg) = InstallPlan.Configured pkg
formatPkgProblems = formatProblemMessage . map showPlanPackageProblem
formatPlanProblems = formatProblemMessage . map InstallPlan.showPlanProblem
......@@ -642,11 +645,11 @@ showPlanPackageProblem (InvalidConfiguredPackage pkg packageProblems) =
| problem <- packageProblems ]
planPackagesProblems :: Platform -> CompilerInfo
-> [InstallPlan.PlanPackage]
-> [ResolverPackage]
-> [PlanPackageProblem]
planPackagesProblems platform cinfo pkgs =
[ InvalidConfiguredPackage pkg packageProblems
| InstallPlan.Configured pkg <- pkgs
| Configured pkg <- pkgs
, let packageProblems = configuredPackageProblems platform cinfo pkg
, not (null packageProblems) ]
......
......@@ -26,9 +26,7 @@ import Distribution.Client.Dependency.Modular.Package
import Distribution.Client.Dependency.Modular.Solver
( SolverConfig(..), solve )
import Distribution.Client.Dependency.Types
( DependencyResolver, PackageConstraint(..) )
import Distribution.Client.InstallPlan
( PlanPackage )
( DependencyResolver, ResolverPackage, PackageConstraint(..) )
import Distribution.System
( Platform(..) )
......@@ -46,7 +44,7 @@ modularResolver sc (Platform arch os) cinfo iidx sidx pprefs pcs pns =
gcs = M.fromListWith (++) (map (\ pc -> (pcName pc, [pc])) pcs)
-- Results have to be converted into an install plan.
postprocess :: Assignment -> RevDepMap -> [PlanPackage]
postprocess :: Assignment -> RevDepMap -> [ResolverPackage]
postprocess a rdm = map (convCP iidx sidx) (toCPs a rdm)
-- Helper function to extract the PN from a constraint.
......
......@@ -3,12 +3,10 @@ module Distribution.Client.Dependency.Modular.ConfiguredConversion where
import Data.Maybe
import Prelude hiding (pi)
import Distribution.Client.InstallPlan
import Distribution.Client.Types
import Distribution.Compiler
import Distribution.Client.Dependency.Types (ResolverPackage(..))
import qualified Distribution.Client.PackageIndex as CI
import qualified Distribution.Simple.PackageIndex as SI
import Distribution.System
import Distribution.Client.Dependency.Modular.Configured
import Distribution.Client.Dependency.Modular.Package
......@@ -16,14 +14,9 @@ import Distribution.Client.Dependency.Modular.Package
import Distribution.Client.ComponentDeps (ComponentDeps)
import qualified Distribution.Client.ComponentDeps as CD
mkPlan :: Platform -> CompilerInfo -> Bool ->
SI.InstalledPackageIndex -> CI.PackageIndex SourcePackage ->
[CP QPN] -> Either [PlanProblem] InstallPlan
mkPlan plat comp indepGoals iidx sidx cps =
new plat comp indepGoals (SI.fromList (map (convCP iidx sidx) cps))
convCP :: SI.InstalledPackageIndex -> CI.PackageIndex SourcePackage ->
CP QPN -> PlanPackage
CP QPN -> ResolverPackage
convCP iidx sidx (CP qpi fa es ds) =
case convPI qpi of
Left pi -> PreExisting $ InstalledPackage
......
......@@ -21,14 +21,11 @@ import Distribution.Client.Dependency.TopDown.Constraints
( Satisfiable(..) )
import Distribution.Client.IndexUtils
( convert )
import qualified Distribution.Client.InstallPlan as InstallPlan
import Distribution.Client.InstallPlan
( PlanPackage(..) )
import Distribution.Client.Types
( SourcePackage(..), ConfiguredPackage(..), InstalledPackage(..)
, enableStanzas, ConfiguredId(..), fakeInstalledPackageId )
import Distribution.Client.Dependency.Types
( DependencyResolver, PackageConstraint(..)
( DependencyResolver, ResolverPackage(..), PackageConstraint(..)
, PackagePreferences(..), InstalledPreference(..)
, Progress(..), foldProgress )
......@@ -266,7 +263,7 @@ topDownResolver' :: Platform -> CompilerInfo
-> (PackageName -> PackagePreferences)
-> [PackageConstraint]
-> [PackageName]
-> Progress Log Failure [PlanPackage]
-> Progress Log Failure [ResolverPackage]
topDownResolver' platform cinfo installedPkgIndex sourcePkgIndex
preferences constraints targets =
fmap (uncurry finalise)
......@@ -288,11 +285,15 @@ topDownResolver' platform cinfo installedPkgIndex sourcePkgIndex
initialPkgNames = Set.fromList targets
finalise selected' constraints' =
PackageIndex.allPackages
map toResolverPackage
. PackageIndex.allPackages
. fst . improvePlan installedPkgIndex' constraints'
. PackageIndex.fromList
$ finaliseSelectedPackages preferences selected' constraints'
toResolverPackage :: FinalSelectedPackage -> ResolverPackage
toResolverPackage (SelectedInstalled pkg) = PreExisting pkg
toResolverPackage (SelectedSource pkg) = Configured pkg
addTopLevelTargets :: [PackageName]
-> Constraints
......@@ -545,7 +546,7 @@ selectNeededSubset installedPkgIndex sourcePkgIndex = select mempty mempty
finaliseSelectedPackages :: (PackageName -> PackagePreferences)
-> SelectedPackages
-> Constraints
-> [PlanPackage]
-> [FinalSelectedPackage]
finaliseSelectedPackages pref selected constraints =
map finaliseSelected (PackageIndex.allPackages selected)
where
......@@ -561,9 +562,9 @@ finaliseSelectedPackages pref selected constraints =
Just (InstalledOnly _) -> finaliseInstalled ipkg
Just (InstalledAndSource _ _) -> finaliseSource (Just ipkg) apkg
finaliseInstalled (InstalledPackageEx pkg _ _) = InstallPlan.PreExisting pkg
finaliseInstalled (InstalledPackageEx pkg _ _) = SelectedInstalled pkg
finaliseSource mipkg (SemiConfiguredPackage pkg flags stanzas deps) =
InstallPlan.Configured (ConfiguredPackage pkg flags stanzas deps')
SelectedSource (ConfiguredPackage pkg flags stanzas deps')
where
-- We cheat in the cabal solver, and classify all dependencies as
-- library dependencies.
......@@ -649,8 +650,8 @@ finaliseSelectedPackages pref selected constraints =
--
improvePlan :: PackageIndex InstalledPackage
-> Constraints
-> PackageIndex PlanPackage
-> (PackageIndex PlanPackage, Constraints)
-> PackageIndex FinalSelectedPackage
-> (PackageIndex FinalSelectedPackage, Constraints)
improvePlan installed constraints0 selected0 =
foldl' improve (selected0, constraints0) (reverseTopologicalOrder selected0)
where
......@@ -663,26 +664,26 @@ improvePlan installed constraints0 selected0 =
-- already installed with the exact same dependencies and all the packages
-- in the plan that it depends on are in the installed state
improvePkg selected constraints pkgid = do
Configured pkg <- PackageIndex.lookupPackageId selected pkgid
ipkg <- PackageIndex.lookupPackageId installed pkgid
SelectedSource pkg <- PackageIndex.lookupPackageId selected pkgid
ipkg <- PackageIndex.lookupPackageId installed pkgid
guard $ all (isInstalled selected) (sourceDeps pkg)
tryInstalled selected constraints [ipkg]
isInstalled selected pkgid =
case PackageIndex.lookupPackageId selected pkgid of
Just (PreExisting _) -> True
_ -> False
Just (SelectedInstalled _) -> True
_ -> False
tryInstalled :: PackageIndex PlanPackage -> Constraints
tryInstalled :: PackageIndex FinalSelectedPackage -> Constraints
-> [InstalledPackage]
-> Maybe (PackageIndex PlanPackage, Constraints)
-> Maybe (PackageIndex FinalSelectedPackage, Constraints)
tryInstalled selected constraints [] = Just (selected, constraints)
tryInstalled selected constraints (pkg:pkgs) =
case constraintsOk (packageId pkg) (sourceDeps pkg) constraints of
Nothing -> Nothing
Just constraints' -> tryInstalled selected' constraints' pkgs'
where
selected' = PackageIndex.insert (PreExisting pkg) selected
selected' = PackageIndex.insert (SelectedInstalled pkg) selected
pkgs' = catMaybes (map notSelected (sourceDeps pkg)) ++ pkgs
notSelected pkgid =
case (PackageIndex.lookupPackageId installed pkgid
......@@ -698,7 +699,7 @@ improvePlan installed constraints0 selected0 =
where
dep = thisPackageVersion pkgid'
reverseTopologicalOrder :: PackageIndex PlanPackage -> [PackageId]
reverseTopologicalOrder :: PackageIndex FinalSelectedPackage -> [PackageId]
reverseTopologicalOrder index = map (packageId . toPkg)
. Graph.topSort
. Graph.transposeG
......@@ -1001,7 +1002,7 @@ listOf disp (x0:x1:xs) = disp x0 ++ go x1 xs
-- this duplication could be avoided, but that's a bit of work and the top-down
-- solver is legacy code anyway.
--
-- (NOTE: This is called at two types: InstalledPackage and PlanPackage.)
-- (NOTE: This is called at two types: InstalledPackage and FinalSelectedPackage.)
dependencyGraph :: PackageSourceDeps pkg
=> PackageIndex pkg
-> (Graph.Graph,
......
......@@ -14,10 +14,9 @@
module Distribution.Client.Dependency.TopDown.Types where
import Distribution.Client.Types
( SourcePackage(..), ReadyPackage(..), InstalledPackage(..)
( InstalledPackage(..), SourcePackage(..), ReadyPackage(..)
, ConfiguredPackage(..)
, OptionalStanza, ConfiguredId(..) )
import Distribution.Client.InstallPlan
( ConfiguredPackage(..), PlanPackage(..) )
import qualified Distribution.Client.ComponentDeps as CD
import Distribution.Package
......@@ -42,6 +41,10 @@ data InstalledOrSource installed source
| InstalledAndSource installed source
deriving Eq
data FinalSelectedPackage
= SelectedInstalled InstalledPackage
| SelectedSource ConfiguredPackage
type TopologicalSortNumber = Int
data InstalledPackageEx
......@@ -80,6 +83,10 @@ instance (Package installed, Package source)
packageId (SourceOnly p ) = packageId p
packageId (InstalledAndSource p _) = packageId p
instance Package FinalSelectedPackage where
packageId (SelectedInstalled pkg) = packageId pkg
packageId (SelectedSource pkg) = packageId pkg
-- | We can have constraints on selecting just installed or just source
-- packages.
......@@ -123,9 +130,7 @@ instance PackageSourceDeps ReadyPackage where
instance PackageSourceDeps InstalledPackage where
sourceDeps (InstalledPackage _ deps) = deps
instance PackageSourceDeps PlanPackage where
sourceDeps (PreExisting pkg) = sourceDeps pkg
sourceDeps (Configured pkg) = sourceDeps pkg
sourceDeps (Processing pkg) = sourceDeps pkg
sourceDeps (Installed pkg _) = sourceDeps pkg
sourceDeps (Failed pkg _) = sourceDeps pkg
instance PackageSourceDeps FinalSelectedPackage where
sourceDeps (SelectedInstalled pkg) = sourceDeps pkg
sourceDeps (SelectedSource pkg) = sourceDeps pkg
......@@ -18,6 +18,7 @@ module Distribution.Client.Dependency.Types (
PreSolver(..),
Solver(..),
DependencyResolver,
ResolverPackage(..),
AllowNewer(..), isAllowNewer,
PackageConstraint(..),
......@@ -45,8 +46,8 @@ import Data.Monoid
#endif
import Distribution.Client.Types
( OptionalStanza(..), SourcePackage(..) )
import qualified Distribution.Client.InstallPlan as InstallPlan
( OptionalStanza(..), SourcePackage(..), ConfiguredPackage
, InstalledPackage )
import Distribution.Compat.ReadP
( (<++) )
......@@ -120,7 +121,15 @@ type DependencyResolver = Platform
-> (PackageName -> PackagePreferences)
-> [PackageConstraint]
-> [PackageName]
-> Progress String String [InstallPlan.PlanPackage]
-> Progress String String [ResolverPackage]
-- | The dependency resolver picks either pre-existing installed packages
-- or it picks source packages along with package configuration.
--
-- This is like the 'InstallPlan.PlanPackage' but with fewer cases.
--
data ResolverPackage = PreExisting InstalledPackage
| Configured ConfiguredPackage
-- | Per-package constraints. Package constraints must be respected by the
-- solver. Multiple constraints for each package can be given, though obviously
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment