Lala
This commit is contained in:
@@ -8,6 +8,7 @@ import GHCup
|
||||
import GHCup.Download
|
||||
import GHCup.Types
|
||||
import GHCup.Utils.Dirs
|
||||
import GHCup.Utils.File
|
||||
import GHCup.Utils.Logger
|
||||
import GHCup.Utils.Version.QQ
|
||||
|
||||
@@ -192,7 +193,7 @@ validateTarballs dls = do
|
||||
where
|
||||
downloadAll dli = do
|
||||
dirs <- liftIO getDirs
|
||||
let settings = Settings True False Never Curl False dirs
|
||||
let settings = Settings True False Never Curl False dirs defExecCb
|
||||
let runLogger = myLoggerT LoggerConfig { lcPrintDebug = True
|
||||
, colorOutter = B.hPut stderr
|
||||
, rawOutter = (\_ -> pure ())
|
||||
|
||||
@@ -14,8 +14,10 @@ import GHCup.Types
|
||||
import GHCup.Utils
|
||||
import GHCup.Utils.File
|
||||
import GHCup.Utils.Logger
|
||||
import GHCup.Utils.Prelude
|
||||
|
||||
import Brick
|
||||
import Brick.BChan
|
||||
import Brick.Widgets.Border
|
||||
import Brick.Widgets.Border.Style
|
||||
import Brick.Widgets.Center
|
||||
@@ -23,11 +25,14 @@ import Brick.Widgets.List
|
||||
#if !defined(TAR)
|
||||
import Codec.Archive
|
||||
#endif
|
||||
import Control.Concurrent
|
||||
import Control.Concurrent.MVar
|
||||
import Control.Exception.Safe
|
||||
import Control.Monad.Logger
|
||||
import Control.Monad.Reader
|
||||
import Control.Monad.Trans.Resource
|
||||
import Data.Bool
|
||||
import Data.ByteString ( ByteString )
|
||||
import Data.Functor
|
||||
import Data.List
|
||||
import Data.Maybe
|
||||
@@ -37,22 +42,40 @@ import Data.String.Interpolate
|
||||
import Data.Vector ( Vector )
|
||||
import Data.Versions hiding ( str )
|
||||
import Haskus.Utils.Variant.Excepts
|
||||
import Prelude hiding ( appendFile )
|
||||
import HPath
|
||||
import HPath.IO hiding ( hideError )
|
||||
import Prelude hiding ( abs, appendFile, writeFile )
|
||||
import System.Exit
|
||||
import System.IO.Unsafe
|
||||
import System.Posix.Types
|
||||
import URI.ByteString
|
||||
|
||||
import qualified Data.Text as T
|
||||
import qualified Graphics.Vty as Vty
|
||||
import qualified Data.Vector as V
|
||||
import qualified "unix-bytestring" System.Posix.IO.ByteString
|
||||
as SPIB
|
||||
|
||||
data SubProcess = SubProcess {
|
||||
procName :: String
|
||||
, exited :: Maybe (Either ProcessError ())
|
||||
, procId :: Maybe ProcessID
|
||||
, logLine :: Maybe ByteString
|
||||
}
|
||||
|
||||
data AppState = AppState {
|
||||
lr :: LR
|
||||
, dls :: GHCupDownloads
|
||||
lr :: LR
|
||||
, dls :: GHCupDownloads
|
||||
, pfreq :: PlatformRequest
|
||||
|
||||
, mproc :: Maybe SubProcess
|
||||
}
|
||||
|
||||
data MyAppEvent = LogLine ByteString
|
||||
| StartProc String
|
||||
| GotProcId ProcessID
|
||||
| EndProc (Either ProcessError ())
|
||||
|
||||
type LR = GenericList String Vector ListResult
|
||||
|
||||
|
||||
@@ -68,21 +91,28 @@ keyHandlers =
|
||||
|
||||
ui :: AppState -> Widget String
|
||||
ui AppState {..} =
|
||||
( padBottom Max
|
||||
$ ( withBorderStyle unicode
|
||||
$ borderWithLabel (str "GHCup")
|
||||
$ (center $ renderList renderItem True lr)
|
||||
)
|
||||
)
|
||||
<=> ( withAttr "help"
|
||||
. txtWrap
|
||||
. T.pack
|
||||
. foldr1 (\x y -> x <> " " <> y)
|
||||
. (++ ["↑↓:Navigation"])
|
||||
$ (fmap (\(c, s, _) -> (c : ':' : s)) keyHandlers)
|
||||
)
|
||||
case mproc of
|
||||
Just _ -> logDialog
|
||||
Nothing ->
|
||||
( padBottom Max
|
||||
$ ( withBorderStyle unicode
|
||||
$ borderWithLabel (str "GHCup")
|
||||
$ (center $ renderList renderItem True lr)
|
||||
)
|
||||
)
|
||||
<=> ( withAttr "help"
|
||||
. txtWrap
|
||||
. T.pack
|
||||
. foldr1 (\x y -> x <> " " <> y)
|
||||
. (++ ["↑↓:Navigation"])
|
||||
$ (fmap (\(c, s, _) -> (c : ':' : s)) keyHandlers)
|
||||
)
|
||||
|
||||
where
|
||||
logDialog = case mproc of
|
||||
Nothing -> emptyWidget
|
||||
Just (SubProcess name Nothing _ (Just logLine)) -> centerLayer . txtWrap . decUTF8Safe $ logLine
|
||||
Just (SubProcess name Nothing _ (Just logLine)) -> centerLayer . txtWrap $ ""
|
||||
renderItem b ListResult {..} =
|
||||
let marks = if
|
||||
| lSet -> (withAttr "set" $ str "✔✔")
|
||||
@@ -121,7 +151,7 @@ minHSize :: Int -> Widget n -> Widget n
|
||||
minHSize s' = hLimit s' . vLimit 1 . (<+> fill ' ')
|
||||
|
||||
|
||||
app :: App AppState e String
|
||||
app :: App AppState MyAppEvent String
|
||||
app = App { appDraw = \st -> [ui st]
|
||||
, appHandleEvent = eventHandler
|
||||
, appStartEvent = return
|
||||
@@ -152,19 +182,33 @@ dimAttributes = attrMap
|
||||
|
||||
|
||||
|
||||
eventHandler :: AppState -> BrickEvent n e -> EventM n (Next AppState)
|
||||
eventHandler :: AppState -> BrickEvent n MyAppEvent -> EventM n (Next AppState)
|
||||
eventHandler st (VtyEvent (Vty.EvResize _ _)) = continue st
|
||||
eventHandler st (VtyEvent (Vty.EvKey (Vty.KChar 'q') _)) = halt st
|
||||
eventHandler st (VtyEvent (Vty.EvKey Vty.KEsc _)) = halt st
|
||||
eventHandler AppState {..} (VtyEvent (Vty.EvKey (Vty.KUp) _)) =
|
||||
continue (AppState (listMoveUp lr) dls pfreq)
|
||||
continue (AppState (listMoveUp lr) dls pfreq mproc)
|
||||
eventHandler AppState {..} (VtyEvent (Vty.EvKey (Vty.KDown) _)) =
|
||||
continue (AppState (listMoveDown lr) dls pfreq)
|
||||
continue (AppState (listMoveDown lr) dls pfreq mproc)
|
||||
eventHandler as (VtyEvent (Vty.EvKey (Vty.KChar c) _)) =
|
||||
case find (\(c', _, _) -> c' == c) keyHandlers of
|
||||
Nothing -> continue as
|
||||
Just (_, _, handler) -> handler as
|
||||
eventHandler st _ = continue st
|
||||
eventHandler st (AppEvent (StartProc str')) = continue st
|
||||
{ mproc = Just SubProcess { procName = str'
|
||||
, exited = Nothing
|
||||
, procId = Nothing
|
||||
, logLine = Nothing
|
||||
}
|
||||
}
|
||||
eventHandler st@AppState { mproc = Just sp } (AppEvent (GotProcId pid)) =
|
||||
continue st { mproc = Just sp { procId = Just pid } }
|
||||
eventHandler st@AppState { mproc = Just sp } (AppEvent (EndProc exited)) =
|
||||
continue st { mproc = Just sp { exited = Just exited, procId = Nothing } }
|
||||
eventHandler st@AppState { mproc = Just sp } (AppEvent (LogLine bs)) =
|
||||
continue st { mproc = Just sp { logLine = Just bs } }
|
||||
eventHandler st (AppEvent _) = error "noes" -- TODO
|
||||
eventHandler st _ = continue st
|
||||
|
||||
|
||||
-- | Suspend the current UI and run an IO action in terminal. If the
|
||||
@@ -174,19 +218,18 @@ withIOAction :: (AppState -> (Int, ListResult) -> IO (Either String a))
|
||||
-> EventM n (Next AppState)
|
||||
withIOAction action as = case listSelectedElement (lr as) of
|
||||
Nothing -> continue as
|
||||
Just (ix, e) -> suspendAndResume $ do
|
||||
action as (ix, e) >>= \case
|
||||
Left err -> putStrLn $ ("Error: " <> err)
|
||||
Right _ -> putStrLn "Success"
|
||||
apps <- (fmap . fmap)
|
||||
(\AppState {..} -> AppState { lr = listMoveTo ix lr, .. })
|
||||
$ getAppState Nothing (pfreq as)
|
||||
case apps of
|
||||
Right nas -> do
|
||||
putStrLn "Press enter to continue"
|
||||
_ <- getLine
|
||||
pure nas
|
||||
Left err -> throwIO $ userError err
|
||||
Just (ix, e) -> do
|
||||
liftIO $ forkIO $ void $ action as (ix, e)
|
||||
continue as
|
||||
-- apps <- (fmap . fmap)
|
||||
-- (\AppState {..} -> AppState { lr = listMoveTo ix lr, .. })
|
||||
-- $ getAppState Nothing (pfreq as)
|
||||
-- case apps of
|
||||
-- Right nas -> do
|
||||
-- putStrLn "Press enter to continue"
|
||||
-- _ <- getLine
|
||||
-- pure nas
|
||||
-- Left err -> throwIO $ userError err
|
||||
|
||||
|
||||
install' :: AppState -> (Int, ListResult) -> IO (Either String ())
|
||||
@@ -302,12 +345,13 @@ settings' :: IORef Settings
|
||||
settings' = unsafePerformIO $ do
|
||||
dirs <- getDirs
|
||||
newIORef Settings { cache = True
|
||||
, noVerify = False
|
||||
, keepDirs = Never
|
||||
, downloader = Curl
|
||||
, verbose = False
|
||||
, ..
|
||||
}
|
||||
, noVerify = False
|
||||
, keepDirs = Never
|
||||
, downloader = Curl
|
||||
, verbose = False
|
||||
, execCb = (\_ _ _ _ _ -> liftIO $ writeFile [abs|/home/jule/git/ghcup-hs/cb.log|] Nothing "settings'")
|
||||
, ..
|
||||
}
|
||||
|
||||
|
||||
logger' :: IORef LoggerConfig
|
||||
@@ -321,16 +365,22 @@ logger' = unsafePerformIO
|
||||
|
||||
|
||||
brickMain :: Settings -> Maybe URI -> LoggerConfig -> GHCupDownloads -> PlatformRequest -> IO ()
|
||||
brickMain s muri l av pfreq' = do
|
||||
brickMain _ muri _ av pfreq' = do
|
||||
writeIORef uri' muri
|
||||
writeIORef settings' s
|
||||
s <- readIORef settings'
|
||||
-- logger interpreter
|
||||
writeIORef logger' l
|
||||
-- writeIORef logger' l
|
||||
l <- readIORef logger'
|
||||
let runLogger = myLoggerT l
|
||||
|
||||
eApps <- getAppState (Just av) pfreq'
|
||||
case eApps of
|
||||
Right as -> defaultMain app (selectLatest as) $> ()
|
||||
Right as -> do
|
||||
eventChan <- newBChan 1000
|
||||
let builder = Vty.mkVty Vty.defaultConfig
|
||||
initialVty <- builder
|
||||
writeIORef settings' s{ execCb = brickExecCb eventChan }
|
||||
customMain initialVty builder (Just eventChan) app (selectLatest as) $> ()
|
||||
Left e -> do
|
||||
runLogger ($(logError) [i|Error building app state: #{show e}|])
|
||||
exitWith $ ExitFailure 2
|
||||
@@ -359,8 +409,25 @@ getAppState mg pfreq' = do
|
||||
dls <- maybe (fmap _ghcupDownloads $ liftE $ getDownloadsF (maybe GHCupURL OwnSource muri)) pure mg
|
||||
|
||||
lV <- lift $ listVersions dls Nothing Nothing pfreq'
|
||||
pure $ (AppState (list "Tool versions" (V.fromList lV) 1) dls pfreq')
|
||||
pure $ (AppState (list "Tool versions" (V.fromList lV) 1) dls pfreq' Nothing)
|
||||
|
||||
case r of
|
||||
VRight a -> pure $ Right a
|
||||
VLeft e -> pure $ Left [i|#{e}|]
|
||||
|
||||
|
||||
brickExecCb :: BChan MyAppEvent -> ExecCb
|
||||
brickExecCb chan _ fileFd stdoutRead pState lfile = do
|
||||
liftIO $ writeFile [abs|/home/jule/git/ghcup-hs/cb.log|] Nothing "brickExecCb"
|
||||
writeBChan chan (StartProc . T.unpack . decUTF8Safe $ lfile)
|
||||
readLineTilEOF lineAction stdoutRead
|
||||
takeMVar pState >>= \case
|
||||
PExited e@(Left _) -> writeBChan chan (EndProc e)
|
||||
_ -> error "no"
|
||||
where
|
||||
lineAction bs = do
|
||||
void $ SPIB.fdWrite fileFd (bs <> "\n")
|
||||
error "blah"
|
||||
writeBChan chan (LogLine bs)
|
||||
|
||||
|
||||
|
||||
@@ -831,7 +831,7 @@ toSettings Options {..} = do
|
||||
downloader = optsDownloader
|
||||
verbose = optVerbose
|
||||
dirs <- getDirs
|
||||
pure $ Settings { .. }
|
||||
pure $ Settings { execCb = (\_ _ _ _ _ -> liftIO $ HPath.IO.writeFile [HPath.abs|/home/jule/git/ghcup-hs/cb.log|] Nothing "toSettings"), ..}
|
||||
|
||||
|
||||
upgradeOptsP :: Parser UpgradeOpts
|
||||
|
||||
Reference in New Issue
Block a user