@@ -38,7 +38,6 @@ import Stack.SourceMap
3838import Stack.Types.Build
3939import Stack.Types.Config
4040import Stack.Types.GhcPkgId
41- import Stack.Types.Package
4241import Stack.Types.SourceMap
4342
4443-- | Options record for @stack dot@
@@ -115,12 +114,12 @@ createDependencyGraph dotOpts = do
115114 locals <- projectLocalPackages
116115 let graph = Map. fromList $ projectPackageDependencies dotOpts (filter lpWanted locals)
117116 installMap <- toInstallMap sourceMap
118- (installedMap , globalDump, _, _) <- getInstalled installMap
117+ (_ , globalDump, _, _) <- getInstalled installMap
119118 -- TODO: Can there be multiple entries for wired-in-packages? If so,
120119 -- this will choose one arbitrarily..
121120 let globalDumpMap = Map. fromList $ map (\ dp -> (Stack.Prelude. pkgName (dpPackageIdent dp), dp)) globalDump
122121 globalIdMap = Map. fromList $ map (\ dp -> (dpGhcPkgId dp, dpPackageIdent dp)) globalDump
123- let depLoader = createDepLoader sourceMap installedMap globalDumpMap globalIdMap loadPackageDeps
122+ let depLoader = createDepLoader sourceMap globalDumpMap globalIdMap loadPackageDeps
124123 loadPackageDeps name version loc flags ghcOptions
125124 -- Skip packages that can't be loaded - see
126125 -- https://github.com/commercialhaskell/stack/issues/2967
@@ -247,49 +246,57 @@ resolveDependencies limit graph loadPackageDeps = do
247246-- | Given a SourceMap and a dependency loader, load the set of dependencies for a package
248247createDepLoader :: HasEnvConfig env
249248 => SourceMap
250- -> Map PackageName (InstallLocation , Installed )
251249 -> Map PackageName DumpPackage
252250 -> Map GhcPkgId PackageIdentifier
253251 -> (PackageName -> Version -> PackageLocationImmutable ->
254252 Map FlagName Bool -> [Text ] -> RIO env (Set PackageName , DotPayload ))
255253 -> PackageName
256254 -> RIO env (Set PackageName , DotPayload )
257- createDepLoader sourceMap installed globalDumpMap globalIdMap loadPackageDeps pkgName =
258- if not (pkgName `Set.member` wiredInPackages)
259- then case Map. lookup pkgName (smProject sourceMap) of
260- Just pp -> do
261- pkg <- loadCommonPackage (ppCommon pp)
262- pure (packageAllDeps pkg, payloadFromLocal pkg)
263- Nothing ->
264- case Map. lookup pkgName (smDeps sourceMap) of
265- Just DepPackage {dpLocation= PLMutable dir} -> do
266- pp <- mkProjectPackage YesPrintWarnings dir False
267- pkg <- loadCommonPackage (ppCommon pp)
268- pure (packageAllDeps pkg, payloadFromLocal pkg)
269- Just dp@ DepPackage {dpLocation= PLImmutable loc} -> do
270- let common = dpCommon dp
271- gpd <- liftIO $ cpGPD common
272- let PackageIdentifier name version = PD. package $ PD. packageDescription gpd
273- flags = cpFlags common
274- ghcOptions = cpGhcOptions common
275- assert (pkgName == name) (loadPackageDeps pkgName version loc flags ghcOptions)
276- Nothing ->
277- pure (Set. empty, payloadFromInstalled (Map. lookup pkgName installed))
278- -- For wired-in-packages, use information from ghc-pkg (see #3084)
279- else case Map. lookup pkgName globalDumpMap of
280- Nothing -> error (" Invariant violated: Expected to find wired-in-package " ++ packageNameString pkgName ++ " in global DB" )
281- Just dp -> pure (Set. fromList deps, payloadFromDump dp)
282- where
283- deps = map (\ depId -> maybe (error (" Invariant violated: Expected to find " ++ ghcPkgIdString depId ++ " in global DB" ))
284- Stack.Prelude. pkgName
285- (Map. lookup depId globalIdMap))
286- (dpDepends dp)
255+ createDepLoader sourceMap globalDumpMap globalIdMap loadPackageDeps pkgName = do
256+ fromMaybe noDepsErr
257+ (projectPackageDeps <|> dependencyDeps <|> globalDeps)
287258 where
259+ projectPackageDeps =
260+ loadDeps <$> Map. lookup pkgName (smProject sourceMap)
261+ where
262+ loadDeps pp = do
263+ pkg <- loadCommonPackage (ppCommon pp)
264+ pure (packageAllDeps pkg, payloadFromLocal pkg)
265+
266+ dependencyDeps =
267+ loadDeps <$> Map. lookup pkgName (smDeps sourceMap)
268+ where
269+ loadDeps DepPackage {dpLocation= PLMutable dir} = do
270+ pp <- mkProjectPackage YesPrintWarnings dir False
271+ pkg <- loadCommonPackage (ppCommon pp)
272+ pure (packageAllDeps pkg, payloadFromLocal pkg)
273+
274+ loadDeps dp@ DepPackage {dpLocation= PLImmutable loc} = do
275+ let common = dpCommon dp
276+ gpd <- liftIO $ cpGPD common
277+ let PackageIdentifier name version = PD. package $ PD. packageDescription gpd
278+ flags = cpFlags common
279+ ghcOptions = cpGhcOptions common
280+ assert (pkgName == name) (loadPackageDeps pkgName version loc flags ghcOptions)
281+
282+ -- If package is a global package, use info from ghc-pkg (#4324, #3084)
283+ globalDeps =
284+ pure . getDepsFromDump <$> Map. lookup pkgName globalDumpMap
285+ where
286+ getDepsFromDump dump =
287+ (Set. fromList deps, payloadFromDump dump)
288+ where
289+ deps = map ghcIdToPackageName (dpDepends dump)
290+ ghcIdToPackageName depId =
291+ let errText = " Invariant violated: Expected to find "
292+ in maybe (error (errText ++ ghcPkgIdString depId ++ " in global DB" ))
293+ Stack.Prelude. pkgName
294+ (Map. lookup depId globalIdMap)
295+
296+ noDepsErr = error (" Invariant violated: The '" ++ packageNameString pkgName
297+ ++ " ' package was not found in any of the dependency sources" )
298+
288299 payloadFromLocal pkg = DotPayload (Just $ packageVersion pkg) (Just $ packageLicense pkg)
289- payloadFromInstalled maybePkg = DotPayload (fmap (installedVersion . snd ) maybePkg) $
290- case maybePkg of
291- Just (_, Library _ _ mlicense) -> mlicense
292- _ -> Nothing
293300 payloadFromDump dp = DotPayload (Just $ pkgVersion $ dpPackageIdent dp) (Right <$> dpLicense dp)
294301
295302-- | Resolve the direct (depth 0) external dependencies of the given local packages (assumed to come from project packages)
0 commit comments