aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/app/AddPath.hs
diff options
context:
space:
mode:
Diffstat (limited to 'app/AddPath.hs')
-rw-r--r--app/AddPath.hs28
1 files changed, 19 insertions, 9 deletions
diff --git a/app/AddPath.hs b/app/AddPath.hs
index 683b82f..df53326 100644
--- a/app/AddPath.hs
+++ b/app/AddPath.hs
@@ -7,9 +7,9 @@
module Main (main) where
-import Control.Monad (void, when)
+import Control.Monad (unless, void)
import Control.Monad.Trans.Except (catchE, runExceptT, throwE)
-import Data.List (union)
+import Data.List ((\\), nub)
import System.IO.Error (ioError, isDoesNotExistError)
import Options.Applicative
@@ -21,9 +21,10 @@ import Utils.PromptMessage
data Options = Options
{ optName :: WindowsEnv.VarName
- , optYes :: Bool
- , optGlobal :: Bool
- , optPaths :: [WindowsEnv.VarValue]
+ , optYes :: Bool
+ , optGlobal :: Bool
+ , optPrepend :: Bool
+ , optPaths :: [WindowsEnv.VarValue]
} deriving (Eq, Show)
optionParser :: Parser Options
@@ -31,6 +32,7 @@ optionParser = Options
<$> optNameDesc
<*> optYesDesc
<*> optGlobalDesc
+ <*> optPrependDesc
<*> optPathsDesc
where
optNameDesc = strOption
@@ -43,6 +45,9 @@ optionParser = Options
optGlobalDesc = switch
$ long "global" <> short 'g'
<> help "Add for all users"
+ optPrependDesc = switch
+ $ long "prepend" <> short 'p'
+ <> help "Prepend to the variable (instead of appending)"
optPathsDesc = many $ argument str
$ metavar "PATH"
<> help "Directories to add"
@@ -57,7 +62,7 @@ addPath :: Options -> IO ()
addPath options = runExceptT doAddPath >>= either ioError return
where
varName = optName options
- pathsToAdd = optPaths options
+ pathsToAdd = nub $ optPaths options
forAllUsers = optGlobal options
profile
@@ -66,6 +71,11 @@ addPath options = runExceptT doAddPath >>= either ioError return
skipPrompt = optYes options
+ prepend = optPrepend options
+ append xs ys
+ | prepend = ys ++ xs
+ | otherwise = xs ++ ys
+
emptyIfMissing e
| isDoesNotExistError e = return ""
| otherwise = throwE e
@@ -73,9 +83,9 @@ addPath options = runExceptT doAddPath >>= either ioError return
doAddPath = do
oldValue <- WindowsEnv.query profile varName `catchE` emptyIfMissing
let oldPaths = WindowsEnv.pathSplit oldValue
- let newPaths = oldPaths `union` pathsToAdd
- when (length oldPaths /= length newPaths) $ do
- let newValue = WindowsEnv.pathJoin newPaths
+ let newPaths = pathsToAdd \\ oldPaths
+ unless (null newPaths) $ do
+ let newValue = WindowsEnv.pathJoin $ append oldPaths newPaths
let promptAnd = if skipPrompt
then withoutPrompt
else withPrompt $ oldNewMessage profile varName oldValue newValue