Skip to content

Commit 4cea4e8

Browse files
committed
Introduce EnvConfig and HasEnvConfig (#289)
@snoyberg
1 parent fe06c3e commit 4cea4e8

File tree

9 files changed

+51
-34
lines changed

9 files changed

+51
-34
lines changed

src/Stack/Build.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ import System.Posix.Files (createSymbolicLink,removeLink)
4747
#endif
4848
--}
4949

50-
type M env m = (MonadIO m,MonadReader env m,HasHttpManager env,HasBuildConfig env,MonadLogger m,MonadBaseControl IO m,MonadCatch m,MonadMask m,HasLogLevel env)
50+
type M env m = (MonadIO m,MonadReader env m,HasHttpManager env,HasBuildConfig env,MonadLogger m,MonadBaseControl IO m,MonadCatch m,MonadMask m,HasLogLevel env,HasEnvConfig env)
5151

5252
-- | Build
5353
build :: M env m => BuildOpts -> m ()

src/Stack/Build/Cache.hs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,11 @@ module Stack.Build.Cache
1818
) where
1919

2020
import Control.Exception.Enclosed (handleIO, tryIO)
21-
2221
import Control.Monad.Catch (MonadCatch, MonadThrow, catch,
2322
throwM)
2423
import Control.Monad.IO.Class
2524
import Control.Monad.Logger (MonadLogger)
2625
import Control.Monad.Reader
27-
2826
import Data.Binary (Binary)
2927
import qualified Data.Binary as Binary
3028
import Data.ByteString (ByteString)
@@ -37,7 +35,6 @@ import Data.Set (Set)
3735
import qualified Data.Set as Set
3836
import Data.Text (Text)
3937
import Data.Text.Encoding (encodeUtf8)
40-
4138
import GHC.Generics (Generic)
4239
import Path
4340
import Path.IO
@@ -87,17 +84,17 @@ data BuildCache = BuildCache
8784
instance Binary BuildCache
8885

8986
-- | Try to read the dirtiness cache for the given package directory.
90-
tryGetBuildCache :: (MonadIO m, MonadReader env m, HasConfig env, MonadThrow m, MonadLogger m, HasBuildConfig env)
87+
tryGetBuildCache :: (MonadIO m, MonadReader env m, HasConfig env, MonadThrow m, MonadLogger m, HasEnvConfig env)
9188
=> Path Abs Dir -> m (Maybe BuildCache)
9289
tryGetBuildCache = tryGetCache buildCacheFile
9390

9491
-- | Try to read the dirtiness cache for the given package directory.
95-
tryGetConfigCache :: (MonadIO m, MonadReader env m, HasConfig env, MonadThrow m, MonadLogger m, HasBuildConfig env)
92+
tryGetConfigCache :: (MonadIO m, MonadReader env m, HasConfig env, MonadThrow m, MonadLogger m, HasEnvConfig env)
9693
=> Path Abs Dir -> m (Maybe ConfigCache)
9794
tryGetConfigCache = tryGetCache configCacheFile
9895

9996
-- | Try to load a cache.
100-
tryGetCache :: (MonadIO m, Binary a, MonadReader env m, HasConfig env, MonadThrow m, MonadLogger m, HasBuildConfig env)
97+
tryGetCache :: (MonadIO m, Binary a, MonadReader env m, HasConfig env, MonadThrow m, MonadLogger m, HasEnvConfig env)
10198
=> (Path Abs Dir -> m (Path Abs File))
10299
-> Path Abs Dir
103100
-> m (Maybe a)
@@ -114,7 +111,7 @@ tryGetCache get' dir = do
114111
where thd (_,_,x) = x
115112

116113
-- | Write the dirtiness cache for this package's files.
117-
writeBuildCache :: (MonadIO m, MonadReader env m, HasConfig env, MonadThrow m, MonadLogger m, HasBuildConfig env)
114+
writeBuildCache :: (MonadIO m, MonadReader env m, HasConfig env, MonadThrow m, MonadLogger m, HasEnvConfig env)
118115
=> Path Abs Dir -> Map FilePath ModTime -> m ()
119116
writeBuildCache dir times =
120117
writeCache
@@ -125,7 +122,7 @@ writeBuildCache dir times =
125122
})
126123

