diff --git a/Language/Haskell/GhcMod/CabalConfig.hs b/Language/Haskell/GhcMod/CabalConfig.hs index 5612535..ed1fdeb 100644 --- a/Language/Haskell/GhcMod/CabalConfig.hs +++ b/Language/Haskell/GhcMod/CabalConfig.hs @@ -1,6 +1,7 @@ {-# LANGUAGE CPP #-} --- | Reading cabal @dist/setup-config@ +-- | This module facilitates extracting information from Cabal's on-disk +-- 'LocalBuildInfo' (@dist/setup-config@). module Language.Haskell.GhcMod.CabalConfig ( CabalConfig , cabalConfigDependencies @@ -37,10 +38,12 @@ import Distribution.Simple.LocalBuildInfo (ComponentName) import System.FilePath (()) ---------------------------------------------------------------- +-- | 'Show'ed cabal 'LocalBuildInfo' string type CabalConfig = String --- | Get file containing 'LocalBuildInfo' data. If it doesn't exist run @cabal --- configure@ i.e. configure with default options like @cabal build@ would do. +-- | Get contents of the file containing 'LocalBuildInfo' data. If it doesn't +-- exist run @cabal configure@ i.e. configure with default options like @cabal +-- build@ would do. getConfig :: Cradle -> IO CabalConfig getConfig cradle = readFile path `E.catch` (\(E.SomeException _) -> configure >> readFile path) @@ -55,10 +58,12 @@ getConfig cradle = configPath :: FilePath configPath = localBuildInfoFile defaultDistPref +-- | Get list of 'Package's needed by all components of the current package cabalConfigDependencies :: Cradle -> PackageIdentifier -> IO [Package] cabalConfigDependencies cradle thisPkg = configDependencies thisPkg <$> getConfig cradle +-- | Extract list of depencenies for all components from 'CabalConfig' configDependencies :: PackageIdentifier -> CabalConfig -> [Package] configDependencies thisPkg config = map fromInstalledPackageId deps where @@ -116,6 +121,8 @@ configDependencies thisPkg config = map fromInstalledPackageId deps Right x -> x Left msg -> error $ "reading config " ++ f ++ " failed ("++msg++")" +-- | Find @field@ in 'CabalConfig'. Returns 'Left' containing a user readable +-- error message with lots of context on failure. extractField :: CabalConfig -> String -> Either String String extractField config field = case extractParens <$> find (field `isPrefixOf`) (tails config) of diff --git a/Language/Haskell/GhcMod/Monad.hs b/Language/Haskell/GhcMod/Monad.hs index a23a411..36aabdd 100644 --- a/Language/Haskell/GhcMod/Monad.hs +++ b/Language/Haskell/GhcMod/Monad.hs @@ -49,7 +49,6 @@ import Language.Haskell.GhcMod.Types import Language.Haskell.GhcMod.Cradle import Language.Haskell.GhcMod.DynFlags import Language.Haskell.GhcMod.GhcPkg -import Language.Haskell.GhcMod.GHCChoice import Language.Haskell.GhcMod.CabalApi import qualified Language.Haskell.GhcMod.Gap as Gap @@ -200,7 +199,7 @@ initializeFlagsWithCradle :: GhcMonad m -> Cradle -> m () initializeFlagsWithCradle opt c - | cabal = withCabal |||> withSandbox + | cabal = withCabal | otherwise = withSandbox where mCradleFile = cradleCabalFile c diff --git a/test/MonadSpec.hs b/test/MonadSpec.hs index 7594e88..74404f1 100644 --- a/test/MonadSpec.hs +++ b/test/MonadSpec.hs @@ -1,6 +1,9 @@ +{-# LANGUAGE ScopedTypeVariables #-} module MonadSpec where import Test.Hspec +import Dir +import Control.Applicative import Control.Monad.Error.Class import Language.Haskell.GhcMod.Types import Language.Haskell.GhcMod.Monad @@ -17,3 +20,8 @@ spec = do return "hello" `catchError` (const $ fail "oh noes") a `shouldBe` (Left $ GMEString "oh noes") + + describe "runGhcModT" $ + it "complains if the cabal file fails to parse while a sandbox is present" $ withDirectory_ "test/data/broken-cabal" $ do + (a,_) <- runGhcModT defaultOptions (gmCradle <$> ask) + a `shouldSatisfy` (\(Left _) -> True) diff --git a/test/data/broken-cabal/.cabal-sandbox/packages/00-index.cache b/test/data/broken-cabal/.cabal-sandbox/packages/00-index.cache new file mode 100644 index 0000000..e69de29 diff --git a/test/data/broken-cabal/.cabal-sandbox/packages/00-index.tar b/test/data/broken-cabal/.cabal-sandbox/packages/00-index.tar new file mode 100644 index 0000000..9df6499 Binary files /dev/null and b/test/data/broken-cabal/.cabal-sandbox/packages/00-index.tar differ diff --git a/test/data/broken-cabal/cabal.sandbox.config.in b/test/data/broken-cabal/cabal.sandbox.config.in new file mode 100644 index 0000000..43e48ce --- /dev/null +++ b/test/data/broken-cabal/cabal.sandbox.config.in @@ -0,0 +1,25 @@ +-- This is a Cabal package environment file. +-- THIS FILE IS AUTO-GENERATED. DO NOT EDIT DIRECTLY. +-- Please create a 'cabal.config' file in the same directory +-- if you want to change the default settings for this sandbox. + + +local-repo: @CWD@/test/data/broken-cabal/.cabal-sandbox/packages +logs-dir: @CWD@/test/data/broken-cabal/.cabal-sandbox/logs +world-file: @CWD@/test/data/broken-cabal/.cabal-sandbox/world +user-install: False +package-db: @CWD@/test/data/broken-cabal/.cabal-sandbox/x86_64-linux-ghc-7.8.3-packages.conf.d +build-summary: @CWD@/test/data/broken-cabal/.cabal-sandbox/logs/build.log + +install-dirs + prefix: @CWD@/test/data/broken-cabal/.cabal-sandbox + bindir: $prefix/bin + libdir: $prefix/lib + libsubdir: $arch-$os-$compiler/$pkgid + libexecdir: $prefix/libexec + datadir: $prefix/share + datasubdir: $arch-$os-$compiler/$pkgid + docdir: $datadir/doc/$arch-$os-$compiler/$pkgid + htmldir: $docdir/html + haddockdir: $htmldir + sysconfdir: $prefix/etc