Skip to content

Commit 830ca3d

Browse files
author
Tristan Webb
committed
global -p option
1 parent e4e4015 commit 830ca3d

3 files changed

Lines changed: 42 additions & 8 deletions

File tree

src/Stack/Config.hs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,17 @@ configFromConfigMonoid configStackRoot mproject configMonoid@ConfigMonoid{..} =
146146
return $ progsDir </> $(mkRelDir stackProgName) </> platform
147147
_ -> return $ configStackRoot </> $(mkRelDir "programs") </> platform
148148

149-
configLocalBin <- do
150-
localDir <- liftIO (getAppUserDataDirectory "local") >>= parseAbsDir
151-
return $ localDir </> $(mkRelDir "bin")
149+
configLocalBin <- case configMonoidLocalBin of
150+
Nothing -> do
151+
localDir <- liftIO (getAppUserDataDirectory "local") >>= parseAbsDir
152+
return $ localDir </> $(mkRelDir "bin")
153+
Just userPath -> do
154+
tryPath <- try (liftIO $ canonicalizePath userPath >>= parseAbsDir)
155+
case tryPath of
156+
Left (_ :: SomeException) ->
157+
error $ "Could not locate user specified directory \"" ++
158+
userPath ++ "\""
159+
Right absPath -> return absPath
152160

153161
configJobs <-
154162
case configMonoidJobs of
@@ -161,7 +169,7 @@ configFromConfigMonoid configStackRoot mproject configMonoid@ConfigMonoid{..} =
161169
-- | Command-line arguments parser for configuration.
162170
configOptsParser :: Bool -> Parser ConfigMonoid
163171
configOptsParser docker =
164-
(\opts systemGHC installGHC arch os jobs includes libs skipGHCCheck skipMsys -> mempty
172+
(\opts systemGHC installGHC arch os jobs includes libs skipGHCCheck skipMsys localBin -> mempty
165173
{ configMonoidDockerOpts = opts
166174
, configMonoidSystemGHC = systemGHC
167175
, configMonoidInstallGHC = installGHC
@@ -172,6 +180,7 @@ configOptsParser docker =
172180
, configMonoidExtraIncludeDirs = includes
173181
, configMonoidExtraLibDirs = libs
174182
, configMonoidSkipMsys = skipMsys
183+
, configMonoidLocalBin = localBin
175184
})
176185
<$> Docker.dockerOptsParser docker
177186
<*> maybeBoolFlags
@@ -216,6 +225,12 @@ configOptsParser docker =
216225
"skip-msys"
217226
"skipping the local MSYS installation (Windows only)"
218227
idm
228+
<*> optional (strOption
229+
( long "local-bin-path"
230+
<> short 'p'
231+
<> metavar "DIR"
232+
<> help "Install binaries to DIR"
233+
))
219234

220235
-- | Get the directory on Windows where we should install extra programs. For
221236
-- more information, see discussion at:

src/Stack/Types/Config.hs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,8 @@ data ConfigMonoid =
436436
-- ^ See: 'configExtraLibDirs'
437437
,configMonoidConcurrentTests :: !(Maybe Bool)
438438
-- ^ See: 'configConcurrentTests'
439+
,configMonoidLocalBin :: !(Maybe FilePath)
440+
-- ^ Used to override the binary installation dir
439441
}
440442
deriving Show
441443

@@ -457,6 +459,7 @@ instance Monoid ConfigMonoid where
457459
, configMonoidExtraIncludeDirs = Set.empty
458460
, configMonoidExtraLibDirs = Set.empty
459461
, configMonoidConcurrentTests = Nothing
462+
, configMonoidLocalBin = Nothing
460463
}
461464
mappend l r = ConfigMonoid
462465
{ configMonoidDockerOpts = configMonoidDockerOpts l <> configMonoidDockerOpts r
@@ -476,6 +479,7 @@ instance Monoid ConfigMonoid where
476479
, configMonoidExtraIncludeDirs = Set.union (configMonoidExtraIncludeDirs l) (configMonoidExtraIncludeDirs r)
477480
, configMonoidExtraLibDirs = Set.union (configMonoidExtraLibDirs l) (configMonoidExtraLibDirs r)
478481
, configMonoidConcurrentTests = configMonoidConcurrentTests l <|> configMonoidConcurrentTests r
482+
, configMonoidLocalBin = configMonoidLocalBin l <|> configMonoidLocalBin r
479483
}
480484

481485
instance FromJSON ConfigMonoid where
@@ -500,6 +504,7 @@ instance FromJSON ConfigMonoid where
500504
configMonoidExtraIncludeDirs <- obj .:? "extra-include-dirs" .!= Set.empty
501505
configMonoidExtraLibDirs <- obj .:? "extra-lib-dirs" .!= Set.empty
502506
configMonoidConcurrentTests <- obj .:? "concurrent-tests"
507+
configMonoidLocalBin <- obj .:? "local-bin"
503508
return ConfigMonoid {..}
504509

505510
-- | Newtype for non-orphan FromJSON instance.

test/integration/lib/StackTest.hs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import System.Directory
77
import System.IO
88
import System.Process
99
import System.Exit
10-
import System.Environment
1110

1211
run' :: FilePath -> [String] -> IO ExitCode
1312
run' cmd args = do
@@ -44,11 +43,26 @@ stackErr args = do
4443
doesNotExist :: FilePath -> IO ()
4544
doesNotExist fp = do
4645
putStrLn $ "doesNotExist " ++ fp
46+
exists <- doesFileOrDirExist fp
47+
case exists of
48+
(Right msg) -> error msg
49+
(Left _) -> return ()
50+
51+
doesExist :: FilePath -> IO ()
52+
doesExist fp = do
53+
putStrLn $ "doesExist " ++ fp
54+
exists <- doesFileOrDirExist fp
55+
case exists of
56+
(Right msg) -> return ()
57+
(Left _) -> error "No file or directory exists"
58+
59+
doesFileOrDirExist :: FilePath -> IO (Either () String)
60+
doesFileOrDirExist fp = do
4761
isFile <- doesFileExist fp
4862
if isFile
49-
then error $ "File exists: " ++ fp
63+
then return (Right ("File exists: " ++ fp))
5064
else do
5165
isDir <- doesDirectoryExist fp
5266
if isDir
53-
then error $ "Directory exists: " ++ fp
54-
else return ()
67+
then return (Right ("Directory exists: " ++ fp))
68+
else return (Left ())

0 commit comments

Comments
 (0)