127124
-- | Write the dirtiness cache for this package's configuration.
128-
writeConfigCache :: (MonadIO m, MonadReader env m, HasConfig env, MonadThrow m, MonadLogger m, HasBuildConfig env)
125+
writeConfigCache :: (MonadIO m, MonadReader env m, HasConfig env, MonadThrow m, MonadLogger m, HasEnvConfig env)
129126
=> Path Abs Dir
130127
-> [Text]
131128
-> Set GhcPkgId -- ^ dependencies
@@ -148,7 +145,7 @@ writeConfigCache dir opts deps cabalfp ttype =
148145
cache
149146

150147
-- | Delete the caches for the project.
151-
deleteCaches :: (MonadIO m, MonadReader env m, HasConfig env, MonadLogger m, MonadThrow m, HasBuildConfig env)
148+
deleteCaches :: (MonadIO m, MonadReader env m, HasConfig env, MonadLogger m, MonadThrow m, HasEnvConfig env)
152149
=> Path Abs Dir -> m ()
153150
deleteCaches dir = do
154151
bfp <- buildCacheFile dir
@@ -157,7 +154,7 @@ deleteCaches dir = do
157154
removeFileIfExists cfp
158155

159156
-- | Write to a cache.
160-
writeCache :: (Binary a, MonadIO m, MonadLogger m, MonadThrow m, MonadReader env m, HasConfig env, HasBuildConfig env)
157+
writeCache :: (Binary a, MonadIO m, MonadLogger m, MonadThrow m, MonadReader env m, HasConfig env, HasEnvConfig env)
161158
=> Path Abs Dir
162159
-> (Path Abs Dir -> m (Path Abs File))
163160
-> a

src/Stack/Build/Execute.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import System.IO.Temp (withSystemTempDirectory)
6767
import System.Process.Internals (createProcess_)
6868
import System.Process.Read
6969

70-
type M env m = (MonadIO m,MonadReader env m,HasHttpManager env,HasBuildConfig env,MonadLogger m,MonadBaseControl IO m,MonadCatch m,MonadMask m,HasLogLevel env)
70+
type M env m = (MonadIO m,MonadReader env m,HasHttpManager env,HasBuildConfig env,MonadLogger m,MonadBaseControl IO m,MonadCatch m,MonadMask m,HasLogLevel env,HasEnvConfig env)
7171

