shellmate 0.2 → 0.2.1
raw patch · 3 files changed
+43/−21 lines, 3 filesdep −containersdep ~bytestringdep ~directorydep ~download-curl
Dependencies removed: containers
Dependency ranges changed: bytestring, directory, download-curl, feed, filepath, process, tagsoup, temporary, transformers, xml
Files
- Control/Shell.hs +1/−1
- Control/Shell/Internal.hs +30/−7
- shellmate.cabal +12/−13
Control/Shell.hs view
@@ -95,7 +95,7 @@ v <- lookupEnv key setEnv key $ f (maybe "" id v) x <- act- maybe (return ()) (setEnv key) v+ setEnv key $ maybe "" id v return x -- | Get the value of an environment variable. Returns the empty string if
Control/Shell/Internal.hs view
@@ -16,7 +16,7 @@ import Control.Monad.IO.Class import qualified Control.Concurrent as Conc import qualified Control.Exception as Ex-import qualified Data.Map as M+import Data.List (sort) import qualified System.Directory as Dir import qualified System.Environment as Env import qualified System.Exit as Exit@@ -71,12 +71,35 @@ instance Functor Shell where fmap f (Shell x) = Shell (fmap (fmap (fmap f)) x) +-- | Given a list of old key-value pairs and a list of new key-value pairs,+-- returns the list of key-value pairs where the key exists in both the old+-- and the new list, and the values are different between the new and the old+-- list. The values in the returned list are taken from the old list.+-- Keys must be unique.+-- @oldValues [(a, 1), (c, 2)] [(b, 3), (c, 4)] == [(c, 2)]@+oldValues :: (Ord a, Eq a, Eq b) => [(a, b)] -> [(a, b)] -> [(a, b)]+oldValues xxs@((k1, v1):xs) yys@((k2, v2):ys)+ | k1 < k2 = oldValues xs yys+ | k1 > k2 = oldValues xxs ys+ | k1 == k2 && v1 /= v2 = (k1, v1) : oldValues xs ys+ | otherwise = oldValues xs ys+oldValues _ _ = []++-- | Remove all given keys from the given key-value list. Both lists must be+-- sorted, and the keys in the key-value list must be unique.+(\\) :: (Ord a, Eq a) => [(a, b)] -> [(a, b)] -> [(a, b)]+xxs@(x@(k1,_):xs) \\ kks@((k,_):ks)+ | k < k1 = xxs \\ ks+ | k > k1 = x:(xs \\ kks)+ | k == k1 = xs \\ ks+xs \\ _ = xs+ -- | Run a Shell computation. The program's working directory and environment -- will be restored after after the computation finishes. shell :: Shell a -> IO (Either ExitReason a) shell act = do dir <- Dir.getCurrentDirectory- env <- M.fromList <$> Env.getEnvironment+ env <- sort <$> Env.getEnvironment (pids, res) <- unSh act merr <- waitPids pids Dir.setCurrentDirectory dir@@ -88,12 +111,12 @@ resultToEither (Next x) = Right x resultToEither (Fail e) = Left (Failure e) resultToEither (Done) = Left Success- ++ resetEnv :: [(String, String)] -> IO () resetEnv old = do- new <- M.fromList <$> Env.getEnvironment- mapM_ (Env.unsetEnv . fst) (M.toList (new M.\\ old))- mapM_ (uncurry Env.setEnv) (M.toList (M.filterWithKey (changed old) new))- changed old k v = maybe True (/= v) (M.lookup k old)+ new <- sort <$> Env.getEnvironment+ mapM_ (Env.unsetEnv . fst) (new \\ old)+ mapM_ (uncurry Env.setEnv) (oldValues old new) -- | Run a shell computation and discard its return value. If the computation -- fails, print its error message to @stderr@ and exit.
shellmate.cabal view
@@ -1,5 +1,5 @@ name: shellmate-version: 0.2+version: 0.2.1 synopsis: Simple interface for shell scripting in Haskell. description: Aims to simplify development of cross-platform shell scripts and similar things. homepage: http://github.com/valderman/shellmate@@ -26,17 +26,16 @@ Control.Shell.Handle Control.Shell.Internal build-depends:- base >=4.7 && <5,- containers,- transformers >=0.3,- download-curl,- feed,- tagsoup,- xml,- bytestring,- filepath,- process,- directory,- temporary+ base >=4.7 && <5,+ transformers >=0.3 && <0.5,+ download-curl >=0.1 && <0.2,+ feed >=0.3 && <0.4,+ tagsoup >=0.13 && <0.14,+ xml >=1.3 && <1.4,+ bytestring >=0.10 && <0.11,+ filepath >=1.3 && <1.5,+ process >=1.1 && <1.5,+ directory >=1.1 && <1.3,+ temporary >=1.1 && <1.3 ghc-options: -Wall