11{-# LANGUAGE ConstraintKinds #-}
22{-# LANGUAGE FlexibleContexts #-}
33{-# LANGUAGE MultiParamTypeClasses #-}
4+ {-# LANGUAGE OverloadedStrings #-}
45{-# LANGUAGE TemplateHaskell #-}
56-- Determine which packages are already installed
67module Stack.Build.Installed
@@ -69,6 +70,7 @@ getInstalled :: (M env m, PackageInstallInfo pii)
6970getInstalled menv opts sourceMap = do
7071 snapDBPath <- packageDatabaseDeps
7172 localDBPath <- packageDatabaseLocal
73+ extraDBPaths <- packageDatabaseExtra
7274
7375 bconfig <- asks getBuildConfig
7476
@@ -78,12 +80,17 @@ getInstalled menv opts sourceMap = do
7880 else return Nothing
7981
8082 let loadDatabase' = loadDatabase menv opts mcache sourceMap
81- (installedLibs0, globalInstalled) <- loadDatabase' Nothing []
82- (installedLibs1, _snapInstalled) <-
83- loadDatabase' (Just (Snap , snapDBPath)) installedLibs0
84- (installedLibs2, localInstalled) <-
85- loadDatabase' (Just (Local , localDBPath)) installedLibs1
86- let installedLibs = M. fromList $ map lhPair installedLibs2
83+
84+ (installedLibs0, globalInstalled) <- loadDatabase' [] Nothing []
85+ (installedLibs1, _extraInstalled) <-
86+ (snd <$> (foldM (\ (prevDBs, lhs') pkgdb -> do
87+ lhs'' <- loadDatabase' prevDBs (Just (ExtraGlobal , pkgdb)) (fst lhs')
88+ return (prevDBs ++ [pkgdb], lhs'')) ([] , (installedLibs0, globalInstalled)) extraDBPaths))
89+ (installedLibs2, _snapInstalled) <-
90+ loadDatabase' extraDBPaths (Just (InstalledTo Snap , snapDBPath)) installedLibs1
91+ (installedLibs3, localInstalled) <-
92+ loadDatabase' extraDBPaths (Just (InstalledTo Local , localDBPath)) installedLibs2
93+ let installedLibs = M. fromList $ map lhPair installedLibs3
8794
8895 case mcache of
8996 Nothing -> return ()
@@ -126,13 +133,15 @@ loadDatabase :: (M env m, PackageInstallInfo pii)
126133 -> GetInstalledOpts
127134 -> Maybe InstalledCache -- ^ if Just, profiling or haddock is required
128135 -> Map PackageName pii -- ^ to determine which installed things we should include
129- -> Maybe (InstallLocation , Path Abs Dir ) -- ^ package database, Nothing for global
136+ -> [Path Abs Dir ] -- ^ extra package databases this database depends on
137+ -> Maybe (InstalledPackageLocation , Path Abs Dir ) -- ^ package database, Nothing for global
130138 -> [LoadHelper ] -- ^ from parent databases
131139 -> m ([LoadHelper ], [DumpPackage () () ])
132- loadDatabase menv opts mcache sourceMap mdb lhs0 = do
140+ loadDatabase menv opts mcache sourceMap extraDBs mdb lhs0 = do
133141 wc <- getWhichCompiler
134- (lhs1, dps) <- ghcPkgDump menv wc (fmap snd mdb)
135- $ conduitDumpPackage =$ sink
142+ (lhs1, dps) <- ghcPkgDump menv wc (extraDBs ++ (fmap snd (maybeToList mdb)))
143+ $ conduitDumpPackage =$ sink
144+
136145 let lhs = pruneDeps
137146 id
138147 lhId
@@ -168,7 +177,7 @@ isAllowed :: PackageInstallInfo pii
168177 => GetInstalledOpts
169178 -> Maybe InstalledCache
170179 -> Map PackageName pii
171- -> Maybe InstallLocation
180+ -> Maybe InstalledPackageLocation
172181 -> DumpPackage Bool Bool
173182 -> Maybe LoadHelper
174183isAllowed opts mcache sourceMap mloc dp
@@ -188,17 +197,23 @@ isAllowed opts mcache sourceMap mloc dp
188197 if name `HashSet.member` wiredInPackages
189198 then []
190199 else dpDepends dp
191- , lhPair = (name, (version, fromMaybe Snap mloc, Library ident gid))
200+ , lhPair = (name, (version, toPackageLocation mloc, Library ident gid))
192201 }
193202 | otherwise = Nothing
194203 where
204+ toPackageLocation :: Maybe InstalledPackageLocation -> InstallLocation
205+ toPackageLocation Nothing = Snap
206+ toPackageLocation (Just ExtraGlobal ) = Snap
207+ toPackageLocation (Just (InstalledTo loc)) = loc
208+
195209 toInclude =
196210 case Map. lookup name sourceMap of
197211 Nothing ->
198212 case mloc of
199213 -- The sourceMap has nothing to say about this global
200214 -- package, so we can use it
201215 Nothing -> True
216+ Just ExtraGlobal -> True
202217 -- For non-global packages, don't include unknown packages.
203218 -- See:
204219 -- https://github.com/commercialhaskell/stack/issues/292
@@ -210,8 +225,8 @@ isAllowed opts mcache sourceMap mloc dp
210225
211226 -- Ensure that the installed location matches where the sourceMap says it
212227 -- should be installed
213- checkLocation Snap = mloc /= Just Local -- we can allow either global or snap
214- checkLocation Local = mloc == Just Local
228+ checkLocation Snap = mloc /= Just ( InstalledTo Local ) -- we can allow either global or snap
229+ checkLocation Local = mloc == Just ( InstalledTo Local ) || mloc == Just ExtraGlobal -- 'locally' installed snapshot packages can come from extra dbs
215230
216231 gid = dpGhcPkgId dp
217232 ident@ (PackageIdentifier name version) = dpPackageIdent dp
0 commit comments