7272
printPlan :: M env m => Plan -> m ()
7373
printPlan plan = do
@@ -155,7 +155,7 @@ executePlan menv bopts baseConfigOpts locals plan = do
155155
idMap <- liftIO $ newTVarIO M.empty
156156
let setupHs = tmpdir' </> $(mkRelFile "Setup.hs")
157157
liftIO $ writeFile (toFilePath setupHs) "import Distribution.Simple\nmain = defaultMain"
158-
cabalPkgVer <- asks (bcCabalVersion . getBuildConfig)
158+
cabalPkgVer <- asks (envConfigCabalVersion . getEnvConfig)
159159
executePlan' plan ExecuteEnv
160160
{ eeEnvOverride = menv
161161
, eeBuildOpts = bopts

src/Stack/Build/Source.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ instance PackageInstallInfo PackageSource where
5252
piiLocation (PSLocal _) = Local
5353
piiLocation (PSUpstream _ loc _) = loc
5454

55-
loadSourceMap :: (MonadIO m, MonadCatch m, MonadReader env m, HasBuildConfig env, MonadBaseControl IO m, HasHttpManager env, MonadLogger m)
55+
loadSourceMap :: (MonadIO m, MonadCatch m, MonadReader env m, HasBuildConfig env, MonadBaseControl IO m, HasHttpManager env, MonadLogger m, HasEnvConfig env)
5656
=> BuildOpts
5757
-> m ( MiniBuildPlan
5858
, [LocalPackage]
@@ -127,7 +127,7 @@ loadSourceMap bopts = do
127127
return (mbp, locals, nonLocalTargets, sourceMap)
128128

129129
-- | Returns locals and extra target packages
130-
loadLocals :: (MonadReader env m, HasBuildConfig env, MonadIO m, MonadLogger m, MonadThrow m, MonadCatch m)
130+
loadLocals :: (MonadReader env m, HasBuildConfig env, MonadIO m, MonadLogger m, MonadThrow m, MonadCatch m,HasEnvConfig env)
131131
=> BuildOpts
132132
-> Map PackageName Version
133133
-> m ([LocalPackage], Set PackageName, Set PackageIdentifier)

src/Stack/Config.hs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ import Stack.Types.Config
6666
import Stack.Constants
6767
import qualified Stack.Docker as Docker
6868
import Stack.Package
69-
import Stack.GhcPkg (getCabalPkgVer)
7069
import Stack.Types
7170
import System.Directory
7271
import System.Environment
@@ -359,8 +358,6 @@ loadBuildConfig menv mproject config noConfigStrat = do
359358
packages' <- mapM (resolvePackageEntry menv root) (projectPackages project)
360359
let packages = Map.fromList $ concat packages'
361360

362-
cabalVer <- getCabalPkgVer menv
363-
364361
return BuildConfig
365362
{ bcConfig = config
366363
, bcResolver = projectResolver project
@@ -370,7 +367,6 @@ loadBuildConfig menv mproject config noConfigStrat = do
370367
, bcRoot = root
371368
, bcStackYaml = stackYamlFP
372369
, bcFlags = projectFlags project
373-
, bcCabalVersion = cabalVer
374370
}
375371

376372
-- | Resolve a PackageEntry into a list of paths, downloading and cloning as

src/Stack/Constants.hs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,30 @@ haskellFileExts :: [Text]
4444
haskellFileExts = ["hs","hsc","lhs"]
4545

4646
-- | The filename used for completed build indicators.
47-
builtFileFromDir :: (MonadThrow m, MonadReader env m, HasPlatform env,HasBuildConfig env)
47+
builtFileFromDir :: (MonadThrow m, MonadReader env m, HasPlatform env,HasEnvConfig env)
4848
=> Path Abs Dir
4949
-> m (Path Abs File)
5050
builtFileFromDir fp = do
5151
dist <- distDirFromDir fp
5252
return (dist </> $(mkRelFile "stack.gen"))
5353

5454
-- | The filename used for completed configure indicators.
55-
configuredFileFromDir :: (MonadThrow m, MonadReader env m, HasPlatform env,HasBuildConfig env)
55+
configuredFileFromDir :: (MonadThrow m, MonadReader env m, HasPlatform env,HasEnvConfig env)
5656
=> Path Abs Dir
5757
-> m (Path Abs File)
5858
configuredFileFromDir fp = do
5959
dist <- distDirFromDir fp
6060
return (dist </> $(mkRelFile "setup-config"))
6161

6262
-- | The filename used for completed build indicators.
63-
builtConfigFileFromDir :: (MonadThrow m, MonadReader env m, HasPlatform env,HasBuildConfig env)
63+
builtConfigFileFromDir :: (MonadThrow m, MonadReader env m, HasPlatform env,HasEnvConfig env)
6464
=> Path Abs Dir
6565
-> m (Path Abs File)
6666
builtConfigFileFromDir fp =
6767
liftM (fp </>) builtConfigRelativeFile
6868

6969
-- | Relative location of completed build indicators.
70-
builtConfigRelativeFile :: (MonadThrow m, MonadReader env m, HasPlatform env,HasBuildConfig env)
70+
builtConfigRelativeFile :: (MonadThrow m, MonadReader env m, HasPlatform env,HasEnvConfig env)
7171
=> m (Path Rel File)
7272
builtConfigRelativeFile = do
7373
dist <- distRelativeDir
@@ -96,7 +96,7 @@ userDocsDir :: Config -> Path Abs Dir
9696
userDocsDir config = configStackRoot config </> $(mkRelDir "doc/")
9797

9898
-- | The filename used for dirtiness check of source files.
99-
buildCacheFile :: (MonadThrow m, MonadReader env m, HasPlatform env,HasBuildConfig env)
99+
buildCacheFile :: (MonadThrow m, MonadReader env m, HasPlatform env,HasEnvConfig env)
100100
=> Path Abs Dir -- ^ Package directory.
101101
-> m (Path Abs File)
102102
buildCacheFile dir = do
@@ -105,7 +105,7 @@ buildCacheFile dir = do
105105
(distDirFromDir dir)
106106

107107
-- | The filename used for dirtiness check of config.
108-
configCacheFile :: (MonadThrow m, MonadReader env m, HasPlatform env,HasBuildConfig env)
108+
configCacheFile :: (MonadThrow m, MonadReader env m, HasPlatform env,HasEnvConfig env)
109109
=> Path Abs Dir -- ^ Package directory.
110110
-> m (Path Abs File)
111111
configCacheFile dir = do
@@ -114,17 +114,17 @@ configCacheFile dir = do
114114
(distDirFromDir dir)
115115

116116
-- | Package's build artifacts directory.
117-
distDirFromDir :: (MonadThrow m, MonadReader env m, HasPlatform env, HasBuildConfig env)
117+
distDirFromDir :: (MonadThrow m, MonadReader env m, HasPlatform env, HasEnvConfig env)
118118
=> Path Abs Dir
119119
-> m (Path Abs Dir)
120120
distDirFromDir fp =
121121
liftM (fp </>) distRelativeDir
122122

123123
-- | Relative location of build artifacts.
124-
distRelativeDir :: (MonadThrow m, MonadReader env m, HasPlatform env, HasBuildConfig env)
124+
distRelativeDir :: (MonadThrow m, MonadReader env m, HasPlatform env, HasEnvConfig env)
125125
=> m (Path Rel Dir)
126126
distRelativeDir = do
127-
cabalPkgVer <- asks (bcCabalVersion . getBuildConfig)
127+
cabalPkgVer <- asks (envConfigCabalVersion . getEnvConfig)
128128
platform <- platformRelDir
129129
cabal <-
130130
parseRelDir $

src/Stack/Types/Config.hs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,22 @@ data BuildConfig = BuildConfig
181181
-- different from bcRoot </> "stack.yaml"
182182
, bcFlags :: !(Map PackageName (Map FlagName Bool))
183183
-- ^ Per-package flag overrides
184-
, bcCabalVersion :: !Version
185-
-- ^ Cabal version used.
186184
}
187185

186+
-- | Configuration after the environment has been setup.
187+
data EnvConfig = EnvConfig
188+
{envConfigBuildConfig :: !BuildConfig
189+
,envConfigCabalVersion :: !Version}
190+
instance HasBuildConfig EnvConfig where
191+
getBuildConfig = envConfigBuildConfig
192+
instance HasConfig EnvConfig
193+
instance HasPlatform EnvConfig
194+
instance HasStackRoot EnvConfig
195+
class HasEnvConfig r where
196+
getEnvConfig :: r -> EnvConfig
197+
instance HasEnvConfig EnvConfig where
198+
getEnvConfig = id
199+
188200
-- | Value returned by 'Stack.Config.loadConfig'.
189201
data LoadConfig m = LoadConfig
190202
{ lcConfig :: !Config

src/Stack/Types/Internal.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ instance HasConfig config => HasConfig (Env config) where
2323
getConfig = getConfig . envConfig
2424
instance HasBuildConfig config => HasBuildConfig (Env config) where
2525
getBuildConfig = getBuildConfig . envConfig
26+
instance HasEnvConfig config => HasEnvConfig (Env config) where
27+
getEnvConfig = getEnvConfig . envConfig
2628

2729
instance HasHttpManager (Env config) where
2830
getHttpManager = envManager

src/main/Main.hs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import Stack.Config
3737
import Stack.Constants
3838
import qualified Stack.Docker as Docker
3939
import Stack.Fetch
40-
import Stack.GhcPkg (envHelper)
40+
import Stack.GhcPkg (envHelper,getCabalPkgVer)
4141
import qualified Stack.PackageIndex
4242
import Stack.Path
4343
import Stack.Setup
@@ -258,16 +258,26 @@ setupCmd SetupCmdOpts{..} go@GlobalOpts{..} = do
258258

259259
withBuildConfig :: GlobalOpts
260260
-> NoBuildConfigStrategy
261-
-> StackT BuildConfig IO ()
261+
-> StackT EnvConfig IO ()
262262
-> IO ()
263263
withBuildConfig go@GlobalOpts{..} strat inner = do
264264
(manager, lc) <- loadConfigWithOpts go
265265
runStackLoggingT manager globalLogLevel $
266266
Docker.rerunWithOptionalContainer (lcConfig lc) (lcProjectRoot lc) $ do
267267
bconfig1 <- runStackLoggingT manager globalLogLevel $
268268
lcLoadBuildConfig lc strat
269-
bconfig2 <- runStackT manager globalLogLevel bconfig1 setupEnv
270-
runStackT manager globalLogLevel bconfig2 inner
269+
(bconfig2,cabalVer) <-
270+
runStackT
271+
manager globalLogLevel bconfig1
272+
(do cfg <- setupEnv
273+
menv <- getMinimalEnvOverride
274+
cabalVer <- getCabalPkgVer menv
275+
return (cfg,cabalVer))
276+
runStackT
277+
manager
278+
globalLogLevel
279+
(EnvConfig bconfig2 cabalVer)
280+
inner
271281

272282
cleanCmd :: () -> GlobalOpts -> IO ()
273283
cleanCmd () go = withBuildConfig go ThrowException clean

0 commit comments

Comments
 (0)