hackport-0.5.1: cabal/cabal-install/Distribution/Client/CmdRepl.hs
{-# LANGUAGE NamedFieldPuns #-}
-- | cabal-install CLI command: repl
--
module Distribution.Client.CmdRepl (
replCommand,
replAction,
) where
import Distribution.Client.ProjectOrchestration
import Distribution.Client.ProjectConfig
( BuildTimeSettings(..) )
import Distribution.Client.ProjectPlanning
( PackageTarget(..) )
import Distribution.Client.BuildTarget
( readUserBuildTargets )
import Distribution.Client.Setup
( GlobalFlags, ConfigFlags(..), ConfigExFlags, InstallFlags )
import Distribution.Simple.Setup
( HaddockFlags, fromFlagOrDefault )
import Distribution.Verbosity
( normal )
import Control.Monad (when)
import Distribution.Simple.Command
( CommandUI(..), usageAlternatives )
import Distribution.Simple.Utils
( wrapText, die )
import qualified Distribution.Client.Setup as Client
replCommand :: CommandUI (ConfigFlags, ConfigExFlags, InstallFlags, HaddockFlags)
replCommand = Client.installCommand {
commandName = "new-repl",
commandSynopsis = "Open a REPL for the current project",
commandUsage = usageAlternatives "new-repl" [ "[FLAGS] TARGET" ],
commandDescription = Just $ \_ -> wrapText $
"Opens a REPL for a Nix-local build project.",
commandNotes = Just $ \pname ->
"Examples:\n"
++ " " ++ pname ++ " new-repl cname"
++ " Open a REPL for the component named cname\n"
++ " " ++ pname ++ " new-repl pkgname:cname"
++ " Open a REPL for the component named cname in pkgname\n"
}
-- | The @repl@ command is very much like @build@. It brings the install plan
-- up to date, selects that part of the plan needed by the given or implicit
-- repl target and then executes the plan.
--
-- Compared to @build@ the difference is that only one target is allowed
-- (given or implicit) and the target type is repl rather than build. The
-- general plan execution infrastructure handles both build and repl targets.
--
-- For more details on how this works, see the module
-- "Distribution.Client.ProjectOrchestration"
--
replAction :: (ConfigFlags, ConfigExFlags, InstallFlags, HaddockFlags)
-> [String] -> GlobalFlags -> IO ()
replAction (configFlags, configExFlags, installFlags, haddockFlags)
targetStrings globalFlags = do
userTargets <- readUserBuildTargets targetStrings
buildCtx <-
runProjectPreBuildPhase
verbosity
( globalFlags, configFlags, configExFlags
, installFlags, haddockFlags )
PreBuildHooks {
hookPrePlanning = \_ _ _ -> return (),
hookSelectPlanSubset = \buildSettings elaboratedPlan -> do
when (buildSettingOnlyDeps buildSettings) $
die $ "The repl command does not support '--only-dependencies'. "
++ "You may wish to use 'build --only-dependencies' and then "
++ "use 'repl'."
-- Interpret the targets on the command line as repl targets
-- (as opposed to say build or haddock targets).
selectTargets
verbosity
ReplDefaultComponent
ReplSpecificComponent
userTargets
False -- onlyDependencies, always False for repl
elaboratedPlan
--TODO: [required eventually] reject multiple targets, or at least
-- targets spanning multiple components. ie it's ok to have two
-- module/file targets in the same component, but not two that live
-- in different components.
}
printPlan verbosity buildCtx
buildOutcomes <- runProjectBuildPhase verbosity buildCtx
runProjectPostBuildPhase verbosity buildCtx buildOutcomes
where
verbosity = fromFlagOrDefault normal (configVerbosity configFlags)