@@ -30,11 +30,13 @@ module Stack.Config
3030 ,defaultConfigYaml
3131 ,getProjectConfig
3232 ,withBuildConfig
33+ ,withNewLogFunc
3334 ) where
3435
3536import Control.Monad.Extra (firstJustM )
3637import Stack.Prelude
3738import Pantry.Internal.AesonExtended
39+ import Data.Array.IArray ((!) , (//) )
3840import qualified Data.ByteString as S
3941import Data.ByteString.Builder (byteString )
4042import Data.Coerce (coerce )
@@ -74,13 +76,16 @@ import Stack.Types.Nix
7476import Stack.Types.Resolver
7577import Stack.Types.SourceMap
7678import Stack.Types.Version
77- import System.Console.ANSI (hSupportsANSIWithoutEmulation )
79+ import System.Console.ANSI (hSupportsANSIWithoutEmulation , setSGRCode )
7880import System.Environment
7981import System.Info.ShortPathName (getShortPathName )
8082import System.PosixCompat.Files (fileOwner , getFileStatus )
8183import System.PosixCompat.User (getEffectiveUserID )
8284import RIO.List (unzip )
83- import RIO.PrettyPrint (stylesUpdateL , useColorL )
85+ import RIO.PrettyPrint (Style (Highlight , Secondary ),
86+ logLevelToStyle , stylesUpdateL , useColorL )
87+ import RIO.PrettyPrint.StylesUpdate (StylesUpdate (.. ))
88+ import RIO.PrettyPrint.DefaultStyles (defaultStyles )
8489import RIO.Process
8590import RIO.Time (toGregorian )
8691
@@ -354,10 +359,12 @@ configFromConfigMonoid
354359 ColorNever -> False
355360 ColorAlways -> True
356361 ColorAuto -> useAnsi
357- configRunner = configRunner'
358- & processContextL .~ origEnv
359- & stylesUpdateL .~ stylesUpdate'
360- & useColorL .~ fromMaybe useColor' mUseColor
362+ useColor'' = fromMaybe useColor' mUseColor
363+ configRunner'' = configRunner'
364+ & processContextL .~ origEnv
365+ & stylesUpdateL .~ stylesUpdate'
366+ & useColorL .~ useColor''
367+ go = runnerGlobalOpts configRunner'
361368
362369 hsc <-
363370 case getFirst configMonoidPackageIndices of
@@ -394,17 +401,47 @@ configFromConfigMonoid
394401
395402 let configStackDeveloperMode = fromFirst stackDeveloperModeDefault configMonoidStackDeveloperMode
396403
397- withPantryConfig
398- pantryRoot
399- hsc
400- (maybe HpackBundled HpackCommand $ getFirst configMonoidOverrideHpack)
401- clConnectionCount
402- (fromFirst defaultCasaRepoPrefix configMonoidCasaRepoPrefix)
403- defaultCasaMaxPerRequest
404- snapLoc
405- (\ configPantryConfig -> initUserStorage
406- (configStackRoot </> relFileStorage)
407- (\ configUserStorage -> inner Config {.. }))
404+ withNewLogFunc go useColor'' stylesUpdate' $ \ logFunc -> do
405+ let configRunner = configRunner'' & logFuncL .~ logFunc
406+ withPantryConfig
407+ pantryRoot
408+ hsc
409+ (maybe HpackBundled HpackCommand $ getFirst configMonoidOverrideHpack)
410+ clConnectionCount
411+ (fromFirst defaultCasaRepoPrefix configMonoidCasaRepoPrefix)
412+ defaultCasaMaxPerRequest
413+ snapLoc
414+ (\ configPantryConfig -> initUserStorage
415+ (configStackRoot </> relFileStorage)
416+ (\ configUserStorage -> inner Config {.. }))
417+
418+ -- | Runs the provided action with a new 'LogFunc', given a 'StylesUpdate'.
419+ withNewLogFunc :: MonadUnliftIO m
420+ => GlobalOpts
421+ -> Bool -- ^ Use color
422+ -> StylesUpdate
423+ -> (LogFunc -> m a )
424+ -> m a
425+ withNewLogFunc go useColor (StylesUpdate update) inner = do
426+ logOptions0 <- logOptionsHandle stderr False
427+ let logOptions
428+ = setLogUseColor useColor
429+ $ setLogLevelColors logLevelColors
430+ $ setLogSecondaryColor secondaryColor
431+ $ setLogAccentColors (const highlightColor)
432+ $ setLogUseTime (globalTimeInLog go)
433+ $ setLogMinLevel (globalLogLevel go)
434+ $ setLogVerboseFormat (globalLogLevel go <= LevelDebug )
435+ $ setLogTerminal (globalTerminal go)
436+ logOptions0
437+ withLogFunc logOptions inner
438+ where
439+ styles = defaultStyles // update
440+ logLevelColors :: LogLevel -> Utf8Builder
441+ logLevelColors level =
442+ fromString $ setSGRCode $ snd $ styles ! logLevelToStyle level
443+ secondaryColor = fromString $ setSGRCode $ snd $ styles ! Secondary
444+ highlightColor = fromString $ setSGRCode $ snd $ styles ! Highlight
408445
409446-- | Get the default location of the local programs directory.
410447getDefaultLocalProgramsBase :: MonadThrow m
0 commit comments