diff options
-rw-r--r-- | CabalHelper/Data.hs | 1 | ||||
-rw-r--r-- | CabalHelper/Main.hs | 1 | ||||
-rw-r--r-- | CabalHelper/Sandbox.hs | 56 | ||||
-rw-r--r-- | Distribution/Helper.hs | 59 | ||||
-rw-r--r-- | cabal-helper.cabal | 1 |
5 files changed, 67 insertions, 51 deletions
diff --git a/CabalHelper/Data.hs b/CabalHelper/Data.hs index 97e9988..6f86ff9 100644 --- a/CabalHelper/Data.hs +++ b/CabalHelper/Data.hs @@ -40,5 +40,6 @@ sourceFiles :: [(FilePath, String)] sourceFiles = [ ("Main.hs", $(LitE . StringL <$> runIO (UTF8.toString <$> BS.readFile "CabalHelper/Main.hs"))) , ("Common.hs", $(LitE . StringL <$> runIO (UTF8.toString <$> BS.readFile "CabalHelper/Common.hs"))) + , ("Sandbox.hs", $(LitE . StringL <$> runIO (UTF8.toString <$> BS.readFile "CabalHelper/Sandbox.hs"))) , ("Types.hs", $(LitE . StringL <$> runIO (UTF8.toString <$> BS.readFile "CabalHelper/Types.hs"))) ] diff --git a/CabalHelper/Main.hs b/CabalHelper/Main.hs index 4c64f42..754f356 100644 --- a/CabalHelper/Main.hs +++ b/CabalHelper/Main.hs @@ -79,6 +79,7 @@ import System.IO import System.IO.Unsafe (unsafeInterleaveIO, unsafePerformIO) import Text.Printf +import CabalHelper.Sandbox import CabalHelper.Common import CabalHelper.Types diff --git a/CabalHelper/Sandbox.hs b/CabalHelper/Sandbox.hs new file mode 100644 index 0000000..f379eeb --- /dev/null +++ b/CabalHelper/Sandbox.hs @@ -0,0 +1,56 @@ +module CabalHelper.Sandbox where + + +import Control.Applicative +import Data.Char +import Data.Maybe +import Data.List +import Data.Version +import System.FilePath +import System.Directory + +import qualified Data.Traversable as T + +-- | Get the path to the sandbox package-db in a project +getSandboxPkgDb :: FilePath + -- ^ Path to the cabal package root directory (containing the + -- @cabal.sandbox.config@ file) + -> String + -- ^ Cabal build platform, i.e. @buildPlatform@ + -> Version + -- ^ GHC version (@cProjectVersion@ is your friend) + -> IO (Maybe FilePath) +getSandboxPkgDb d platform ghcVer = do + mConf <- T.traverse readFile =<< mightExist (d </> "cabal.sandbox.config") + return $ fixPkgDbVer <$> (extractSandboxDbDir =<< mConf) + + where + fixPkgDbVer dir = + case takeFileName dir == ghcSandboxPkgDbDir platform ghcVer of + True -> dir + False -> takeDirectory dir </> ghcSandboxPkgDbDir platform ghcVer + +ghcSandboxPkgDbDir :: String -> Version -> String +ghcSandboxPkgDbDir platform ghcVer = + platform ++ "-ghc-" ++ showVersion ghcVer ++ "-packages.conf.d" + +-- | Extract the sandbox package db directory from the cabal.sandbox.config +-- file. Exception is thrown if the sandbox config file is broken. +extractSandboxDbDir :: String -> Maybe FilePath +extractSandboxDbDir conf = extractValue <$> parse conf + where + key = "package-db:" + keyLen = length key + + parse = listToMaybe . filter (key `isPrefixOf`) . lines + extractValue = CabalHelper.Sandbox.dropWhileEnd isSpace . dropWhile isSpace . drop keyLen + + +mightExist :: FilePath -> IO (Maybe FilePath) +mightExist f = do + exists <- doesFileExist f + return $ if exists then (Just f) else (Nothing) + +-- dropWhileEnd is not provided prior to base 4.5.0.0. +dropWhileEnd :: (a -> Bool) -> [a] -> [a] +dropWhileEnd p = foldr (\x xs -> if p x && null xs then [] else x : xs) [] diff --git a/Distribution/Helper.hs b/Distribution/Helper.hs index 304bba9..f591b28 100644 --- a/Distribution/Helper.hs +++ b/Distribution/Helper.hs @@ -46,7 +46,7 @@ module Distribution.Helper ( , buildPlatform -- * Stuff that cabal-install really should export - , getSandboxPkgDb + , Distribution.Helper.getSandboxPkgDb -- * Managing @dist/@ , reconfigure @@ -58,15 +58,12 @@ module Distribution.Helper ( ) where import Control.Applicative -import Control.Arrow import Control.Monad import Control.Monad.IO.Class import Control.Monad.State.Strict import Control.Monad.Reader import Control.Exception as E import Data.Char -import Data.Monoid -import Data.Maybe import Data.List import Data.Default import Data.Version @@ -80,10 +77,9 @@ import System.IO.Unsafe import Text.Printf import GHC.Generics -import qualified Data.Traversable as T - import Paths_cabal_helper (getLibexecDir) import CabalHelper.Types +import CabalHelper.Sandbox -- | Paths or names of various programs we need. data Programs = Programs { @@ -117,6 +113,8 @@ type MonadQuery m = ( MonadIO m , MonadState (Maybe SomeLocalBuildInfo) m , MonadReader (Programs, FilePath) m) +run :: Monad m + => (Programs, FilePath) -> Maybe SomeLocalBuildInfo -> Query m a -> m a run r s action = flip runReaderT r (flip evalStateT s (unQuery action)) -- | @runQuery query distdir@. Run a 'Query'. @distdir@ is where Cabal's @@ -243,51 +241,19 @@ writeAutogenFiles distdir = liftIO $ do exe <- findLibexecExe "cabal-helper-wrapper" void $ readProcess exe [distdir, "write-autogen-files"] "" - -- | Get the path to the sandbox package-db in a project getSandboxPkgDb :: FilePath - -- ^ Path to the cabal package root directory (containing the - -- @cabal.sandbox.config@ file) + -- ^ Cabal build platform, i.e. @buildPlatform@ -> Version -- ^ GHC version (@cProjectVersion@ is your friend) -> IO (Maybe FilePath) -getSandboxPkgDb d ghcVer = do - mConf <- T.traverse readFile =<< mightExist (d </> "cabal.sandbox.config") - return $ fixPkgDbVer <$> (extractSandboxDbDir =<< mConf) - - where - fixPkgDbVer dir = - case takeFileName dir == ghcSandboxPkgDbDir ghcVer of - True -> dir - False -> takeDirectory dir </> ghcSandboxPkgDbDir ghcVer - -ghcSandboxPkgDbDir :: Version -> String -ghcSandboxPkgDbDir ghcVer = - cabalBuildPlatform ++ "-ghc-" ++ showVersion ghcVer ++ "-packages.conf.d" - -cabalBuildPlatform :: String --- The build platform isn't going to change at runtime, is it? ;) -cabalBuildPlatform = unsafePerformIO $ buildPlatform - --- | Extract the sandbox package db directory from the cabal.sandbox.config --- file. Exception is thrown if the sandbox config file is broken. -extractSandboxDbDir :: String -> Maybe FilePath -extractSandboxDbDir conf = extractValue <$> parse conf - where - key = "package-db:" - keyLen = length key - - parse = listToMaybe . filter (key `isPrefixOf`) . lines - extractValue = Distribution.Helper.dropWhileEnd isSpace . dropWhile isSpace . drop keyLen +getSandboxPkgDb = + CabalHelper.Sandbox.getSandboxPkgDb $ unsafePerformIO buildPlatform buildPlatform :: IO String buildPlatform = do exe <- findLibexecExe "cabal-helper-wrapper" - dropWhileEnd isSpace <$> readProcess exe ["print-build-platform"] "" - where - -- dropWhileEnd is not provided prior to base 4.5.0.0. - dropWhileEnd :: (a -> Bool) -> [a] -> [a] - dropWhileEnd p = foldr (\x xs -> if p x && null xs then [] else x : xs) [] + CabalHelper.Sandbox.dropWhileEnd isSpace <$> readProcess exe ["print-build-platform"] "" -- | This exception is thrown by all 'runQuery' functions if the internal -- wrapper executable cannot be found. You may catch this and present the user @@ -361,12 +327,3 @@ getExecutablePath' = #else getProgName #endif - -mightExist :: FilePath -> IO (Maybe FilePath) -mightExist f = do - exists <- doesFileExist f - return $ if exists then (Just f) else (Nothing) - --- dropWhileEnd is not provided prior to base 4.5.0.0. -dropWhileEnd :: (a -> Bool) -> [a] -> [a] -dropWhileEnd p = foldr (\x xs -> if p x && null xs then [] else x : xs) [] diff --git a/cabal-helper.cabal b/cabal-helper.cabal index 15710e3..0cbee55 100644 --- a/cabal-helper.cabal +++ b/cabal-helper.cabal @@ -43,6 +43,7 @@ library Other-Modules: Paths_cabal_helper , CabalHelper.Types default-language: Haskell2010 + GHC-Options: -Wall Build-Depends: base >= 4.5 && < 5 , Cabal >= 1.14 && < 1.23 , data-default |