Skip to content

Commit ced6ea8

Browse files
committed
Warn about missing extra-deps #1521
1 parent 25e5741 commit ced6ea8

File tree

7 files changed

+58
-11
lines changed

7 files changed

+58
-11
lines changed

ChangeLog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ Other enhancements:
7070
[#2727](https://github.com/commercialhaskell/stack/issues/2727)
7171
* `--color` option added to override auto-detection of ANSI support
7272
[#2725](https://github.com/commercialhaskell/stack/issues/2725)
73+
* Missing extra-deps are now warned about, adding a degree of typo detection
74+
[#1521](https://github.com/commercialhaskell/stack/issues/1521)
7375

7476
Bug fixes:
7577

src/Stack/Build.hs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@ import Data.List.NonEmpty (NonEmpty(..))
3636
import qualified Data.List.NonEmpty as NE
3737
import qualified Data.Map as Map
3838
import Data.Map.Strict (Map)
39+
import Data.Maybe (catMaybes)
3940
import Data.Monoid
4041
import Data.Set (Set)
4142
import qualified Data.Set as Set
43+
import Data.String
4244
import Data.Text (Text)
4345
import qualified Data.Text as T
4446
import Data.Text.Encoding (decodeUtf8)
@@ -58,6 +60,8 @@ import Stack.Build.Target
5860
import Stack.Fetch as Fetch
5961
import Stack.GhcPkg
6062
import Stack.Package
63+
import Stack.PackageIndex
64+
import Stack.PrettyPrint
6165
import Stack.Types.Build
6266
import Stack.Types.Config
6367
import Stack.Types.FlagName
@@ -92,7 +96,7 @@ build setLocalFiles mbuildLk boptsCli = fixCodePage $ do
9296
let profiling = boptsLibProfile bopts || boptsExeProfile bopts
9397
menv <- getMinimalEnvOverride
9498

95-
(targets, mbp, locals, extraToBuild, sourceMap) <- loadSourceMap NeedTargets boptsCli
99+
(targets, mbp, locals, extraToBuild, extraDeps, sourceMap) <- loadSourceMapFull NeedTargets boptsCli
96100

97101
-- Set local files, necessary for file watching
98102
stackYaml <- asks $ bcStackYaml . getBuildConfig
@@ -108,6 +112,8 @@ build setLocalFiles mbuildLk boptsCli = fixCodePage $ do
108112
, getInstalledHaddock = shouldHaddockDeps bopts }
109113
sourceMap
110114

115+
warnMissingExtraDeps installedMap extraDeps
116+
111117
baseConfigOpts <- mkBaseConfigOpts boptsCli
112118
plan <- withLoadPackage menv $ \loadPackage ->
113119
constructPlan mbp baseConfigOpts locals extraToBuild localDumpPkgs loadPackage sourceMap installedMap
@@ -164,6 +170,25 @@ data CabalVersionException = CabalVersionException { unCabalVersionException ::
164170
instance Show CabalVersionException where show = unCabalVersionException
165171
instance Exception CabalVersionException
166172

173+
warnMissingExtraDeps
174+
:: (StackM env m, HasConfig env)
175+
=> InstalledMap -> Map PackageName Version -> m ()
176+
warnMissingExtraDeps installed extraDeps = do
177+
missingExtraDeps <-
178+
fmap catMaybes $ forM (Map.toList extraDeps) $ \(n, v) ->
179+
if Map.member n installed
180+
then return Nothing
181+
else do
182+
vs <- getPackageVersions n
183+
if Set.null vs
184+
then return $ Just $
185+
fromString (packageNameString n ++ "-" ++ versionString v)
186+
else return Nothing
187+
when (not (null missingExtraDeps)) $
188+
$prettyWarn $
189+
"Some extra-deps are neither installed nor in the index:" <> line <>
190+
indent 4 (bulletedList missingExtraDeps)
191+
167192
-- | See https://github.com/commercialhaskell/stack/issues/1198.
168193
warnIfExecutablesWithSameNameCouldBeOverwritten
169194
:: MonadLogger m => [LocalPackage] -> Plan -> m ()
@@ -378,7 +403,7 @@ queryBuildInfo selectors0 =
378403
-- | Get the raw build information object
379404
rawBuildInfo :: (StackM env m, HasEnvConfig env) => m Value
380405
rawBuildInfo = do
381-
(_, _mbp, locals, _extraToBuild, _sourceMap) <- loadSourceMap NeedTargets defaultBuildOptsCLI
406+
(locals, _sourceMap) <- loadSourceMap NeedTargets defaultBuildOptsCLI
382407
return $ object
383408
[ "locals" .= Object (HM.fromList $ map localToPair locals)
384409
]

src/Stack/Build/Source.hs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
-- Load information on package sources
1111
module Stack.Build.Source
1212
( loadSourceMap
13+
, loadSourceMapFull
1314
, SourceMap
1415
, PackageSource (..)
1516
, getLocalFlags
@@ -76,16 +77,29 @@ import System.FilePath (takeFileName)
7677
import System.IO (withBinaryFile, IOMode (ReadMode))
7778
import System.IO.Error (isDoesNotExistError)
7879

80+
-- | Like 'loadSourceMapFull', but doesn't return values that aren't as
81+
-- commonly needed.
7982
loadSourceMap :: (StackM env m, HasEnvConfig env)
8083
=> NeedTargets
8184
-> BuildOptsCLI
82-
-> m ( Map PackageName SimpleTarget
83-
, MiniBuildPlan
84-
, [LocalPackage]
85-
, Set PackageName -- non-local targets
85+
-> m ( [LocalPackage]
8686
, SourceMap
8787
)
8888
loadSourceMap needTargets boptsCli = do
89+
(_, _, locals, _, _, sourceMap) <- loadSourceMapFull needTargets boptsCli
90+
return (locals, sourceMap)
91+
92+
loadSourceMapFull :: (StackM env m, HasEnvConfig env)
93+
=> NeedTargets
94+
-> BuildOptsCLI
95+
-> m ( Map PackageName SimpleTarget
96+
, MiniBuildPlan
97+
, [LocalPackage]
98+
, Set PackageName -- non-local targets
99+
, Map PackageName Version -- extra-deps from configuration and cli
100+
, SourceMap
101+
)
102+
loadSourceMapFull needTargets boptsCli = do
89103
bconfig <- asks getBuildConfig
90104
rawLocals <- getLocalPackageViews
91105
(mbp0, cliExtraDeps, targets) <- parseTargetsFromBuildOptsWith rawLocals needTargets boptsCli
@@ -159,7 +173,7 @@ loadSourceMap needTargets boptsCli = do
159173
in PSUpstream (mpiVersion mpi) Snap (mpiFlags mpi) (mpiGhcOptions mpi ++ configOpts) (mpiGitSHA1 mpi)
160174
] `Map.difference` Map.fromList (map (, ()) (HashSet.toList wiredInPackages))
161175

162-
return (targets, mbp, locals, nonLocalTargets, sourceMap)
176+
return (targets, mbp, locals, nonLocalTargets, extraDeps0, sourceMap)
163177

164178
-- | All flags for a local package
165179
getLocalFlags

src/Stack/Dot.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ createDependencyGraph :: (StackM env m, HasEnvConfig env, MonadBaseUnlift IO m)
115115
=> DotOpts
116116
-> m (Map PackageName (Set PackageName, DotPayload))
117117
createDependencyGraph dotOpts = do
118-
(_,_,locals,_,sourceMap) <- loadSourceMap NeedTargets defaultBuildOptsCLI
118+
(locals,sourceMap) <- loadSourceMap NeedTargets defaultBuildOptsCLI
119119
{ boptsCLITargets = dotTargets dotOpts
120120
, boptsCLIFlags = dotFlags dotOpts
121121
}

src/Stack/Ghci.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ instance Show GhciException where
132132
ghci :: (StackM r m, HasEnvConfig r, MonadBaseUnlift IO m) => GhciOpts -> m ()
133133
ghci opts@GhciOpts{..} = do
134134
-- Load source map, without explicit targets, to collect all info.
135-
(_, _, locals, _, sourceMap) <- loadSourceMap AllowNoTargets defaultBuildOptsCLI
135+
(locals, sourceMap) <- loadSourceMap AllowNoTargets defaultBuildOptsCLI
136136
{ boptsCLITargets = [] }
137137
-- Parse --main-is argument.
138138
mainIsTargets <- parseMainIsTargets ghciMainIs

src/Stack/PrettyPrint.hs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ module Stack.PrettyPrint
1717
, errorRed, goodGreen, shellMagenta
1818
, displayTargetPkgId, displayCurrentPkgId, displayErrorPkgId
1919
, displayMilliseconds
20+
-- * Formatting utils
21+
, bulletedList
2022
-- * Re-exports from "Text.PrettyPrint.Leijen.Extended"
2123
, Display(..), AnsiDoc, AnsiAnn(..), HasAnsiAnn(..), Doc
2224
, nest, line, linebreak, group, softline, softbreak
@@ -30,6 +32,7 @@ module Stack.PrettyPrint
3032
import Control.Exception.Lifted
3133
import Control.Monad.Logger
3234
import Control.Monad.Reader
35+
import Data.List (intersperse)
3336
import Data.Monoid
3437
import Data.String (fromString)
3538
import qualified Data.Text as T
@@ -135,3 +138,6 @@ instance Display (PackageName, NamedComponent) where
135138
displayMilliseconds :: Clock.TimeSpec -> AnsiDoc
136139
displayMilliseconds t = goodGreen $
137140
(fromString . show . (`div` 10^(6 :: Int)) . Clock.toNanoSecs) t <> "ms"
141+
142+
bulletedList :: [AnsiDoc] -> AnsiDoc
143+
bulletedList = mconcat . intersperse line . map ("*" <+>)

src/Stack/SDist.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ getCabalLbs :: (StackM env m, HasEnvConfig env) => PvpBounds -> FilePath -> m L.
132132
getCabalLbs pvpBounds fp = do
133133
bs <- liftIO $ S.readFile fp
134134
(_warnings, gpd) <- readPackageUnresolvedBS Nothing bs
135-
(_, _, _, _, sourceMap) <- loadSourceMap AllowNoTargets defaultBuildOptsCLI
135+
(_, sourceMap) <- loadSourceMap AllowNoTargets defaultBuildOptsCLI
136136
menv <- getMinimalEnvOverride
137137
(installedMap, _, _, _) <- getInstalled menv GetInstalledOpts
138138
{ getInstalledProfiling = False
@@ -214,7 +214,7 @@ getSDistFileList lp =
214214
let bopts = defaultBuildOpts
215215
let boptsCli = defaultBuildOptsCLI
216216
baseConfigOpts <- mkBaseConfigOpts boptsCli
217-
(_, _mbp, locals, _extraToBuild, _sourceMap) <- loadSourceMap NeedTargets boptsCli
217+
(locals, _) <- loadSourceMap NeedTargets boptsCli
218218
runInBase <- liftBaseWith $ \run -> return (void . run)
219219
withExecuteEnv menv bopts boptsCli baseConfigOpts locals
220220
[] [] [] -- provide empty list of globals. This is a hack around custom Setup.hs files

0 commit comments

Comments
 (0)