11{-# LANGUAGE DeriveDataTypeable #-}
22{-# LANGUAGE DeriveGeneric #-}
33{-# LANGUAGE EmptyDataDecls #-}
4+ {-# LANGUAGE FlexibleContexts #-}
45{-# LANGUAGE OverloadedStrings #-}
56{-# LANGUAGE TemplateHaskell #-}
67{-# LANGUAGE TupleSections #-}
@@ -25,10 +26,11 @@ module Stack.BuildPlan
2526import Control.Applicative ((<$>) , (<*>) )
2627import Control.Arrow ((&&&) )
2728import Control.Exception.Enclosed (tryIO , handleIO )
28- import Control.Monad (liftM )
29+ import Control.Monad (liftM , forM )
2930import Control.Monad.Catch
3031import Control.Monad.IO.Class
3132import Control.Monad.Logger
33+ import Control.Monad.Trans.Control (MonadBaseControl )
3234import Control.Monad.Reader (asks )
3335import Control.Monad.State.Strict (State , execState , get , modify ,
3436 put )
@@ -37,9 +39,6 @@ import Data.Aeson (withObject, withText, (.:))
3739import qualified Data.Binary as Binary
3840import Data.ByteString (ByteString )
3941import qualified Data.ByteString.Char8 as S8
40- import Data.Conduit
41- import qualified Data.Conduit.List as CL
42- import Data.Either (partitionEithers )
4342import qualified Data.Foldable as F
4443import qualified Data.HashMap.Strict as HM
4544import Data.IntMap (IntMap )
@@ -64,19 +63,18 @@ import Distribution.PackageDescription (GenericPackageDescription,
6463import GHC.Generics (Generic )
6564import Network.HTTP.Download
6665import Path
66+ import Stack.Fetch
6767import Stack.GhcPkg
6868import Stack.Types
6969import Stack.Constants
7070import Stack.Package
71- import Stack.PackageIndex
7271import System.Directory (createDirectoryIfMissing , getDirectoryContents )
7372import System.FilePath (takeDirectory )
7473
7574data BuildPlanException
7675 = UnknownPackages
7776 (Map PackageName (Set PackageName )) -- truly unknown
7877 (Map PackageName (Set PackageIdentifier )) -- shadowed
79- | Couldn'tFindInIndex (Set PackageIdentifier )
8078 deriving (Typeable )
8179instance Exception BuildPlanException
8280instance Show BuildPlanException where
@@ -126,10 +124,6 @@ instance Show BuildPlanException where
126124 $ Set. unions
127125 $ Map. elems shadowed
128126
129- show (Couldn'tFindInIndex idents) =
130- " Couldn't find the following packages in the index: " ++
131- intercalate " , " (map packageIdentifierString $ Set. toList idents)
132-
133127-- | Determine the necessary packages to install to have the given set of
134128-- packages available.
135129--
@@ -181,7 +175,7 @@ data MiniBuildPlan = MiniBuildPlan
181175 deriving (Generic , Show )
182176instance Binary. Binary MiniBuildPlan
183177
184- toMiniBuildPlan :: (MonadIO m , MonadLogger m , MonadReader env m , HasHttpManager env , MonadThrow m , HasConfig env )
178+ toMiniBuildPlan :: (MonadIO m , MonadLogger m , MonadReader env m , HasHttpManager env , MonadThrow m , HasConfig env , MonadBaseControl IO m )
185179 => BuildPlan -> m MiniBuildPlan
186180toMiniBuildPlan bp = do
187181 extras <- addDeps ghcVersion $ fmap goPP $ bpPackages bp
@@ -205,73 +199,48 @@ toMiniBuildPlan bp = do
205199 )
206200
207201-- | Add in the resolved dependencies from the package index
208- addDeps :: (MonadIO m , MonadLogger m , MonadReader env m , HasHttpManager env , MonadThrow m , HasConfig env )
202+ addDeps :: (MonadIO m , MonadLogger m , MonadReader env m , HasHttpManager env , MonadThrow m , HasConfig env , MonadBaseControl IO m )
209203 => Version -- ^ GHC version
210204 -> Map PackageName (Version , Map FlagName Bool )
211205 -> m (Map PackageName MiniPackageInfo )
212206addDeps ghcVersion toCalc = do
213207 menv <- getMinimalEnvOverride
214- eres <- tryAddDeps menv
215- case eres of
216- Left _ -> do
217- $ logInfo " Missing packages in index, updating and trying again"
218- updateAllIndices menv
219- tryAddDeps menv >>= either throwM return
220- Right res -> return res
208+ platform <- asks $ configPlatform . getConfig
209+ resolvedMap <- resolvePackages menv (Map. keysSet idents0) Set. empty
210+ let byIndex = Map. fromListWith (++) $ flip map (Map. toList resolvedMap)
211+ $ \ (ident, rp) ->
212+ (indexName $ rpIndex rp,
213+ [( ident
214+ , rpCache rp
215+ , maybe Map. empty snd $ Map. lookup (packageIdentifierName ident) toCalc
216+ )])
217+ res <- forM (Map. toList byIndex) $ \ (indexName', pkgs) -> withCabalFiles indexName' pkgs
218+ $ \ ident flags cabalBS -> do
219+ gpd <- readPackageUnresolvedBS Nothing cabalBS
220+ let packageConfig = PackageConfig
221+ { packageConfigEnableTests = False
222+ , packageConfigEnableBenchmarks = False
223+ , packageConfigFlags = flags
224+ , packageConfigGhcVersion = ghcVersion
225+ , packageConfigPlatform = platform
226+ }
227+ name = packageIdentifierName ident
228+ pd = resolvePackageDescription packageConfig gpd
229+ exes = Set. fromList $ map (ExeName . S8. pack . exeName) $ executables pd
230+ notMe = Set. filter (/= name) . Map. keysSet
231+ return (name, MiniPackageInfo
232+ { mpiVersion = packageIdentifierVersion ident
233+ , mpiFlags = flags
234+ , mpiPackageDeps = notMe $ packageDependencies pd
235+ , mpiToolDeps = Map. keysSet $ packageToolDependencies pd
236+ , mpiExes = exes
237+ })
238+ return $ Map. fromList $ concat res
221239 where
222- tryAddDeps menv = do
223- platform <- asks (configPlatform . getConfig)
224- index: _ <- asks (configPackageIndices . getConfig) -- FIXME
225- idents <- sourcePackageIndex menv index $$ CL. foldM (go platform) idents0 -- FIXME use the more efficient cabal file lookup code like Stack.Fetch
226- return $ case partitionEithers $ map hoistEither $ Map. toList idents of
227- ([] , pairs) -> Right $ Map. fromList pairs
228- (missing, _) -> Left $ Couldn'tFindInIndex $ Set. fromList missing
229-
230240 idents0 = Map. fromList
231241 $ map (\ (n, (v, f)) -> (PackageIdentifier n v, Left f))
232242 $ Map. toList toCalc
233243
234- hoistEither (ident, Left _) = Left ident
235- hoistEither (PackageIdentifier name version, Right (flags, pdeps, tdeps, exes)) =
236- Right (name, MiniPackageInfo
237- { mpiVersion = version
238- , mpiFlags = flags
239- , mpiPackageDeps = pdeps
240- , mpiToolDeps = tdeps
241- , mpiExes = exes
242- })
243-
244- go platform m (Left ucf) =
245- case Map. lookup ident m of
246- Just (Left flags) -> do
247- gpd <- ucfParse ucf
248- let packageConfig = PackageConfig
249- { packageConfigEnableTests = False
250- , packageConfigEnableBenchmarks = False
251- , packageConfigFlags = flags
252- , packageConfigGhcVersion = ghcVersion
253- , packageConfigPlatform = platform
254- }
255- pd = resolvePackageDescription packageConfig gpd
256- pdeps = Map. filterWithKey
257- (const . (/= ucfName ucf))
258- (packageDependencies pd)
259- tdeps = Map. keysSet (packageToolDependencies pd)
260- exes = Set. fromList $ map (ExeName . S8. pack . exeName) $ executables pd
261- return $ Map. insert
262- ident
263- (Right
264- ( flags
265- , Map. keysSet pdeps
266- , tdeps
267- , exes
268- ))
269- m
270- _ -> return m
271- where
272- ident = PackageIdentifier (ucfName ucf) (ucfVersion ucf)
273- go _ m (Right _) = return m
274-
275244-- | Resolve all packages necessary to install for
276245getDeps :: MiniBuildPlan
277246 -> (PackageName -> Bool ) -- ^ is it shadowed by a local package?
@@ -390,7 +359,7 @@ instance FromJSON Snapshots where
390359
391360-- | Load up a 'MiniBuildPlan', preferably from cache
392361loadMiniBuildPlan
393- :: (MonadIO m , MonadThrow m , MonadLogger m , MonadReader env m , HasHttpManager env , HasConfig env )
362+ :: (MonadIO m , MonadThrow m , MonadLogger m , MonadReader env m , HasHttpManager env , HasConfig env , MonadBaseControl IO m )
394363 => SnapName
395364 -> Map PackageName Version -- ^ packages in global database
396365 -> m MiniBuildPlan
@@ -546,7 +515,7 @@ checkDeps flags deps packages = do
546515
547516-- | Find a snapshot and set of flags that is compatible with the given
548517-- 'GenericPackageDescription'. Returns 'Nothing' if no such snapshot is found.
549- findBuildPlan :: (MonadIO m , MonadCatch m , MonadLogger m , MonadReader env m , HasHttpManager env , HasConfig env )
518+ findBuildPlan :: (MonadIO m , MonadCatch m , MonadLogger m , MonadReader env m , HasHttpManager env , HasConfig env , MonadBaseControl IO m )
550519 => Path Abs File
551520 -> GenericPackageDescription
552521 -> m (Maybe (SnapName , Map FlagName Bool ))
0 commit comments