hsenv 0.3 → 0.4
raw patch · 9 files changed
+64/−37 lines, 9 files
Files
- hsenv.cabal +1/−1
- skeletons/activate +20/−9
- skeletons/cabal +7/−1
- src/Actions.hs +13/−10
- src/Args.hs +11/−10
- src/MyMonad.hs +2/−1
- src/Paths.hs +6/−2
- src/Types.hs +2/−1
- src/hsenv.hs +2/−2
hsenv.cabal view
@@ -1,6 +1,6 @@ Name: hsenv -Version: 0.3+Version: 0.4 Synopsis: Virtual Haskell Environment builder
skeletons/activate view
@@ -19,24 +19,29 @@ echo "" echo "To exit from this virtual environment, enter command 'deactivate_hsenv'." -export "HSENV_PATH_BACKUP"="${PATH}"-export "HSENV_PS1_BACKUP"="${PS1}"+HSENV_PATH_BACKUP="$PATH" +if <MODIFY_PS1>; then+ HSENV_PS1_BACKUP="$PS1"+fi+ deactivate_hsenv() { echo "Deactivating ${HSENV_NAME} Virtual Haskell Environment (at ${HSENV})." echo "Restoring previous environment settings." - export "PATH"="${HSENV_PATH_BACKUP}"- unset -v "HSENV_PATH_BACKUP"- export "PS1"="${HSENV_PS1_BACKUP}"- unset -v "HSENV_PS1_BACKUP"+ export PATH="$HSENV_PATH_BACKUP"+ unset -v HSENV_PATH_BACKUP + if <MODIFY_PS1>; then+ PS1="$HSENV_PS1_BACKUP"+ unset -v HSENV_PS1_BACKUP+ fi+ unset -v PACKAGE_DB_FOR_CABAL unset -v PACKAGE_DB_FOR_GHC_PKG unset -v PACKAGE_DB_FOR_GHC unset -v HSENV unset -v HSENV_NAME- unset -v GHC_PACKAGE_PATH unset -f deactivate_hsenv if [ -n "$BASH" -o -n "$ZSH_VERSION" ]; then@@ -79,7 +84,7 @@ PKG_DB_OPT_SUFFIX="db" fi -GHC_PACKAGE_PATH_REPLACEMENT="$(cat <HSENV_DIR>/ghc_package_path_var | sed -r -e 's/^/:/' -e 's/::*/:/g' -e 's/:\s*$//')"+GHC_PACKAGE_PATH_REPLACEMENT="$(cat <HSENV_DIR>/ghc_package_path_var | sed -e 's/^/:/' -e 's/::*/:/g' -e 's/:\s*$//')" replace_pkg () { replacement=$1@@ -92,7 +97,13 @@ export PACKAGE_DB_FOR_GHC=" -no-user-package-${PKG_DB_OPT_SUFFIX} $(replace_pkg -package-${PKG_DB_OPT_SUFFIX}=)" export PACKAGE_DB_FOR_GHC_MOD=" -g -no-user-package-${PKG_DB_OPT_SUFFIX} $(replace_pkg '-g -package-'${PKG_DB_OPT_SUFFIX}=)" -export PS1="(${HSENV_NAME})${PS1}"+if <MODIFY_PS1>; then+ if [ -n "$HSENV_NAME" ]; then+ PS1="($HSENV_NAME)$PS1"+ else+ PS1="[hsenv]$PS1"+ fi+fi unset -v GHC_VERSION_OUTPUT unset -v GHC_VERSION_NUMBER
skeletons/cabal view
@@ -24,13 +24,19 @@ CABAL_BUILDDIR_ARG="" +if [ -z "<HSENV_NAME>" ]; then+ CABAL_BUILDIR="dist"+else+ CABAL_BUILDIR="dist_<HSENV_NAME>"+fi+ CABAL_BUILDABLE_COMMANDS="build clean configure copy haddock hscolour install register sdist test upgrade" CABAL_COMMAND="$(echo ${@} | tr -s ' ' '\n' | grep -E '[a-z]' | grep -Ev '^-' | head -n 1)" for CABAL_BUILDABLE_COMMAND in ${CABAL_BUILDABLE_COMMANDS}; do if [ "${CABAL_BUILDABLE_COMMAND}" = "${CABAL_COMMAND}" ]; then- CABAL_BUILDDIR_ARG="--builddir=dist_<HSENV_NAME>"+ CABAL_BUILDDIR_ARG="--builddir=${CABAL_BUILDIR}" fi done
src/Actions.hs view
@@ -19,7 +19,7 @@ import Distribution.Package (PackageName(..)) import Safe (lastMay) import Data.List (intercalate)-import Data.Maybe+import Data.Maybe (fromMaybe, isJust) import MyMonad import Types@@ -72,7 +72,7 @@ , cabalWrapper ] let cabalWrapperContents = substs [ ("<CABAL_CONFIG>", cabalConfig)- , ("<HSENV_NAME>", hsEnvName')] cabalWrapperSkel+ , ("<HSENV_NAME>", fromMaybe "" hsEnvName')] cabalWrapperSkel indentMessages $ do trace "cabal wrapper contents:" indentMessages $ mapM_ trace $ lines cabalWrapperContents@@ -109,18 +109,21 @@ installActivateScript = do info "Installing activate script" hsEnvName' <- asks hsEnvName+ noModifyPS1 <- asks noPS1 dirStructure <- hseDirStructure ghcPkgDbPath <- indentMessages ghcPkgDbPathLocation let activateScript = hsEnvBinDir dirStructure </> "activate" indentMessages $ debug $ "using location: " ++ activateScript- let activateScriptContents = substs [ ("<HSENV_NAME>", hsEnvName')- , ("<HSENV_DIR>", hsEnvDir dirStructure)- , ("<HSENV>", hsEnv dirStructure)- , ("<GHC_PACKAGE_PATH>", ghcPkgDbPath)- , ("<HSENV_BIN_DIR>", hsEnvBinDir dirStructure)- , ("<CABAL_BIN_DIR>", cabalBinDir dirStructure)- , ("<GHC_BIN_DIR>", ghcBinDir dirStructure)- ] activateSkel+ let activateScriptContents =+ substs [ ("<HSENV_NAME>", fromMaybe "" hsEnvName')+ , ("<HSENV_DIR>", hsEnvDir dirStructure)+ , ("<HSENV>", hsEnv dirStructure)+ , ("<GHC_PACKAGE_PATH>", ghcPkgDbPath)+ , ("<HSENV_BIN_DIR>", hsEnvBinDir dirStructure)+ , ("<CABAL_BIN_DIR>", cabalBinDir dirStructure)+ , ("<GHC_BIN_DIR>", ghcBinDir dirStructure)+ , ("<MODIFY_PS1>", if noModifyPS1 then "false" else "true")+ ] activateSkel indentMessages $ do trace "activate script contents:" indentMessages $ mapM_ trace $ lines activateScriptContents
src/Args.hs view
@@ -4,8 +4,6 @@ import Control.Arrow import Util.Args-import System.Directory (getCurrentDirectory)-import System.FilePath (splitPath) import Types #ifdef cabal@@ -19,7 +17,7 @@ versionString = "dev" #endif -verbosityOpt, veryVerbosityOpt, skipSanityOpt, sharingOpt :: Switch+verbosityOpt, veryVerbosityOpt, skipSanityOpt, sharingOpt, noPS1Opt :: Switch verbosityOpt = Switch { switchName = "verbose" , switchHelp = "Print some debugging info"@@ -41,6 +39,13 @@ , switchShort = Nothing } +noPS1Opt =+ Switch { switchName = "no-ps1-indicator"+ , switchHelp =+ "Don't modify the shell prompt to indicate the current hsenv"+ , switchShort = Nothing+ }+ nameOpt, ghcOpt :: DynOpt nameOpt = DynOpt@@ -75,13 +80,9 @@ (_, True) -> VeryVerbose (True, False) -> Verbose (False, False) -> Quiet- nameFlag <- getOpt nameOpt -< ()- name <- case nameFlag of- Just name' -> returnA -< name'- Nothing -> do- cwd <- liftIO' getCurrentDirectory -< ()- returnA -< last $ splitPath cwd+ name <- getOpt nameOpt -< () ghcFlag <- getOpt ghcOpt -< ()+ noPS1' <- getOpt noPS1Opt -< () let ghc = case ghcFlag of Nothing -> System Just path -> Tarball path@@ -94,8 +95,8 @@ , ghcSource = ghc , makeCmd = make , noSharing = noSharingFlag+ , noPS1 = noPS1' }- where liftIO' = liftIO . const getArgs :: IO Options getArgs = parseArgs argParser versionString outro
src/MyMonad.hs view
@@ -9,6 +9,7 @@ , finally , throwError , catchError+ , ask , asks , gets , tell@@ -20,7 +21,7 @@ import Control.Exception as Exception (IOException, catch) import Control.Monad.Trans (MonadIO, liftIO)-import Control.Monad.Reader (ReaderT, MonadReader, runReaderT, asks)+import Control.Monad.Reader (ReaderT, MonadReader, runReaderT, asks, ask) import Control.Monad.Writer (WriterT, MonadWriter, runWriterT, tell) import Control.Monad.State (StateT, MonadState, evalStateT, modify, gets) import Control.Monad.Error (ErrorT, MonadError, runErrorT, throwError, catchError)
src/Paths.hs view
@@ -1,6 +1,7 @@ module Paths ( hseDirStructure , cabalConfigLocation , dotDirName+ , constructDotDirName , insidePathVar ) where @@ -32,11 +33,14 @@ , ghcBinDir = ghcDirLocation </> "bin" } +constructDotDirName :: Options -> String+constructDotDirName opts = maybe ".hsenv" (".hsenv_" ++) (hsEnvName opts)+ -- directory name of hsEnvDir dotDirName :: MyMonad String dotDirName = do- name <- asks hsEnvName- return $ ".hsenv_" ++ name+ opts <- ask+ return $ constructDotDirName opts -- returns location of cabal's config file inside virtual environment dir structure cabalConfigLocation :: MyMonad FilePath
src/Types.hs view
@@ -19,10 +19,11 @@ data Options = Options { verbosity :: Verbosity , skipSanityCheck :: Bool- , hsEnvName :: String -- Virtual Haskell Environment name+ , hsEnvName :: Maybe String -- Virtual Haskell Environment name , ghcSource :: GhcSource , makeCmd :: String -- make substitute used for 'make install' of external GHC , noSharing :: Bool -- don't share ~/.cabal/packages+ , noPS1 :: Bool -- Don't modify shell prompt } data MyState = MyState { logDepth :: Integer -- used for indentation of logging messages
src/hsenv.hs view
@@ -7,7 +7,7 @@ import Actions import SanityCheck (sanityCheck) import Args (getArgs)-import Paths (dotDirName)+import Paths (dotDirName, constructDotDirName) main :: IO () main = do@@ -22,7 +22,7 @@ writeFile "hsenv.log" errorLog exitFailure Right () -> do- let dotDir = ".hsenv_" ++ hsEnvName options+ let dotDir = constructDotDirName options writeFile (dotDir </> "hsenv.log") $ unlines messageLog realMain :: MyMonad ()