Skip to content

Commit fe6acf4

Browse files
committed
Merge branch 'fix-dot-4324' of https://github.com/vanceism7/stack into vanceism7-fix-dot-4324
2 parents f39a7ae + dfeecdf commit fe6acf4

1 file changed

Lines changed: 45 additions & 38 deletions

File tree

src/Stack/Dot.hs

Lines changed: 45 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import Stack.SourceMap
3838
import Stack.Types.Build
3939
import Stack.Types.Config
4040
import Stack.Types.GhcPkgId
41-
import Stack.Types.Package
4241
import 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
248247
createDepLoader :: 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

Comments
 (0)