Add --env-file flag

This commit is contained in:
Brandon Chinn 2021-08-17 16:59:01 -07:00
parent 296c8e4782
commit d3cd4f2519
3 changed files with 27 additions and 9 deletions

View File

@ -98,6 +98,8 @@ parseKernelArgs = foldl' addFlag defaultKernelSpecOptions
kernelSpecOpts { kernelSpecInstallPrefix = Just prefix }
addFlag kernelSpecOpts KernelspecUseStack =
kernelSpecOpts { kernelSpecUseStack = True }
addFlag kernelSpecOpts (KernelspecEnvFile fp) =
kernelSpecOpts { kernelSpecEnvFile = Just fp }
addFlag _kernelSpecOpts flag = error $ "Unknown flag" ++ show flag
-- | Run the IHaskell language kernel.
@ -127,13 +129,12 @@ runKernel kOpts profileSrc = do
-- If we're in a stack directory, use `stack` to set the environment
-- We can't do this with base <= 4.6 because setEnv doesn't exist.
when stack $ do
stackEnv <- lines <$> readProcess "stack" ["exec", "env"] ""
forM_ stackEnv $ \line ->
let (var, val) = break (== '=') line
in case tailMay val of
when stack $
readProcess "stack" ["exec", "env"] "" >>= parseAndSetEnv
case kernelSpecEnvFile kOpts of
Nothing -> return ()
Just val' -> setEnv var val'
Just envFile -> readFile envFile >>= parseAndSetEnv
-- Serve on all sockets and ports defined in the profile.
interface <- serveProfile profile debug
@ -210,6 +211,12 @@ runKernel kOpts profileSrc = do
isCommMessage req = mhMsgType (header req) `elem` [CommDataMessage, CommCloseMessage]
parseAndSetEnv envLines =
forM_ (lines envLines) $ \line -> do
case break (== '=') line of
(_, []) -> return ()
(key, _:val) -> setEnv key val
-- Initial kernel state.
initialKernelState :: IO (MVar KernelState)
initialKernelState = newMVar defaultKernelState

View File

@ -39,6 +39,7 @@ data Argument = ConfFile String -- ^ A file with commands to load at startup
| ConvertLhsStyle (LhsStyle String)
| KernelspecInstallPrefix String
| KernelspecUseStack
| KernelspecEnvFile FilePath
deriving (Eq, Show)
data LhsStyle string =
@ -124,6 +125,14 @@ kernelStackFlag = flagNone ["stack"] addStack
where
addStack (Args md prev) = Args md (KernelspecUseStack : prev)
kernelEnvFileFlag :: Flag Args
kernelEnvFileFlag =
flagReq
["env-file"]
(store KernelspecEnvFile)
"<file>"
"Load environment from this file when kernel is installed"
confFlag :: Flag Args
confFlag = flagReq ["conf", "c"] (store ConfFile) "<rc.hs>"
"File with commands to execute at start; replaces ~/.ihaskell/rc.hs."
@ -144,11 +153,11 @@ store constructor str (Args md prev) = Right $ Args md $ constructor str : prev
installKernelSpec :: Mode Args
installKernelSpec =
mode "install" (Args InstallKernelSpec []) "Install the Jupyter kernelspec." noArgs
[ghcLibFlag, ghcRTSFlag, kernelDebugFlag, confFlag, installPrefixFlag, helpFlag, kernelStackFlag]
[ghcLibFlag, ghcRTSFlag, kernelDebugFlag, confFlag, installPrefixFlag, helpFlag, kernelStackFlag, kernelEnvFileFlag]
kernel :: Mode Args
kernel = mode "kernel" (Args (Kernel Nothing) []) "Invoke the IHaskell kernel." kernelArg
[ghcLibFlag, kernelDebugFlag, confFlag, kernelStackFlag, kernelCodeMirrorFlag]
[ghcLibFlag, kernelDebugFlag, confFlag, kernelStackFlag, kernelEnvFileFlag, kernelCodeMirrorFlag]
where
kernelArg = flagArg update "<json-kernel-file>"
update filename (Args _ flags) = Right $ Args (Kernel $ Just filename) flags

View File

@ -43,6 +43,7 @@ data KernelSpecOptions =
, kernelSpecConfFile :: IO (Maybe String) -- ^ Filename of profile JSON file.
, kernelSpecInstallPrefix :: Maybe String
, kernelSpecUseStack :: Bool -- ^ Whether to use @stack@ environments.
, kernelSpecEnvFile :: Maybe FilePath
}
defaultKernelSpecOptions :: KernelSpecOptions
@ -55,6 +56,7 @@ defaultKernelSpecOptions = KernelSpecOptions
, kernelSpecConfFile = defaultConfFile
, kernelSpecInstallPrefix = Nothing
, kernelSpecUseStack = False
, kernelSpecEnvFile = Nothing
}
-- | The IPython kernel name.