stack-0.1.1.0: src/Stack/Upgrade.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
module Stack.Upgrade (upgrade) where
import Control.Monad.Catch
import Control.Monad.IO.Class
import Control.Monad.Logger
import Control.Monad.Reader
import Control.Monad.Trans.Control
import qualified Data.Map as Map
import qualified Data.Set as Set
import Network.HTTP.Client.Conduit (HasHttpManager, getHttpManager)
import Path
import Stack.Build
import Stack.Build.Types
import Stack.Config
import Stack.Fetch
import Stack.PackageIndex
import Stack.Setup
import Stack.Types
import Stack.Types.Internal
import Stack.Types.StackT
import System.IO.Temp (withSystemTempDirectory)
import System.Process.Run
upgrade :: (MonadIO m, MonadMask m, MonadReader env m, HasConfig env, HasHttpManager env, MonadLogger m, HasTerminal env, HasLogLevel env, MonadBaseControl IO m)
=> Bool -- ^ use Git?
-> Maybe Resolver
-> m ()
upgrade fromGit mresolver = withSystemTempDirectory "stack-upgrade" $ \tmp' -> do
menv <- getMinimalEnvOverride
tmp <- parseAbsDir tmp'
dir <-
if fromGit
then do
$logInfo "Cloning stack"
runIn tmp "git" menv
[ "clone"
, "git@github.com:commercialhaskell/stack" -- TODO allow to be configured
, "stack"
, "--depth"
, "1"
]
Nothing
return $ tmp </> $(mkRelDir "stack")
else do
updateAllIndices menv
caches <- getPackageCaches menv
let latest = Map.fromListWith max
$ map toTuple
$ Map.keys caches
case Map.lookup $(mkPackageName "stack") latest of
Nothing -> error "No stack found in package indices"
Just version -> do
let ident = PackageIdentifier $(mkPackageName "stack") version
paths <- unpackPackageIdents menv tmp Nothing $ Set.singleton ident
case Map.lookup ident paths of
Nothing -> error "Stack.Upgrade.upgrade: invariant violated, unpacked directory not found"
Just path -> return path
manager <- asks getHttpManager
logLevel <- asks getLogLevel
terminal <- asks getTerminal
configMonoid <- asks $ configConfigMonoid . getConfig
liftIO $ do
bconfig <- runStackLoggingT manager logLevel terminal $ do
lc <- loadConfig
configMonoid
(Just $ dir </> $(mkRelFile "stack.yaml"))
lcLoadBuildConfig lc mresolver ThrowException
envConfig1 <- runStackT manager logLevel bconfig terminal setupEnv
runStackT manager logLevel envConfig1 terminal $ build BuildOpts
{ boptsTargets = ["stack"]
, boptsLibProfile = False
, boptsExeProfile = False
, boptsEnableOptimizations = Nothing
, boptsHaddock = False
, boptsHaddockDeps = Nothing
, boptsFinalAction = DoNothing
, boptsDryrun = False
, boptsGhcOptions = []
, boptsFlags = Map.empty
, boptsInstallExes = True
, boptsPreFetch = False
, boptsTestArgs = []
, boptsOnlySnapshot = False
, boptsCoverage = False
}