1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- module CabalDev (modifyOptions) where
- {-
- If the directory 'cabal-dev/packages-X.X.X.conf' exists, add it to the
- options ghc-mod uses to check the source. Otherwise just pass it on.
- -}
- import Control.Applicative ((<$>))
- import Control.Exception (throwIO)
- import Control.Exception.IOChoice
- import Data.List (find)
- import System.Directory
- import System.FilePath (splitPath,joinPath,(</>))
- import Text.Regex.Posix ((=~))
- import Types
- modifyOptions :: Options -> IO Options
- modifyOptions opts = found ||> notFound
- where
- found = addPath opts <$> findCabalDev (sandbox opts)
- notFound = return opts
- findCabalDev :: Maybe String -> IO FilePath
- findCabalDev (Just path) = do
- exist <- doesDirectoryExist path
- if exist then
- findConf path
- else
- findCabalDev Nothing
- findCabalDev Nothing = getCurrentDirectory >>= searchIt . splitPath
- addPath :: Options -> String -> Options
- addPath orig_opts path = do
- let orig_ghcopt = ghcOpts orig_opts
- orig_opts { ghcOpts = orig_ghcopt ++ ["-package-conf", path, "-no-user-package-conf"] }
- searchIt :: [FilePath] -> IO FilePath
- searchIt [] = throwIO $ userError "Not found"
- searchIt path = do
- let cabalDir = mpath path
- exist <- doesDirectoryExist cabalDir
- if exist then
- findConf cabalDir
- else
- searchIt $ init path
- where
- mpath a = joinPath a </> "cabal-dev/"
- findConf :: FilePath -> IO FilePath
- findConf path = do
- Just f <- find (=~ "packages.*\\.conf") <$> getDirectoryContents path
- return $ path </> f
|