Skip to content

Commit ccfbce9

Browse files
committed
More user friendly error messages for missing packages commercialhaskell#142
1 parent 18cca1e commit ccfbce9

2 files changed

Lines changed: 37 additions & 11 deletions

File tree

src/Stack/Build.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,7 @@ getDependencies locals ranges = do
300300
localTools = M.fromList $ map (\p -> (packageName p, ())) locals
301301
toolDeps' = M.difference toolDeps localTools
302302

303-
(deps, users) <- resolveBuildPlan mbp isShadowed $ M.unionWith Set.union
303+
(deps, users) <- resolveBuildPlan menv mbp isShadowed $ M.unionWith Set.union
304304
(fmap M.keysSet ranges)
305305
toolDeps'
306306
forM_ (M.toList users) $ \(name, users') -> $logDebug $

src/Stack/BuildPlan.hs

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,13 @@ import Stack.GhcPkg
6868
import Stack.Types
6969
import Stack.Constants
7070
import Stack.Package
71+
import Stack.PackageIndex
7172
import System.Directory (createDirectoryIfMissing, getDirectoryContents)
7273
import System.FilePath (takeDirectory)
7374

7475
data BuildPlanException
7576
= UnknownPackages
76-
(Map PackageName (Set PackageName)) -- truly unknown
77+
(Map PackageName (Maybe Version, (Set PackageName))) -- truly unknown
7778
(Map PackageName (Set PackageIdentifier)) -- shadowed
7879
deriving (Typeable)
7980
instance Exception BuildPlanException
@@ -84,18 +85,37 @@ instance Show BuildPlanException where
8485
unknown' :: [String]
8586
unknown'
8687
| Map.null unknown = []
87-
| otherwise =
88-
"The following packages do not exist in the build plan:"
89-
: map go (Map.toList unknown)
88+
| otherwise = concat
89+
[ ["The following packages do not exist in the build plan:"]
90+
, map go (Map.toList unknown)
91+
, case mapMaybe goRecommend $ Map.toList unknown of
92+
[] -> []
93+
rec ->
94+
"Recommended action: add the following to your extra-deps:"
95+
: rec
96+
, case mapMaybe getNoKnown $ Map.toList unknown of
97+
[] -> []
98+
noKnown ->
99+
[ "There are no known versions of the following packages:"
100+
, intercalate ", " $ map packageNameString noKnown
101+
]
102+
]
90103
where
91-
go (dep, users) | Set.null users = packageNameString dep
92-
go (dep, users) = concat
104+
go (dep, (_, users)) | Set.null users = packageNameString dep
105+
go (dep, (_, users)) = concat
93106
[ packageNameString dep
94107
, " (used by "
95108
, intercalate ", " $ map packageNameString $ Set.toList users
96109
, ")"
97110
]
98111

112+
goRecommend (name, (Just version, _)) =
113+
Just $ "- " ++ packageIdentifierString (PackageIdentifier name version)
114+
goRecommend (_, (Nothing, _)) = Nothing
115+
116+
getNoKnown (name, (Nothing, _)) = Just name
117+
getNoKnown (_, (Just _, _)) = Nothing
118+
99119
shadowed' :: [String]
100120
shadowed'
101121
| Map.null shadowed = []
@@ -130,16 +150,22 @@ instance Show BuildPlanException where
130150
-- This function will not provide test suite and benchmark dependencies.
131151
--
132152
-- This may fail if a target package is not present in the @BuildPlan@.
133-
resolveBuildPlan :: MonadThrow m
134-
=> MiniBuildPlan
153+
resolveBuildPlan :: (MonadThrow m, MonadIO m, MonadReader env m, HasConfig env, MonadLogger m, HasHttpManager env)
154+
=> EnvOverride
155+
-> MiniBuildPlan
135156
-> (PackageName -> Bool) -- ^ is it shadowed by a local package?
136157
-> Map PackageName (Set PackageName) -- ^ required packages, and users of it
137158
-> m ( Map PackageName (Version, Map FlagName Bool)
138159
, Map PackageName (Set PackageName)
139160
)
140-
resolveBuildPlan mbp isShadowed packages
161+
resolveBuildPlan menv mbp isShadowed packages
141162
| Map.null (rsUnknown rs) && Map.null (rsShadowed rs) = return (rsToInstall rs, rsUsedBy rs)
142-
| otherwise = throwM $ UnknownPackages (rsUnknown rs) (rsShadowed rs)
163+
| otherwise = do
164+
cache <- getPackageCaches menv
165+
let maxVer = Map.fromListWith max $ map toTuple $ Map.keys cache
166+
unknown = flip Map.mapWithKey (rsUnknown rs) $ \ident x ->
167+
(Map.lookup ident maxVer, x)
168+
throwM $ UnknownPackages unknown (rsShadowed rs)
143169
where
144170
rs = getDeps mbp isShadowed packages
145171

0 commit comments

Comments
 (0)