cabal-dev-0.7: src/Distribution/Dev/InstallDependencies.hs
module Distribution.Dev.InstallDependencies
( actions )
where
import System.Console.GetOpt ( OptDescr(..) )
import Distribution.Dev.Command ( CommandActions(..), CommandResult(..) )
import Distribution.Dev.Flags ( Config, getVerbosity )
import Distribution.Dev.Sandbox ( resolveSandbox )
import Distribution.Dev.InitPkgDb ( initPkgDb )
import Distribution.Dev.InvokeCabal ( setup, cabalProgram )
import Distribution.Simple.Program ( requireProgram
, getProgramOutput
, runProgram
)
import Distribution.Simple.Program.Db ( emptyProgramDb )
import Distribution.Simple.Utils ( notice )
actions :: CommandActions
actions = CommandActions
{ cmdDesc = "Install the dependencies for this package"
, cmdRun = \cfg _ args -> installDependencies cfg args
, cmdOpts = [] :: [OptDescr ()]
, cmdPassFlags = True
}
installDependencies :: Config -> [String] -> IO CommandResult
installDependencies flgs pkgNames = do
let v = getVerbosity flgs
s <- initPkgDb v =<< resolveSandbox flgs
setupRes <- setup s flgs
case setupRes of
Left err -> return $ CommandError err
Right args ->
do
(cabal, _) <- requireProgram v cabalProgram emptyProgramDb
out <- getProgramOutput v cabal $ concat
[ args
, ["install", "--dry-run", "--verbose=1"]
, pkgNames
]
let -- Drop the lines that say:
-- Resolving dependencies...
-- In order, the following [...]
pkgIdStrs = drop 2 $ lines out
-- We take the init if no pkgNames were supplied because
-- that means we're working on the cabal file in the
-- current directory.
deps = case pkgNames of
[] | not $ null pkgIdStrs -> init pkgIdStrs
_ -> pkgIdStrs
case deps of
[] -> notice v "No dependencies need to be installed"
_ -> do notice v $ "Installing dependencies: " ++ unwords deps
runProgram v cabal $ args ++ ("install":deps)
return CommandOk