144 lines
3.4 KiB
Haskell
144 lines
3.4 KiB
Haskell
{-# LANGUAGE CPP #-}
|
|
{-# LANGUAGE DataKinds #-}
|
|
{-# LANGUAGE TypeApplications #-}
|
|
{-# LANGUAGE FlexibleContexts #-}
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# LANGUAGE TemplateHaskell #-}
|
|
{-# LANGUAGE QuasiQuotes #-}
|
|
{-# LANGUAGE DuplicateRecordFields #-}
|
|
{-# LANGUAGE RankNTypes #-}
|
|
|
|
module GHCup.OptParse.GC where
|
|
|
|
|
|
import GHCup
|
|
import GHCup.Errors
|
|
import GHCup.Types
|
|
import GHCup.Utils.Logger
|
|
import GHCup.Utils.String.QQ
|
|
|
|
#if !MIN_VERSION_base(4,13,0)
|
|
import Control.Monad.Fail ( MonadFail )
|
|
#endif
|
|
import Control.Monad.Reader
|
|
import Control.Monad.Trans.Resource
|
|
import Data.Functor
|
|
import Haskus.Utils.Variant.Excepts
|
|
import Options.Applicative hiding ( style )
|
|
import Prelude hiding ( appendFile )
|
|
import System.Exit
|
|
import Text.PrettyPrint.HughesPJClass ( prettyShow )
|
|
|
|
import qualified Data.Text as T
|
|
import Control.Exception.Safe (MonadMask)
|
|
|
|
|
|
|
|
|
|
|
|
---------------
|
|
--[ Options ]--
|
|
---------------
|
|
|
|
|
|
data GCOptions = GCOptions
|
|
{ gcOldGHC :: Bool
|
|
, gcProfilingLibs :: Bool
|
|
, gcShareDir :: Bool
|
|
, gcHLSNoGHC :: Bool
|
|
, gcCache :: Bool
|
|
, gcTmp :: Bool
|
|
}
|
|
|
|
|
|
|
|
---------------
|
|
--[ Parsers ]--
|
|
---------------
|
|
|
|
|
|
gcP :: Parser GCOptions
|
|
gcP =
|
|
GCOptions
|
|
<$>
|
|
switch
|
|
(short 'o' <> long "ghc-old" <> help "Remove GHC versions marked as 'old'")
|
|
<*>
|
|
switch
|
|
(short 'p' <> long "profiling-libs" <> help "Remove profiling libs of GHC versions")
|
|
<*>
|
|
switch
|
|
(short 's' <> long "share-dir" <> help "Remove GHC share directories (documentation)")
|
|
<*>
|
|
switch
|
|
(short 'h' <> long "hls-no-ghc" <> help "Remove HLS versions that don't have a corresponding installed GHC version")
|
|
<*>
|
|
switch
|
|
(short 'c' <> long "cache" <> help "GC the GHCup cache")
|
|
<*>
|
|
switch
|
|
(short 't' <> long "tmpdirs" <> help "Remove tmpdir leftovers")
|
|
|
|
|
|
|
|
--------------
|
|
--[ Footer ]--
|
|
--------------
|
|
|
|
|
|
gcFooter :: String
|
|
gcFooter = [s|Discussion:
|
|
Performs garbage collection. If no switches are specified, does nothing.|]
|
|
|
|
|
|
|
|
|
|
---------------------------
|
|
--[ Effect interpreters ]--
|
|
---------------------------
|
|
|
|
|
|
type GCEffects = '[ NotInstalled ]
|
|
|
|
|
|
runGC :: MonadUnliftIO m
|
|
=> (ReaderT AppState m (VEither GCEffects a) -> m (VEither GCEffects a))
|
|
-> Excepts GCEffects (ResourceT (ReaderT AppState m)) a
|
|
-> m (VEither GCEffects a)
|
|
runGC runAppState =
|
|
runAppState
|
|
. runResourceT
|
|
. runE
|
|
@GCEffects
|
|
|
|
|
|
|
|
------------------
|
|
--[ Entrypoint ]--
|
|
------------------
|
|
|
|
|
|
|
|
gc :: ( Monad m
|
|
, MonadMask m
|
|
, MonadUnliftIO m
|
|
, MonadFail m
|
|
)
|
|
=> GCOptions
|
|
-> (forall a. ReaderT AppState m (VEither GCEffects a) -> m (VEither GCEffects a))
|
|
-> (ReaderT LeanAppState m () -> m ())
|
|
-> m ExitCode
|
|
gc GCOptions{..} runAppState runLogger = runGC runAppState (do
|
|
when gcOldGHC rmOldGHC
|
|
lift $ when gcProfilingLibs rmProfilingLibs
|
|
lift $ when gcShareDir rmShareDir
|
|
lift $ when gcHLSNoGHC rmHLSNoGHC
|
|
lift $ when gcCache rmCache
|
|
lift $ when gcTmp rmTmp
|
|
) >>= \case
|
|
VRight _ -> do
|
|
pure ExitSuccess
|
|
VLeft e -> do
|
|
runLogger $ logError $ T.pack $ prettyShow e
|
|
pure $ ExitFailure 27
|