module GHC (
listGhcInstallation,
removeGhcMinorInstallation,
removeGhcVersionInstallation,
sizeGhcInstalls
)
where
import Control.Monad.Extra
import Data.List.Extra
import Data.Version.Extra
import SimpleCmd
import System.FilePath
import Directories (getStackSubdir, globDirs, switchToSystemDirUnder)
import qualified Remove
import Versions
getStackProgramsDir :: IO FilePath
getStackProgramsDir =
getStackSubdir "programs"
sizeGhcInstalls :: Bool -> IO ()
sizeGhcInstalls nothuman = do
programs <- getStackProgramsDir
cmd_ "du" $ ["-h" | not nothuman] ++ ["-s", programs]
setStackProgramsDir :: IO ()
setStackProgramsDir =
getStackProgramsDir >>= switchToSystemDirUnder
getGhcInstallDirs :: Maybe Version -> IO [FilePath]
getGhcInstallDirs mghcver = do
setStackProgramsDir
sortOn ghcInstallVersion <$> globDirs matchVersion
where
matchVersion =
case mghcver of
Nothing -> "*"
Just ver ->
"*-" ++ showVersion ver ++ if isMajorVersion ver then "*" else ""
ghcInstallVersion :: FilePath -> Version
ghcInstallVersion =
readVersion . takeWhileEnd (/= '-') . dropSuffix ".temp"
listGhcInstallation :: Maybe Version -> IO ()
listGhcInstallation mghcver = do
dirs <- getGhcInstallDirs mghcver
mapM_ putStrLn $ case mghcver of
Nothing -> dirs
Just ghcver -> filter ((== ghcver) . (if isMajorVersion ghcver then majorVersion else id) . ghcInstallVersion) dirs
removeGhcVersionInstallation :: Bool -> Version -> IO ()
removeGhcVersionInstallation dryrun ghcver = do
installs <- getGhcInstallDirs (Just ghcver)
case installs of
[] -> putStrLn $ "stack ghc compiler version " ++ showVersion ghcver ++ " not found"
[g] | not (isMajorVersion ghcver) -> doRemoveGhcVersion dryrun g
gs -> if isMajorVersion ghcver then do
Remove.prompt dryrun ("all stack ghc " ++ showVersion ghcver ++ " installations: ")
mapM_ (doRemoveGhcVersion dryrun) gs
else error' "more than one match found!!"
removeGhcMinorInstallation :: Bool -> Maybe Version -> IO ()
removeGhcMinorInstallation dryrun mghcver = do
dirs <- getGhcInstallDirs (majorVersion <$> mghcver)
case mghcver of
Nothing -> do
let majors = groupOn (majorVersion . ghcInstallVersion) dirs
forM_ majors $ \ minors ->
forM_ (init minors) $ doRemoveGhcVersion dryrun
Just ghcver -> do
let minors = filter ((< ghcver) . ghcInstallVersion) dirs
forM_ minors $ doRemoveGhcVersion dryrun
doRemoveGhcVersion :: Bool -> FilePath -> IO ()
doRemoveGhcVersion dryrun ghcinst = do
Remove.doRemoveDirectory dryrun ghcinst
Remove.removeFile dryrun (ghcinst <.> "installed")
putStrLn $ ghcinst ++ "compiler " ++ (if dryrun then "would be " else "") ++ "removed"