module Bash where import Control.Monad.Error import System.Process import System.Directory import System.IO import System.Exit import Action import Config import Error getSystemPortdir :: HPAction String getSystemPortdir = do dir <- runBash "source /etc/make.conf;echo -n $PORTDIR" case dir of "" -> return "/usr/portage" _ -> return dir getPortdir :: HPAction String getPortdir = do cfg <- getCfg case portagePath cfg of Just dir -> return dir Nothing -> do sys <- getSystemPortdir setPortagePath (Just sys) return sys runBash :: String -> -- ^ The command line HPAction String -- ^ The command-line's output runBash command = do mpath <- liftIO $ findExecutable "bash" bash <- maybe (throwError BashNotFound) return mpath (inp,outp,err,pid) <- liftIO $ runInteractiveProcess bash ["-c",command] Nothing Nothing liftIO $ hClose inp result <- liftIO $ hGetContents outp errors <- liftIO $ hGetContents err length result `seq` liftIO (hClose outp) length errors `seq` liftIO (hClose err) exitCode <- liftIO $ waitForProcess pid case exitCode of ExitFailure _ -> throwError $ BashError errors ExitSuccess -> return result