module Distribution.Dev.InstallDependencies ( actions ) where import System.Console.GetOpt ( OptDescr(..) ) import Distribution.Dev.Command ( CommandActions(..), CommandResult(..) ) import Distribution.Dev.Flags ( Config, getVerbosity, cfgCabalInstall ) import Distribution.Dev.Sandbox ( resolveSandbox ) import Distribution.Dev.InitPkgDb ( initPkgDb ) import Distribution.Dev.InvokeCabal ( setup ) import qualified Distribution.Dev.CabalInstall as CI import Distribution.Simple.Program ( requireProgram , getProgramOutput , runProgram ) import Distribution.Simple.Program.Db ( emptyProgramDb ) import Distribution.Simple.Utils ( notice, warn ) 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 (cabal, _) <- requireProgram v (CI.program $ cfgCabalInstall flgs) emptyProgramDb eFeatures <- CI.getFeatures v cabal setupRes <- setup s cabal flgs CI.Install case (setupRes, eFeatures) of (Left err, _) -> return $ CommandError err (_, Left err) -> return $ CommandError err (Right args, Right features) -> if CI.hasOnlyDependencies features then do notice v "You are using a version of cabal-install that has \ \the --only-dependencies flag to the install command.\ \ Invoking that instead..." runProgram v cabal $ concat [ args , ["--only-dependencies"] , pkgNames ] return CommandOk else do warn v "Using a work-around to install dependencies for cabal-install\ \ less than 0.10" out <- getProgramOutput v cabal $ concat [ args , ["--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