packages feed

cabal-dev-0.7.3.1: src/Distribution/Dev/Ghci.hs

module Distribution.Dev.Ghci
   ( actions )
where

import Distribution.Dev.Command ( CommandActions(..), CommandResult(..) )
import Distribution.Dev.Flags ( Config, getVerbosity, getSandbox )
import Distribution.Dev.InitPkgDb ( initPkgDb )
import Distribution.Dev.Sandbox ( pkgConf, Sandbox, KnownVersion, resolveSandbox )
import Distribution.Simple.Program ( Program( programFindVersion
                                            )
                                   , ConfiguredProgram( programDefaultArgs )
                                   , emptyProgramConfiguration
                                   , findProgramVersion
                                   , runProgram
                                   , requireProgram
                                   , simpleProgram
                                   , programVersion
                                   , programLocation
                                   , locationPath
                                   )
import Distribution.Simple.Utils ( debug )
import Distribution.Text ( display )
import System.Console.GetOpt  ( OptDescr )
import System.FilePath ((</>))

actions :: CommandActions
actions = CommandActions
              { cmdDesc = "Run ghci with the proper package database."
              , cmdRun = \cfg _ args -> invokeGhci cfg args
              , cmdOpts = [] :: [OptDescr ()]
              , cmdPassFlags = True
              }

ghciArgs :: Sandbox KnownVersion -> [String]
ghciArgs sandbox = [ "-package-conf", pkgConf sandbox
                   , "-no-user-package-conf"
                   ]

configureGhci :: Config -> IO ConfiguredProgram
configureGhci cfg = do (ghci, _) <- requireProgram (getVerbosity cfg) ghciProgram emptyProgramConfiguration
                       sandbox <- initPkgDb (getVerbosity cfg) =<< (resolveSandbox cfg)
                       return ghci { programDefaultArgs = ghciArgs sandbox }

-- XXX This invocation pattern is repeated in at least two places (see InvokeCabal)
invokeGhci :: Config -> [String] -> IO CommandResult
invokeGhci cfg args = do let v = getVerbosity cfg
                         ghci <- configureGhci cfg
                         debug v $ concat [ "Using ghci "
                                          , maybe "(unknown version)" display $ programVersion ghci
                                          , " at "
                                          , show (locationPath $ programLocation ghci)
                                          ]
                         runProgram v ghci args
                         return CommandOk

ghciProgram :: Program
ghciProgram = (simpleProgram "ghci") {
    programFindVersion = findProgramVersion "--numeric-version" id
  }