Merge pull request #286 from jwiegley/merge257

Pull request for merge257
This commit is contained in:
John Wiegley 2018-05-02 15:05:10 -07:00 committed by GitHub
commit 13f3ebddd4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 38 additions and 0 deletions

View file

@ -134,6 +134,7 @@ builtinsList = sequence [
, add2 Normal "div" div_
, add2 Normal "elem" elem_
, add2 Normal "elemAt" elemAt_
, add Normal "exec" exec_
, add0 Normal "false" (return $ nvConstant $ NBool False)
, add Normal "fetchTarball" fetchTarball
, add2 Normal "filter" filter_
@ -190,6 +191,7 @@ builtinsList = sequence [
, add Normal "toPath" toPath
, add TopLevel "toString" toString
, add Normal "toXML" toXML_
, add2 TopLevel "trace" trace_
, add Normal "tryEval" tryEval
, add Normal "typeOf" typeOf
, add Normal "unsafeDiscardStringContext" unsafeDiscardStringContext
@ -855,6 +857,17 @@ tryEval e = catch (onSuccess <$> e) (pure . onError)
, ("value", valueThunk (nvConstant (NBool False)))
]
trace_ :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m) -> m (NValue m)
trace_ msg action = do
traceEffect . Text.unpack =<< fromValue @Text msg
action
exec_ :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
exec_ xs = do
ls <- fromValue @[NThunk m] xs
xs <- traverse (fromValue @Text . force') ls
exec (map Text.unpack xs)
fetchTarball :: forall e m. MonadNix e m => m (NValue m) -> m (NValue m)
fetchTarball v = v >>= \case
NVSet s _ -> case M.lookup "url" s of

View file

@ -32,3 +32,7 @@ class MonadFile m => MonadEffects m where
nixInstantiateExpr :: String -> m (NValue m)
getRecursiveSize :: a -> m (NValue m)
traceEffect :: String -> m ()
exec :: [String] -> m (NValue m)

View file

@ -583,6 +583,27 @@ instance (MonadFix m, MonadCatch m, MonadIO m, Alternative m,
const $ toNix (0 :: Integer)
#endif
traceEffect = liftIO . putStrLn
exec = \case
[] -> throwError $ ErrorCall "exec: missing program"
(prog:args) -> do
(exitCode, out, _) <-
liftIO $ readProcessWithExitCode prog args ""
let t = Text.strip (Text.pack out)
let emsg = "program[" ++ prog ++ "] args=" ++ show args
case exitCode of
ExitSuccess ->
if Text.null t
then throwError $ ErrorCall $ "exec has no output :" ++ emsg
else case parseNixTextLoc t of
Failure err ->
throwError $ ErrorCall $
"Error parsing output of exec: " ++ show err ++ " " ++ emsg
Success v -> evalExprLoc v
err -> throwError $ ErrorCall $
"exec failed: " ++ show err ++ " " ++ emsg
runLazyM :: Options -> MonadIO m => Lazy m a -> m a
runLazyM opts = (`evalStateT` M.empty)
. (`runReaderT` newContext opts)