@@ -68,12 +68,13 @@ import Stack.GhcPkg
6868import Stack.Types
6969import Stack.Constants
7070import Stack.Package
71+ import Stack.PackageIndex
7172import System.Directory (createDirectoryIfMissing , getDirectoryContents )
7273import System.FilePath (takeDirectory )
7374
7475data 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 )
7980instance 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