packages feed

cabal-install 3.8.1.0 → 3.10.1.0

raw patch · 79 files changed

+1595/−685 lines, 79 filesdep ~Cabaldep ~Cabal-syntaxdep ~basePVP ok

version bump matches the API change (PVP)

Dependency ranges changed: Cabal, Cabal-syntax, base, cabal-install-solver, directory, mtl, process, resolv

API changes (from Hackage documentation)

- Distribution.Client.Compat.Process: readProcessWithExitCode :: FilePath -> [String] -> String -> IO (ExitCode, String, String)
- Distribution.Client.Config: getCabalDir :: IO FilePath
- Distribution.Client.ProjectConfig.Legacy: instantiateProjectConfigSkeleton :: OS -> Arch -> CompilerInfo -> FlagAssignment -> ProjectConfigSkeleton -> ProjectConfig
- Distribution.Client.ProjectOrchestration: CBenchName :: UnqualComponentName -> ComponentName
- Distribution.Client.ProjectOrchestration: CExeName :: UnqualComponentName -> ComponentName
- Distribution.Client.ProjectOrchestration: CFLibName :: UnqualComponentName -> ComponentName
- Distribution.Client.ProjectOrchestration: CTestName :: UnqualComponentName -> ComponentName
- Distribution.Client.ScriptUtils: getScriptCacheDirectoryRoot :: IO FilePath
- Distribution.Client.Utils.Json: instance Distribution.Client.Utils.Json.ToJSON GHC.Integer.Type.Integer
+ Distribution.Client.CmdBuild: BuildFlags :: Flag Bool -> BuildFlags
+ Distribution.Client.CmdBuild: [buildOnlyConfigure] :: BuildFlags -> Flag Bool
+ Distribution.Client.CmdBuild: data BuildFlags
+ Distribution.Client.CmdBuild: defaultBuildFlags :: BuildFlags
+ Distribution.Client.CmdErrorMessages: renderListPretty :: [String] -> String
+ Distribution.Client.CmdErrorMessages: renderListTabular :: [String] -> String
+ Distribution.Client.CmdHaddock: ClientHaddockFlags :: Flag Bool -> ClientHaddockFlags
+ Distribution.Client.CmdHaddock: [openInBrowser] :: ClientHaddockFlags -> Flag Bool
+ Distribution.Client.CmdHaddock: newtype ClientHaddockFlags
+ Distribution.Client.CmdHaddockProject: haddockProjectAction :: HaddockProjectFlags -> [String] -> GlobalFlags -> IO ()
+ Distribution.Client.CmdHaddockProject: haddockProjectCommand :: CommandUI HaddockProjectFlags
+ Distribution.Client.Config: defaultReportsDir :: IO FilePath
+ Distribution.Client.Config: defaultScriptBuildsDir :: IO FilePath
+ Distribution.Client.Config: defaultStoreDir :: IO FilePath
+ Distribution.Client.Dependency: PreferAllOldest :: PackagesPreferenceDefault
+ Distribution.Client.Dependency.Types: PreferAllOldest :: PackagesPreferenceDefault
+ Distribution.Client.FetchUtils: verifyFetchedTarball :: Verbosity -> RepoContext -> Repo -> PackageId -> IO Bool
+ Distribution.Client.PackageHash: [pkgHashExtraLibDirsStatic] :: PackageHashConfigInputs -> [FilePath]
+ Distribution.Client.PackageHash: [pkgHashHaddockBaseUrl] :: PackageHashConfigInputs -> Maybe String
+ Distribution.Client.PackageHash: [pkgHashHaddockIndex] :: PackageHashConfigInputs -> Maybe PathTemplate
+ Distribution.Client.PackageHash: [pkgHashHaddockLib] :: PackageHashConfigInputs -> Maybe String
+ Distribution.Client.ProjectConfig: [packageConfigHaddockBaseUrl] :: PackageConfig -> Flag String
+ Distribution.Client.ProjectConfig: [packageConfigHaddockIndex] :: PackageConfig -> Flag PathTemplate
+ Distribution.Client.ProjectConfig: [packageConfigHaddockLib] :: PackageConfig -> Flag String
+ Distribution.Client.ProjectConfig: [projectConfigInstallDirs] :: ProjectConfigShared -> InstallDirs (Flag PathTemplate)
+ Distribution.Client.ProjectConfig: [projectConfigPreferOldest] :: ProjectConfigShared -> Flag PreferOldest
+ Distribution.Client.ProjectConfig: [solverSettingPreferOldest] :: SolverSettings -> PreferOldest
+ Distribution.Client.ProjectConfig.Legacy: instantiateProjectConfigSkeletonFetchingCompiler :: Monad m => m (OS, Arch, CompilerInfo) -> FlagAssignment -> ProjectConfigSkeleton -> m ProjectConfig
+ Distribution.Client.ProjectConfig.Legacy: instantiateProjectConfigSkeletonWithCompiler :: OS -> Arch -> CompilerInfo -> FlagAssignment -> ProjectConfigSkeleton -> ProjectConfig
+ Distribution.Client.ProjectConfig.Types: [packageConfigHaddockBaseUrl] :: PackageConfig -> Flag String
+ Distribution.Client.ProjectConfig.Types: [packageConfigHaddockIndex] :: PackageConfig -> Flag PathTemplate
+ Distribution.Client.ProjectConfig.Types: [packageConfigHaddockLib] :: PackageConfig -> Flag String
+ Distribution.Client.ProjectConfig.Types: [projectConfigInstallDirs] :: ProjectConfigShared -> InstallDirs (Flag PathTemplate)
+ Distribution.Client.ProjectConfig.Types: [projectConfigPreferOldest] :: ProjectConfigShared -> Flag PreferOldest
+ Distribution.Client.ProjectConfig.Types: [solverSettingPreferOldest] :: SolverSettings -> PreferOldest
+ Distribution.Client.ProjectOrchestration: BuildCommand :: CurrentCommand
+ Distribution.Client.ProjectOrchestration: CNotLibName :: NotLibComponentName -> ComponentName
+ Distribution.Client.ProjectOrchestration: ReplCommand :: CurrentCommand
+ Distribution.Client.ProjectOrchestration: [installedPackages] :: ProjectBaseContext -> Maybe InstalledPackageIndex
+ Distribution.Client.ProjectOrchestration: pattern CBenchName :: UnqualComponentName -> ComponentName
+ Distribution.Client.ProjectOrchestration: pattern CExeName :: UnqualComponentName -> ComponentName
+ Distribution.Client.ProjectOrchestration: pattern CFLibName :: UnqualComponentName -> ComponentName
+ Distribution.Client.ProjectOrchestration: pattern CTestName :: UnqualComponentName -> ComponentName
+ Distribution.Client.ProjectPlanning: [elabHaddockBaseUrl] :: ElaboratedConfiguredPackage -> Maybe String
+ Distribution.Client.ProjectPlanning: [elabHaddockIndex] :: ElaboratedConfiguredPackage -> Maybe PathTemplate
+ Distribution.Client.ProjectPlanning: [elabHaddockLib] :: ElaboratedConfiguredPackage -> Maybe String
+ Distribution.Client.ProjectPlanning.Types: [elabHaddockBaseUrl] :: ElaboratedConfiguredPackage -> Maybe String
+ Distribution.Client.ProjectPlanning.Types: [elabHaddockIndex] :: ElaboratedConfiguredPackage -> Maybe PathTemplate
+ Distribution.Client.ProjectPlanning.Types: [elabHaddockLib] :: ElaboratedConfiguredPackage -> Maybe String
+ Distribution.Client.Setup: [fetchPreferOldest] :: FetchFlags -> Flag PreferOldest
+ Distribution.Client.Setup: [freezePreferOldest] :: FreezeFlags -> Flag PreferOldest
+ Distribution.Client.Setup: [getOnlyPkgDescr] :: GetFlags -> Flag Bool
+ Distribution.Client.Setup: [installPreferOldest] :: InstallFlags -> Flag PreferOldest
+ Distribution.Client.Signal: Terminated :: Terminated
+ Distribution.Client.Signal: data Terminated
+ Distribution.Client.Signal: installTerminationHandler :: IO ()
+ Distribution.Client.Signal: instance GHC.Exception.Type.Exception Distribution.Client.Signal.Terminated
+ Distribution.Client.Signal: instance GHC.Show.Show Distribution.Client.Signal.Terminated
+ Distribution.Client.Utils: hasElem :: Ord a => [a] -> a -> Bool
+ Distribution.Client.Utils.Json: instance Distribution.Client.Utils.Json.ToJSON GHC.Num.Integer.Integer
- Distribution.Client.DistDirLayout: defaultCabalDirLayout :: FilePath -> CabalDirLayout
+ Distribution.Client.DistDirLayout: defaultCabalDirLayout :: IO CabalDirLayout
- Distribution.Client.DistDirLayout: mkCabalDirLayout :: FilePath -> Maybe FilePath -> Maybe FilePath -> CabalDirLayout
+ Distribution.Client.DistDirLayout: mkCabalDirLayout :: Maybe FilePath -> Maybe FilePath -> IO CabalDirLayout
- Distribution.Client.Init.Utils: filePathToPkgName :: FilePath -> PackageName
+ Distribution.Client.Init.Utils: filePathToPkgName :: Interactive m => FilePath -> m PackageName
- Distribution.Client.PackageHash: PackageHashConfigInputs :: CompilerId -> Platform -> FlagAssignment -> [String] -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> ProfDetailLevel -> ProfDetailLevel -> Bool -> OptimisationLevel -> Bool -> Bool -> Bool -> Bool -> DebugInfoLevel -> Map String [String] -> [FilePath] -> [FilePath] -> [FilePath] -> Maybe PathTemplate -> Maybe PathTemplate -> [Maybe PackageDB] -> Bool -> Bool -> Bool -> Maybe String -> Bool -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Maybe PathTemplate -> PackageHashConfigInputs
+ Distribution.Client.PackageHash: PackageHashConfigInputs :: CompilerId -> Platform -> FlagAssignment -> [String] -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> ProfDetailLevel -> ProfDetailLevel -> Bool -> OptimisationLevel -> Bool -> Bool -> Bool -> Bool -> DebugInfoLevel -> Map String [String] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Maybe PathTemplate -> Maybe PathTemplate -> [Maybe PackageDB] -> Bool -> Bool -> Bool -> Maybe String -> Bool -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe String -> Maybe String -> PackageHashConfigInputs
- Distribution.Client.ProjectConfig: PackageConfig :: MapLast String FilePath -> MapMappend String [String] -> NubList FilePath -> FlagAssignment -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag ProfDetailLevel -> Flag ProfDetailLevel -> [String] -> Flag OptimisationLevel -> Flag PathTemplate -> Flag PathTemplate -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag DebugInfoLevel -> Flag DumpBuildInfo -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag String -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag PathTemplate -> Flag HaddockTarget -> Flag PathTemplate -> Flag PathTemplate -> Flag TestShowDetails -> Flag Bool -> Flag FilePath -> Flag Bool -> [PathTemplate] -> [PathTemplate] -> PackageConfig
+ Distribution.Client.ProjectConfig: PackageConfig :: MapLast String FilePath -> MapMappend String [String] -> NubList FilePath -> FlagAssignment -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag ProfDetailLevel -> Flag ProfDetailLevel -> [String] -> Flag OptimisationLevel -> Flag PathTemplate -> Flag PathTemplate -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag DebugInfoLevel -> Flag DumpBuildInfo -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag String -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag PathTemplate -> Flag PathTemplate -> Flag String -> Flag String -> Flag HaddockTarget -> Flag PathTemplate -> Flag PathTemplate -> Flag TestShowDetails -> Flag Bool -> Flag FilePath -> Flag Bool -> [PathTemplate] -> [PathTemplate] -> PackageConfig
- Distribution.Client.ProjectConfig: ProjectConfigShared :: Flag FilePath -> Flag FilePath -> Flag FilePath -> Flag Bool -> Flag CompilerFlavor -> Flag FilePath -> Flag FilePath -> Flag PathTemplate -> [Maybe PackageDB] -> NubList RemoteRepo -> NubList LocalRepo -> Flag ActiveRepos -> Flag TotalIndexState -> Flag FilePath -> [(UserConstraint, ConstraintSource)] -> [PackageVersionConstraint] -> Flag Version -> Flag PreSolver -> Maybe AllowOlder -> Maybe AllowNewer -> Flag WriteGhcEnvironmentFilesPolicy -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Bool -> Flag IndependentGoals -> NubList FilePath -> ProjectConfigShared
+ Distribution.Client.ProjectConfig: ProjectConfigShared :: Flag FilePath -> Flag FilePath -> Flag FilePath -> Flag Bool -> Flag CompilerFlavor -> Flag FilePath -> Flag FilePath -> Flag PathTemplate -> InstallDirs (Flag PathTemplate) -> [Maybe PackageDB] -> NubList RemoteRepo -> NubList LocalRepo -> Flag ActiveRepos -> Flag TotalIndexState -> Flag FilePath -> [(UserConstraint, ConstraintSource)] -> [PackageVersionConstraint] -> Flag Version -> Flag PreSolver -> Maybe AllowOlder -> Maybe AllowNewer -> Flag WriteGhcEnvironmentFilesPolicy -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Bool -> Flag IndependentGoals -> Flag PreferOldest -> NubList FilePath -> ProjectConfigShared
- Distribution.Client.ProjectConfig: SolverSettings :: [RemoteRepo] -> [LocalRepo] -> [(UserConstraint, ConstraintSource)] -> [PackageVersionConstraint] -> FlagAssignment -> Map PackageName FlagAssignment -> Maybe Version -> PreSolver -> AllowOlder -> AllowNewer -> Maybe Int -> ReorderGoals -> CountConflicts -> FineGrainedConflicts -> MinimizeConflictSet -> StrongFlags -> AllowBootLibInstalls -> OnlyConstrained -> Maybe TotalIndexState -> Maybe ActiveRepos -> IndependentGoals -> SolverSettings
+ Distribution.Client.ProjectConfig: SolverSettings :: [RemoteRepo] -> [LocalRepo] -> [(UserConstraint, ConstraintSource)] -> [PackageVersionConstraint] -> FlagAssignment -> Map PackageName FlagAssignment -> Maybe Version -> PreSolver -> AllowOlder -> AllowNewer -> Maybe Int -> ReorderGoals -> CountConflicts -> FineGrainedConflicts -> MinimizeConflictSet -> StrongFlags -> AllowBootLibInstalls -> OnlyConstrained -> Maybe TotalIndexState -> Maybe ActiveRepos -> IndependentGoals -> PreferOldest -> SolverSettings
- Distribution.Client.ProjectConfig.Types: PackageConfig :: MapLast String FilePath -> MapMappend String [String] -> NubList FilePath -> FlagAssignment -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag ProfDetailLevel -> Flag ProfDetailLevel -> [String] -> Flag OptimisationLevel -> Flag PathTemplate -> Flag PathTemplate -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag DebugInfoLevel -> Flag DumpBuildInfo -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag String -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag PathTemplate -> Flag HaddockTarget -> Flag PathTemplate -> Flag PathTemplate -> Flag TestShowDetails -> Flag Bool -> Flag FilePath -> Flag Bool -> [PathTemplate] -> [PathTemplate] -> PackageConfig
+ Distribution.Client.ProjectConfig.Types: PackageConfig :: MapLast String FilePath -> MapMappend String [String] -> NubList FilePath -> FlagAssignment -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag ProfDetailLevel -> Flag ProfDetailLevel -> [String] -> Flag OptimisationLevel -> Flag PathTemplate -> Flag PathTemplate -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag DebugInfoLevel -> Flag DumpBuildInfo -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag String -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag Bool -> Flag Bool -> Flag FilePath -> Flag PathTemplate -> Flag PathTemplate -> Flag String -> Flag String -> Flag HaddockTarget -> Flag PathTemplate -> Flag PathTemplate -> Flag TestShowDetails -> Flag Bool -> Flag FilePath -> Flag Bool -> [PathTemplate] -> [PathTemplate] -> PackageConfig
- Distribution.Client.ProjectConfig.Types: ProjectConfigShared :: Flag FilePath -> Flag FilePath -> Flag FilePath -> Flag Bool -> Flag CompilerFlavor -> Flag FilePath -> Flag FilePath -> Flag PathTemplate -> [Maybe PackageDB] -> NubList RemoteRepo -> NubList LocalRepo -> Flag ActiveRepos -> Flag TotalIndexState -> Flag FilePath -> [(UserConstraint, ConstraintSource)] -> [PackageVersionConstraint] -> Flag Version -> Flag PreSolver -> Maybe AllowOlder -> Maybe AllowNewer -> Flag WriteGhcEnvironmentFilesPolicy -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Bool -> Flag IndependentGoals -> NubList FilePath -> ProjectConfigShared
+ Distribution.Client.ProjectConfig.Types: ProjectConfigShared :: Flag FilePath -> Flag FilePath -> Flag FilePath -> Flag Bool -> Flag CompilerFlavor -> Flag FilePath -> Flag FilePath -> Flag PathTemplate -> InstallDirs (Flag PathTemplate) -> [Maybe PackageDB] -> NubList RemoteRepo -> NubList LocalRepo -> Flag ActiveRepos -> Flag TotalIndexState -> Flag FilePath -> [(UserConstraint, ConstraintSource)] -> [PackageVersionConstraint] -> Flag Version -> Flag PreSolver -> Maybe AllowOlder -> Maybe AllowNewer -> Flag WriteGhcEnvironmentFilesPolicy -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Bool -> Flag IndependentGoals -> Flag PreferOldest -> NubList FilePath -> ProjectConfigShared
- Distribution.Client.ProjectConfig.Types: SolverSettings :: [RemoteRepo] -> [LocalRepo] -> [(UserConstraint, ConstraintSource)] -> [PackageVersionConstraint] -> FlagAssignment -> Map PackageName FlagAssignment -> Maybe Version -> PreSolver -> AllowOlder -> AllowNewer -> Maybe Int -> ReorderGoals -> CountConflicts -> FineGrainedConflicts -> MinimizeConflictSet -> StrongFlags -> AllowBootLibInstalls -> OnlyConstrained -> Maybe TotalIndexState -> Maybe ActiveRepos -> IndependentGoals -> SolverSettings
+ Distribution.Client.ProjectConfig.Types: SolverSettings :: [RemoteRepo] -> [LocalRepo] -> [(UserConstraint, ConstraintSource)] -> [PackageVersionConstraint] -> FlagAssignment -> Map PackageName FlagAssignment -> Maybe Version -> PreSolver -> AllowOlder -> AllowNewer -> Maybe Int -> ReorderGoals -> CountConflicts -> FineGrainedConflicts -> MinimizeConflictSet -> StrongFlags -> AllowBootLibInstalls -> OnlyConstrained -> Maybe TotalIndexState -> Maybe ActiveRepos -> IndependentGoals -> PreferOldest -> SolverSettings
- Distribution.Client.ProjectOrchestration: ProjectBaseContext :: DistDirLayout -> CabalDirLayout -> ProjectConfig -> [PackageSpecifier UnresolvedSourcePackage] -> BuildTimeSettings -> CurrentCommand -> ProjectBaseContext
+ Distribution.Client.ProjectOrchestration: ProjectBaseContext :: DistDirLayout -> CabalDirLayout -> ProjectConfig -> [PackageSpecifier UnresolvedSourcePackage] -> BuildTimeSettings -> CurrentCommand -> Maybe InstalledPackageIndex -> ProjectBaseContext
- Distribution.Client.ProjectPlanning: ElaboratedConfiguredPackage :: UnitId -> ComponentId -> Map ModuleName Module -> Map ModuleName OpenModule -> Bool -> PackageId -> ModuleShape -> FlagAssignment -> FlagAssignment -> PackageDescription -> PackageLocation (Maybe FilePath) -> Maybe PackageSourceHash -> Bool -> BuildStyle -> ComponentRequestedSpec -> OptionalStanzaSet -> OptionalStanzaMap (Maybe Bool) -> [Maybe PackageDB] -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> Maybe CabalFileText -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> ProfDetailLevel -> ProfDetailLevel -> Bool -> OptimisationLevel -> Bool -> Bool -> Bool -> Bool -> DebugInfoLevel -> DumpBuildInfo -> Map String FilePath -> Map String [String] -> [FilePath] -> [String] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Maybe PathTemplate -> Maybe PathTemplate -> InstallDirs FilePath -> Bool -> Bool -> Maybe String -> Bool -> HaddockTarget -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Maybe FilePath -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe TestShowDetails -> Bool -> Maybe FilePath -> Bool -> [PathTemplate] -> [PathTemplate] -> SetupScriptStyle -> Version -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> Maybe ComponentTarget -> [ComponentTarget] -> Bool -> ElaboratedPackageOrComponent -> ElaboratedConfiguredPackage
+ Distribution.Client.ProjectPlanning: ElaboratedConfiguredPackage :: UnitId -> ComponentId -> Map ModuleName Module -> Map ModuleName OpenModule -> Bool -> PackageId -> ModuleShape -> FlagAssignment -> FlagAssignment -> PackageDescription -> PackageLocation (Maybe FilePath) -> Maybe PackageSourceHash -> Bool -> BuildStyle -> ComponentRequestedSpec -> OptionalStanzaSet -> OptionalStanzaMap (Maybe Bool) -> [Maybe PackageDB] -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> Maybe CabalFileText -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> ProfDetailLevel -> ProfDetailLevel -> Bool -> OptimisationLevel -> Bool -> Bool -> Bool -> Bool -> DebugInfoLevel -> DumpBuildInfo -> Map String FilePath -> Map String [String] -> [FilePath] -> [String] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Maybe PathTemplate -> Maybe PathTemplate -> InstallDirs FilePath -> Bool -> Bool -> Maybe String -> Bool -> HaddockTarget -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Maybe FilePath -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe String -> Maybe String -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe TestShowDetails -> Bool -> Maybe FilePath -> Bool -> [PathTemplate] -> [PathTemplate] -> SetupScriptStyle -> Version -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> Maybe ComponentTarget -> [ComponentTarget] -> Bool -> ElaboratedPackageOrComponent -> ElaboratedConfiguredPackage
- Distribution.Client.ProjectPlanning: rebuildInstallPlan :: Verbosity -> DistDirLayout -> CabalDirLayout -> ProjectConfig -> [PackageSpecifier UnresolvedSourcePackage] -> IO (ElaboratedInstallPlan, ElaboratedInstallPlan, ElaboratedSharedConfig, TotalIndexState, ActiveRepos)
+ Distribution.Client.ProjectPlanning: rebuildInstallPlan :: Verbosity -> DistDirLayout -> CabalDirLayout -> ProjectConfig -> [PackageSpecifier UnresolvedSourcePackage] -> Maybe InstalledPackageIndex -> IO (ElaboratedInstallPlan, ElaboratedInstallPlan, ElaboratedSharedConfig, TotalIndexState, ActiveRepos)
- Distribution.Client.ProjectPlanning.Types: ElaboratedConfiguredPackage :: UnitId -> ComponentId -> Map ModuleName Module -> Map ModuleName OpenModule -> Bool -> PackageId -> ModuleShape -> FlagAssignment -> FlagAssignment -> PackageDescription -> PackageLocation (Maybe FilePath) -> Maybe PackageSourceHash -> Bool -> BuildStyle -> ComponentRequestedSpec -> OptionalStanzaSet -> OptionalStanzaMap (Maybe Bool) -> [Maybe PackageDB] -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> Maybe CabalFileText -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> ProfDetailLevel -> ProfDetailLevel -> Bool -> OptimisationLevel -> Bool -> Bool -> Bool -> Bool -> DebugInfoLevel -> DumpBuildInfo -> Map String FilePath -> Map String [String] -> [FilePath] -> [String] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Maybe PathTemplate -> Maybe PathTemplate -> InstallDirs FilePath -> Bool -> Bool -> Maybe String -> Bool -> HaddockTarget -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Maybe FilePath -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe TestShowDetails -> Bool -> Maybe FilePath -> Bool -> [PathTemplate] -> [PathTemplate] -> SetupScriptStyle -> Version -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> Maybe ComponentTarget -> [ComponentTarget] -> Bool -> ElaboratedPackageOrComponent -> ElaboratedConfiguredPackage
+ Distribution.Client.ProjectPlanning.Types: ElaboratedConfiguredPackage :: UnitId -> ComponentId -> Map ModuleName Module -> Map ModuleName OpenModule -> Bool -> PackageId -> ModuleShape -> FlagAssignment -> FlagAssignment -> PackageDescription -> PackageLocation (Maybe FilePath) -> Maybe PackageSourceHash -> Bool -> BuildStyle -> ComponentRequestedSpec -> OptionalStanzaSet -> OptionalStanzaMap (Maybe Bool) -> [Maybe PackageDB] -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> PackageDBStack -> Maybe CabalFileText -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> ProfDetailLevel -> ProfDetailLevel -> Bool -> OptimisationLevel -> Bool -> Bool -> Bool -> Bool -> DebugInfoLevel -> DumpBuildInfo -> Map String FilePath -> Map String [String] -> [FilePath] -> [String] -> [FilePath] -> [FilePath] -> [FilePath] -> [FilePath] -> Maybe PathTemplate -> Maybe PathTemplate -> InstallDirs FilePath -> Bool -> Bool -> Maybe String -> Bool -> HaddockTarget -> Bool -> Bool -> Bool -> Bool -> Maybe FilePath -> Bool -> Bool -> Maybe FilePath -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe String -> Maybe String -> Maybe PathTemplate -> Maybe PathTemplate -> Maybe TestShowDetails -> Bool -> Maybe FilePath -> Bool -> [PathTemplate] -> [PathTemplate] -> SetupScriptStyle -> Version -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> [ComponentTarget] -> Maybe ComponentTarget -> [ComponentTarget] -> Bool -> ElaboratedPackageOrComponent -> ElaboratedConfiguredPackage
- Distribution.Client.ScriptUtils: withContextAndSelectors :: AcceptNoTargets -> Maybe ComponentKind -> NixStyleFlags a -> [String] -> GlobalFlags -> (TargetContext -> ProjectBaseContext -> [TargetSelector] -> IO b) -> IO b
+ Distribution.Client.ScriptUtils: withContextAndSelectors :: AcceptNoTargets -> Maybe ComponentKind -> NixStyleFlags a -> [String] -> GlobalFlags -> CurrentCommand -> (TargetContext -> ProjectBaseContext -> [TargetSelector] -> IO b) -> IO b
- Distribution.Client.Setup: FetchFlags :: Flag Bool -> Flag Bool -> Flag PreSolver -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag IndependentGoals -> Flag ShadowPkgs -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Bool -> Flag Bool -> Flag Verbosity -> FetchFlags
+ Distribution.Client.Setup: FetchFlags :: Flag Bool -> Flag Bool -> Flag PreSolver -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag IndependentGoals -> Flag PreferOldest -> Flag ShadowPkgs -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Bool -> Flag Bool -> Flag Verbosity -> FetchFlags
- Distribution.Client.Setup: FreezeFlags :: Flag Bool -> Flag Bool -> Flag Bool -> Flag PreSolver -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag IndependentGoals -> Flag ShadowPkgs -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Verbosity -> FreezeFlags
+ Distribution.Client.Setup: FreezeFlags :: Flag Bool -> Flag Bool -> Flag Bool -> Flag PreSolver -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag IndependentGoals -> Flag PreferOldest -> Flag ShadowPkgs -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Verbosity -> FreezeFlags
- Distribution.Client.Setup: GetFlags :: Flag FilePath -> Flag Bool -> Flag TotalIndexState -> Flag ActiveRepos -> Flag (Maybe RepoKind) -> Flag Verbosity -> GetFlags
+ Distribution.Client.Setup: GetFlags :: Flag FilePath -> Flag Bool -> Flag Bool -> Flag TotalIndexState -> Flag ActiveRepos -> Flag (Maybe RepoKind) -> Flag Verbosity -> GetFlags
- Distribution.Client.Setup: InstallFlags :: Flag Bool -> Flag PathTemplate -> Flag CopyDest -> Flag Bool -> Flag Bool -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag IndependentGoals -> Flag ShadowPkgs -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Bool -> Flag AvoidReinstalls -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag TotalIndexState -> Flag String -> NubList PathTemplate -> Flag PathTemplate -> Flag ReportLevel -> Flag Bool -> Flag FilePath -> Flag Bool -> Flag (Maybe Int) -> Flag Bool -> Flag Bool -> Flag Bool -> InstallFlags
+ Distribution.Client.Setup: InstallFlags :: Flag Bool -> Flag PathTemplate -> Flag CopyDest -> Flag Bool -> Flag Bool -> Flag Int -> Flag ReorderGoals -> Flag CountConflicts -> Flag FineGrainedConflicts -> Flag MinimizeConflictSet -> Flag IndependentGoals -> Flag PreferOldest -> Flag ShadowPkgs -> Flag StrongFlags -> Flag AllowBootLibInstalls -> Flag OnlyConstrained -> Flag Bool -> Flag AvoidReinstalls -> Flag Bool -> Flag Bool -> Flag Bool -> Flag Bool -> Flag TotalIndexState -> Flag String -> NubList PathTemplate -> Flag PathTemplate -> Flag ReportLevel -> Flag Bool -> Flag FilePath -> Flag Bool -> Flag (Maybe Int) -> Flag Bool -> Flag Bool -> Flag Bool -> InstallFlags

Files

LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2003-2022, Cabal Development Team.+Copyright (c) 2003-2023, Cabal Development Team. See the AUTHORS file for the full list of copyright holders.  See */LICENSE for the copyright holders of the subcomponents.
cabal-install.cabal view
@@ -1,7 +1,7 @@ Cabal-Version:      2.2  Name:               cabal-install-Version:            3.8.1.0+Version:            3.10.1.0 Synopsis:           The command-line interface for Cabal and Hackage. Description:     The \'cabal\' command-line program simplifies the process of managing@@ -13,7 +13,7 @@ License-File:       LICENSE Author:             Cabal Development Team (see AUTHORS file) Maintainer:         Cabal Development Team <cabal-devel@haskell.org>-Copyright:          2003-2022, Cabal Development Team+Copyright:          2003-2023, Cabal Development Team Category:           Distribution Build-type:         Simple Extra-Source-Files:@@ -46,20 +46,21 @@       ghc-options: -Wunused-packages  common base-dep-    build-depends: base >=4.10 && <4.17+    build-depends: base >=4.10 && <4.18  common cabal-dep-    build-depends: Cabal ^>=3.8+    build-depends: Cabal ^>=3.10  common cabal-syntax-dep-    build-depends: Cabal-syntax ^>=3.8+    build-depends: Cabal-syntax ^>=3.10  common cabal-install-solver-dep-    build-depends: cabal-install-solver ^>=3.8+    build-depends: cabal-install-solver ^>=3.10  library     import: warnings, base-dep, cabal-dep, cabal-syntax-dep, cabal-install-solver-dep     default-language: Haskell2010+    default-extensions: TypeOperators      hs-source-dirs:   src     exposed-modules:@@ -83,6 +84,7 @@         Distribution.Client.CmdExec         Distribution.Client.CmdFreeze         Distribution.Client.CmdHaddock+        Distribution.Client.CmdHaddockProject         Distribution.Client.CmdInstall         Distribution.Client.CmdInstall.ClientInstallFlags         Distribution.Client.CmdInstall.ClientInstallTargetSelector@@ -98,7 +100,6 @@         Distribution.Client.Compat.ExecutablePath         Distribution.Client.Compat.Orphans         Distribution.Client.Compat.Prelude-        Distribution.Client.Compat.Process         Distribution.Client.Compat.Semaphore         Distribution.Client.Config         Distribution.Client.Configure@@ -166,6 +167,7 @@         Distribution.Client.Security.HTTP         Distribution.Client.Setup         Distribution.Client.SetupWrapper+        Distribution.Client.Signal         Distribution.Client.SolverInstallPlan         Distribution.Client.SourceFiles         Distribution.Client.SrcDist@@ -206,24 +208,24 @@         bytestring >= 0.10.6.0 && < 0.12,         containers >= 0.5.6.2  && < 0.7,         cryptohash-sha256 >= 0.11 && < 0.12,-        directory  >= 1.2.2.0  && < 1.4,+        directory  >= 1.3.7.0  && < 1.4,         echo       >= 0.1.3    && < 0.2,         edit-distance >= 0.2.2 && < 0.3,         exceptions >= 0.10.4   && < 0.11,         filepath   >= 1.4.0.0  && < 1.5,         hashable   >= 1.0      && < 1.5,         HTTP       >= 4000.1.5 && < 4000.5,-        mtl        >= 2.0      && < 2.3,+        mtl        >= 2.0      && < 2.4,         network-uri >= 2.6.0.2 && < 2.7,         pretty     >= 1.1      && < 1.2,         process    >= 1.2.3.0  && < 1.7,         random     >= 1.2      && < 1.3,         stm        >= 2.0      && < 2.6,         tar        >= 0.5.0.3  && < 0.6,-        time       >= 1.5.0.1  && < 1.12,+        time       >= 1.5.0.1  && < 1.13,         zlib       >= 0.5.3    && < 0.7,         hackage-security >= 0.6.2.0 && < 0.7,-        text       >= 1.2.3    && < 1.3,+        text       >= 1.2.3    && < 1.3 || >= 2.0 && < 2.1,         parsec     >= 3.1.13.0 && < 3.2,         regex-base  >= 0.94.0.0 && <0.95,         regex-posix >= 0.96.0.0 && <0.97,@@ -244,7 +246,11 @@     if flag(lukko)       build-depends: lukko >= 0.1 && <0.2 +   -- pull in process version with fixed waitForProcess error+   if impl(ghc >=8.2)+     build-depends: process >= 1.6.15.0 + executable cabal     import: warnings, base-dep, cabal-dep, cabal-syntax-dep     main-is: Main.hs@@ -267,6 +273,7 @@ test-suite unit-tests     import: warnings, base-dep, cabal-dep, cabal-syntax-dep, cabal-install-solver-dep     default-language: Haskell2010+    default-extensions: TypeOperators     ghc-options: -rtsopts -threaded      type: exitcode-stdio-1.0
changelog view
@@ -1,5 +1,8 @@ -*-change-log-*- +3.10.1.0 Mikolaj Konarski <mikolaj@well-typed.com> March 2023+	* See https://github.com/haskell/cabal/blob/master/release-notes/cabal-install-3.10.1.0.md+ 3.8.1.0 Mikolaj Konarski <mikolaj@well-typed.com> August 2022 	* See https://github.com/haskell/cabal/blob/master/release-notes/cabal-install-3.8.1.0.md @@ -169,7 +172,7 @@ 	* Default changelog generated by 'cabal init' is now named 	  'CHANGELOG.md' (#5441). 	* Align output of 'new-build' command phases (#4040).-	* Add suport for specifying remote VCS dependencies via new+	* Add support for specifying remote VCS dependencies via new 	  'source-repository-package' stanzas in 'cabal.project' files 	  (#5351). @@ -206,7 +209,7 @@ 	* Use [lfxtb] letters to differentiate component kind instead of 	opaque "c" in dist-dir layout. 	* 'cabal configure' now supports '--enable-static', which can be-	used to build static libaries with GHC via GHC's `-staticlib`+	used to build static libraries with GHC via GHC's `-staticlib` 	flag. 	* 'cabal user-config now supports '--augment' which can append 	additional lines to a new or updated cabal config file.@@ -226,7 +229,7 @@ 	when it wasn't necessary (#4444). 	* Packages installed in sandboxes via 'add-source' now have 	their timestamps updated correctly and so will not be reinstalled-	unncecessarily if the main install command fails (#1375).+	unnecessarily if the main install command fails (#1375). 	* Add Windows device path support for copyFile, renameFile. Allows cabal 	new-build to use temporary store path of up to 32k length 	(#3972, #4914, #4515).@@ -577,9 +580,9 @@ 	* Improved bootstrap.sh  0.5.2 Duncan Coutts <duncan@haskell.org> Aug 2008-	* Suport building haddock documentaion+	* Support building haddock documentation 	* Self-reinstall now works on Windows-	* Allow adding symlinks to excutables into a separate bindir+	* Allow adding symlinks to executables into a separate bindir 	* New self-documenting config file 	* New install --reinstall flag 	* More helpful status messages in a couple places
main/Main.hs view
@@ -1,4 +1,6 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE ScopedTypeVariables #-}  ----------------------------------------------------------------------------- -- |@@ -78,6 +80,7 @@ import qualified Distribution.Client.CmdRepl      as CmdRepl import qualified Distribution.Client.CmdFreeze    as CmdFreeze import qualified Distribution.Client.CmdHaddock   as CmdHaddock+import qualified Distribution.Client.CmdHaddockProject as CmdHaddockProject import qualified Distribution.Client.CmdInstall   as CmdInstall import qualified Distribution.Client.CmdRun       as CmdRun import qualified Distribution.Client.CmdTest      as CmdTest@@ -113,6 +116,8 @@ import Distribution.Client.ManpageFlags       (ManpageFlags (..)) import Distribution.Client.Utils          ( determineNumJobs, relaxEncodingErrors )+import Distribution.Client.Signal+         ( installTerminationHandler ) import Distribution.Client.Version          ( cabalInstallVersion ) @@ -159,20 +164,22 @@ import System.FilePath          ( dropExtension, splitExtension                                 , takeExtension, (</>), (<.>) ) import System.IO                ( BufferMode(LineBuffering), hSetBuffering-                                , stderr, stdout )+                                , hPutStrLn, stderr, stdout ) import System.Directory         ( doesFileExist, getCurrentDirectory                                 , withCurrentDirectory) import Data.Monoid              (Any(..))-import Control.Exception        (try)+import Control.Exception        (AssertionFailed, assert, try)   -- | Entry point -- main :: IO () main = do+  installTerminationHandler   -- Enable line buffering so that we can get fast feedback even when piped.   -- This is especially important for CI and build systems.   hSetBuffering stdout LineBuffering+   -- If the locale encoding for CLI doesn't support all Unicode characters,   -- printing to it may fail unless we relax the handling of encoding errors   -- when writing to stderr and stdout.@@ -181,12 +188,20 @@   (args0, args1) <- break (== "--") <$> getArgs   mainWorker =<< (++ args1) <$> expandResponse args0 +-- | Check whether assertions are enabled and print a warning in that case.+warnIfAssertionsAreEnabled :: IO ()+warnIfAssertionsAreEnabled =+  assert False (return ()) `catch`+  (\(_e :: AssertionFailed) -> hPutStrLn stderr assertionsEnabledMsg)+    -- Andreas, 2022-12-30, issue #8654:+    -- The verbosity machinery is not in place at this point (option -v not parsed),+    -- so instead of using function @warn@, we print straight to stderr.+  where+    assertionsEnabledMsg =+      "Warning: this is a debug build of cabal-install with assertions enabled."+ mainWorker :: [String] -> IO () mainWorker args = do-  maybeScriptAndArgs <- case args of-    []     -> return Nothing-    (h:tl) -> (\b -> if b then Just (h:|tl) else Nothing) <$> CmdRun.validScript h-   topHandler $     case commandsRun (globalCommand commands) commands args of       CommandHelp   help                 -> printGlobalHelp help@@ -200,10 +215,23 @@               -> printNumericVersion           CommandHelp     help           -> printCommandHelp help           CommandList     opts           -> printOptionsList opts-          CommandErrors   errs           -> maybe (printErrors errs) go maybeScriptAndArgs where-            go (script:|scriptArgs) = CmdRun.handleShebang script scriptArgs-          CommandReadyToGo action        -> action globalFlags +          CommandErrors   errs           -> do+            -- Check whether cabal is called from a script, like #!/path/to/cabal.+            case args of+              []      -> printErrors errs+              script : scriptArgs -> CmdRun.validScript script >>= \case+                False -> printErrors errs+                True  -> do+                  -- In main operation (not help, version etc.) print warning if assertions are on.+                  warnIfAssertionsAreEnabled+                  CmdRun.handleShebang script scriptArgs++          CommandReadyToGo action        -> do+            -- In main operation (not help, version etc.) print warning if assertions are on.+            warnIfAssertionsAreEnabled+            action globalFlags+   where     printCommandHelp help = do       pname <- getProgName@@ -254,6 +282,8 @@       , newCmd  CmdRepl.replCommand           CmdRepl.replAction       , newCmd  CmdFreeze.freezeCommand       CmdFreeze.freezeAction       , newCmd  CmdHaddock.haddockCommand     CmdHaddock.haddockAction+      , newCmd  CmdHaddockProject.haddockProjectCommand+                                              CmdHaddockProject.haddockProjectAction       , newCmd  CmdInstall.installCommand     CmdInstall.installAction       , newCmd  CmdRun.runCommand             CmdRun.runAction       , newCmd  CmdTest.testCommand           CmdTest.testAction@@ -409,7 +439,7 @@       buildNumJobs = NoFlag       }     buildFlags_latest     = buildFlags {-      -- Take the 'jobs' setting '~/.cabal/config' into account.+      -- Take the 'jobs' setting config file into account.       buildNumJobs = Flag . Just . determineNumJobs $                      (numJobsConfigFlag `mappend` numJobsCmdLineFlag)       }
src/Distribution/Client/BuildReports/Anonymous.hs view
@@ -37,7 +37,7 @@ import Distribution.Client.Version            (cabalInstallVersion) import Distribution.Compiler                  (CompilerId (..)) import Distribution.FieldGrammar-import Distribution.Fields                   +import Distribution.Fields import Distribution.Package                   (PackageIdentifier (..), mkPackageName) import Distribution.PackageDescription        (FlagAssignment) import Distribution.Parsec
src/Distribution/Client/Check.hs view
@@ -26,7 +26,7 @@ import Distribution.PackageDescription.Configuration (flattenPackageDescription) import Distribution.PackageDescription.Parsec        (parseGenericPackageDescription, runParseResult)-import Distribution.Parsec                           (PWarning (..), showPError, showPWarning)+import Distribution.Parsec                           (PWarning (..), showPError) import Distribution.Simple.Utils                     (defaultPackageDesc, die', notice, warn) import System.IO                                     (hPutStr, stderr) @@ -55,8 +55,7 @@     pdfile <- defaultPackageDesc verbosity     (ws, ppd) <- readGenericPackageDescriptionCheck verbosity pdfile     -- convert parse warnings into PackageChecks-    -- Note: we /could/ pick different levels, based on warning type.-    let ws' = [ PackageDistSuspicious (showPWarning pdfile w) | w <- ws ]+    let ws' = map (wrapParseWarning pdfile) ws     -- flatten the generic package description into a regular package     -- description     -- TODO: this may give more warnings than it should give;@@ -111,4 +110,6 @@     return (not . any isCheckError $ packageChecks)    where-    printCheckMessages = traverse_ (warn verbosity . explanation)+    printCheckMessages :: [PackageCheck] -> IO ()+    printCheckMessages = traverse_ (warn verbosity) . map show+        -- xxx mapM_ o traverse?
src/Distribution/Client/CmdBench.hs view
@@ -118,7 +118,7 @@     runProjectPostBuildPhase verbosity baseCtx buildCtx buildOutcomes   where     verbosity = fromFlagOrDefault normal (configVerbosity configFlags)-    cliConfig = commandLineFlagsToProjectConfig globalFlags flags +    cliConfig = commandLineFlagsToProjectConfig globalFlags flags                   mempty -- ClientInstallFlags, not needed here  -- | This defines what a 'TargetSelector' means for the @bench@ command.
src/Distribution/Client/CmdBuild.hs view
@@ -6,6 +6,9 @@     buildCommand,     buildAction, +    BuildFlags(..),+    defaultBuildFlags,+     -- * Internals exposed for testing     selectPackageTargets,     selectComponentTarget@@ -98,7 +101,7 @@ -- buildAction :: NixStyleFlags BuildFlags -> [String] -> GlobalFlags -> IO () buildAction flags@NixStyleFlags { extraFlags = buildFlags, ..} targetStrings globalFlags-  = withContextAndSelectors RejectNoTargets Nothing flags targetStrings globalFlags $ \targetCtx ctx targetSelectors -> do+  = withContextAndSelectors RejectNoTargets Nothing flags targetStrings globalFlags BuildCommand $ \targetCtx ctx targetSelectors -> do     -- TODO: This flags defaults business is ugly     let onlyConfigure = fromFlag (buildOnlyConfigure defaultBuildFlags                                  <> buildOnlyConfigure buildFlags)
src/Distribution/Client/CmdClean.hs view
@@ -4,12 +4,12 @@ import Prelude () import Distribution.Client.Compat.Prelude +import Distribution.Client.Config+    ( defaultScriptBuildsDir ) import Distribution.Client.DistDirLayout     ( DistDirLayout(..), defaultDistDirLayout ) import Distribution.Client.ProjectConfig     ( findProjectRoot )-import Distribution.Client.ScriptUtils-    ( getScriptCacheDirectoryRoot ) import Distribution.Client.Setup     ( GlobalFlags ) import Distribution.ReadE ( succeedReadE )@@ -121,7 +121,7 @@     -- There is currently no good way to specify to only clean orphaned caches.     -- It would be better as part of an explicit gc step (see issue #3333)     toClean  <- Set.fromList <$> mapM canonicalizePath extraArgs-    cacheDir <- getScriptCacheDirectoryRoot+    cacheDir <- defaultScriptBuildsDir     existsCD <- doesDirectoryExist cacheDir     caches   <- if existsCD then listDirectory cacheDir else return []     paths    <- fmap concat . forM caches $ \cache -> do
src/Distribution/Client/CmdErrorMessages.hs view
@@ -72,6 +72,13 @@ renderListCommaAnd [x,x'] = x ++ " and " ++ x' renderListCommaAnd (x:xs) = x ++ ", " ++ renderListCommaAnd xs +renderListTabular :: [String] -> String+renderListTabular = ("\n"++) . unlines . map ("| * "++)++renderListPretty :: [String] -> String+renderListPretty xs = if length xs > 5 then renderListTabular xs+                                       else renderListCommaAnd xs+ -- | Render a list of things in the style @blah blah; this that; and the other@ renderListSemiAnd :: [String] -> String renderListSemiAnd []     = ""
src/Distribution/Client/CmdFreeze.hs view
@@ -115,6 +115,7 @@                          distDirLayout cabalDirLayout                          projectConfig                          localPackages+                         Nothing      let freezeConfig = projectFreezeConfig elaboratedPlan totalIndexState activeRepos         dryRun = buildSettingDryRun buildSettings@@ -233,4 +234,3 @@         | InstallPlan.Configured elab <- InstallPlan.toList plan         , elabLocalToProject elab         ]-
src/Distribution/Client/CmdHaddock.hs view
@@ -7,6 +7,8 @@     haddockCommand,     haddockAction, +    ClientHaddockFlags(..),+     -- * Internals exposed for testing     selectPackageTargets,     selectComponentTarget@@ -16,17 +18,23 @@ import Prelude ()  import Distribution.Client.ProjectOrchestration+import Distribution.Client.ProjectPlanning+         ( ElaboratedSharedConfig(..) ) import Distribution.Client.CmdErrorMessages import Distribution.Client.TargetProblem          ( TargetProblem (..), TargetProblem' ) import Distribution.Client.NixStyleOptions          ( NixStyleFlags (..), nixStyleOptions, defaultNixStyleFlags ) import Distribution.Client.Setup-         ( GlobalFlags, ConfigFlags(..) )+         ( GlobalFlags, ConfigFlags(..), InstallFlags (..)) import Distribution.Simple.Setup          ( HaddockFlags(..), fromFlagOrDefault, trueArg ) import Distribution.Simple.Command          ( CommandUI(..), usageAlternatives, ShowOrParseArgs, OptionField, option )+import Distribution.Simple.Program.Builtin+         ( haddockProgram )+import Distribution.Simple.Program.Db+         ( addKnownProgram, reconfigurePrograms ) import Distribution.Verbosity          ( normal ) import Distribution.Simple.Utils@@ -118,11 +126,26 @@      printPlan verbosity baseCtx buildCtx -    buildOutcomes <- runProjectBuildPhase verbosity baseCtx buildCtx-    runProjectPostBuildPhase verbosity baseCtx buildCtx buildOutcomes+    progs <- reconfigurePrograms verbosity+               (haddockProgramPaths haddockFlags)+               (haddockProgramArgs haddockFlags)+             -- we need to insert 'haddockProgram' before we reconfigure it,+             -- otherwise 'set+           . addKnownProgram haddockProgram+           . pkgConfigCompilerProgs+           . elaboratedShared+           $ buildCtx+    let buildCtx' = buildCtx { elaboratedShared =+                               (elaboratedShared buildCtx)+                               { pkgConfigCompilerProgs = progs } }++    buildOutcomes <- runProjectBuildPhase verbosity baseCtx buildCtx'+    runProjectPostBuildPhase verbosity baseCtx buildCtx' buildOutcomes   where     verbosity = fromFlagOrDefault normal (configVerbosity configFlags)-    cliConfig = commandLineFlagsToProjectConfig globalFlags flags mempty -- ClientInstallFlags, not needed here+    installDoc = fromFlagOrDefault True (installDocumentation installFlags)+    flags' = flags { installFlags = installFlags { installDocumentation = Flag installDoc } }+    cliConfig = commandLineFlagsToProjectConfig globalFlags flags' mempty -- ClientInstallFlags, not needed here  -- | This defines what a 'TargetSelector' means for the @haddock@ command. -- It selects the 'AvailableTarget's that the 'TargetSelector' refers to,
+ src/Distribution/Client/CmdHaddockProject.hs view
@@ -0,0 +1,337 @@+module Distribution.Client.CmdHaddockProject+  ( haddockProjectCommand+  , haddockProjectAction+  ) where++import Prelude ()+import Data.Bool (bool)+import Distribution.Client.Compat.Prelude hiding (get)++import qualified Distribution.Client.CmdBuild   as CmdBuild+import qualified Distribution.Client.CmdHaddock as CmdHaddock++import Distribution.Client.DistDirLayout      (DistDirLayout(..)+                                              ,CabalDirLayout(..)+                                              ,StoreDirLayout(..))+import Distribution.Client.InstallPlan        (foldPlanPackage)+import qualified Distribution.Client.InstallPlan as InstallPlan+import qualified Distribution.Client.NixStyleOptions as NixStyleOptions+import Distribution.Client.ProjectOrchestration+                                              (AvailableTarget(..)+                                              ,AvailableTargetStatus(..)+                                              ,CurrentCommand(..)+                                              ,ProjectBaseContext(..)+                                              ,ProjectBuildContext(..)+                                              ,TargetSelector(..)+                                              ,printPlan+                                              ,pruneInstallPlanToTargets+                                              ,resolveTargets+                                              ,runProjectPreBuildPhase+                                              ,selectComponentTargetBasic)+import Distribution.Client.ProjectPlanning    (ElaboratedConfiguredPackage(..)+                                              ,ElaboratedInstallPlan+                                              ,ElaboratedSharedConfig(..)+                                              ,TargetAction(..))+import Distribution.Client.ProjectPlanning.Types+                                              (elabDistDirParams)+import Distribution.Client.Setup              (GlobalFlags(..)+                                              ,ConfigFlags(..))+import Distribution.Client.ScriptUtils        (AcceptNoTargets(..)+                                              ,TargetContext(..)+                                              ,updateContextAndWriteProjectFile+                                              ,withContextAndSelectors)+import Distribution.Client.TargetProblem      (TargetProblem(..))++import Distribution.Types.PackageId (pkgName)+import Distribution.Types.PackageName (unPackageName)+import Distribution.Types.Version (mkVersion)+import Distribution.Types.VersionRange (orLaterVersion)+import Distribution.Types.InstalledPackageInfo (InstalledPackageInfo (..))+import Distribution.Simple.Command+         ( CommandUI(..) )+import Distribution.Simple.Compiler+         ( Compiler (..) )+import Distribution.Simple.Flag+        ( Flag(..)+        , flagElim+        , flagToList+        , fromFlag+        , fromFlagOrDefault+        )+import Distribution.Simple.InstallDirs+         ( toPathTemplate )+import Distribution.Simple.Haddock (createHaddockIndex)+import Distribution.Simple.Utils+         ( die', createDirectoryIfMissingVerbose+         , copyDirectoryRecursive, warn )+import Distribution.Simple.Program.Builtin+         ( haddockProgram )+import Distribution.Simple.Program.Db+         ( addKnownProgram, reconfigurePrograms, requireProgramVersion )+import Distribution.Simple.Setup+         ( HaddockFlags(..), defaultHaddockFlags+         , HaddockProjectFlags(..)+         , Visibility(..)+         , haddockProjectCommand+         )+import Distribution.Verbosity as Verbosity+         ( normal )++import System.FilePath          ( takeDirectory, normalise, (</>), (<.>) )+import System.Directory         ( doesDirectoryExist, doesFileExist )++haddockProjectAction :: HaddockProjectFlags -> [String] -> GlobalFlags -> IO ()+haddockProjectAction flags _extraArgs globalFlags = do+    -- create destination directory if it does not exist+    let outputDir = normalise $ fromFlag (haddockProjectDir flags)+    createDirectoryIfMissingVerbose verbosity True outputDir++    when ((2::Int) <=+            ( flagElim 0 (bool 0 1) (haddockProjectHackage flags)+            + flagElim 0 (bool 0 1) (haddockProjectLocal flags)+            + flagElim 0 (const 1)  (haddockProjectHtmlLocation flags)+            )) $+      die' verbosity "Options `--local`, `--hackage` and `--html-location` are mutually exclusive`"++    warn verbosity "haddock-project command is experimental, it might break in the future"++    -- build all packages with appropriate haddock flags+    let haddockFlags = defaultHaddockFlags+          { haddockHtml         = Flag True+          -- one can either use `--haddock-base-url` or+          -- `--haddock-html-location`.+          , haddockBaseUrl      = if localStyle+                                  then Flag ".."+                                  else NoFlag+          , haddockProgramPaths = haddockProjectProgramPaths  flags+          , haddockProgramArgs  = haddockProjectProgramArgs   flags+          , haddockHtmlLocation = if fromFlagOrDefault False (haddockProjectHackage flags)+                                  then Flag "https://hackage.haskell.org/package/$pkg-$version/docs"+                                  else haddockProjectHtmlLocation flags+          , haddockHoogle       = haddockProjectHoogle        flags+          , haddockExecutables  = haddockProjectExecutables   flags+          , haddockTestSuites   = haddockProjectTestSuites    flags+          , haddockBenchmarks   = haddockProjectBenchmarks    flags+          , haddockForeignLibs  = haddockProjectForeignLibs   flags+          , haddockInternal     = haddockProjectInternal      flags+          , haddockCss          = haddockProjectCss           flags+          , haddockLinkedSource = if localOrHackage+                                  then Flag True+                                  else haddockProjectLinkedSource flags+          , haddockQuickJump    = if localOrHackage+                                  then Flag True+                                  else haddockProjectQuickJump flags+          , haddockHscolourCss  = haddockProjectHscolourCss    flags+          , haddockContents     = if localStyle then Flag (toPathTemplate "../index.html")+                                                else NoFlag+          , haddockIndex        = if localStyle then Flag (toPathTemplate "../doc-index.html")+                                                else NoFlag+          , haddockKeepTempFiles= haddockProjectKeepTempFiles flags+          , haddockVerbosity    = haddockProjectVerbosity     flags+          , haddockLib          = haddockProjectLib           flags+          }+        nixFlags = (commandDefaultFlags CmdHaddock.haddockCommand)+                   { NixStyleOptions.haddockFlags = haddockFlags+                   , NixStyleOptions.configFlags  =+                       (NixStyleOptions.configFlags (commandDefaultFlags CmdBuild.buildCommand))+                       { configVerbosity = haddockProjectVerbosity flags }+                   }++    --+    -- Construct the build plan and infer the list of packages which haddocks+    -- we need.+    --++    withContextAndSelectors RejectNoTargets Nothing nixFlags ["all"] globalFlags HaddockCommand $ \targetCtx ctx targetSelectors -> do+      baseCtx <- case targetCtx of+        ProjectContext             -> return ctx+        GlobalContext              -> return ctx+        ScriptContext path exemeta -> updateContextAndWriteProjectFile ctx path exemeta+      let distLayout  = distDirLayout baseCtx+          cabalLayout = cabalDirLayout baseCtx+      buildCtx <-+        runProjectPreBuildPhase verbosity baseCtx $ \elaboratedPlan -> do+              -- Interpret the targets on the command line as build targets+              -- (as opposed to say repl or haddock targets).+              targets <- either reportTargetProblems return+                       $ resolveTargets+                           selectPackageTargets+                           selectComponentTargetBasic+                           elaboratedPlan+                           Nothing+                           targetSelectors++              let elaboratedPlan' = pruneInstallPlanToTargets+                                      TargetActionBuild+                                      targets+                                      elaboratedPlan+              return (elaboratedPlan', targets)++      printPlan verbosity baseCtx buildCtx++      let elaboratedPlan :: ElaboratedInstallPlan+          elaboratedPlan = elaboratedPlanOriginal buildCtx++          sharedConfig :: ElaboratedSharedConfig+          sharedConfig = elaboratedShared buildCtx++          pkgs :: [Either InstalledPackageInfo ElaboratedConfiguredPackage ]+          pkgs = matchingPackages elaboratedPlan++      progs <- reconfigurePrograms verbosity+                 (haddockProjectProgramPaths flags)+                 (haddockProjectProgramArgs flags)+               -- we need to insert 'haddockProgram' before we reconfigure it,+               -- otherwise 'set+             . addKnownProgram haddockProgram+             . pkgConfigCompilerProgs+             $ sharedConfig+      let sharedConfig' = sharedConfig { pkgConfigCompilerProgs = progs }++      _ <- requireProgramVersion+             verbosity haddockProgram+             (orLaterVersion (mkVersion [2,26,1])) progs++      --+      -- Build haddocks of each components+      --++      CmdHaddock.haddockAction+        nixFlags+        ["all"]+        globalFlags++      --+      -- Copy haddocks to the destination folder+      --++      packageInfos <- fmap (nub . concat) $ for pkgs $ \pkg ->+        case pkg of+          Left _ | not localStyle ->+            return []+          Left package -> do+            let packageName = unPackageName (pkgName $ sourcePackageId package)+                destDir = outputDir </> packageName+            fmap catMaybes $ for (haddockInterfaces package) $ \interfacePath -> do+              let docDir = takeDirectory interfacePath+              a <- doesFileExist interfacePath+              case a of+                True -> copyDirectoryRecursive verbosity docDir destDir+                     >> return (Just ( packageName+                                     , interfacePath+                                     , Hidden+                                     ))+                False -> return Nothing++          Right package ->+            case elabLocalToProject package of+              True -> do+                let distDirParams = elabDistDirParams sharedConfig' package+                    buildDir = distBuildDirectory distLayout distDirParams+                    packageName = unPackageName (pkgName $ elabPkgSourceId package)+                let docDir = buildDir+                         </> "doc" </> "html"+                         </> packageName+                    destDir = outputDir </> packageName+                    interfacePath = destDir+                                </> packageName <.> "haddock"+                a <- doesDirectoryExist docDir+                case a of+                  True  -> copyDirectoryRecursive verbosity docDir destDir+                        >> return [( packageName+                                   , interfacePath+                                   , Visible+                                   )]+                  False -> return []+              False | not localStyle ->+                return []+              False -> do+                let packageName = unPackageName (pkgName $ elabPkgSourceId package)+                    packageDir = storePackageDirectory (cabalStoreDirLayout cabalLayout)+                                   (compilerId (pkgConfigCompiler sharedConfig'))+                                   (elabUnitId package)+                    docDir = packageDir </> "share" </> "doc" </> "html"+                    destDir = outputDir </> packageName+                    interfacePath = destDir+                                </> packageName <.> "haddock"+                a <- doesDirectoryExist docDir+                case a of+                  True  -> copyDirectoryRecursive verbosity docDir destDir+                        -- non local packages will be hidden in haddock's+                        -- generated contents page+                        >> return [( packageName+                                   , interfacePath+                                   , Hidden+                                   )]+                  False -> return []++      --+      -- generate index, content, etc.+      --++      let flags' = flags+            { haddockProjectDir         = Flag outputDir+            , haddockProjectGenIndex    = if localOrHackage+                                          then Flag True+                                          else haddockProjectGenIndex flags+            , haddockProjectGenContents = if localOrHackage+                                          then Flag True+                                          else haddockProjectGenContents flags+            , haddockProjectQuickJump   = if localOrHackage+                                          then Flag True+                                          else haddockProjectQuickJump flags+            , haddockProjectLinkedSource = haddockLinkedSource haddockFlags+            , haddockProjectInterfaces  = Flag+                [ ( interfacePath+                  , Just packageName+                  , Just packageName+                  , visibility+                  )+                | (packageName, interfacePath, visibility) <- packageInfos+                ]+            }+      createHaddockIndex verbosity+                         (pkgConfigCompilerProgs sharedConfig')+                         (pkgConfigCompiler sharedConfig')+                         (pkgConfigPlatform sharedConfig')+                         flags'+  where+    verbosity = fromFlagOrDefault normal (haddockProjectVerbosity flags)++    -- Build a self contained directory which contains haddocks of all+    -- transitive dependencies; or depend on `--haddocks-html-location` to+    -- provide location of the documentation of dependencies.+    localStyle =+      let local    = fromFlagOrDefault False (haddockProjectLocal flags)+          hackage  = fromFlagOrDefault False (haddockProjectHackage flags)+          location = fromFlagOrDefault False (const True <$> haddockProjectHtmlLocation flags)+      in        local && not hackage && not location+         -- or if none of the flags is given set `localStyle` to `True`+         || not local && not hackage && not location+++    localOrHackage =+      any id $ flagToList (haddockProjectLocal flags)+            ++ flagToList (haddockProjectHackage flags)++    reportTargetProblems :: Show x => [x] -> IO a+    reportTargetProblems =+        die' verbosity . unlines . map show++    -- TODO: this is just a sketch+    selectPackageTargets :: TargetSelector+                         -> [AvailableTarget k]+                         -> Either (TargetProblem ()) [k]+    selectPackageTargets _ ts = Right $+      mapMaybe+        (\t -> case availableTargetStatus t of+            TargetBuildable k _ | availableTargetLocalToProject t+                                -> Just k+            _                   -> Nothing)+        ts++    matchingPackages :: ElaboratedInstallPlan+                     -> [Either InstalledPackageInfo ElaboratedConfiguredPackage]+    matchingPackages =+        fmap (foldPlanPackage Left Right)+      . InstallPlan.toList
src/Distribution/Client/CmdInstall.hs view
@@ -33,7 +33,7 @@ import Distribution.Client.CmdInstall.ClientInstallTargetSelector  import Distribution.Client.Setup-         ( GlobalFlags(..), ConfigFlags(..) )+         ( GlobalFlags(..), ConfigFlags(..), InstallFlags(..) ) import Distribution.Client.Types          ( PackageSpecifier(..), PackageLocation(..), UnresolvedSourcePackage          , SourcePackageDb(..) )@@ -53,18 +53,19 @@ import Distribution.Client.ProjectConfig.Types          ( ProjectConfig(..), ProjectConfigShared(..)          , ProjectConfigBuildOnly(..), PackageConfig(..)+         , MapMappend(..)          , getMapLast, getMapMappend, projectConfigLogsDir          , projectConfigStoreDir, projectConfigBuildOnly          , projectConfigConfigFile ) import Distribution.Simple.Program.Db          ( userSpecifyPaths, userSpecifyArgss, defaultProgramDb-         , modifyProgramSearchPath, ProgramDb )+         , modifyProgramSearchPath ) import Distribution.Simple.BuildPaths          ( exeExtension ) import Distribution.Simple.Program.Find          ( ProgramSearchPathEntry(..) ) import Distribution.Client.Config-         ( defaultInstallPath, getCabalDir, loadConfig, SavedConfig(..) )+         ( defaultInstallPath, loadConfig, SavedConfig(..) ) import qualified Distribution.Simple.PackageIndex as PI import Distribution.Solver.Types.PackageIndex          ( lookupPackageName, searchByName )@@ -96,11 +97,11 @@ import Distribution.Simple.Flag          ( fromFlagOrDefault, flagToMaybe, flagElim ) import Distribution.Simple.Setup-         ( Flag(..) )+         ( Flag(..), installDirsOptions ) import Distribution.Solver.Types.SourcePackage          ( SourcePackage(..) ) import Distribution.Simple.Command-         ( CommandUI(..), usageAlternatives )+         ( CommandUI(..), usageAlternatives, optionName ) import Distribution.Simple.Configure          ( configCompilerEx ) import Distribution.Simple.Compiler@@ -124,12 +125,11 @@          , withTempDirectory, createDirectoryIfMissingVerbose          , ordNub ) import Distribution.Utils.Generic-         ( safeHead, writeFileAtomic )+         ( writeFileAtomic )  import qualified Data.ByteString.Lazy.Char8 as BS-import Data.Ord-         ( Down(..) ) import qualified Data.Map as Map+import qualified Data.Set as S import qualified Data.List.NonEmpty as NE import Distribution.Utils.NubList          ( fromNubList )@@ -150,7 +150,7 @@   , commandDescription  = Just $ \_ -> wrapText $     "Installs one or more packages. This is done by installing them "     ++ "in the store and symlinking/copying the executables in the directory "-    ++ "specified by the --installdir flag (`~/.cabal/bin/` by default). "+    ++ "specified by the --installdir flag (`~/.local/bin/` by default). "     ++ "If you want the installed executables to be available globally, "     ++ "make sure that the PATH environment variable contains that directory. "     ++ "\n\n"@@ -168,10 +168,15 @@       ++ "  " ++ pname ++ " v2-install ./pkgfoo\n"       ++ "    Install the package in the ./pkgfoo directory\n" -  , commandOptions      = nixStyleOptions clientInstallOptions+  , commandOptions      = \x -> filter notInstallDirOpt $ nixStyleOptions clientInstallOptions x   , commandDefaultFlags = defaultNixStyleFlags defaultClientInstallFlags   }+ where+  -- install doesn't take installDirs flags, since it always installs into the store in a fixed way.+  notInstallDirOpt x = not $ optionName x `elem` installDirOptNames+  installDirOptNames = map optionName installDirsOptions + -- | The @install@ command actually serves four different needs. It installs: -- * exes: --   For example a program from hackage. The behavior is similar to the old@@ -204,6 +209,15 @@     targetFilter   = if installLibs then Just LibKind else Just ExeKind     targetStrings' = if null targetStrings then ["."] else targetStrings +    -- Note the logic here is rather goofy. Target selectors of the form "foo:bar" also parse as uris.+    -- However, we want install to also take uri arguments. Hence, we only parse uri arguments in the case where+    -- no project file is present (including an implicit one derived from being in a package directory)+    -- or where the --ignore-project flag is passed explicitly. In such a case we only parse colon-free target selectors+    -- as selectors, and otherwise parse things as URIs.++    -- However, in the special case where --ignore-project is passed with no selectors, we want to act as though this is+    -- a "normal" ignore project that actually builds and installs the selected package.+     withProject :: IO ([PackageSpecifier UnresolvedSourcePackage], [URI], [TargetSelector], ProjectConfig)     withProject = do       let reducedVerbosity = lessVerbose verbosity@@ -233,7 +247,7 @@         packageTargets =           flip TargetPackageNamed targetFilter . pkgName <$> packageIds -      if null targetStrings'+      if null targetStrings'' -- if every selector is already resolved as a packageid, return without further parsing.         then return (packageSpecifiers, [], packageTargets, projectConfig localBaseCtx)         else do           targetSelectors <-@@ -250,11 +264,10 @@                  , selectors ++ packageTargets                  , projectConfig localBaseCtx ) -    withoutProject :: ProjectConfig -> IO ([PackageSpecifier pkg], [URI], [TargetSelector], ProjectConfig)+    withoutProject :: ProjectConfig -> IO ([PackageSpecifier UnresolvedSourcePackage], [URI], [TargetSelector], ProjectConfig)+    withoutProject _ | null targetStrings = withProject -- if there's no targets, we don't parse specially, but treat it as install in a standard cabal package dir     withoutProject globalConfig = do       tss <- traverse (parseWithoutProjectTargetSelector verbosity) targetStrings'--      cabalDir <- getCabalDir       let         projectConfig = globalConfig <> cliConfig @@ -268,8 +281,9 @@          mlogsDir = flagToMaybe projectConfigLogsDir         mstoreDir = flagToMaybe projectConfigStoreDir-        cabalDirLayout = mkCabalDirLayout cabalDir mstoreDir mlogsDir+      cabalDirLayout <- mkCabalDirLayout mstoreDir mlogsDir +      let         buildSettings = resolveBuildTimeSettings                           verbosity cabalDirLayout                           projectConfig@@ -363,14 +377,37 @@       (projectConfigBuildOnly config)       [ ProjectPackageRemoteTarball uri | uri <- uris ] +    -- check for targets already in env+    let getPackageName :: PackageSpecifier UnresolvedSourcePackage -> PackageName+        getPackageName (NamedPackage pn _) = pn+        getPackageName (SpecificSourcePackage (SourcePackage pkgId _ _ _)) = pkgName pkgId+        targetNames = S.fromList $ map getPackageName (specs ++ uriSpecs)+        envNames = S.fromList $ map getPackageName envSpecs+        forceInstall = fromFlagOrDefault False $ installOverrideReinstall installFlags+        nameIntersection = S.intersection targetNames envNames++    -- we check for intersections in targets with the existing env+    (envSpecs', nonGlobalEnvEntries') <- if null nameIntersection+      then pure (envSpecs, map snd nonGlobalEnvEntries)+      else if forceInstall+             then let es = filter (\e -> not $ getPackageName e `S.member` nameIntersection) envSpecs+                      nge = map snd . filter (\e -> not $ fst e `S.member` nameIntersection) $ nonGlobalEnvEntries+                  in pure (es, nge)+             else die' verbosity $ "Packages requested to install already exist in environment file at " ++ envFile ++ ". Overwriting them may break other packages. Use --force-reinstalls to proceed anyway. Packages: " ++ intercalate ", " (map prettyShow $ S.toList nameIntersection)++    -- we construct an installed index of files in the cleaned target environment (absent overwrites) so that we can solve with regards to packages installed locally but not in the upstream repo+    let installedPacks = PI.allPackagesByName installedIndex+        newEnvNames = S.fromList $ map getPackageName envSpecs'+        installedIndex' = PI.fromList . concatMap snd . filter (\p -> fst p `S.member` newEnvNames) $ installedPacks+     baseCtx <- establishDummyProjectBaseContext                  verbosity                  config                  distDirLayout-                 (envSpecs ++ specs ++ uriSpecs)+                 (envSpecs' ++ specs ++ uriSpecs)                  InstallCommand -    buildCtx <- constructProjectBuildContext verbosity baseCtx targetSelectors+    buildCtx <- constructProjectBuildContext verbosity (baseCtx {installedPackages = Just installedIndex'}) targetSelectors      printPlan verbosity baseCtx buildCtx @@ -387,19 +424,31 @@     unless dryRun $       if installLibs       then installLibraries verbosity-           buildCtx compiler packageDbs progDb envFile nonGlobalEnvEntries+           buildCtx compiler packageDbs envFile nonGlobalEnvEntries'       else installExes verbosity            baseCtx buildCtx platform compiler configFlags clientInstallFlags   where     configFlags' = disableTestsBenchsByDefault configFlags     verbosity = fromFlagOrDefault normal (configVerbosity configFlags')     ignoreProject = flagIgnoreProject projectFlags-    cliConfig = commandLineFlagsToProjectConfig-                  globalFlags-                  flags { configFlags = configFlags' }-                  clientInstallFlags'+    baseCliConfig = commandLineFlagsToProjectConfig+                        globalFlags+                        flags { configFlags = configFlags' }+                        clientInstallFlags'+    cliConfig = addLocalConfigToTargets baseCliConfig targetStrings     globalConfigFlag = projectConfigConfigFile (projectConfigShared cliConfig) +-- | Treat all direct targets of install command as local packages: #8637+addLocalConfigToTargets :: ProjectConfig -> [String] -> ProjectConfig+addLocalConfigToTargets config targetStrings+    = config {+        projectConfigSpecificPackage = projectConfigSpecificPackage config+                                       <> MapMappend (Map.fromList targetPackageConfigs)+    }+  where+    localConfig = projectConfigLocalPackages config+    targetPackageConfigs = map (\x -> (mkPackageName x, localConfig)) targetStrings+ -- | Verify that invalid config options were not passed to the install command. -- -- If an invalid configuration is found the command will @die'@.@@ -605,7 +654,7 @@   installdir <- fromFlagOrDefault                 (warn verbosity installdirUnknown >> pure installPath) $                 pure <$> cinstInstalldir clientInstallFlags-  createDirectoryIfMissingVerbose verbosity False installdir+  createDirectoryIfMissingVerbose verbosity True installdir   warnIfNoExes verbosity buildCtx    installMethod <- flagElim defaultMethod return $@@ -640,29 +689,18 @@   -> ProjectBuildContext   -> Compiler   -> PackageDBStack-  -> ProgramDb   -> FilePath -- ^ Environment file   -> [GhcEnvironmentFileEntry]   -> IO () installLibraries verbosity buildCtx compiler-                 packageDbs programDb envFile envEntries = do-  -- Why do we get it again? If we updated a globalPackage then we need-  -- the new version.-  installedIndex <- getInstalledPackages verbosity compiler packageDbs programDb+                 packageDbs envFile envEntries = do   if supportsPkgEnvFiles $ getImplInfo compiler     then do       let-        getLatest :: PackageName -> [InstalledPackageInfo]-        getLatest = (=<<) (maybeToList . safeHead . snd) . take 1 . sortBy (comparing (Down . fst))-                  . PI.lookupPackageName installedIndex-        globalLatest = concat (getLatest <$> globalPackages)-         baseEntries =           GhcEnvFileClearPackageDbStack : fmap GhcEnvFilePackageDb packageDbs-        globalEntries = GhcEnvFilePackageId . installedUnitId <$> globalLatest         pkgEntries = ordNub $-              globalEntries-          ++ envEntries+             envEntries           ++ entriesForLibraryComponents (targetsMap buildCtx)         contents' = renderGhcEnvironmentFile (baseEntries ++ pkgEntries)       createDirectoryIfMissing True (takeDirectory envFile)@@ -700,21 +738,12 @@     exeMaybe (ComponentTarget (CExeName exe) _) = Just exe     exeMaybe _                                  = Nothing -globalPackages :: [PackageName]-globalPackages = mkPackageName <$>-  [ "ghc", "hoopl", "bytestring", "unix", "base", "time", "hpc", "filepath"-  , "process", "array", "integer-gmp", "containers", "ghc-boot", "binary"-  , "ghc-prim", "ghci", "rts", "terminfo", "transformers", "deepseq"-  , "ghc-boot-th", "pretty", "template-haskell", "directory", "text"-  , "bin-package-db"-  ]- -- | Return the package specifiers and non-global environment file entries. getEnvSpecsAndNonGlobalEntries   :: PI.InstalledPackageIndex   -> [GhcEnvironmentFileEntry]   -> Bool-  -> ([PackageSpecifier a], [GhcEnvironmentFileEntry])+  -> ([PackageSpecifier a], [(PackageName, GhcEnvironmentFileEntry)]) getEnvSpecsAndNonGlobalEntries installedIndex entries installLibs =   if installLibs   then (envSpecs, envEntries')@@ -724,7 +753,7 @@  environmentFileToSpecifiers   :: PI.InstalledPackageIndex -> [GhcEnvironmentFileEntry]-  -> ([PackageSpecifier a], [GhcEnvironmentFileEntry])+  -> ([PackageSpecifier a], [(PackageName, GhcEnvironmentFileEntry)]) environmentFileToSpecifiers ipi = foldMap $ \case     (GhcEnvFilePackageId unitId)         | Just InstalledPackageInfo@@ -732,9 +761,7 @@           <- PI.lookupUnitId ipi unitId         , let pkgSpec = NamedPackage pkgName                         [PackagePropertyVersion (thisVersion pkgVersion)]-        -> if pkgName `elem` globalPackages-          then ([pkgSpec], [])-          else ([pkgSpec], [GhcEnvFilePackageId installedUnitId])+        -> ([pkgSpec], [(pkgName, GhcEnvFilePackageId installedUnitId)])     _ -> ([], [])  @@ -912,11 +939,10 @@   -> Flag FilePath   -> IO PackageDBStack getPackageDbStack compilerId storeDirFlag logsDirFlag = do-  cabalDir <- getCabalDir   mstoreDir <- traverse makeAbsolute $ flagToMaybe storeDirFlag   let     mlogsDir    = flagToMaybe logsDirFlag-    cabalLayout = mkCabalDirLayout cabalDir mstoreDir mlogsDir+  cabalLayout <- mkCabalDirLayout mstoreDir mlogsDir   pure $ storePackageDBStack (cabalStoreDirLayout cabalLayout) compilerId  -- | This defines what a 'TargetSelector' means for the @bench@ command.
src/Distribution/Client/CmdInstall/ClientInstallFlags.hs view
@@ -66,7 +66,7 @@     "How to handle already existing symlinks."     cinstOverwritePolicy (\v flags -> flags { cinstOverwritePolicy = v })     $ reqArg "always|never|prompt"-        (parsecToReadE (\err -> "Error parsing overwrite-policy: " ++ err) (toFlag `fmap` parsec)) +        (parsecToReadE (\err -> "Error parsing overwrite-policy: " ++ err) (toFlag `fmap` parsec))         (map prettyShow . flagToList)   , option [] ["install-method"]     "How to install the executables."
src/Distribution/Client/CmdListBin.hs view
@@ -34,7 +34,7 @@ import Distribution.Simple.BuildPaths            (dllExtension, exeExtension) import Distribution.Simple.Command               (CommandUI (..)) import Distribution.Simple.Setup                 (configVerbosity, fromFlagOrDefault)-import Distribution.Simple.Utils                 (die', wrapText)+import Distribution.Simple.Utils                 (die', withOutputMarker, wrapText) import Distribution.System                       (Platform) import Distribution.Types.ComponentName          (showComponentName) import Distribution.Types.UnitId                 (UnitId)@@ -78,7 +78,7 @@       _   -> die' verbosity "One target is required, given multiple"    -- configure and elaborate target selectors-  withContextAndSelectors RejectNoTargets (Just ExeKind) flags [target] globalFlags $ \targetCtx ctx targetSelectors -> do+  withContextAndSelectors RejectNoTargets (Just ExeKind) flags [target] globalFlags OtherCommand $ \targetCtx ctx targetSelectors -> do     baseCtx <- case targetCtx of       ProjectContext             -> return ctx       GlobalContext              -> return ctx@@ -133,7 +133,18 @@      case binfiles of         []     -> die' verbosity "No target found"-        [exe] -> putStrLn exe+        [exe]  -> putStr $ withOutputMarker verbosity $ exe ++ "\n"+                    -- Andreas, 2023-01-13, issue #8400:+                    -- Regular output of `list-bin` should go to stdout unconditionally,+                    -- but for the sake of the testsuite, we want to mark it so it goes+                    -- into the golden value for the test.+                    -- Note: 'withOutputMarker' only checks 'isVerboseMarkOutput',+                    -- thus, we can reuse @verbosity@ here, even if other components+                    -- of @verbosity@ may be wrong (like 'VStderr', verbosity level etc.).+                    -- Andreas, 2023-01-20:+                    -- Appending the newline character here rather than using 'putStrLn'+                    -- because an active 'withOutputMarker' produces text that ends+                    -- in newline characters.         _ -> die' verbosity "Multiple targets found"   where     defaultVerbosity = verboseStderr silent
src/Distribution/Client/CmdOutdated.hs view
@@ -30,7 +30,7 @@     , DistDirLayout(distProjectRootDirectory, distProjectFile) ) import Distribution.Client.ProjectConfig import Distribution.Client.ProjectConfig.Legacy-    ( instantiateProjectConfigSkeleton )+    ( instantiateProjectConfigSkeletonWithCompiler ) import Distribution.Client.ProjectFlags     ( projectFlagsOptions, ProjectFlags(..), defaultProjectFlags     , removeIgnoreProjectOption )@@ -306,7 +306,7 @@                       {- TODO: Support dist dir override -} Nothing   projectConfig <- runRebuild (distProjectRootDirectory distDirLayout) $ do                       pcs <- readProjectLocalFreezeConfig verbosity httpTransport distDirLayout-                      pure $ instantiateProjectConfigSkeleton os arch (compilerInfo compiler) mempty pcs+                      pure $ instantiateProjectConfigSkeletonWithCompiler os arch (compilerInfo compiler) mempty pcs   let ucnstrs = map fst . projectConfigConstraints . projectConfigShared                 $ projectConfig       deps    = userConstraintsToDependencies ucnstrs
src/Distribution/Client/CmdRepl.hs view
@@ -75,7 +75,7 @@ import Distribution.Types.ComponentName          ( componentNameString ) import Distribution.Types.CondTree-         ( CondTree(..), traverseCondTreeC )+         ( CondTree(..) ) import Distribution.Types.Dependency          ( Dependency(..), mainLibSet ) import Distribution.Types.Library@@ -187,7 +187,7 @@ -- replAction :: NixStyleFlags (ReplOptions, EnvFlags) -> [String] -> GlobalFlags -> IO () replAction flags@NixStyleFlags { extraFlags = (replOpts, envFlags), ..} targetStrings globalFlags-  = withContextAndSelectors AcceptNoTargets (Just LibKind) flags targetStrings globalFlags $ \targetCtx ctx targetSelectors -> do+  = withContextAndSelectors AcceptNoTargets (Just LibKind) flags targetStrings globalFlags ReplCommand $ \targetCtx ctx targetSelectors -> do     when (buildSettingOnlyDeps (buildSettings ctx)) $       die' verbosity $ "The repl command does not support '--only-dependencies'. "           ++ "You may wish to use 'build --only-dependencies' and then "@@ -338,7 +338,12 @@       | packageId pkg /= pkgId = SpecificSourcePackage pkg       | SourcePackage{..} <- pkg =         SpecificSourcePackage $ pkg { srcpkgDescription =-          srcpkgDescription & (\f -> L.allCondTrees $ traverseCondTreeC f)+          -- New dependencies are added to the original ones found in the+          -- `targetBuildDepends` field.+          -- `traverseBuildInfos` is used in order to update _all_ the+          -- occurrences of the field `targetBuildDepends`. It ensures that+          -- fields depending on the latter are also consistently updated.+          srcpkgDescription &  (L.traverseBuildInfos . L.targetBuildDepends)                             %~ (deps ++)         }     addDeps spec = spec
src/Distribution/Client/CmdRun.hs view
@@ -27,7 +27,8 @@          ( renderTargetSelector, showTargetSelector,            renderTargetProblem,            renderTargetProblemNoTargets, plural, targetSelectorPluralPkgs,-           targetSelectorFilter, renderListCommaAnd )+           targetSelectorFilter, renderListCommaAnd,+           renderListPretty ) import Distribution.Client.TargetProblem          ( TargetProblem (..) ) @@ -42,11 +43,11 @@ import Distribution.Simple.Command          ( CommandUI(..), usageAlternatives ) import Distribution.Types.ComponentName-         ( showComponentName )+         ( componentNameRaw ) import Distribution.Verbosity          ( normal, silent ) import Distribution.Simple.Utils-         ( wrapText, die', info, notice )+         ( wrapText, die', info, notice, safeHead ) import Distribution.Client.ProjectPlanning          ( ElaboratedConfiguredPackage(..)          , ElaboratedInstallPlan, binDirectoryFor )@@ -64,6 +65,7 @@ import Distribution.Client.ScriptUtils          ( AcceptNoTargets(..), withContextAndSelectors, updateContextAndWriteProjectFile, TargetContext(..) ) +import Data.List (group) import qualified Data.Set as Set import System.Directory          ( doesFileExist )@@ -120,7 +122,7 @@ -- runAction :: NixStyleFlags () -> [String] -> GlobalFlags -> IO () runAction flags@NixStyleFlags {..} targetAndArgs globalFlags-  = withContextAndSelectors RejectNoTargets (Just ExeKind) flags targetStr globalFlags $ \targetCtx ctx targetSelectors -> do+  = withContextAndSelectors RejectNoTargets (Just ExeKind) flags targetStr globalFlags OtherCommand $ \targetCtx ctx targetSelectors -> do     (baseCtx, defaultVerbosity) <- case targetCtx of       ProjectContext             -> return (ctx, normal)       GlobalContext              -> return (ctx, normal)@@ -424,14 +426,13 @@ renderRunProblem (TargetProblemMatchesMultiple targetSelector targets) =     "The run command is for running a single executable at once. The target '"  ++ showTargetSelector targetSelector ++ "' refers to "- ++ renderTargetSelector targetSelector ++ " which includes "- ++ renderListCommaAnd ( ("the "++) <$>-                         showComponentName <$>-                         availableTargetComponentName <$>-                         foldMap-                           (\kind -> filterTargetsKind kind targets)-                           [ExeKind, TestKind, BenchKind] )- ++ "."+ ++ renderTargetSelector targetSelector ++ " which includes \n"+ ++ unlines ((\(label, xs) -> "- " ++ label ++ ": " ++ renderListPretty xs)+    <$> (zip ["executables", "test-suites", "benchmarks"]+     $  filter (not . null) . map removeDuplicates+     $  map (componentNameRaw . availableTargetComponentName)+    <$> (flip filterTargetsKind $ targets) <$> [ExeKind, TestKind, BenchKind] ))+    where removeDuplicates = catMaybes . map safeHead . group . sort  renderRunProblem (TargetProblemMultipleTargets selectorMap) =     "The run command is for running a single executable at once. The targets "
src/Distribution/Client/CmdSdist.hs view
@@ -137,7 +137,7 @@ -------------------------------------------------------------------------------  sdistAction :: (ProjectFlags, SdistFlags) -> [String] -> GlobalFlags -> IO ()-sdistAction (ProjectFlags{..}, SdistFlags{..}) targetStrings globalFlags = do+sdistAction (pf@ProjectFlags{..}, SdistFlags{..}) targetStrings globalFlags = do     (baseCtx, distDirLayout) <- withProjectOrGlobalConfig verbosity flagIgnoreProject globalConfigFlag withProject withoutProject      let localPkgs = localPackages baseCtx@@ -196,6 +196,7 @@             { configVerbosity = sdistVerbosity             , configDistPref = sdistDistDir             }+          , projectFlags = pf           }         mempty 
src/Distribution/Client/CmdUpdate.hs view
@@ -85,7 +85,7 @@      ++ "  " ++ pname ++ " v2-update hackage.haskell.org,HEAD\n"      ++ "  " ++ pname ++ " v2-update hackage.haskell.org\n"      ++ "    Download hackage.haskell.org at a specific index state.\n\n"-     ++ "  " ++ pname ++ " new update hackage.haskell.org head.hackage\n"+     ++ "  " ++ pname ++ " v2-update hackage.haskell.org head.hackage\n"      ++ "    Download hackage.haskell.org and head.hackage\n"      ++ "    head.hackage must be a known repo-id. E.g. from\n"      ++ "    your cabal.project(.local) file.\n"
− src/Distribution/Client/Compat/Process.hs
@@ -1,48 +0,0 @@--------------------------------------------------------------------------------- |--- Module      :  Distribution.Client.Compat.Process--- Copyright   :  (c) 2013 Liu Hao, Brent Yorgey--- License     :  BSD-style (see the file LICENSE)------ Maintainer  :  cabal-devel@haskell.org--- Stability   :  provisional--- Portability :  portable------ Cross-platform utilities for invoking processes.-----------------------------------------------------------------------------------module Distribution.Client.Compat.Process (-  readProcessWithExitCode-) where--import Prelude (FilePath, IO, String, return, (||))--import           Control.Exception (catch, throw)-import           System.Exit       (ExitCode (ExitFailure))-import           System.IO.Error   (isDoesNotExistError, isPermissionError)-import qualified System.Process    as P---- | @readProcessWithExitCode@ creates an external process, reads its---   standard output and standard error strictly, waits until the---   process terminates, and then returns the @ExitCode@ of the---   process, the standard output, and the standard error.------   See the documentation of the version from @System.Process@ for---   more information.------   The version from @System.Process@ behaves inconsistently across---   platforms when an executable with the given name is not found: in---   some cases it returns an @ExitFailure@, in others it throws an---   exception.  This variant catches \"does not exist\" and---   \"permission denied\" exceptions and turns them into---   @ExitFailure@s.------ TODO: this doesn't use 'Distrubution.Compat.Process'.----readProcessWithExitCode :: FilePath -> [String] -> String -> IO (ExitCode, String, String)-readProcessWithExitCode cmd args input =-  P.readProcessWithExitCode cmd args input-    `catch` \e -> if isDoesNotExistError e || isPermissionError e-                    then return (ExitFailure 127, "", "")-                    else throw e
src/Distribution/Client/Config.hs view
@@ -22,12 +22,14 @@     showConfigWithComments,     parseConfig, -    getCabalDir,     defaultConfigFile,     defaultCacheDir,+    defaultScriptBuildsDir,+    defaultStoreDir,     defaultCompiler,     defaultInstallPath,     defaultLogsDir,+    defaultReportsDir,     defaultUserInstall,      baseSavedConfig,@@ -46,6 +48,7 @@     postProcessRepo,   ) where +import Distribution.Compat.Environment (lookupEnv) import Distribution.Client.Compat.Prelude import Prelude () @@ -90,7 +93,7 @@          , Flag(..), toFlag, flagToMaybe, fromFlagOrDefault ) import Distribution.Simple.InstallDirs          ( InstallDirs(..), defaultInstallDirs-         , PathTemplate, toPathTemplate )+         , PathTemplate, toPathTemplate) import Distribution.Deprecated.ParseUtils          ( FieldDescr(..), liftField, runP          , ParseResult(..), PError(..), PWarning(..)@@ -130,7 +133,7 @@ import Text.PrettyPrint.HughesPJ          ( text, Doc ) import System.Directory-         ( createDirectoryIfMissing, getAppUserDataDirectory, renameFile )+         ( createDirectoryIfMissing, getHomeDirectory, getXdgDirectory, XdgDirectory(XdgCache, XdgConfig, XdgState), renameFile, getAppUserDataDirectory, doesDirectoryExist ) import Network.URI          ( URI(..), URIAuth(..), parseURI ) import System.FilePath@@ -138,7 +141,7 @@ import System.IO.Error          ( isDoesNotExistError ) import Distribution.Compat.Environment-         ( getEnvironment, lookupEnv )+         ( getEnvironment ) import qualified Data.Map as M import qualified Data.ByteString as BS @@ -302,6 +305,7 @@         installFineGrainedConflicts  = combine installFineGrainedConflicts,         installMinimizeConflictSet   = combine installMinimizeConflictSet,         installIndependentGoals      = combine installIndependentGoals,+        installPreferOldest          = combine installPreferOldest,         installShadowPkgs            = combine installShadowPkgs,         installStrongFlags           = combine installStrongFlags,         installAllowBootLibInstalls  = combine installAllowBootLibInstalls,@@ -487,6 +491,9 @@         haddockKeepTempFiles = combine haddockKeepTempFiles,         haddockVerbosity     = combine haddockVerbosity,         haddockCabalFilePath = combine haddockCabalFilePath,+        haddockIndex         = combine haddockIndex,+        haddockBaseUrl       = combine haddockBaseUrl,+        haddockLib           = combine haddockLib,         haddockArgs          = lastNonEmpty haddockArgs         }         where@@ -535,7 +542,7 @@ -- baseSavedConfig :: IO SavedConfig baseSavedConfig = do-  userPrefix <- getCabalDir+  userPrefix <- defaultInstallPrefix   cacheDir   <- defaultCacheDir   logsDir    <- defaultLogsDir   return mempty {@@ -583,40 +590,91 @@     }   } -defaultCabalDir :: IO FilePath-defaultCabalDir = getAppUserDataDirectory "cabal"--getCabalDir :: IO FilePath-getCabalDir = do+-- | If @CABAL\_DIR@ is set or @~/.cabal@ exists, return that+-- directory.  Otherwise returns Nothing.  If this function returns+-- Nothing, then it implies that we are not using a single directory+-- for everything, but instead use XDG paths.  Fundamentally, this+-- function is used to implement transparent backwards compatibility+-- with pre-XDG versions of cabal-install.+maybeGetCabalDir :: IO (Maybe FilePath)+maybeGetCabalDir = do   mDir <- lookupEnv "CABAL_DIR"   case mDir of-    Nothing -> defaultCabalDir-    Just dir -> return dir+    Just dir -> return $ Just dir+    Nothing -> do+      defaultDir <- getAppUserDataDirectory "cabal"+      dotCabalExists <- doesDirectoryExist defaultDir+      return $ if dotCabalExists+               then Just defaultDir+               else Nothing +-- | The default behaviour of cabal-install is to use the XDG+-- directory standard.  However, if @CABAL_DIR@ is set, we instead use+-- that directory as a single store for everything cabal-related, like+-- the old @~/.cabal@ behaviour.  Also, for backwards compatibility,+-- if @~/.cabal@ exists we treat that as equivalent to @CABAL_DIR@+-- being set.  This function abstracts that decision-making.+getDefaultDir :: XdgDirectory -> FilePath -> IO FilePath+getDefaultDir xdg subdir = do+  mDir <- maybeGetCabalDir+  case mDir of+    Just dir -> return $ dir </> subdir+    Nothing -> getXdgDirectory xdg $ "cabal" </> subdir++-- | The default prefix used for installation.+defaultInstallPrefix :: IO FilePath+defaultInstallPrefix = do+  mDir <- maybeGetCabalDir+  case mDir of+    Just dir ->+      return dir+    Nothing -> do+      dir <- getHomeDirectory+      return $ dir </> ".local"+ defaultConfigFile :: IO FilePath-defaultConfigFile = do-  dir <- getCabalDir-  return $ dir </> "config"+defaultConfigFile =+  getDefaultDir XdgConfig "config"  defaultCacheDir :: IO FilePath-defaultCacheDir = do-  dir <- getCabalDir-  return $ dir </> "packages"+defaultCacheDir =+  getDefaultDir XdgCache "packages" +defaultScriptBuildsDir :: IO FilePath+defaultScriptBuildsDir =+  getDefaultDir XdgCache "script-builds"++defaultStoreDir :: IO FilePath+defaultStoreDir =+  getDefaultDir XdgState "store"+ defaultLogsDir :: IO FilePath-defaultLogsDir = do-  dir <- getCabalDir-  return $ dir </> "logs"+defaultLogsDir =+  getDefaultDir XdgCache "logs" +defaultReportsDir :: IO FilePath+defaultReportsDir =+  getDefaultDir XdgCache "reports"+ defaultExtraPath :: IO [FilePath] defaultExtraPath = do-  dir <- getCabalDir-  return [dir </> "bin"]+  mDir <- maybeGetCabalDir+  case mDir of+    Just dir ->+      return [dir </> "bin"]+    Nothing -> do+      dir <- getHomeDirectory+      return [dir </> ".local" </> "bin"]  defaultInstallPath :: IO FilePath defaultInstallPath = do-  dir <- getCabalDir-  return (dir </> "bin")+  mDir <- maybeGetCabalDir+  case mDir of+    Just dir ->+      return $ dir </> "bin"+    Nothing -> do+      dir <- getHomeDirectory+      return $ dir </> ".local" </> "bin"  defaultCompiler :: CompilerFlavor defaultCompiler = fromMaybe GHC defaultCompilerFlavor@@ -632,7 +690,7 @@     str  = "hackage.haskell.org"     name = RepoName str     uri  = URI "http:" (Just (URIAuth "" str "")) "/" "" ""-    -- Note that lots of old ~/.cabal/config files will have the old url+    -- Note that lots of old config files will have the old url     -- http://hackage.haskell.org/packages/archive     -- but new config files can use the new url (without the /packages/archive)     -- and avoid having to do a http redirect@@ -1426,7 +1484,7 @@       unlines (map (showPWarning "Error parsing additional config lines") ws)  -- | Get the differences (as a pseudo code diff) between the user's--- '~/.cabal/config' and the one that cabal would generate if it didn't exist.+-- config file and the one that cabal would generate if it didn't exist. userConfigDiff :: Verbosity -> GlobalFlags -> [String] -> IO [String] userConfigDiff verbosity globalFlags extraLines = do   userConfig <- loadRawConfig normal (globalConfigFile globalFlags)@@ -1473,7 +1531,7 @@         in (topAndTail left, topAndTail (drop 1 right))  --- | Update the user's ~/.cabal/config' keeping the user's customizations.+-- | Update the user's config file keeping the user's customizations. userConfigUpdate :: Verbosity -> GlobalFlags -> [String] -> IO () userConfigUpdate verbosity globalFlags extraLines = do   userConfig  <- loadRawConfig normal (globalConfigFile globalFlags)
src/Distribution/Client/Configure.hs view
@@ -73,8 +73,8 @@ import Distribution.PackageDescription.Configuration          ( finalizePD ) import Distribution.Version-         ( Version, mkVersion, anyVersion, thisVersion-         , VersionRange, orLaterVersion )+         ( Version, anyVersion, thisVersion+         , VersionRange ) import Distribution.Simple.Utils as Utils          ( warn, notice, debug, die'          , defaultPackageDesc )@@ -84,21 +84,12 @@ import System.FilePath ( (</>) )  -- | Choose the Cabal version such that the setup scripts compiled against this--- version will support the given command-line flags.+-- version will support the given command-line flags. Currently, it implements no+-- specific restrictions and allows any version, unless the second argument is+-- filled with a 'Version', in which case this version is picked. chooseCabalVersion :: ConfigExFlags -> Maybe Version -> VersionRange-chooseCabalVersion configExFlags maybeVersion =-  maybe defaultVersionRange thisVersion maybeVersion-  where-    -- Cabal < 1.19.2 doesn't support '--exact-configuration' which is needed-    -- for '--allow-newer' to work.-    allowNewer = isRelaxDeps-                 (maybe mempty unAllowNewer $ configAllowNewer configExFlags)-    allowOlder = isRelaxDeps-                 (maybe mempty unAllowOlder $ configAllowOlder configExFlags)--    defaultVersionRange = if allowOlder || allowNewer-                          then orLaterVersion (mkVersion [1,19,2])-                          else anyVersion+chooseCabalVersion _configExFlags maybeVersion =+  maybe anyVersion thisVersion maybeVersion  -- | Configure the package found in the local directory configure :: Verbosity
src/Distribution/Client/Dependency.hs view
@@ -109,7 +109,7 @@ import qualified Distribution.Solver.Types.ComponentDeps as CD import           Distribution.Solver.Types.ConstraintSource import           Distribution.Solver.Types.DependencyResolver-import           Distribution.Solver.Types.InstalledPreference+import           Distribution.Solver.Types.InstalledPreference as Preference import           Distribution.Solver.Types.LabeledPackageConstraint import           Distribution.Solver.Types.OptionalStanza import           Distribution.Solver.Types.PackageConstraint@@ -400,6 +400,9 @@       , pkgname <- [ mkPackageName "base"                    , mkPackageName "ghc-bignum"                    , mkPackageName "ghc-prim"+                   , mkPackageName "ghc-boot"+                   , mkPackageName "ghc"+                   , mkPackageName "ghci"                    , mkPackageName "integer-gmp"                    , mkPackageName "integer-simple"                    , mkPackageName "template-haskell"@@ -767,13 +770,14 @@       [ (pkgname, pref)       | PackageInstalledPreference pkgname pref <- prefs ]     installPrefDefault = case defaultPref of-      PreferAllLatest         -> const PreferLatest-      PreferAllInstalled      -> const PreferInstalled+      PreferAllLatest         -> const Preference.PreferLatest+      PreferAllOldest         -> const Preference.PreferOldest+      PreferAllInstalled      -> const Preference.PreferInstalled       PreferLatestForSelected -> \pkgname ->         -- When you say cabal install foo, what you really mean is, prefer the         -- latest version of foo, but the installed version of everything else-        if pkgname `Set.member` selected then PreferLatest-                                         else PreferInstalled+        if pkgname `Set.member` selected then Preference.PreferLatest+                                         else Preference.PreferInstalled      stanzasPref :: PackageName -> [OptionalStanza]     stanzasPref pkgname =@@ -1019,8 +1023,9 @@                           (installPref pkg, versionPref pkg, packageVersion pkg)         installPref   :: UnresolvedSourcePackage -> Bool         installPref   = case preferInstalled of-          PreferLatest    -> const False-          PreferInstalled -> not . null+          Preference.PreferLatest    -> const False+          Preference.PreferOldest    -> const False+          Preference.PreferInstalled -> not . null                            . InstalledPackageIndex.lookupSourcePackageId                                                      installedPkgIndex                            . packageId
src/Distribution/Client/Dependency/Types.hs view
@@ -49,6 +49,13 @@      --      PreferAllLatest +     -- | Always prefer the oldest version irrespective of any existing+     -- installed version or packages explicitly requested.+     --+     -- * This is enabled by --prefer-oldest.+     --+   | PreferAllOldest+      -- | Always prefer the installed versions over ones that would need to be      -- installed. Secondarily, prefer latest versions (eg the latest installed      -- version or if there are none then the latest source version).
src/Distribution/Client/DistDirLayout.hs view
@@ -27,6 +27,8 @@  import System.FilePath +import Distribution.Client.Config+         ( defaultStoreDir, defaultLogsDir) import Distribution.Package          ( PackageId, PackageIdentifier, ComponentId, UnitId ) import Distribution.Compiler@@ -292,19 +294,16 @@       storeIncomingDirectory compid </> prettyShow unitid <.> "lock"  -defaultCabalDirLayout :: FilePath -> CabalDirLayout-defaultCabalDirLayout cabalDir =-    mkCabalDirLayout cabalDir Nothing Nothing+defaultCabalDirLayout :: IO CabalDirLayout+defaultCabalDirLayout =+    mkCabalDirLayout Nothing Nothing -mkCabalDirLayout :: FilePath -- ^ Cabal directory-                 -> Maybe FilePath -- ^ Store directory. Must be absolute+mkCabalDirLayout :: Maybe FilePath -- ^ Store directory. Must be absolute                  -> Maybe FilePath -- ^ Log directory-                 -> CabalDirLayout-mkCabalDirLayout cabalDir mstoreDir mlogDir =-    CabalDirLayout {..}-  where-    cabalStoreDirLayout :: StoreDirLayout-    cabalStoreDirLayout =-        defaultStoreDirLayout (fromMaybe (cabalDir </> "store") mstoreDir)-    cabalLogsDirectory :: FilePath-    cabalLogsDirectory = fromMaybe (cabalDir </> "logs") mlogDir+                 -> IO CabalDirLayout+mkCabalDirLayout mstoreDir mlogDir = do+    cabalStoreDirLayout <-+      defaultStoreDirLayout <$> maybe defaultStoreDir pure mstoreDir+    cabalLogsDirectory <-+      maybe defaultLogsDir pure mlogDir+    pure $ CabalDirLayout {..}
src/Distribution/Client/FetchUtils.hs view
@@ -11,7 +11,7 @@ -- -- Functions for fetching packages ------------------------------------------------------------------------------{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE RecordWildCards, ScopedTypeVariables #-} module Distribution.Client.FetchUtils (      -- * fetching packages@@ -22,6 +22,7 @@     -- ** specifically for repo packages     checkRepoTarballFetched,     fetchRepoTarball,+    verifyFetchedTarball,      -- ** fetching packages asynchronously     asyncFetchPackages,@@ -43,7 +44,7 @@ import Distribution.Package          ( PackageId, packageName, packageVersion ) import Distribution.Simple.Utils-         ( notice, info, debug, die' )+         ( notice, info, debug, warn, die' ) import Distribution.Verbosity          ( verboseUnmarkOutput ) import Distribution.Client.GlobalFlags@@ -56,7 +57,8 @@ import Control.Concurrent.Async import Control.Concurrent.MVar import System.Directory-         ( doesFileExist, createDirectoryIfMissing, getTemporaryDirectory )+         ( doesFileExist, createDirectoryIfMissing, getTemporaryDirectory+         , getFileSize ) import System.IO          ( openTempFile, hClose ) import System.FilePath@@ -67,6 +69,8 @@          ( URI(uriPath) )  import qualified Hackage.Security.Client as Sec+import qualified Hackage.Security.Util.Path as Sec+import qualified Hackage.Security.Util.Checked as Sec  -- ------------------------------------------------------------ -- * Actually fetch things@@ -118,6 +122,38 @@       then return (Just file)       else return Nothing +verifyFetchedTarball :: Verbosity -> RepoContext -> Repo -> PackageId -> IO Bool+verifyFetchedTarball verbosity repoCtxt repo pkgid =+   let file = packageFile repo pkgid+       handleError :: IO Bool -> IO Bool+       handleError act = do+         res <- Safe.try act+         case res of+           Left e -> warn verbosity ("Error verifying fetched tarball " ++ file ++ ", will redownload: " ++ show (e :: SomeException)) >> pure False+           Right b -> pure b+   in handleError $ do+        exists <- doesFileExist file+        if not exists+          then return True -- if the file does not exist, it vacuously passes validation, since it will be downloaded as necessary with what we will then check is a valid hash.+          else case repo of+            -- a secure repo has hashes we can compare against to confirm this is the correct file.+                RepoSecure{} ->+                 repoContextWithSecureRepo repoCtxt repo $ \repoSecure ->+                   Sec.withIndex repoSecure $ \callbacks ->+                     let warnAndFail s = warn verbosity ("Fetched tarball " ++ file ++ " does not match server, will redownload: " ++ s) >> return False+                     -- the do block in parens is due to dealing with the checked exceptions mechanism.+                     in (do fileInfo <- Sec.indexLookupFileInfo callbacks pkgid+                            sz <- Sec.FileLength . fromInteger <$> getFileSize file+                            if sz /= Sec.fileInfoLength (Sec.trusted fileInfo)+                              then warnAndFail "file length mismatch"+                              else do+                                res <- Sec.compareTrustedFileInfo (Sec.trusted fileInfo) <$> Sec.computeFileInfo (Sec.Path file :: Sec.Path Sec.Absolute)+                                if res+                                  then pure True+                                  else warnAndFail "file hash mismatch")+                       `Sec.catchChecked` (\(e :: Sec.InvalidPackageException) -> warnAndFail (show e))+                       `Sec.catchChecked` (\(e :: Sec.VerificationError) -> warnAndFail (show e))+                _ -> pure True  -- | Fetch a package if we don't have it already. --@@ -290,7 +326,7 @@ -- ------------------------------------------------------------  -- | Generate the full path to the locally cached copy of--- the tarball for a given @PackageIdentifer@.+-- the tarball for a given @PackageIdentifier@. -- packageFile :: Repo -> PackageId -> FilePath packageFile repo pkgid = packageDir repo pkgid@@ -298,7 +334,7 @@                      <.> "tar.gz"  -- | Generate the full path to the directory where the local cached copy of--- the tarball for a given @PackageIdentifer@ is stored.+-- the tarball for a given @PackageIdentifier@ is stored. -- packageDir :: Repo -> PackageId -> FilePath packageDir (RepoLocalNoIndex (LocalRepo _ dir _) _) _pkgid = dir
src/Distribution/Client/GenBounds.hs view
@@ -19,7 +19,7 @@ import Distribution.Client.Compat.Prelude  import Distribution.Client.Utils-         ( incVersion )+         ( hasElem, incVersion ) import Distribution.Client.Freeze          ( getFreezePkgs ) import Distribution.Client.Setup@@ -40,7 +40,7 @@ import Distribution.Simple.Program          ( ProgramDb ) import Distribution.Simple.Utils-         ( tryFindPackageDesc )+         ( notice, tryFindPackageDesc ) import Distribution.System          ( Platform ) import Distribution.Version@@ -106,33 +106,29 @@     case epd of       Left _ -> putStrLn "finalizePD failed"       Right (pd,_) -> do-        let needBounds = filter (not . hasUpperBound . depVersion) $+       let needBounds = map depName $ filter (not . hasUpperBound . depVersion) $                          enabledBuildDepends pd defaultComponentRequestedSpec -        if (null needBounds)-          then putStrLn-               "Congratulations, all your dependencies have upper bounds!"-          else go needBounds-  where-     go needBounds = do        pkgs  <- getFreezePkgs                   verbosity packageDBs repoCtxt comp platform progdb                   globalFlags freezeFlags -       putStrLn boundsNeededMsg--       let isNeeded pkg = unPackageName (packageName pkg)-                          `elem` map depName needBounds+       let isNeeded = hasElem needBounds . unPackageName . packageName        let thePkgs = filter isNeeded pkgs         let padTo = maximum $ map (length . unPackageName . packageName) pkgs-       traverse_ (putStrLn . (++",") . showBounds padTo) thePkgs -     depName :: Dependency -> String-     depName (Dependency pn _ _) = unPackageName pn+       if null thePkgs then notice verbosity+         "Congratulations, all your dependencies have upper bounds!"+        else do+         notice verbosity boundsNeededMsg+         traverse_ (notice verbosity . (++",") . showBounds padTo) thePkgs -     depVersion :: Dependency -> VersionRange-     depVersion (Dependency _ vr _) = vr+depName :: Dependency -> String+depName (Dependency pn _ _) = unPackageName pn++depVersion :: Dependency -> VersionRange+depVersion (Dependency _ vr _) = vr  -- | The message printed when some dependencies are found to be lacking proper -- PVP-mandated bounds.
src/Distribution/Client/Get.hs view
@@ -31,7 +31,7 @@ import Distribution.Simple.Setup          ( Flag(..), fromFlag, fromFlagOrDefault, flagToMaybe ) import Distribution.Simple.Utils-         ( notice, die', info, writeFileAtomic )+         ( notice, die', info, warn, writeFileAtomic ) import qualified Distribution.PackageDescription as PD import Distribution.Simple.Program          ( programName )@@ -49,8 +49,11 @@ import Distribution.Client.IndexUtils         ( getSourcePackagesAtIndexState, TotalIndexState, ActiveRepos ) import Distribution.Solver.Types.SourcePackage+import Distribution.PackageDescription.PrettyPrint+        ( writeGenericPackageDescription )  import qualified Data.Map as Map+import Control.Monad ( mapM_ ) import System.Directory          ( createDirectoryIfMissing, doesDirectoryExist, doesFileExist ) import System.FilePath@@ -94,16 +97,26 @@   unless (null prefix) $     createDirectoryIfMissing True prefix -  if useSourceRepo-    then clone  pkgs-    else unpack pkgs+  if onlyPkgDescr+    then do+      when useSourceRepo $+        warn verbosity $+          "Ignoring --source-repository for --only-package-description" +      mapM_ (unpackOnlyPkgDescr verbosity prefix) pkgs+    else+      if useSourceRepo+        then clone pkgs+        else unpack pkgs+   where     resolverParams :: SourcePackageDb -> [PackageSpecifier UnresolvedSourcePackage] -> DepResolverParams     resolverParams sourcePkgDb pkgSpecifiers =         --TODO: add command-line constraint and preference args for unpack         standardInstallPolicy mempty sourcePkgDb pkgSpecifiers +    onlyPkgDescr = fromFlagOrDefault False (getOnlyPkgDescr getFlags)+     prefix :: String     prefix = fromFlagOrDefault "" (getDestDir getFlags) @@ -188,6 +201,23 @@                       ++ " with the latest revision from the index."         writeFileAtomic descFilePath pkgtxt ++-- | Write a @pkgId.cabal@ file with the package description to the destination+-- directory, unless one already exists.+unpackOnlyPkgDescr :: Verbosity -> FilePath -> UnresolvedSourcePackage -> IO ()+unpackOnlyPkgDescr verbosity dstDir pkg = do+    let pkgFile = dstDir </> prettyShow (packageId pkg) <.> "cabal"+    existsFile <- doesFileExist pkgFile+    when existsFile $ die' verbosity $+      "The file \"" ++ pkgFile ++ "\" already exists, not overwriting."+    existsDir <- doesDirectoryExist (addTrailingPathSeparator pkgFile)+    when existsDir $ die' verbosity $+      "A directory \"" ++ pkgFile ++ "\" is in the way, not unpacking."+    notice verbosity $ "Writing package description to " ++ pkgFile+    case srcpkgDescrOverride pkg of+      Just pkgTxt -> writeFileAtomic pkgFile pkgTxt+      Nothing ->+        writeGenericPackageDescription pkgFile (srcpkgDescription pkg)  -- ------------------------------------------------------------ -- * Cloning packages from their declared source repositories
src/Distribution/Client/Haddock.hs view
@@ -41,7 +41,7 @@                        -> IO () regenerateHaddockIndex verbosity pkgs progdb index = do       (paths, warns) <- haddockPackagePaths pkgs' Nothing-      let paths' = [ (interface, html) | (interface, Just html, _) <- paths]+      let paths' = [ (interface, html) | (interface, Just html, _, _) <- paths]       for_ warns (debug verbosity)        (confHaddock, _, _) <-
src/Distribution/Client/HttpUtils.hs view
@@ -500,7 +500,7 @@             warningMsg     =  "the 'wget' transport currently doesn't support"                            ++ " range requests, which wastes network bandwidth."                            ++ " To fix this, set 'http-transport' to 'curl' or"-                           ++ " 'plain-http' in '~/.cabal/config'."+                           ++ " 'plain-http' in '~/.config/cabal/config'."                            ++ " Note that the 'plain-http' transport doesn't"                            ++ " support HTTPS.\n" 
src/Distribution/Client/Init/Format.hs view
@@ -123,7 +123,7 @@ mkCommonStanza :: WriteOpts -> PrettyField FieldAnnotation mkCommonStanza opts = case specHasCommonStanzas $ _optCabalSpec opts of   NoCommonStanzas -> PrettyEmpty-  _ -> PrettySection +  _ -> PrettySection     annNoComments     "common"     [text "warnings"]@@ -136,7 +136,7 @@         NoCommonStanzas -> PrettyEmpty         _ -> field "import" (hsep . map text) ["warnings"]           ["Import common warning flags."]-          False +          False           opts      , field "exposed-modules" formatExposedModules (toList expMods)@@ -182,9 +182,9 @@           NoCommonStanzas -> PrettyEmpty           _ -> field "import" (hsep . map text) ["warnings"]             ["Import common warning flags."]-            False +            False             opts-      +       , field "main-is" unsafeFromHs exeMain          [".hs or .lhs file containing the Main module."]          True@@ -230,9 +230,9 @@            NoCommonStanzas -> PrettyEmpty            _ -> field "import" (hsep . map text) ["warnings"]              ["Import common warning flags."]-             False +             False              opts-      +        , field "default-language" id lang          ["Base language which the package is written in."]          True
src/Distribution/Client/Init/Interactive/Command.hs view
@@ -297,7 +297,7 @@ packageNamePrompt :: Interactive m => SourcePackageDb -> InitFlags -> m PackageName packageNamePrompt srcDb flags = getPackageName flags $ do     defName <- case packageDir flags of-        Flag b -> return $ filePathToPkgName b+        Flag b -> filePathToPkgName b         NoFlag -> currentDirPkgName      go $ DefaultPrompt defName@@ -416,7 +416,7 @@     let h2010   = "Haskell2010"         h98     = "Haskell98"         ghc2021 = "GHC2021 (requires at least GHC 9.2)"-          +     l <- promptList ("Choose a language for your " ++ pkgType)       [h2010, h98, ghc2021]       (DefaultPrompt h2010)@@ -427,13 +427,7 @@       | l == h2010       -> return Haskell2010       | l == h98         -> return Haskell98       | l == ghc2021     -> return GHC2021-      | all isAlphaNum l -> return $ UnknownLanguage l-      | otherwise        -> do-        putStrLn-          $ "\nThe language must be alphanumeric. "-          ++ "Please enter a different language."--        languagePrompt flags pkgType+      | otherwise        -> return $ UnknownLanguage l  noCommentsPrompt :: Interactive m => InitFlags -> m Bool noCommentsPrompt flags = getNoComments flags $ do
src/Distribution/Client/Init/NonInteractive/Command.hs view
@@ -139,7 +139,7 @@       return $ ProjectSettings         (mkOpts comments cabalSpec) pkgDesc (Just libTarget)         (Just exeTarget) testTarget-    +     TestSuite -> do       testTarget <- genTestTarget initFlags comp pkgIx cabalSpec @@ -358,7 +358,7 @@            otherModules' <- libOtherModulesHeuristics flags           return $ filter (`notElem` otherModules') modulesNames-        +         else           return [] 
src/Distribution/Client/Init/NonInteractive/Heuristics.hs view
@@ -27,7 +27,6 @@   ) where  import Distribution.Client.Compat.Prelude hiding (readFile, (<|>), many)-import Distribution.Utils.Generic (safeLast)  import Distribution.Simple.Setup (fromFlagOrDefault) @@ -40,7 +39,7 @@ import Distribution.CabalSpecVersion import Language.Haskell.Extension import Distribution.Version-import Distribution.Types.PackageName (PackageName, mkPackageName)+import Distribution.Types.PackageName (PackageName) import Distribution.Simple.Compiler import qualified Data.Set as Set import Distribution.FieldGrammar.Newtypes@@ -82,24 +81,7 @@  -- | Guess the package name based on the given root directory. guessPackageName :: Interactive m => FilePath -> m PackageName-guessPackageName = fmap (mkPackageName . repair . fromMaybe "" . safeLast . splitDirectories)-                 . canonicalizePathNoThrow-  where-    -- Treat each span of non-alphanumeric characters as a hyphen. Each-    -- hyphenated component of a package name must contain at least one-    -- alphabetic character. An arbitrary character ('x') will be prepended if-    -- this is not the case for the first component, and subsequent components-    -- will simply be run together. For example, "1+2_foo-3" will become-    -- "x12-foo3".-    repair = repair' ('x' :) id-    repair' invalid valid x = case dropWhile (not . isAlphaNum) x of-        "" -> repairComponent ""-        x' -> let (c, r) = first repairComponent $ span isAlphaNum x'-              in c ++ repairRest r-      where-        repairComponent c | all isDigit c = invalid c-                          | otherwise     = valid c-    repairRest = repair' id ('-' :)+guessPackageName = filePathToPkgName  -- | Try to guess the license from an already existing @LICENSE@ file in --   the package directory, comparing the file contents with the ones@@ -125,7 +107,7 @@ guessPackageType flags = do   if fromFlagOrDefault False (initializeTestSuite flags)     then-      return TestSuite +      return TestSuite     else do       let lastDir dirs   = L.last . splitDirectories $ dirs           srcCandidates  = [defaultSourceDir, "src", "source"]
src/Distribution/Client/Init/Simple.hs view
@@ -16,7 +16,7 @@ import qualified Data.List.NonEmpty as NEL import Distribution.Client.Init.Utils (currentDirPkgName, mkPackageNameDep, fixupDocFiles) import Distribution.Client.Init.Defaults-import Distribution.Simple.Flag (fromFlagOrDefault, flagElim, Flag(..))+import Distribution.Simple.Flag (fromFlagOrDefault, flagElim, Flag (..)) import Distribution.Client.Init.FlagExtractors import qualified Data.Set as Set import Distribution.Types.Dependency@@ -170,6 +170,6 @@       return $ initFlags         { dependencies = Flag $ based ++ as         }-  _ -> do+  NoFlag -> do     based <- dependenciesPrompt pkgIx initFlags     return initFlags { dependencies = Flag based }
src/Distribution/Client/Init/Types.hs view
@@ -72,7 +72,7 @@ import qualified System.IO  import qualified System.Directory as P-import qualified System.Process as P+import qualified System.Process as Process import qualified Distribution.Compat.Environment as P import System.FilePath import Distribution.FieldGrammar.Newtypes (SpecLicense)@@ -342,7 +342,7 @@     doesDirectoryExist = P.doesDirectoryExist     doesFileExist = P.doesFileExist     canonicalizePathNoThrow = P.canonicalizePathNoThrow-    readProcessWithExitCode = P.readProcessWithExitCode+    readProcessWithExitCode = Process.readProcessWithExitCode     getEnvironment = P.getEnvironment     getCurrentYear = P.getCurrentYear     listFilesInside = P.listFilesInside
src/Distribution/Client/Init/Utils.hs view
@@ -23,9 +23,9 @@ ) where  -import qualified Prelude+import qualified Prelude () import Distribution.Client.Compat.Prelude hiding (putStrLn, empty, readFile, Parsec, many)-import Distribution.Utils.Generic (isInfixOf)+import Distribution.Utils.Generic (isInfixOf, safeLast)  import Control.Monad (forM) @@ -38,7 +38,6 @@ import Distribution.ModuleName (ModuleName) import Distribution.InstalledPackageInfo (InstalledPackageInfo, exposed) import qualified Distribution.Package as P-import qualified Distribution.Types.PackageName as PN import Distribution.Simple.PackageIndex (InstalledPackageIndex, moduleNameIndex) import Distribution.Simple.Setup (Flag(..)) import Distribution.Utils.String (trim)@@ -277,11 +276,28 @@       Flag x -> x                   < CabalSpecV2_0       NoFlag -> defaultCabalVersion < CabalSpecV2_0 -filePathToPkgName :: FilePath -> P.PackageName-filePathToPkgName = PN.mkPackageName . Prelude.last . splitDirectories+filePathToPkgName :: Interactive m => FilePath -> m P.PackageName+filePathToPkgName = fmap (mkPackageName . repair . fromMaybe "" . safeLast . splitDirectories)+                 . canonicalizePathNoThrow+  where+    -- Treat each span of non-alphanumeric characters as a hyphen. Each+    -- hyphenated component of a package name must contain at least one+    -- alphabetic character. An arbitrary character ('x') will be prepended if+    -- this is not the case for the first component, and subsequent components+    -- will simply be run together. For example, "1+2_foo-3" will become+    -- "x12-foo3".+    repair = repair' ('x' :) id+    repair' invalid valid x = case dropWhile (not . isAlphaNum) x of+        "" -> repairComponent ""+        x' -> let (c, r) = first repairComponent $ span isAlphaNum x'+              in c ++ repairRest r+      where+        repairComponent c | all isDigit c = invalid c+                          | otherwise     = valid c+    repairRest = repair' id ('-' :)  currentDirPkgName :: Interactive m => m P.PackageName-currentDirPkgName = filePathToPkgName <$> getCurrentDirectory+currentDirPkgName = filePathToPkgName =<< getCurrentDirectory  mkPackageNameDep :: PackageName -> Dependency mkPackageNameDep pkg = mkDependency pkg anyVersion (NES.singleton LMainLibName)
src/Distribution/Client/Install.hs view
@@ -71,7 +71,7 @@          , ConfigExFlags(..), InstallFlags(..)          , filterTestFlags ) import Distribution.Client.Config-         ( getCabalDir, defaultUserInstall )+         ( defaultReportsDir, defaultUserInstall ) import Distribution.Client.Tar (extractTarGzFile) import Distribution.Client.Types as Source import Distribution.Client.BuildReports.Types@@ -197,7 +197,7 @@         warn verbosity $ "--root-cmd is no longer supported, "         ++ "see https://github.com/haskell/cabal/issues/3353"         ++ " (if you didn't type --root-cmd, comment out root-cmd"-        ++ " in your ~/.cabal/config file)"+        ++ " in your ~/.config/cabal/config file)"     let userOrSandbox = fromFlag (configUserInstall configFlags)     unless userOrSandbox $         warn verbosity $ "the --global flag is deprecated -- "@@ -831,10 +831,10 @@ storeDetailedBuildReports :: Verbosity -> FilePath                           -> [(BuildReports.BuildReport, Maybe Repo)] -> IO () storeDetailedBuildReports verbosity logsDir reports = sequence_-  [ do dotCabal <- getCabalDir+  [ do allReportsDir <- defaultReportsDir        let logFileName = prettyShow (BuildReports.package report) <.> "log"            logFile     = logsDir </> logFileName-           reportsDir  = dotCabal </> "reports" </> unRepoName (remoteRepoName remoteRepo)+           reportsDir  = allReportsDir </> unRepoName (remoteRepoName remoteRepo)            reportFile  = reportsDir </> logFileName         handleMissingLogFile $ do
src/Distribution/Client/Manpage.hs view
@@ -27,15 +27,14 @@ import Distribution.Client.Init.Utils   (trim) import Distribution.Client.ManpageFlags import Distribution.Client.Setup        (globalCommand)+import Distribution.Compat.Process      (proc) import Distribution.Simple.Command-import Distribution.Simple.Flag         (fromFlagOrDefault)+import Distribution.Simple.Flag         (fromFlag, fromFlagOrDefault) import Distribution.Simple.Utils-  ( IOData(..), IODataMode(..), createProcessWithEnv, ignoreSigPipe, rawSystemStdInOut )-import qualified Distribution.Verbosity as Verbosity+  ( IOData(..), IODataMode(..), ignoreSigPipe, rawSystemStdInOut, rawSystemProcAction,+    fromCreatePipe, die' ) import System.IO                        (hClose, hPutStr) import System.Environment               (lookupEnv)-import System.FilePath                  (takeFileName)- import qualified System.Process as Process  data FileInfo = FileInfo String String -- ^ path, description@@ -47,7 +46,7 @@ -- | A list of files that should be documented in the manual page. files :: [FileInfo] files =-  [ (FileInfo "~/.cabal/config" "The defaults that can be overridden with command-line options.")+  [ (FileInfo "~/.config/cabal/config" "The defaults that can be overridden with command-line options.")   ]  manpageCmd :: String -> [CommandSpec a] -> ManpageFlags -> IO ()@@ -69,7 +68,7 @@          -- Feed contents into @nroff -man /dev/stdin@         (formatted, _errors, ec1) <- rawSystemStdInOut-          Verbosity.normal+          verbosity           "nroff"           [ "-man", "/dev/stdin" ]           Nothing  -- Inherit working directory@@ -79,26 +78,23 @@          unless (ec1 == ExitSuccess) $ exitWith ec1 -        pager <- fromMaybe "less" <$> lookupEnv "PAGER"-        -- 'less' is borked with color sequences otherwise-        let pagerArgs = if takeFileName pager == "less" then ["-R"] else []+        pagerAndArgs <- fromMaybe "less -R" <$> lookupEnv "PAGER"+        -- 'less' is borked with color sequences otherwise, hence -R+        (pager, pagerArgs) <- case words pagerAndArgs of+          []     -> die' verbosity "man: empty value of the PAGER environment variable"+          (p:pa) -> pure (p, pa)         -- Pipe output of @nroff@ into @less@-        (Just inLess, _, _, procLess) <- createProcessWithEnv-          Verbosity.normal-          pager-          pagerArgs-          Nothing  -- Inherit working directory-          Nothing  -- Inherit environment-          Process.CreatePipe  -- in-          Process.Inherit     -- out-          Process.Inherit     -- err--        hPutStr inLess formatted-        hClose  inLess-        exitWith =<< Process.waitForProcess procLess+        (ec2, _) <- rawSystemProcAction verbosity+            (proc pager pagerArgs) { Process.std_in = Process.CreatePipe }+              $ \mIn _ _ -> do+          let wIn = fromCreatePipe mIn+          hPutStr wIn formatted+          hClose  wIn+        exitWith ec2   where     contents :: String     contents = manpage pname commands+    verbosity = fromFlag $ manpageVerbosity flags  -- | Produces a manual page with @troff@ markup. manpage :: String -> [CommandSpec a] -> String
src/Distribution/Client/PackageHash.hs view
@@ -196,6 +196,7 @@        pkgHashDebugInfo           :: DebugInfoLevel,        pkgHashProgramArgs         :: Map String [String],        pkgHashExtraLibDirs        :: [FilePath],+       pkgHashExtraLibDirsStatic  :: [FilePath],        pkgHashExtraFrameworkDirs  :: [FilePath],        pkgHashExtraIncludeDirs    :: [FilePath],        pkgHashProgPrefix          :: Maybe PathTemplate,@@ -215,7 +216,10 @@        pkgHashHaddockCss          :: Maybe FilePath,        pkgHashHaddockLinkedSource :: Bool,        pkgHashHaddockQuickJump    :: Bool,-       pkgHashHaddockContents     :: Maybe PathTemplate+       pkgHashHaddockContents     :: Maybe PathTemplate,+       pkgHashHaddockIndex        :: Maybe PathTemplate,+       pkgHashHaddockBaseUrl      :: Maybe String,+       pkgHashHaddockLib          :: Maybe String  --     TODO: [required eventually] pkgHashToolsVersions     ? --     TODO: [required eventually] pkgHashToolsExtraOptions ?@@ -290,6 +294,7 @@       , opt   "stripped-exe" True  prettyShow pkgHashStripExes       , opt   "debug-info"   NormalDebugInfo (show . fromEnum) pkgHashDebugInfo       , opt   "extra-lib-dirs"     [] unwords pkgHashExtraLibDirs+      , opt   "extra-lib-dirs-static" [] unwords pkgHashExtraLibDirsStatic       , opt   "extra-framework-dirs" [] unwords pkgHashExtraFrameworkDirs       , opt   "extra-include-dirs" [] unwords pkgHashExtraIncludeDirs       , opt   "prog-prefix" Nothing (maybe "" fromPathTemplate) pkgHashProgPrefix@@ -309,6 +314,9 @@       , opt   "haddock-hyperlink-source" False prettyShow pkgHashHaddockLinkedSource       , opt   "haddock-quickjump" False prettyShow pkgHashHaddockQuickJump       , opt   "haddock-contents-location" Nothing (maybe "" fromPathTemplate) pkgHashHaddockContents+      , opt   "haddock-index-location" Nothing (maybe "" fromPathTemplate) pkgHashHaddockIndex+      , opt   "haddock-base-url" Nothing (fromMaybe "") pkgHashHaddockBaseUrl+      , opt   "haddock-lib" Nothing (fromMaybe "") pkgHashHaddockLib        ] ++ Map.foldrWithKey (\prog args acc -> opt (prog ++ "-options") [] unwords args : acc) [] pkgHashProgramArgs   where
src/Distribution/Client/ProjectConfig.hs view
@@ -119,7 +119,7 @@          ( PathTemplate, fromPathTemplate          , toPathTemplate, substPathTemplate, initialPathTemplateEnv ) import Distribution.Simple.Utils-         ( die', warn, notice, info, createDirectoryIfMissingVerbose, rawSystemIOWithEnv )+         ( die', warn, notice, info, createDirectoryIfMissingVerbose, maybeExit, rawSystemIOWithEnv ) import Distribution.Client.Utils          ( determineNumJobs ) import Distribution.Utils.NubList@@ -254,6 +254,7 @@     solverSettingIndexState        = flagToMaybe projectConfigIndexState     solverSettingActiveRepos       = flagToMaybe projectConfigActiveRepos     solverSettingIndependentGoals  = fromFlag projectConfigIndependentGoals+    solverSettingPreferOldest      = fromFlag projectConfigPreferOldest   --solverSettingShadowPkgs        = fromFlag projectConfigShadowPkgs   --solverSettingReinstall         = fromFlag projectConfigReinstall   --solverSettingAvoidReinstalls   = fromFlag projectConfigAvoidReinstalls@@ -274,7 +275,8 @@        projectConfigStrongFlags       = Flag (StrongFlags False),        projectConfigAllowBootLibInstalls = Flag (AllowBootLibInstalls False),        projectConfigOnlyConstrained   = Flag OnlyConstrainedNone,-       projectConfigIndependentGoals  = Flag (IndependentGoals False)+       projectConfigIndependentGoals  = Flag (IndependentGoals False),+       projectConfigPreferOldest      = Flag (PreferOldest False)      --projectConfigShadowPkgs        = Flag False,      --projectConfigReinstall         = Flag False,      --projectConfigAvoidReinstalls   = Flag False,@@ -465,7 +467,7 @@     -> Flag Bool                  -- ^ whether to ignore local project (--ignore-project flag)     -> Flag FilePath              -- ^ @--cabal-config@     -> IO a                       -- ^ with project-    -> (ProjectConfig -> IO a)    -- ^ without projet+    -> (ProjectConfig -> IO a)    -- ^ without project     -> IO a withProjectOrGlobalConfig verbosity (Flag True) gcf _with without = do     globalConfig <- runRebuild "" $ readGlobalConfig verbosity gcf@@ -620,7 +622,7 @@     writeFile file . showProjectConfig  --- | Read the user's @~/.cabal/config@ file.+-- | Read the user's cabal-install config file. -- readGlobalConfig :: Verbosity -> Flag FilePath -> Rebuild ProjectConfig readGlobalConfig verbosity configFileFlag = do@@ -1175,8 +1177,7 @@         -- Run post-checkout-command if it is specified         for_ repoGroupWithPaths $ \(repo, _, repoPath) ->             for_ (nonEmpty (srpCommand repo)) $ \(cmd :| args) -> liftIO $ do-                exitCode <- rawSystemIOWithEnv verbosity cmd args (Just repoPath) Nothing Nothing Nothing Nothing-                unless (exitCode == ExitSuccess) $ exitWith exitCode+                maybeExit $ rawSystemIOWithEnv verbosity cmd args (Just repoPath) Nothing Nothing Nothing Nothing          -- But for reading we go through each 'SourceRepo' including its subdir         -- value and have to know which path each one ended up in.
src/Distribution/Client/ProjectConfig/Legacy.hs view
@@ -7,7 +7,8 @@    -- Project config skeletons     ProjectConfigSkeleton,     parseProjectSkeleton,-    instantiateProjectConfigSkeleton,+    instantiateProjectConfigSkeletonFetchingCompiler,+    instantiateProjectConfigSkeletonWithCompiler,     singletonProjectConfigSkeleton,     projectSkeletonImports, @@ -44,7 +45,7 @@          ( ClientInstallFlags(..), defaultClientInstallFlags          , clientInstallOptions ) -import Distribution.Compat.Lens (view)+import Distribution.Compat.Lens (view, toListOf)  import Distribution.Solver.Types.ConstraintSource @@ -52,7 +53,7 @@ import Distribution.Package import Distribution.Types.SourceRepo (RepoType) import Distribution.Types.CondTree-         ( CondTree (..), CondBranch (..), mapTreeConds, traverseCondTreeC )+         ( CondTree (..), CondBranch (..), mapTreeConds, traverseCondTreeC, traverseCondTreeV, ignoreConditions ) import Distribution.PackageDescription          ( dispFlagAssignment, Condition (..), ConfVar (..), FlagAssignment ) import Distribution.PackageDescription.Configuration (simplifyWithSysParams)@@ -66,7 +67,7 @@          , TestFlags(..), testOptions', defaultTestFlags          , BenchmarkFlags(..), benchmarkOptions', defaultBenchmarkFlags          , programDbPaths', splitArgs, DumpBuildInfo (NoDumpBuildInfo, DumpBuildInfo)-         , readPackageDb, showPackageDb+         , readPackageDb, showPackageDb, installDirsOptions          ) import Distribution.Client.NixStyleOptions (NixStyleFlags (..)) import Distribution.Client.ProjectFlags (ProjectFlags (..), projectFlagsOptions, defaultProjectFlags)@@ -101,7 +102,7 @@ import Distribution.Client.ParseUtils import Distribution.Simple.Command          ( CommandUI(commandOptions), ShowOrParseArgs(..)-         , OptionField, option, reqArg' )+         , OptionField(..), option, reqArg' ) import Distribution.Types.PackageVersionConstraint          ( PackageVersionConstraint ) import Distribution.Parsec (ParsecParser, parsecToken)@@ -116,7 +117,7 @@ import Distribution.Fields.ConfVar (parseConditionConfVarFromClause)  import Distribution.Client.HttpUtils-import System.FilePath ((</>), isPathSeparator, makeValid)+import System.FilePath ((</>), isPathSeparator, makeValid, isAbsolute, takeDirectory) import System.Directory (createDirectoryIfMissing)  @@ -135,8 +136,16 @@ singletonProjectConfigSkeleton :: ProjectConfig -> ProjectConfigSkeleton singletonProjectConfigSkeleton x = CondNode x mempty mempty -instantiateProjectConfigSkeleton :: OS -> Arch -> CompilerInfo -> FlagAssignment -> ProjectConfigSkeleton -> ProjectConfig-instantiateProjectConfigSkeleton os arch impl _flags skel = go $ mapTreeConds (fst . simplifyWithSysParams os arch impl) skel+instantiateProjectConfigSkeletonFetchingCompiler :: Monad m =>  m (OS, Arch, CompilerInfo) -> FlagAssignment -> ProjectConfigSkeleton -> m ProjectConfig+instantiateProjectConfigSkeletonFetchingCompiler fetch flags skel+   | null (toListOf traverseCondTreeV skel) = pure $ fst (ignoreConditions skel)+   | otherwise = do+       (os, arch, impl) <- fetch+       pure $ instantiateProjectConfigSkeletonWithCompiler os arch impl flags skel+++instantiateProjectConfigSkeletonWithCompiler :: OS -> Arch -> CompilerInfo -> FlagAssignment -> ProjectConfigSkeleton -> ProjectConfig+instantiateProjectConfigSkeletonWithCompiler os arch impl _flags skel = go $ mapTreeConds (fst . simplifyWithSysParams os arch impl) skel     where         go :: CondTree                FlagName@@ -215,7 +224,8 @@             createDirectoryIfMissing True cacheDir             _ <- downloadURI httpTransport verbosity uri fp             BS.readFile fp-         Nothing -> BS.readFile pci+         Nothing -> BS.readFile $+           if isAbsolute pci then pci else takeDirectory source </> pci      modifiesCompiler :: ProjectConfig -> Bool     modifiesCompiler pc = isSet projectConfigHcFlavor || isSet projectConfigHcPath || isSet projectConfigHcPkg@@ -346,9 +356,17 @@         splitConfig pc = (pc                          , mempty { packageConfigProgramPaths = packageConfigProgramPaths pc                                   , packageConfigProgramPathExtra = packageConfigProgramPathExtra pc-                                  , packageConfigDocumentation = packageConfigDocumentation pc }) --- | Convert from the types currently used for the user-wide @~/.cabal/config@+                                  -- Some flags to haddock should be passed to dependencies+                                  , packageConfigDocumentation = packageConfigDocumentation pc+                                  , packageConfigHaddockHoogle = packageConfigHaddockHoogle pc+                                  , packageConfigHaddockHtml = packageConfigHaddockHtml pc+                                  , packageConfigHaddockInternal = packageConfigHaddockInternal pc+                                  , packageConfigHaddockQuickJump = packageConfigHaddockQuickJump pc+                                  , packageConfigHaddockLinkedSource = packageConfigHaddockLinkedSource pc+                                  })++-- | Convert from the types currently used for the user-wide Cabal config -- file into the 'ProjectConfig' type. -- -- Only a subset of the 'ProjectConfig' can be represented in the user-wide@@ -484,7 +502,7 @@       configHcPath              = projectConfigHcPath,       configHcPkg               = projectConfigHcPkg,     --configProgramPathExtra    = projectConfigProgPathExtra DELETE ME-    --configInstallDirs         = projectConfigInstallDirs,+      configInstallDirs         = projectConfigInstallDirs,     --configUserInstall         = projectConfigUserInstall,       configPackageDBs          = projectConfigPackageDBs     } = configFlags@@ -514,6 +532,7 @@       installMinimizeConflictSet = projectConfigMinimizeConflictSet,       installPerComponent       = projectConfigPerComponent,       installIndependentGoals   = projectConfigIndependentGoals,+      installPreferOldest       = projectConfigPreferOldest,     --installShadowPkgs         = projectConfigShadowPkgs,       installStrongFlags        = projectConfigStrongFlags,       installAllowBootLibInstalls = projectConfigAllowBootLibInstalls,@@ -595,7 +614,10 @@       haddockLinkedSource       = packageConfigHaddockLinkedSource,       haddockQuickJump          = packageConfigHaddockQuickJump,       haddockHscolourCss        = packageConfigHaddockHscolourCss,-      haddockContents           = packageConfigHaddockContents+      haddockContents           = packageConfigHaddockContents,+      haddockIndex              = packageConfigHaddockIndex,+      haddockBaseUrl            = packageConfigHaddockBaseUrl,+      haddockLib                = packageConfigHaddockLib     } = haddockFlags      TestFlags {@@ -724,7 +746,8 @@     configFlags = mempty {       configVerbosity     = projectConfigVerbosity,       configDistPref      = projectConfigDistDir,-      configPackageDBs    = projectConfigPackageDBs+      configPackageDBs    = projectConfigPackageDBs,+      configInstallDirs   = projectConfigInstallDirs     }      configExFlags = ConfigExFlags {@@ -756,6 +779,7 @@       installFineGrainedConflicts = projectConfigFineGrainedConflicts,       installMinimizeConflictSet = projectConfigMinimizeConflictSet,       installIndependentGoals  = projectConfigIndependentGoals,+      installPreferOldest      = projectConfigPreferOldest,       installShadowPkgs        = mempty, --projectConfigShadowPkgs,       installStrongFlags       = projectConfigStrongFlags,       installAllowBootLibInstalls = projectConfigAllowBootLibInstalls,@@ -821,7 +845,7 @@       configOptimization        = mempty,       configProgPrefix          = mempty,       configProgSuffix          = mempty,-      configInstallDirs         = mempty,+      configInstallDirs         = projectConfigInstallDirs,       configScratchDir          = mempty,       configDistPref            = mempty,       configCabalFilePath       = mempty,@@ -956,6 +980,9 @@       haddockKeepTempFiles = mempty,       haddockVerbosity     = mempty,       haddockCabalFilePath = mempty,+      haddockIndex         = packageConfigHaddockIndex,+      haddockBaseUrl       = packageConfigHaddockBaseUrl,+      haddockLib           = packageConfigHaddockLib,       haddockArgs          = mempty     } @@ -1115,7 +1142,7 @@         (Disp.text . showPackageDb) (fmap readPackageDb parsecToken)         configPackageDBs (\v conf -> conf { configPackageDBs = v })       ]-  . filterFields ["verbose", "builddir" ]+  . filterFields (["verbose", "builddir"] ++ map optionName installDirsOptions)   . commandOptionsToFields   $ configureOptions ParseArgs @@ -1165,7 +1192,7 @@       , "jobs", "keep-going", "offline", "per-component"         -- solver flags:       , "max-backjumps", "reorder-goals", "count-conflicts"-      , "fine-grained-conflicts" , "minimize-conflict-set", "independent-goals"+      , "fine-grained-conflicts" , "minimize-conflict-set", "independent-goals", "prefer-oldest"       , "strong-flags" , "allow-boot-library-installs"       , "reject-unconstrained-dependencies", "index-state"       ]@@ -1275,7 +1302,8 @@       , "foreign-libraries"       , "executables", "tests", "benchmarks", "all", "internal", "css"       , "hyperlink-source", "quickjump", "hscolour-css"-      , "contents-location", "keep-temp-files"+      , "contents-location", "index-location", "keep-temp-files", "base-url"+      , "lib"       ]   . commandOptionsToFields   ) (haddockOptions ParseArgs)@@ -1310,7 +1338,6 @@       []   . commandOptionsToFields   ) (benchmarkOptions' ParseArgs)-    where     overrideFieldCompiler =
src/Distribution/Client/ProjectConfig/Types.hs view
@@ -61,7 +61,7 @@ import Distribution.Simple.Setup          ( Flag, HaddockTarget(..), TestShowDetails(..), DumpBuildInfo (..) ) import Distribution.Simple.InstallDirs-         ( PathTemplate )+         ( PathTemplate, InstallDirs ) import Distribution.Utils.NubList          ( NubList ) @@ -73,7 +73,7 @@  -- | This type corresponds directly to what can be written in the -- @cabal.project@ file. Other sources of configuration can also be injected--- into this type, such as the user-wide @~/.cabal/config@ file and the+-- into this type, such as the user-wide config file and the -- command line of @cabal configure@ or @cabal build@. -- -- Since it corresponds to the external project file it is an instance of@@ -169,12 +169,11 @@        projectConfigHcPkg             :: Flag FilePath,        projectConfigHaddockIndex      :: Flag PathTemplate, -       -- Things that only make sense for manual mode, not --local mode+       -- Only makes sense for manual mode, not --local mode        -- too much control!      --projectConfigUserInstall       :: Flag Bool,-     --projectConfigInstallDirs       :: InstallDirs (Flag PathTemplate),-     --TODO: [required eventually] decide what to do with InstallDirs-     -- currently we don't allow it to be specified in the config file++       projectConfigInstallDirs       :: InstallDirs (Flag PathTemplate),        projectConfigPackageDBs        :: [Maybe PackageDB],         -- configuration used both by the solver and other phases@@ -203,6 +202,7 @@        projectConfigOnlyConstrained   :: Flag OnlyConstrained,        projectConfigPerComponent      :: Flag Bool,        projectConfigIndependentGoals  :: Flag IndependentGoals,+       projectConfigPreferOldest      :: Flag PreferOldest,         projectConfigProgPathExtra     :: NubList FilePath @@ -287,6 +287,9 @@        packageConfigHaddockQuickJump    :: Flag Bool, --TODO: [required eventually] use this        packageConfigHaddockHscolourCss  :: Flag FilePath, --TODO: [required eventually] use this        packageConfigHaddockContents     :: Flag PathTemplate, --TODO: [required eventually] use this+       packageConfigHaddockIndex        :: Flag PathTemplate, --TODO: [required eventually] use this+       packageConfigHaddockBaseUrl      :: Flag String, --TODO: [required eventually] use this+       packageConfigHaddockLib          :: Flag String, --TODO: [required eventually] use this        packageConfigHaddockForHackage   :: Flag HaddockTarget,        -- Test options        packageConfigTestHumanLog        :: Flag PathTemplate,@@ -410,7 +413,8 @@        solverSettingOnlyConstrained   :: OnlyConstrained,        solverSettingIndexState        :: Maybe TotalIndexState,        solverSettingActiveRepos       :: Maybe ActiveRepos,-       solverSettingIndependentGoals  :: IndependentGoals+       solverSettingIndependentGoals  :: IndependentGoals,+       solverSettingPreferOldest      :: PreferOldest        -- Things that only make sense for manual mode, not --local mode        -- too much control!      --solverSettingShadowPkgs        :: Bool,
src/Distribution/Client/ProjectOrchestration.hs view
@@ -138,7 +138,6 @@ import qualified Distribution.Client.BuildReports.Storage as BuildReports          ( storeLocal ) -import           Distribution.Client.Config (getCabalDir) import           Distribution.Client.HttpUtils import           Distribution.Client.Setup hiding (packageName) import           Distribution.Compiler@@ -162,7 +161,7 @@ import qualified Distribution.Simple.Setup as Setup import           Distribution.Simple.Command (commandShowOptions) import           Distribution.Simple.Configure (computeEffectiveProfiling)-+import           Distribution.Simple.PackageIndex (InstalledPackageIndex) import           Distribution.Simple.Utils                    ( die', warn, notice, noticeNoWrap, debugNoWrap, createDirectoryIfMissingVerbose, ordNub ) import           Distribution.Verbosity@@ -187,7 +186,7 @@  -- | Tracks what command is being executed, because we need to hide this somewhere -- for cases that need special handling (usually for error reporting).-data CurrentCommand = InstallCommand | HaddockCommand | OtherCommand+data CurrentCommand = InstallCommand | HaddockCommand | BuildCommand | ReplCommand | OtherCommand                     deriving (Show, Eq)  -- | This holds the context of a project prior to solving: the content of the@@ -199,7 +198,8 @@        projectConfig  :: ProjectConfig,        localPackages  :: [PackageSpecifier UnresolvedSourcePackage],        buildSettings  :: BuildTimeSettings,-       currentCommand :: CurrentCommand+       currentCommand :: CurrentCommand,+       installedPackages :: Maybe InstalledPackageIndex      }  establishProjectBaseContext@@ -222,8 +222,6 @@     -> CurrentCommand     -> IO ProjectBaseContext establishProjectBaseContextWithRoot verbosity cliConfig projectRoot currentCommand = do-    cabalDir <- getCabalDir-     let distDirLayout  = defaultDistDirLayout projectRoot mdistDirectory      httpTransport <- configureTransport verbosity@@ -247,9 +245,9 @@         mlogsDir = Setup.flagToMaybe projectConfigLogsDir     mstoreDir <- sequenceA $ makeAbsolute                  <$> Setup.flagToMaybe projectConfigStoreDir-    let cabalDirLayout = mkCabalDirLayout cabalDir mstoreDir mlogsDir+    cabalDirLayout <- mkCabalDirLayout mstoreDir mlogsDir -        buildSettings = resolveBuildTimeSettings+    let  buildSettings = resolveBuildTimeSettings                           verbosity cabalDirLayout                           projectConfig @@ -263,11 +261,13 @@       projectConfig,       localPackages,       buildSettings,-      currentCommand+      currentCommand,+      installedPackages     }   where     mdistDirectory = Setup.flagToMaybe projectConfigDistDir     ProjectConfigShared { projectConfigDistDir } = projectConfigShared cliConfig+    installedPackages = Nothing   -- | This holds the context between the pre-build, build and post-build phases.@@ -312,7 +312,8 @@       distDirLayout,       cabalDirLayout,       projectConfig,-      localPackages+      localPackages,+      installedPackages     }     action = do     -- Take the project configuration and make a plan for how to build@@ -324,6 +325,7 @@                          distDirLayout cabalDirLayout                          projectConfig                          localPackages+                         installedPackages     action elaboratedPlan elaboratedShared  runProjectPreBuildPhase@@ -337,7 +339,8 @@       distDirLayout,       cabalDirLayout,       projectConfig,-      localPackages+      localPackages,+      installedPackages     }     selectPlanSubset = do     -- Take the project configuration and make a plan for how to build@@ -349,6 +352,7 @@                          distDirLayout cabalDirLayout                          projectConfig                          localPackages+                         installedPackages      -- The plan for what to do is represented by an 'ElaboratedInstallPlan' @@ -862,26 +866,26 @@           ProjectBaseContext {             buildSettings = BuildTimeSettings{buildSettingDryRun},             projectConfig = ProjectConfig {+              projectConfigAllPackages =+                  PackageConfig {packageConfigOptimization = globalOptimization},               projectConfigLocalPackages =-                  PackageConfig {packageConfigOptimization}-            }+                  PackageConfig {packageConfigOptimization = localOptimization}+            },+            currentCommand           }           ProjectBuildContext {             elaboratedPlanToExecute = elaboratedPlan,             elaboratedShared,             pkgsBuildStatus           }--  | null pkgs-  = notice verbosity "Up to date"--  | otherwise-  = noticeNoWrap verbosity $ unlines $+  | null pkgs && currentCommand == BuildCommand+    = notice verbosity "Up to date"+  | not (null pkgs) = noticeNoWrap verbosity $ unlines $       (showBuildProfile ++ "In order, the following "        ++ wouldWill ++ " be built"        ++ ifNormal " (use -v for more details)" ++ ":")     : map showPkgAndReason pkgs-+  | otherwise = return ()   where     pkgs = InstallPlan.executionOrder elaboratedPlan @@ -997,7 +1001,7 @@     showBuildProfile :: String     showBuildProfile = "Build profile: " ++ unwords [       "-w " ++ (showCompilerId . pkgConfigCompiler) elaboratedShared,-      "-O" ++  (case packageConfigOptimization of+      "-O" ++  (case globalOptimization <> localOptimization of -- if local is not set, read global                 Setup.Flag NoOptimisation      -> "0"                 Setup.Flag NormalOptimisation  -> "1"                 Setup.Flag MaximumOptimisation -> "2"@@ -1153,7 +1157,7 @@       , [pkg]              <- rootpkgs       , installedUnitId pkg == pkgid       , isFailureSelfExplanatory (buildFailureReason failure)-      , currentCommand /= InstallCommand+      , currentCommand `notElem` [InstallCommand, BuildCommand, ReplCommand]       = True       | otherwise       = False@@ -1319,8 +1323,6 @@   -> CurrentCommand   -> IO ProjectBaseContext establishDummyProjectBaseContext verbosity projectConfig distDirLayout localPackages currentCommand = do-    cabalDir <- getCabalDir-     let ProjectConfigBuildOnly {           projectConfigLogsDir         } = projectConfigBuildOnly projectConfig@@ -1331,12 +1333,14 @@          mlogsDir = flagToMaybe projectConfigLogsDir         mstoreDir = flagToMaybe projectConfigStoreDir-        cabalDirLayout = mkCabalDirLayout cabalDir mstoreDir mlogsDir -        buildSettings :: BuildTimeSettings+    cabalDirLayout <- mkCabalDirLayout mstoreDir mlogsDir++    let buildSettings :: BuildTimeSettings         buildSettings = resolveBuildTimeSettings                           verbosity cabalDirLayout                           projectConfig+        installedPackages = Nothing      return ProjectBaseContext {       distDirLayout,@@ -1344,7 +1348,8 @@       projectConfig,       localPackages,       buildSettings,-      currentCommand+      currentCommand,+      installedPackages     }  establishDummyDistDirLayout :: Verbosity -> ProjectConfig -> FilePath -> IO DistDirLayout
src/Distribution/Client/ProjectPlanning.hs view
@@ -170,7 +170,9 @@ import qualified Text.PrettyPrint as Disp import qualified Data.Map as Map import qualified Data.Set as Set-import           Control.Monad.State as State+import           Control.Monad (sequence, forM)+import           Control.Monad.IO.Class (liftIO)+import           Control.Monad.State as State (State, execState, runState, state) import           Control.Exception (assert) import           Data.List (groupBy, deleteBy) import qualified Data.List.NonEmpty as NE@@ -330,11 +332,14 @@                        fileMonitorProjectConfigKey -- todo check deps too?       $ do           liftIO $ info verbosity "Project settings changed, reconfiguring..."-          liftIO $ createDirectoryIfMissingVerbose verbosity True distProjectCacheDirectory           projectConfigSkeleton <- phaseReadProjectConfig-          -- have to create the cache directory before configuring the compiler-          (compiler, Platform arch os, _) <- configureCompiler verbosity distDirLayout ((fst $ PD.ignoreConditions projectConfigSkeleton) <> cliConfig)-          let projectConfig = instantiateProjectConfigSkeleton os arch (compilerInfo compiler) mempty projectConfigSkeleton+          let fetchCompiler = do+                 -- have to create the cache directory before configuring the compiler+                 liftIO $ createDirectoryIfMissingVerbose verbosity True distProjectCacheDirectory+                 (compiler, Platform arch os, _) <- configureCompiler verbosity distDirLayout ((fst $ PD.ignoreConditions projectConfigSkeleton) <> cliConfig)+                 pure (os, arch, compilerInfo compiler)++          projectConfig <- instantiateProjectConfigSkeletonFetchingCompiler fetchCompiler mempty projectConfigSkeleton           localPackages <- phaseReadLocalPackages (projectConfig <> cliConfig)           return (projectConfig, localPackages) @@ -441,8 +446,8 @@         progdb   =             userSpecifyPaths (Map.toList (getMapLast packageConfigProgramPaths))           . modifyProgramSearchPath-              (++ [ ProgramSearchPathDir dir-                  | dir <- fromNubList packageConfigProgramPathExtra ])+              ([ ProgramSearchPathDir dir+               | dir <- fromNubList packageConfigProgramPathExtra ] ++)           $ defaultProgramDb  @@ -463,6 +468,7 @@                    -> DistDirLayout -> CabalDirLayout                    -> ProjectConfig                    -> [PackageSpecifier UnresolvedSourcePackage]+                   -> Maybe InstalledPackageIndex                    -> IO ( ElaboratedInstallPlan  -- with store packages                          , ElaboratedInstallPlan  -- with source packages                          , ElaboratedSharedConfig@@ -477,7 +483,7 @@                    }                    CabalDirLayout {                      cabalStoreDirLayout-                   } = \projectConfig localPackages ->+                   } = \projectConfig localPackages mbInstalledPackages ->     runRebuild distProjectRootDirectory $ do     progsearchpath <- liftIO $ getSystemSearchPath     let projectConfigMonitored = projectConfig { projectConfigBuildOnly = mempty }@@ -500,6 +506,7 @@                         <- phaseRunSolver         projectConfig                                                   compilerEtc                                                   localPackages+                                                  (fromMaybe mempty mbInstalledPackages)           (elaboratedPlan,            elaboratedShared) <- phaseElaboratePlan projectConfig                                                    compilerEtc pkgConfigDB@@ -573,13 +580,15 @@         :: ProjectConfig         -> (Compiler, Platform, ProgramDb)         -> [PackageSpecifier UnresolvedSourcePackage]+        -> InstalledPackageIndex         -> Rebuild (SolverInstallPlan, PkgConfigDb, IndexUtils.TotalIndexState, IndexUtils.ActiveRepos)     phaseRunSolver projectConfig@ProjectConfig {                      projectConfigShared,                      projectConfigBuildOnly                    }                    (compiler, platform, progdb)-                   localPackages =+                   localPackages+                   installedPackages =         rerunIfChanged verbosity fileMonitorSolverPlan                        (solverSettings,                         localPackages, localPackagesEnabledStanzas,@@ -606,7 +615,7 @@             notice verbosity "Resolving dependencies..."             planOrError <- foldProgress logMsg (pure . Left) (pure . Right) $               planPackages verbosity compiler platform solver solverSettings-                           installedPkgIndex sourcePkgDb pkgConfigDB+                           (installedPackages <> installedPkgIndex) sourcePkgDb pkgConfigDB                            localPackages localPackagesEnabledStanzas             case planOrError of               Left msg -> do reportPlanningFailure projectConfig compiler platform localPackages@@ -676,6 +685,7 @@             getPackageSourceHashes verbosity withRepoCtx solverPlan          defaultInstallDirs <- liftIO $ userInstallDirTemplates compiler+        let installDirs = fmap Cabal.fromFlag $ (fmap Flag defaultInstallDirs) <> (projectConfigInstallDirs projectConfigShared)         (elaboratedPlan, elaboratedShared)           <- liftIO . runLogProgress verbosity $               elaborateInstallPlan@@ -686,7 +696,7 @@                 solverPlan                 localPackages                 sourcePackageHashes-                defaultInstallDirs+                installDirs                 projectConfigShared                 projectConfigAllPackages                 projectConfigLocalPackages@@ -694,7 +704,7 @@         let instantiatedPlan               = instantiateInstallPlan                   cabalStoreDirLayout-                  defaultInstallDirs+                  installDirs                   elaboratedShared                   elaboratedPlan         liftIO $ debugNoWrap verbosity (InstallPlan.showInstallPlan instantiatedPlan)@@ -913,9 +923,9 @@         -- Tarballs from repositories, either where the repository provides         -- hashes as part of the repo metadata, or where we will have to         -- download and hash the tarball.-        repoTarballPkgsWithMetadata    :: [(PackageId, Repo)]+        repoTarballPkgsWithMetadataUnvalidated    :: [(PackageId, Repo)]         repoTarballPkgsWithoutMetadata :: [(PackageId, Repo)]-        (repoTarballPkgsWithMetadata,+        (repoTarballPkgsWithMetadataUnvalidated,          repoTarballPkgsWithoutMetadata) =           partitionEithers           [ case repo of@@ -923,10 +933,16 @@               _            -> Right (pkgid, repo)           | (pkgid, RepoTarballPackage repo _ _) <- allPkgLocations ] +    (repoTarballPkgsWithMetadata, repoTarballPkgsToDownloadWithMeta) <- fmap partitionEithers $+      liftIO $ withRepoCtx $ \repoctx -> forM repoTarballPkgsWithMetadataUnvalidated $+        \x@(pkg, repo) -> verifyFetchedTarball verbosity repoctx repo pkg >>= \b -> case b of+                          True -> return $ Left x+                          False -> return $ Right x+     -- For tarballs from repos that do not have hashes available we now have     -- to check if the packages were downloaded already.     ---    (repoTarballPkgsToDownload,+    (repoTarballPkgsToDownloadWithNoMeta,      repoTarballPkgsDownloaded)       <- fmap partitionEithers $          liftIO $ sequence@@ -936,6 +952,7 @@                   Just tarball -> return (Right (pkgid, tarball))            | (pkgid, repo) <- repoTarballPkgsWithoutMetadata ] +    let repoTarballPkgsToDownload = repoTarballPkgsToDownloadWithMeta ++ repoTarballPkgsToDownloadWithNoMeta     (hashesFromRepoMetadata,      repoTarballPkgsNewlyDownloaded) <-       -- Avoid having to initialise the repository (ie 'withRepoCtx') if we@@ -1030,7 +1047,6 @@ planPackages verbosity comp platform solver SolverSettings{..}              installedPkgIndex sourcePkgDb pkgConfigDB              localPackages pkgStanzasEnable =-     resolveDependencies       platform (compilerInfo comp)       pkgConfigDB solver@@ -1076,7 +1092,10 @@         -- installed for global packages, or prefer latest even for         -- global packages. Perhaps should be configurable but with a         -- different name than "upgrade-dependencies".-      . setPreferenceDefault PreferLatestForSelected+      . setPreferenceDefault+        (if Cabal.asBool solverSettingPreferOldest+          then PreferAllOldest+          else PreferLatestForSelected)                            {-(if solverSettingUpgradeDeps                                 then PreferAllLatest                                 else PreferLatestForSelected)-}@@ -1181,6 +1200,7 @@     -- respective major Cabal version bundled with the respective GHC     -- release).     --+    -- etc.     -- GHC 9.2   needs  Cabal >= 3.6     -- GHC 9.0   needs  Cabal >= 3.4     -- GHC 8.10  needs  Cabal >= 3.2@@ -1197,6 +1217,7 @@     -- TODO: long-term, this compatibility matrix should be     --       stored as a field inside 'Distribution.Compiler.Compiler'     setupMinCabalVersionConstraint+      | isGHC, compVer >= mkVersion [9,6]  = mkVersion [3,10]       | isGHC, compVer >= mkVersion [9,4]  = mkVersion [3,8]       | isGHC, compVer >= mkVersion [9,2]  = mkVersion [3,6]       | isGHC, compVer >= mkVersion [9,0]  = mkVersion [3,4]@@ -1955,6 +1976,9 @@         elabHaddockQuickJump    = perPkgOptionFlag pkgid False packageConfigHaddockQuickJump         elabHaddockHscolourCss  = perPkgOptionMaybe pkgid packageConfigHaddockHscolourCss         elabHaddockContents     = perPkgOptionMaybe pkgid packageConfigHaddockContents+        elabHaddockIndex        = perPkgOptionMaybe pkgid packageConfigHaddockIndex+        elabHaddockBaseUrl      = perPkgOptionMaybe pkgid packageConfigHaddockBaseUrl+        elabHaddockLib          = perPkgOptionMaybe pkgid packageConfigHaddockLib          elabTestMachineLog      = perPkgOptionMaybe pkgid packageConfigTestMachineLog         elabTestHumanLog        = perPkgOptionMaybe pkgid packageConfigTestHumanLog@@ -3432,7 +3456,6 @@     sysconfdir   = prefix </> "etc"  - computeInstallDirs :: StoreDirLayout                    -> InstallDirs.InstallDirTemplates                    -> ElaboratedSharedConfig@@ -3741,9 +3764,13 @@                     -> Verbosity                     -> FilePath                     -> Cabal.HaddockFlags-setupHsHaddockFlags (ElaboratedConfiguredPackage{..}) _ verbosity builddir =+setupHsHaddockFlags (ElaboratedConfiguredPackage{..}) (ElaboratedSharedConfig{..}) verbosity builddir =     Cabal.HaddockFlags {-      haddockProgramPaths  = mempty, --unused, set at configure time+      haddockProgramPaths  =+        case lookupProgram haddockProgram pkgConfigCompilerProgs of+          Nothing  -> mempty+          Just prg -> [( programName haddockProgram+                       , locationPath (programLocation prg) )],       haddockProgramArgs   = mempty, --unused, set at configure time       haddockHoogle        = toFlag elabHaddockHoogle,       haddockHtml          = toFlag elabHaddockHtml,@@ -3763,6 +3790,9 @@       haddockKeepTempFiles = mempty, --TODO: from build settings       haddockVerbosity     = toFlag verbosity,       haddockCabalFilePath = mempty,+      haddockIndex         = maybe mempty toFlag elabHaddockIndex,+      haddockBaseUrl       = maybe mempty toFlag elabHaddockBaseUrl,+      haddockLib           = maybe mempty toFlag elabHaddockLib,       haddockArgs          = mempty     } @@ -3897,6 +3927,7 @@       pkgHashDebugInfo           = elabDebugInfo,       pkgHashProgramArgs         = elabProgramArgs,       pkgHashExtraLibDirs        = elabExtraLibDirs,+      pkgHashExtraLibDirsStatic  = elabExtraLibDirsStatic,       pkgHashExtraFrameworkDirs  = elabExtraFrameworkDirs,       pkgHashExtraIncludeDirs    = elabExtraIncludeDirs,       pkgHashProgPrefix          = elabProgPrefix,@@ -3915,7 +3946,10 @@       pkgHashHaddockCss          = elabHaddockCss,       pkgHashHaddockLinkedSource = elabHaddockLinkedSource,       pkgHashHaddockQuickJump    = elabHaddockQuickJump,-      pkgHashHaddockContents     = elabHaddockContents+      pkgHashHaddockContents     = elabHaddockContents,+      pkgHashHaddockIndex        = elabHaddockIndex,+      pkgHashHaddockBaseUrl      = elabHaddockBaseUrl,+      pkgHashHaddockLib          = elabHaddockLib     }   where     ElaboratedConfiguredPackage{..} = normaliseConfiguredPackage shared pkg
src/Distribution/Client/ProjectPlanning/Types.hs view
@@ -292,6 +292,9 @@        elabHaddockQuickJump      :: Bool,        elabHaddockHscolourCss    :: Maybe FilePath,        elabHaddockContents       :: Maybe PathTemplate,+       elabHaddockIndex          :: Maybe PathTemplate,+       elabHaddockBaseUrl        :: Maybe String,+       elabHaddockLib            :: Maybe String,         elabTestMachineLog        :: Maybe PathTemplate,        elabTestHumanLog          :: Maybe PathTemplate,
src/Distribution/Client/Sandbox/PackageEnvironment.hs view
@@ -25,7 +25,7 @@ import Distribution.Client.Compat.Prelude import Prelude () -import Distribution.Client.Config      ( SavedConfig(..) +import Distribution.Client.Config      ( SavedConfig(..)                                        , configFieldDescriptions                                        , haddockFlagsFields                                        , installDirsFields, withProgramsFields@@ -45,7 +45,7 @@                                        , commaListFieldParsec, commaNewLineListFieldParsec                                        , liftField, lineNo, locatedErrorMsg                                        , readFields-                                       , showPWarning +                                       , showPWarning                                        , syntaxError, warning ) import System.Directory                ( doesFileExist ) import System.FilePath                 ( (</>) )@@ -81,7 +81,7 @@ -- | Type of the current package environment. data PackageEnvironmentType   = UserPackageEnvironment    -- ^ './cabal.config'-  | AmbientPackageEnvironment -- ^ '~/.cabal/config'+  | AmbientPackageEnvironment -- ^ '~/.config/cabal/config'  -- | Is there a 'cabal.config' in this directory? classifyPackageEnvironment :: FilePath -> IO PackageEnvironmentType@@ -271,7 +271,7 @@ showPackageEnvironment pkgEnv = showPackageEnvironmentWithComments Nothing pkgEnv  -- | Pretty-print the package environment with default values for empty fields--- commented out (just like the default ~/.cabal/config).+-- commented out (just like the default Cabal config file). showPackageEnvironmentWithComments :: (Maybe PackageEnvironment)                                       -> PackageEnvironment                                       -> String
src/Distribution/Client/ScriptUtils.hs view
@@ -6,7 +6,7 @@ -- | Utilities to help commands with scripts -- module Distribution.Client.ScriptUtils (-    getScriptCacheDirectoryRoot, getScriptHash, getScriptCacheDirectory, ensureScriptCacheDirectory,+    getScriptHash, getScriptCacheDirectory, ensureScriptCacheDirectory,     withContextAndSelectors, AcceptNoTargets(..), TargetContext(..),     updateContextAndWriteProjectFile, updateContextAndWriteProjectFile',     fakeProjectSourcePackage, lSrcpkgDescription@@ -22,7 +22,7 @@     ( CabalSpecVersion (..), cabalSpecLatest) import Distribution.Client.ProjectOrchestration import Distribution.Client.Config-    ( getCabalDir )+    ( defaultScriptBuildsDir ) import Distribution.Client.DistDirLayout     ( DistDirLayout(..) ) import Distribution.Client.HashValue@@ -37,7 +37,7 @@     , projectConfigHttpTransport ) import Distribution.Client.ProjectConfig.Legacy     ( ProjectConfigSkeleton-    , parseProjectSkeleton, instantiateProjectConfigSkeleton )+    , parseProjectSkeleton, instantiateProjectConfigSkeletonFetchingCompiler ) import Distribution.Client.ProjectFlags     ( flagIgnoreProject ) import Distribution.Client.RebuildMonad@@ -120,14 +120,6 @@ --    repl to deal with the fact that the repl is relative to the working directory and not --    the project root. --- | Get the directory where script builds are cached.------ @CABAL_DIR\/script-builds\/@-getScriptCacheDirectoryRoot :: IO FilePath-getScriptCacheDirectoryRoot = do-  cabalDir <- getCabalDir-  return $ cabalDir </> "script-builds"- -- | Get the hash of a script's absolute path) -- -- Two hashes will be the same as long as the absolute paths@@ -138,14 +130,14 @@ -- | Get the directory for caching a script build. -- -- The only identity of a script is it's absolute path, so append the--- hashed path to @CABAL_DIR\/script-builds\/@ to get the cache directory.+-- hashed path to the @script-builds@ dir to get the cache directory. getScriptCacheDirectory :: FilePath -> IO FilePath-getScriptCacheDirectory script = (</>) <$> getScriptCacheDirectoryRoot <*> getScriptHash script+getScriptCacheDirectory script = (</>) <$> defaultScriptBuildsDir <*> getScriptHash script  -- | Get the directory for caching a script build and ensure it exists. -- -- The only identity of a script is it's absolute path, so append the--- hashed path to @CABAL_DIR\/script-builds\/@ to get the cache directory.+-- hashed path to the @script-builds@ dir to get the cache directory. ensureScriptCacheDirectory :: Verbosity -> FilePath -> IO FilePath ensureScriptCacheDirectory verbosity script = do   cacheDir <- getScriptCacheDirectory script@@ -179,10 +171,11 @@   -> NixStyleFlags a     -- ^ Command line flags   -> [String]            -- ^ Target strings or a script and args.   -> GlobalFlags         -- ^ Global flags.+  -> CurrentCommand      -- ^ Current Command (usually for error reporting).   -> (TargetContext -> ProjectBaseContext -> [TargetSelector] -> IO b)   -- ^ The body of your command action.   -> IO b-withContextAndSelectors noTargets kind flags@NixStyleFlags {..} targetStrings globalFlags act+withContextAndSelectors noTargets kind flags@NixStyleFlags {..} targetStrings globalFlags cmd act   = withTemporaryTempDirectory $ \mkTmpDir -> do     (tc, ctx) <- withProjectOrGlobalConfig verbosity ignoreProject globalConfigFlag with (without mkTmpDir) @@ -217,11 +210,11 @@     defaultTarget = [TargetPackage TargetExplicitNamed [fakePackageId] Nothing]      with = do-      ctx <- establishProjectBaseContext verbosity cliConfig OtherCommand+      ctx <- establishProjectBaseContext verbosity cliConfig cmd       return (ProjectContext, ctx)     without mkDir globalConfig = do       distDirLayout <- establishDummyDistDirLayout verbosity (globalConfig <> cliConfig) =<< mkDir-      ctx <- establishDummyProjectBaseContext verbosity (globalConfig <> cliConfig) distDirLayout [] OtherCommand+      ctx <- establishDummyProjectBaseContext verbosity (globalConfig <> cliConfig) distDirLayout [] cmd       return (GlobalContext, ctx)     scriptOrError script err = do       exists <- doesFileExist script@@ -243,9 +236,11 @@          projectCfgSkeleton <- readProjectBlockFromScript verbosity httpTransport (distDirLayout ctx) (takeFileName script) scriptContents -        (compiler, Platform arch os, _) <- runRebuild (distProjectRootDirectory . distDirLayout $ ctx) $ configureCompiler verbosity (distDirLayout ctx) ((fst $ ignoreConditions projectCfgSkeleton) <> projectConfig ctx)+        let fetchCompiler = do+               (compiler, Platform arch os, _) <- runRebuild (distProjectRootDirectory . distDirLayout $ ctx) $ configureCompiler verbosity (distDirLayout ctx) ((fst $ ignoreConditions projectCfgSkeleton) <> projectConfig ctx)+               pure (os, arch, compilerInfo compiler) -        let projectCfg = instantiateProjectConfigSkeleton os arch (compilerInfo compiler) mempty projectCfgSkeleton :: ProjectConfig+        projectCfg <- instantiateProjectConfigSkeletonFetchingCompiler fetchCompiler mempty projectCfgSkeleton          let executable' = executable & L.buildInfo . L.defaultLanguage %~ maybe (Just Haskell2010) Just             ctx'        = ctx & lProjectConfig %~ (<> projectCfg)
src/Distribution/Client/Setup.hs view
@@ -112,7 +112,7 @@ import Distribution.Types.UnqualComponentName          ( unqualComponentNameToPackageName ) import Distribution.PackageDescription-         ( BuildType(..), RepoKind(..), LibraryName(..) )+         ( BuildType(..), RepoKind(..), LibraryName(..), Dependency ) import Distribution.System ( Platform ) import Distribution.ReadE          ( ReadE(..), succeedReadE, parsecToReadE, parsecToReadEErr, unexpectMsgString )@@ -127,6 +127,8 @@          ) import Distribution.Client.ManpageFlags (ManpageFlags, defaultManpageFlags, manpageOptions) import Distribution.FieldGrammar.Newtypes (SpecVersion (..))+import Distribution.Parsec+         ( parsecCommaList  )  import Data.List          ( deleteFirstsBy )@@ -238,41 +240,49 @@          "Commands:\n"       ++ unlines (         [ startGroup "global"-        , addCmd "update"-        , addCmd "install"-        , par+        , addCmd "user-config"         , addCmd "help"-        , addCmd "info"+        , par+        , startGroup "package database"+        , addCmd "update"         , addCmd "list"-        , addCmd "fetch"-        , addCmd "user-config"+        , addCmd "info"         , par-        , startGroup "package"-        , addCmd "get"-        , addCmd "unpack"+        , startGroup "initialization and download"         , addCmd "init"+        , addCmd "fetch"+        , addCmd "get"         , par+        , startGroup "project configuration"         , addCmd "configure"+        , addCmd "freeze"+        , addCmd "gen-bounds"+        , addCmd "outdated"+        , par+        , startGroup "project building and installing"         , addCmd "build"+        , addCmd "install"+        , addCmd "haddock"+        , addCmd "haddock-project"         , addCmd "clean"         , par-        , addCmd "run"+        , startGroup "running and testing"+        , addCmd "list-bin"         , addCmd "repl"-        , addCmd "test"+        , addCmd "run"         , addCmd "bench"+        , addCmd "test"+        , addCmd "exec"         , par+        , startGroup "sanity checks and shipping"         , addCmd "check"         , addCmd "sdist"         , addCmd "upload"         , addCmd "report"         , par-        , addCmd "freeze"-        , addCmd "gen-bounds"-        , addCmd "outdated"-        , addCmd "haddock"+        , startGroup "deprecated"+        , addCmd "unpack"         , addCmd "hscolour"-        , addCmd "exec"-        , addCmd "list-bin"         , par         , startGroup "new-style projects (forwards-compatible aliases)"         , addCmd "v2-build"@@ -298,12 +308,8 @@         , addCmd "v1-bench"         , addCmd "v1-freeze"         , addCmd "v1-haddock"-        , addCmd "v1-exec"-        , addCmd "v1-update"         , addCmd "v1-install"         , addCmd "v1-clean"-        , addCmd "v1-sdist"-        , addCmd "v1-doctest"         , addCmd "v1-copy"         , addCmd "v1-register"         , addCmd "v1-reconfigure"@@ -360,6 +366,11 @@       ,multiOption "nix"         globalNix (\v flags -> flags { globalNix = v })         [+          optArg' "(True or False)" (maybeToFlag . (readMaybe =<<)) (\case+            Flag True -> [Just "enable"]+            Flag False -> [Just "disable"]+            NoFlag -> [Just "disable"]) "" ["nix"]+            "Nix integration: run commands through nix-shell if a 'shell.nix' file exists (default is False)",           noArg (Flag True) [] ["enable-nix"]           "Enable Nix integration: run commands through nix-shell if a 'shell.nix' file exists",           noArg (Flag False) [] ["disable-nix"]@@ -409,7 +420,6 @@          "Set a location for a cabal.config file for projects without their own cabal.config freeze file."          globalConstraintsFile (\v flags -> flags {globalConstraintsFile = v})          (reqArgFlag "FILE")-       ]  -- ------------------------------------------------------------@@ -497,7 +507,7 @@     flags_2_5_0 = flags_3_7_0 {       -- Cabal < 2.5 does not understand --dependency=pkg:component=cid       -- (public sublibraries), so we convert it to the legacy-      -- --dependency=pkg_or_internal_compoent=cid+      -- --dependency=pkg_or_internal_component=cid         configDependencies =           let convertToLegacyInternalDep (GivenComponent _ (LSubLibName cn) cid) =                 Just $ GivenComponent@@ -943,6 +953,7 @@       fetchFineGrainedConflicts :: Flag FineGrainedConflicts,       fetchMinimizeConflictSet :: Flag MinimizeConflictSet,       fetchIndependentGoals :: Flag IndependentGoals,+      fetchPreferOldest     :: Flag PreferOldest,       fetchShadowPkgs       :: Flag ShadowPkgs,       fetchStrongFlags      :: Flag StrongFlags,       fetchAllowBootLibInstalls :: Flag AllowBootLibInstalls,@@ -964,6 +975,7 @@     fetchFineGrainedConflicts = Flag (FineGrainedConflicts True),     fetchMinimizeConflictSet = Flag (MinimizeConflictSet False),     fetchIndependentGoals = Flag (IndependentGoals False),+    fetchPreferOldest     = Flag (PreferOldest False),     fetchShadowPkgs       = Flag (ShadowPkgs False),     fetchStrongFlags      = Flag (StrongFlags False),     fetchAllowBootLibInstalls = Flag (AllowBootLibInstalls False),@@ -1027,6 +1039,7 @@                          fetchFineGrainedConflicts (\v flags -> flags { fetchFineGrainedConflicts = v })                          fetchMinimizeConflictSet (\v flags -> flags { fetchMinimizeConflictSet = v })                          fetchIndependentGoals (\v flags -> flags { fetchIndependentGoals = v })+                         fetchPreferOldest     (\v flags -> flags { fetchPreferOldest = v })                          fetchShadowPkgs       (\v flags -> flags { fetchShadowPkgs       = v })                          fetchStrongFlags      (\v flags -> flags { fetchStrongFlags      = v })                          fetchAllowBootLibInstalls (\v flags -> flags { fetchAllowBootLibInstalls = v })@@ -1049,6 +1062,7 @@       freezeFineGrainedConflicts :: Flag FineGrainedConflicts,       freezeMinimizeConflictSet :: Flag MinimizeConflictSet,       freezeIndependentGoals :: Flag IndependentGoals,+      freezePreferOldest     :: Flag PreferOldest,       freezeShadowPkgs       :: Flag ShadowPkgs,       freezeStrongFlags      :: Flag StrongFlags,       freezeAllowBootLibInstalls :: Flag AllowBootLibInstalls,@@ -1068,6 +1082,7 @@     freezeFineGrainedConflicts = Flag (FineGrainedConflicts True),     freezeMinimizeConflictSet = Flag (MinimizeConflictSet False),     freezeIndependentGoals = Flag (IndependentGoals False),+    freezePreferOldest     = Flag (PreferOldest False),     freezeShadowPkgs       = Flag (ShadowPkgs False),     freezeStrongFlags      = Flag (StrongFlags False),     freezeAllowBootLibInstalls = Flag (AllowBootLibInstalls False),@@ -1122,6 +1137,7 @@                          freezeFineGrainedConflicts (\v flags -> flags { freezeFineGrainedConflicts = v })                          freezeMinimizeConflictSet (\v flags -> flags { freezeMinimizeConflictSet = v })                          freezeIndependentGoals (\v flags -> flags { freezeIndependentGoals = v })+                         freezePreferOldest     (\v flags -> flags { freezePreferOldest = v })                          freezeShadowPkgs       (\v flags -> flags { freezeShadowPkgs       = v })                          freezeStrongFlags      (\v flags -> flags { freezeStrongFlags      = v })                          freezeAllowBootLibInstalls (\v flags -> flags { freezeAllowBootLibInstalls = v })@@ -1264,7 +1280,7 @@     commandSynopsis     = "Upload build reports to a remote server.",     commandDescription  = Nothing,     commandNotes        = Just $ \_ ->-         "You can store your Hackage login in the ~/.cabal/config file\n",+         "You can store your Hackage login in the ~/.config/cabal/config file\n",     commandUsage        = usageAlternatives "report" ["[FLAGS]"],     commandDefaultFlags = defaultReportFlags,     commandOptions      = \_ ->@@ -1297,6 +1313,7 @@  data GetFlags = GetFlags {     getDestDir          :: Flag FilePath,+    getOnlyPkgDescr     :: Flag Bool,     getPristine         :: Flag Bool,     getIndexState       :: Flag TotalIndexState,     getActiveRepos      :: Flag ActiveRepos,@@ -1307,6 +1324,7 @@ defaultGetFlags :: GetFlags defaultGetFlags = GetFlags {     getDestDir          = mempty,+    getOnlyPkgDescr     = mempty,     getPristine         = mempty,     getIndexState       = mempty,     getActiveRepos      = mempty,@@ -1352,6 +1370,16 @@                                       (toFlag `fmap` parsec))                           (flagToList . fmap prettyShow)) +       , option [] ["only-package-description"]+           "Unpack only the package description file."+           getOnlyPkgDescr (\v flags -> flags { getOnlyPkgDescr = v })+           trueArg++       , option [] ["package-description-only"]+           "A synonym for --only-package-description."+           getOnlyPkgDescr (\v flags -> flags { getOnlyPkgDescr = v })+           trueArg+        , option [] ["pristine"]            ("Unpack the original pristine tarball, rather than updating the "            ++ ".cabal file with the latest revision from the package archive.")@@ -1556,6 +1584,7 @@     installFineGrainedConflicts :: Flag FineGrainedConflicts,     installMinimizeConflictSet :: Flag MinimizeConflictSet,     installIndependentGoals :: Flag IndependentGoals,+    installPreferOldest     :: Flag PreferOldest,     installShadowPkgs       :: Flag ShadowPkgs,     installStrongFlags      :: Flag StrongFlags,     installAllowBootLibInstalls :: Flag AllowBootLibInstalls,@@ -1598,6 +1627,7 @@     installFineGrainedConflicts = Flag (FineGrainedConflicts True),     installMinimizeConflictSet = Flag (MinimizeConflictSet False),     installIndependentGoals= Flag (IndependentGoals False),+    installPreferOldest    = Flag (PreferOldest False),     installShadowPkgs      = Flag (ShadowPkgs False),     installStrongFlags     = Flag (StrongFlags False),     installAllowBootLibInstalls = Flag (AllowBootLibInstalls False),@@ -1657,7 +1687,7 @@      ++ " `v1-configure` for a list of commands being affected.\n"      ++ "\n"      ++ "Installed executables will by default"-     ++ " be put into `~/.cabal/bin/`."+     ++ " be put into `~/.local/bin/`."      ++ " If you want installed executable to be available globally, make"      ++ " sure that the PATH environment variable contains that directory.\n"      ++ "\n",@@ -1749,7 +1779,7 @@     , name `elem` ["hoogle", "html", "html-location"                   ,"executables", "tests", "benchmarks", "all", "internal", "css"                   ,"hyperlink-source", "quickjump", "hscolour-css"-                  ,"contents-location", "for-hackage"]+                  ,"contents-location", "use-index", "for-hackage", "base-url", "lib"]     ]  testOptions :: ShowOrParseArgs -> [OptionField TestFlags]@@ -1823,6 +1853,7 @@                         installFineGrainedConflicts (\v flags -> flags { installFineGrainedConflicts = v })                         installMinimizeConflictSet (\v flags -> flags { installMinimizeConflictSet = v })                         installIndependentGoals (\v flags -> flags { installIndependentGoals = v })+                        installPreferOldest     (\v flags -> flags { installPreferOldest = v })                         installShadowPkgs       (\v flags -> flags { installShadowPkgs       = v })                         installStrongFlags      (\v flags -> flags { installStrongFlags      = v })                         installAllowBootLibInstalls (\v flags -> flags { installAllowBootLibInstalls = v })@@ -1978,7 +2009,7 @@     commandSynopsis     = "Uploads source packages or documentation to Hackage.",     commandDescription  = Nothing,     commandNotes        = Just $ \_ ->-         "You can store your Hackage login in the ~/.cabal/config file\n"+         "You can store your Hackage login in the ~/.config/cabal/config file\n"       ++ relevantConfigValuesText ["username", "password", "password-command"],     commandUsage        = \pname ->          "Usage: " ++ pname ++ " upload [FLAGS] TARFILES\n",@@ -2137,12 +2168,14 @@    , option ['x'] ["extra-source-file"]     "Extra source file to be distributed with tarball."-    IT.extraSrc (\v flags -> flags { IT.extraSrc = v })+    IT.extraSrc+    (\v flags -> flags { IT.extraSrc = mergeListFlag (IT.extraSrc flags) v })     (reqArg' "FILE" (Flag . (:[]))                     (fromFlagOrDefault []))   , option [] ["extra-doc-file"]     "Extra doc file to be distributed with tarball."-    IT.extraDoc (\v flags -> flags { IT.extraDoc = v })+    IT.extraDoc+    (\v flags -> flags { IT.extraDoc = mergeListFlag (IT.extraDoc flags) v })     (reqArg' "FILE" (Flag . (:[])) (fromFlagOrDefault []))    , option [] ["lib", "is-library"]@@ -2170,7 +2203,8 @@        , option [] ["test-dir"]         "Directory containing tests."-        IT.testDirs (\v flags -> flags { IT.testDirs = v })+        IT.testDirs (\v flags ->+          flags { IT.testDirs = mergeListFlag (IT.testDirs flags) v })         (reqArg' "DIR" (Flag . (:[]))                        (fromFlagOrDefault [])) @@ -2197,7 +2231,8 @@   , option ['o'] ["expose-module"]     "Export a module from the package."     IT.exposedModules-    (\v flags -> flags { IT.exposedModules = v })+    (\v flags -> flags { IT.exposedModules =+      mergeListFlag (IT.exposedModules flags) v})     (reqArg "MODULE" (parsecToReadE ("Cannot parse module name: "++)                                  (Flag . (:[]) <$> parsec))                      (flagElim [] (fmap prettyShow)))@@ -2205,33 +2240,38 @@   , option [] ["extension"]     "Use a LANGUAGE extension (in the other-extensions field)."     IT.otherExts-    (\v flags -> flags { IT.otherExts = v })+    (\v flags -> flags { IT.otherExts =+      mergeListFlag (IT.otherExts flags) v })     (reqArg "EXTENSION" (parsecToReadE ("Cannot parse extension: "++)                                     (Flag . (:[]) <$> parsec))                         (flagElim [] (fmap prettyShow)))    , option ['d'] ["dependency"]-    "Package dependency."-    IT.dependencies (\v flags -> flags { IT.dependencies = v })-    (reqArg "PACKAGE" (parsecToReadE ("Cannot parse dependency: "++)-                                  (Flag . (:[]) <$> parsec))-                      (flagElim [] (fmap prettyShow)))+    "Package dependencies. Permits comma separated list of dependencies."+    IT.dependencies+    (\v flags -> flags { IT.dependencies =+      mergeListFlag (IT.dependencies flags) v })+    (reqArg "DEPENDENCIES" (fmap Flag dependenciesReadE)+                           (fmap prettyShow . fromFlagOrDefault []))    , option [] ["application-dir"]     "Directory containing package application executable."-    IT.applicationDirs (\v flags -> flags { IT.applicationDirs = v})+    IT.applicationDirs (\v flags -> flags { IT.applicationDirs =+      mergeListFlag (IT.applicationDirs flags) v})     (reqArg' "DIR" (Flag . (:[]))                    (fromFlagOrDefault []))    , option [] ["source-dir", "sourcedir"]     "Directory containing package library source."-    IT.sourceDirs (\v flags -> flags { IT.sourceDirs = v })+    IT.sourceDirs (\v flags -> flags { IT.sourceDirs =+      mergeListFlag (IT.sourceDirs flags) v })     (reqArg' "DIR" (Flag. (:[]))                    (fromFlagOrDefault []))    , option [] ["build-tool"]     "Required external build tool."-    IT.buildTools (\v flags -> flags { IT.buildTools = v })+    IT.buildTools (\v flags -> flags { IT.buildTools =+      mergeListFlag (IT.buildTools flags) v })     (reqArg' "TOOL" (Flag . (:[]))                     (fromFlagOrDefault [])) @@ -2243,7 +2283,17 @@    , optionVerbosity IT.initVerbosity (\v flags -> flags { IT.initVerbosity = v })   ]+  where+    dependenciesReadE :: ReadE [Dependency]+    dependenciesReadE =+      parsecToReadE+        ("Cannot parse dependencies: " ++)+        (parsecCommaList parsec) +    mergeListFlag :: Flag [a] -> Flag [a] -> Flag [a]+    mergeListFlag currentFlags v =+      Flag $ concat (flagToList currentFlags ++ flagToList v)+ -- ------------------------------------------------------------ -- * Copy and Register -- ------------------------------------------------------------@@ -2333,18 +2383,18 @@   commandDescription  = Just $ \_ -> wrapText $        "When upgrading cabal, the set of configuration keys and their default"     ++ " values may change. This command provides means to merge the existing"-    ++ " config in ~/.cabal/config"+    ++ " config in ~/.config/cabal/config"     ++ " (i.e. all bindings that are actually defined and not commented out)"     ++ " and the default config of the new version.\n"     ++ "\n"-    ++ "init: Creates a new config file at either ~/.cabal/config or as"+    ++ "init: Creates a new config file at either ~/.config/cabal/config or as"     ++ " specified by --config-file, if given. An existing file won't be "     ++ " overwritten unless -f or --force is given.\n"-    ++ "diff: Shows a pseudo-diff of the user's ~/.cabal/config file and"+    ++ "diff: Shows a pseudo-diff of the user's ~/.config/cabal/config file and"     ++ " the default configuration that would be created by cabal if the"     ++ " config file did not exist.\n"     ++ "update: Applies the pseudo-diff to the configuration that would be"-    ++ " created by default, and write the result back to ~/.cabal/config.",+    ++ " created by default, and write the result back to ~/.config/cabal/config.",    commandNotes        = Nothing,   commandUsage        = usageAlternatives "user-config" ["init", "diff", "update"],@@ -2399,13 +2449,14 @@                   -> (flags -> Flag FineGrainedConflicts) -> (Flag FineGrainedConflicts -> flags -> flags)                   -> (flags -> Flag MinimizeConflictSet) -> (Flag MinimizeConflictSet -> flags -> flags)                   -> (flags -> Flag IndependentGoals) -> (Flag IndependentGoals -> flags -> flags)+                  -> (flags -> Flag PreferOldest) -> (Flag PreferOldest -> flags -> flags)                   -> (flags -> Flag ShadowPkgs)       -> (Flag ShadowPkgs       -> flags -> flags)                   -> (flags -> Flag StrongFlags)      -> (Flag StrongFlags      -> flags -> flags)                   -> (flags -> Flag AllowBootLibInstalls) -> (Flag AllowBootLibInstalls -> flags -> flags)                   -> (flags -> Flag OnlyConstrained)  -> (Flag OnlyConstrained  -> flags -> flags)                   -> [OptionField flags] optionSolverFlags showOrParseArgs getmbj setmbj getrg setrg getcc setcc-                  getfgc setfgc getmc setmc getig setig getsip setsip+                  getfgc setfgc getmc setmc getig setig getpo setpo getsip setsip                   getstrfl setstrfl getib setib getoc setoc =   [ option [] ["max-backjumps"]       ("Maximum number of backjumps allowed while solving (default: " ++ show defaultMaxBackjumps ++ "). Use a negative number to enable unlimited backtracking. Use 0 to disable backtracking completely.")@@ -2438,6 +2489,11 @@       "Treat several goals on the command line as independent. If several goals depend on the same package, different versions can be chosen."       (fmap asBool . getig)       (setig . fmap IndependentGoals)+      (yesNoOpt showOrParseArgs)+  , option [] ["prefer-oldest"]+      "Prefer the oldest (instead of the latest) versions of packages available. Useful to determine lower bounds in the build-depends section."+      (fmap asBool . getpo)+      (setpo . fmap PreferOldest)       (yesNoOpt showOrParseArgs)   , option [] ["shadow-installed-packages"]       "If multiple package instances of the same version are installed, treat all but one as shadowed."
src/Distribution/Client/SetupWrapper.hs view
@@ -77,7 +77,7 @@ import qualified Distribution.InstalledPackageInfo as IPI import Distribution.Client.Types import Distribution.Client.Config-         ( getCabalDir )+         ( defaultCacheDir ) import Distribution.Client.IndexUtils          ( getInstalledPackages ) import Distribution.Client.JobControl@@ -87,8 +87,8 @@ import Distribution.Utils.Generic          ( safeHead ) import Distribution.Simple.Utils-         ( die', debug, info, infoNoWrap-         , cabalVersion, tryFindPackageDesc+         ( die', debug, info, infoNoWrap, maybeExit+         , cabalVersion, tryFindPackageDesc, rawSystemProc          , createDirectoryIfMissingVerbose, installExecutableFile          , copyFileVerbose, rewriteFileEx, rewriteFileLBS ) import Distribution.Client.Utils@@ -109,9 +109,8 @@ import System.Directory    ( doesFileExist ) import System.FilePath     ( (</>), (<.>) ) import System.IO           ( Handle, hPutStr )-import Distribution.Compat.Process (createProcess)-import System.Process      ( StdStream(..), proc, waitForProcess-                           , ProcessHandle )+import Distribution.Compat.Process (proc)+import System.Process      ( StdStream(..) ) import qualified System.Process as Process import Data.List           ( foldl1' ) import Distribution.Client.Compat.ExecutablePath  ( getExecutablePath )@@ -241,7 +240,7 @@     -- When we are installing in parallel, we always use the external setup     -- method. Since compiling the setup script each time adds noticeable     -- overhead, we use a shared setup script cache-    -- ('~/.cabal/setup-exe-cache'). For each (compiler, platform, Cabal+    -- ('$XDG_CACHE_HOME/cabal/setup-exe-cache'). For each (compiler, platform, Cabal     -- version) combination the cache holds a compiled setup script     -- executable. This only affects the Simple build type; for the Custom,     -- Configure and Make build types we always compile the setup script anew.@@ -437,35 +436,32 @@ buildTypeAction Make      = Make.defaultMainArgs buildTypeAction Custom               = error "buildTypeAction Custom" +invoke :: Verbosity -> FilePath -> [String] -> SetupScriptOptions -> IO ()+invoke verbosity path args options = do+  info verbosity $ unwords (path : args)+  case useLoggingHandle options of+    Nothing        -> return ()+    Just logHandle -> info verbosity $ "Redirecting build log to " ++ show logHandle --- | @runProcess'@ is a version of @runProcess@ where we have--- the additional option to decide whether or not we should--- delegate CTRL+C to the spawned process.-runProcess' :: FilePath                 -- ^ Filename of the executable-            -> [String]                 -- ^ Arguments to pass to executable-            -> Maybe FilePath           -- ^ Optional path to working directory-            -> Maybe [(String, String)] -- ^ Optional environment-            -> Maybe Handle             -- ^ Handle for @stdin@-            -> Maybe Handle             -- ^ Handle for @stdout@-            -> Maybe Handle             -- ^ Handle for @stderr@-            -> Bool                     -- ^ Delegate Ctrl+C ?-            -> IO ProcessHandle-runProcess' cmd args mb_cwd mb_env mb_stdin mb_stdout mb_stderr _delegate = do-  (_,_,_,ph) <--    createProcess-      (proc cmd args){ Process.cwd = mb_cwd-                     , Process.env = mb_env-                     , Process.std_in  = mbToStd mb_stdin-                     , Process.std_out = mbToStd mb_stdout-                     , Process.std_err = mbToStd mb_stderr-                     , Process.delegate_ctlc = _delegate-                     }-  return ph-  where-    mbToStd :: Maybe Handle -> StdStream-    mbToStd Nothing = Inherit-    mbToStd (Just hdl) = UseHandle hdl+  searchpath <- programSearchPathAsPATHVar+                (map ProgramSearchPathDir (useExtraPathEnv options) +++                 getProgramSearchPath (useProgramDb options))+  env       <- getEffectiveEnvironment $+                 [ ("PATH", Just searchpath)+                 , ("HASKELL_DIST_DIR", Just (useDistPref options))+                 ] ++ useExtraEnvOverrides options +  let loggingHandle = case useLoggingHandle options of+                        Nothing -> Inherit+                        Just hdl -> UseHandle hdl+      cp = (proc path args) { Process.cwd = useWorkingDir options+                            , Process.env = env+                            , Process.std_out = loggingHandle+                            , Process.std_err = loggingHandle+                            , Process.delegate_ctlc = isInteractive options+                            }+  maybeExit $ rawSystemProc verbosity cp+ -- ------------------------------------------------------------ -- * Self-Exec SetupMethod -- ------------------------------------------------------------@@ -478,83 +474,43 @@   info verbosity $ "Using self-exec internal setup method with build-type "                  ++ show bt ++ " and args:\n  " ++ show args   path <- getExecutablePath-  info verbosity $ unwords (path : args)-  case useLoggingHandle options of-    Nothing        -> return ()-    Just logHandle -> info verbosity $ "Redirecting build log to "-                                    ++ show logHandle--  searchpath <- programSearchPathAsPATHVar-                (map ProgramSearchPathDir (useExtraPathEnv options) ++-                 getProgramSearchPath (useProgramDb options))-  env       <- getEffectiveEnvironment $-                 [ ("PATH", Just searchpath)-                 , ("HASKELL_DIST_DIR", Just (useDistPref options))-                 ] ++ useExtraEnvOverrides options-  process <- runProcess' path args-             (useWorkingDir options) env Nothing-             (useLoggingHandle options) (useLoggingHandle options)-             (isInteractive options)-  exitCode <- waitForProcess process-  unless (exitCode == ExitSuccess) $ exitWith exitCode+  invoke verbosity path args options  -- ------------------------------------------------------------ -- * External SetupMethod -- ------------------------------------------------------------  externalSetupMethod :: WithCallStack (FilePath -> SetupRunner)-externalSetupMethod path verbosity options _ args = do-  info verbosity $ unwords (path : args)-  case useLoggingHandle options of-    Nothing        -> return ()-    Just logHandle -> info verbosity $ "Redirecting build log to "-                                    ++ show logHandle--  -- See 'Note: win32 clean hack' above.-#ifdef mingw32_HOST_OS-  if useWin32CleanHack options then doWin32CleanHack path else doInvoke path+externalSetupMethod path verbosity options _ args =+#ifndef mingw32_HOST_OS+  invoke verbosity path args options #else-  doInvoke path-#endif-+  -- See 'Note: win32 clean hack' above.+  if useWin32CleanHack options+    then invokeWithWin32CleanHack path+    else invoke' path   where-    doInvoke path' = do-      searchpath <- programSearchPathAsPATHVar-                    (map ProgramSearchPathDir (useExtraPathEnv options) ++-                      getProgramSearchPath (useProgramDb options))-      env        <- getEffectiveEnvironment $-                      [ ("PATH", Just searchpath)-                      , ("HASKELL_DIST_DIR", Just (useDistPref options))-                      ] ++ useExtraEnvOverrides options--      debug verbosity $ "Setup arguments: "++unwords args-      process <- runProcess' path' args-                  (useWorkingDir options) env Nothing-                  (useLoggingHandle options) (useLoggingHandle options)-                  (isInteractive options)-      exitCode <- waitForProcess process-      unless (exitCode == ExitSuccess) $ exitWith exitCode+    invoke' p = invoke verbosity p args options -#ifdef mingw32_HOST_OS-    doWin32CleanHack path' = do+    invokeWithWin32CleanHack origPath = do       info verbosity $ "Using the Win32 clean hack."       -- Recursively removes the temp dir on exit.       withTempDirectory verbosity (workingDir options) "cabal-tmp" $ \tmpDir ->-          bracket (moveOutOfTheWay tmpDir path')-                  (maybeRestore path')-                  doInvoke+          bracket (moveOutOfTheWay tmpDir origPath)+                  (\tmpPath -> maybeRestore origPath tmpPath)+                  (\tmpPath -> invoke' tmpPath) -    moveOutOfTheWay tmpDir path' = do-      let newPath = tmpDir </> "setup" <.> exeExtension buildPlatform-      Win32.moveFile path' newPath-      return newPath+    moveOutOfTheWay tmpDir origPath = do+      let tmpPath = tmpDir </> "setup" <.> exeExtension buildPlatform+      Win32.moveFile origPath tmpPath+      return tmpPath -    maybeRestore oldPath path' = do-      let oldPathDir = takeDirectory oldPath-      oldPathDirExists <- doesDirectoryExist oldPathDir+    maybeRestore origPath tmpPath = do+      let origPathDir = takeDirectory origPath+      origPathDirExists <- doesDirectoryExist origPathDir       -- 'setup clean' didn't complete, 'dist/setup' still exists.-      when oldPathDirExists $-        Win32.moveFile path' oldPath+      when origPathDirExists $+        Win32.moveFile tmpPath origPath #endif  getExternalSetupMethod@@ -784,8 +740,8 @@   cachedSetupDirAndProg :: SetupScriptOptions -> Version                         -> IO (FilePath, FilePath)   cachedSetupDirAndProg options' cabalLibVersion = do-    cabalDir <- getCabalDir-    let setupCacheDir       = cabalDir </> "setup-exe-cache"+    cacheDir <- defaultCacheDir+    let setupCacheDir       = cacheDir </> "setup-exe-cache"         cachedSetupProgFile = setupCacheDir                               </> ("setup-" ++ buildTypeString ++ "-"                                    ++ cabalVersionString ++ "-"
+ src/Distribution/Client/Signal.hs view
@@ -0,0 +1,49 @@+{-# LANGUAGE CPP #-}+module Distribution.Client.Signal+  ( installTerminationHandler+  , Terminated(..)+  )+where++import qualified Control.Exception as Exception++#ifndef mingw32_HOST_OS+import Control.Concurrent (myThreadId)+import Control.Monad (void)+import qualified System.Posix.Signals as Signals+#endif++-- | Terminated is an asynchronous exception, thrown when+-- SIGTERM is received. It's to 'kill' what 'UserInterrupt'+-- is to Ctrl-C.+data Terminated = Terminated++instance Exception.Exception Terminated where+  toException = Exception.asyncExceptionToException+  fromException = Exception.asyncExceptionFromException++instance Show Terminated where+  show Terminated = "terminated"++-- | Install a signal handler that initiates a controlled shutdown on receiving+-- SIGTERM by throwing an asynchronous exception at the main thread. Must be+-- called from the main thread.+--+-- It is a noop on Windows.+--+installTerminationHandler :: IO ()++#ifdef mingw32_HOST_OS++installTerminationHandler = return ()++#else++installTerminationHandler = do+  mainThreadId <- myThreadId+  void $ Signals.installHandler+    Signals.sigTERM+    (Signals.CatchOnce $ Exception.throwTo mainThreadId Terminated)+    Nothing++#endif
src/Distribution/Client/SourceFiles.hs view
@@ -39,7 +39,7 @@  import Prelude () import Distribution.Client.Compat.Prelude-import Distribution.Verbosity (silent)+import Distribution.Verbosity (normal)  import System.FilePath @@ -150,7 +150,8 @@     -- A.hs-boot; need to track both.     findNeededModules ["hs", "lhs", "hsig", "lhsig"]     findNeededModules ["hs-boot", "lhs-boot"]-    expandedExtraSrcFiles <- liftIO $ fmap concat . for (extraSrcFiles pkg_descr) $ \fpath -> matchDirFileGlobWithDie silent (\ _ _ -> return []) (specVersion pkg_descr) "." fpath+    root <- askRoot+    expandedExtraSrcFiles <- liftIO $ fmap concat . for (extraSrcFiles pkg_descr) $ \fpath -> matchDirFileGlobWithDie normal (\ _ _ -> return []) (specVersion pkg_descr) root fpath     traverse_ needIfExists $ concat         [ cSources bi         , cxxSources bi
src/Distribution/Client/TargetSelector.hs view
@@ -713,21 +713,26 @@     case [ (t, m, ms) | MatchingInternalError t m ms <- problems ] of       [] -> return ()       ((target, originalMatch, renderingsAndMatches):_) ->-        die' verbosity $ "Internal error in target matching. It should always "-           ++ "be possible to find a syntax that's sufficiently qualified to "-           ++ "give an unambiguous match. However when matching '"-           ++ showTargetString target ++ "'  we found "-           ++ showTargetSelector originalMatch-           ++ " (" ++ showTargetSelectorKind originalMatch ++ ") which does "-           ++ "not have an unambiguous syntax. The possible syntax and the "-           ++ "targets they match are as follows:\n"+        die' verbosity $ "Internal error in target matching: could not make an "+           ++ "unambiguous fully qualified target selector for '"+           ++ showTargetString target ++ "'.\n"+           ++ "We made the target '" ++ showTargetSelector originalMatch ++ "' ("+           ++ showTargetSelectorKind originalMatch ++ ") that was expected to "+           ++ "be unambiguous but matches the following targets:\n"            ++ unlines-                [ "'" ++ showTargetString rendering ++ "' which matches "-                  ++ intercalate ", "+                [ "'" ++ showTargetString rendering ++ "', matching:"+                  ++ concatMap ("\n  - " ++)                        [ showTargetSelector match ++                          " (" ++ showTargetSelectorKind match ++ ")"                        | match <- matches ]                 | (rendering, matches) <- renderingsAndMatches ]+           ++ "\nNote: Cabal expects to be able to make a single fully "+           ++ "qualified name for a target or provide a more specific error. "+           ++ "Our failure to do so is a bug in cabal. "+           ++ "Tracking issue: https://github.com/haskell/cabal/issues/8684"+           ++ "\n\nHint: this may be caused by trying to build a package that "+           ++ "exists in the project directory but is missing from "+           ++ "the 'packages' stanza in your cabal project file."      case [ (t, e, g) | TargetSelectorExpected t e g <- problems ] of       []      -> return ()
src/Distribution/Client/Types/ConfiguredPackage.hs view
@@ -82,5 +82,3 @@ instance PackageInstalled (ConfiguredPackage loc) where   installedDepends = CD.flatDeps . depends --
src/Distribution/Client/Upload.hs view
@@ -183,9 +183,9 @@       let auth        :: (String, String)           auth        = (username, password) -      dotCabal <- getCabalDir+      reportsDir <- defaultReportsDir       let srcDir :: FilePath-          srcDir = dotCabal </> "reports" </> unRepoName (remoteRepoName remoteRepo)+          srcDir = reportsDir </> unRepoName (remoteRepoName remoteRepo)       -- We don't want to bomb out just because we haven't built any packages       -- from this repo yet.       srcExists <- doesDirectoryExist srcDir
src/Distribution/Client/Utils.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE ForeignFunctionInterface, ScopedTypeVariables, CPP #-}+{-# LANGUAGE ScopedTypeVariables, CPP #-}  module Distribution.Client.Utils   ( MergeResult(..)@@ -28,6 +28,7 @@   , listFilesRecursive   , listFilesInside   , safeRead+  , hasElem   ) where  import Prelude ()@@ -47,7 +48,6 @@          ( zipWithM_ ) import Data.List          ( groupBy )-import Foreign.C.Types ( CInt(..) ) import qualified Control.Exception as Exception          ( finally ) import qualified Control.Exception.Safe as Safe@@ -61,6 +61,7 @@          ) import System.IO.Unsafe ( unsafePerformIO ) +import GHC.Conc.Sync ( getNumProcessors ) import GHC.IO.Encoding          ( recover, TextEncoding(TextEncoding) ) import GHC.IO.Encoding.Failure@@ -73,7 +74,7 @@ import qualified System.Directory as Dir import qualified System.IO.Error as IOError #endif-+import qualified Data.Set as Set  -- | Generic merging utility. For sorted input lists this is a full outer join. --@@ -145,9 +146,7 @@ withEnv k v m = do   mb_old <- lookupEnv k   setEnv k v-  m `Exception.finally` (case mb_old of-    Nothing -> unsetEnv k-    Just old -> setEnv k old)+  m `Exception.finally` setOrUnsetEnv k mb_old  -- | Executes the action with a list of environment variables and -- corresponding overrides, where@@ -160,15 +159,15 @@ withEnvOverrides :: [(String, Maybe FilePath)] -> IO a -> IO a withEnvOverrides overrides m = do   mb_olds <- traverse lookupEnv envVars-  traverse_ (uncurry update) overrides-  m `Exception.finally` zipWithM_ update envVars mb_olds+  traverse_ (uncurry setOrUnsetEnv) overrides+  m `Exception.finally` zipWithM_ setOrUnsetEnv envVars mb_olds    where     envVars :: [String]     envVars = map fst overrides -    update :: String -> Maybe FilePath -> IO ()-    update var Nothing    = unsetEnv var-    update var (Just val) = setEnv var val+setOrUnsetEnv :: String -> Maybe String -> IO ()+setOrUnsetEnv var Nothing    = unsetEnv var+setOrUnsetEnv var (Just val) = setEnv var val  -- | Executes the action, increasing the PATH environment -- in some way@@ -197,12 +196,10 @@   m `Exception.finally`     (l $ "cabal: Leaving directory '" ++ d ++ "'\n") -foreign import ccall "getNumberOfProcessors" c_getNumberOfProcessors :: IO CInt- -- The number of processors is not going to change during the duration of the -- program, so unsafePerformIO is safe here. numberOfProcessors :: Int-numberOfProcessors = fromEnum $ unsafePerformIO c_getNumberOfProcessors+numberOfProcessors = unsafePerformIO getNumProcessors  -- | Determine the number of jobs to use given the value of the '-j' flag. determineNumJobs :: Flag (Maybe Int) -> Int@@ -433,7 +430,7 @@ -- | From System.Directory.Extra --   https://hackage.haskell.org/package/extra-1.7.9 listFilesInside :: (FilePath -> IO Bool) -> FilePath -> IO [FilePath]-listFilesInside test dir = ifM (notM $ test $ dropTrailingPathSeparator dir) (pure []) $ do+listFilesInside test dir = ifNotM (test $ dropTrailingPathSeparator dir) (pure []) $ do     (dirs,files) <- partitionM doesDirectoryExist =<< listContents dir     rest <- concatMapM (listFilesInside test) dirs     pure $ files ++ rest@@ -455,6 +452,11 @@ ifM :: Monad m => m Bool -> m a -> m a -> m a ifM b t f = do b' <- b; if b' then t else f +-- | 'ifM' with swapped branches:+--   @ifNotM b t f = ifM (not <$> b) t f@+ifNotM :: Monad m => m Bool -> m a -> m a -> m a+ifNotM = flip . ifM+ -- | From Control.Monad.Extra --   https://hackage.haskell.org/package/extra-1.7.9 concatMapM :: Monad m => (a -> m [b]) -> [a] -> m [b]@@ -471,12 +473,18 @@     (as,bs) <- partitionM f xs     pure ([x | res]++as, [x | not res]++bs) --- | From Control.Monad.Extra---   https://hackage.haskell.org/package/extra-1.7.9-notM :: Functor m => m Bool -> m Bool-notM = fmap not- safeRead :: Read a => String -> Maybe a safeRead s   | [(x, "")] <- reads s = Just x   | otherwise = Nothing++-- | @hasElem xs x = elem x xs@ except that @xs@ is turned into a 'Set' first.+--   Use underapplied to speed up subsequent lookups, e.g. @filter (hasElem xs) ys@.+--   Only amortized when used several times!+--+--   Time complexity \(O((n+m) \log(n))\) for \(m\) lookups in a list of length \(n\).+--   (Compare this to 'elem''s \(O(nm)\).)+--+--   This is [Agda.Utils.List.hasElem](https://hackage.haskell.org/package/Agda-2.6.2.2/docs/Agda-Utils-List.html#v:hasElem).+hasElem :: Ord a => [a] -> a -> Bool+hasElem xs = (`Set.member` Set.fromList xs)
src/Distribution/Client/VCS.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE NamedFieldPuns, RecordWildCards, RankNTypes #-}@@ -53,8 +54,11 @@          ( mkVersion ) import qualified Distribution.PackageDescription as PD +#if !MIN_VERSION_base(4,18,0) import Control.Applicative          ( liftA2 )+#endif+ import Control.Exception          ( throw, try ) import Control.Monad.Trans@@ -205,7 +209,7 @@                                srcuri destdir  --- | Syncronise a set of 'SourceRepo's referring to the same repository with+-- | Synchronise a set of 'SourceRepo's referring to the same repository with -- corresponding local directories. The local directories may or may not -- already exist. --@@ -654,7 +658,7 @@ -- -- --                    ----->  foo on branch B ----->---    resolve confict                                  Initial patch+--    resolve conflict                                  Initial patch --                    ----->  foo on branch A -----> -- --    Which is seems reasonable.
src/Distribution/Client/Version.hs view
@@ -7,10 +7,10 @@ import Distribution.Version  -- This value determines the `cabal-install --version` output.--- --- It is used in several places throughout the project, including anonymous build reports, client configuration, --- and project planning output. Historically, this was a @Paths_*@ module, however, this conflicted with --- program coverage information generated by HPC, and hence was moved to be a standalone value.   --+-- It is used in several places throughout the project, including anonymous build reports, client configuration,+-- and project planning output. Historically, this was a @Paths_*@ module, however, this conflicted with+-- program coverage information generated by HPC, and hence was moved to be a standalone value.+-- cabalInstallVersion :: Version-cabalInstallVersion = mkVersion [3,8,1,0]+cabalInstallVersion = mkVersion [3,10,1,0]
src/Distribution/Deprecated/ViewAsFieldDescr.hs view
@@ -81,4 +81,3 @@ getChoiceByLongFlag _ _ =   error "Distribution.command.getChoiceByLongFlag: expected a choice option" -
tests/IntegrationTests2.hs view
@@ -15,7 +15,6 @@  import Distribution.Client.DistDirLayout import Distribution.Client.ProjectConfig-import Distribution.Client.Config (getCabalDir) import Distribution.Client.HttpUtils import Distribution.Client.TargetSelector hiding (DirActions(..)) import qualified Distribution.Client.TargetSelector as TS (DirActions(..))@@ -51,6 +50,7 @@ import Distribution.InstalledPackageInfo (InstalledPackageInfo) import Distribution.Simple.Setup (toFlag, HaddockFlags(..), defaultHaddockFlags) import Distribution.Client.Setup (globalCommand)+import Distribution.Client.Config (loadConfig, SavedConfig(savedGlobalFlags)) import Distribution.Simple.Compiler import Distribution.Simple.Command import qualified Distribution.Simple.Flag as Flag@@ -1678,8 +1678,7 @@  configureProject :: FilePath -> ProjectConfig -> IO ProjDetails configureProject testdir cliConfig = do-    cabalDir <- getCabalDir-    let cabalDirLayout = defaultCabalDirLayout cabalDir+    cabalDirLayout <- defaultCabalDirLayout      projectRootDir <- canonicalizePath (basedir </> testdir)     isexplict      <- doesFileExist (projectRootDir </> "cabal.project")@@ -1730,6 +1729,7 @@                          distDirLayout cabalDirLayout                          projectConfig                          localPackages+                         Nothing      return (projDetails,             elaboratedPlan,@@ -1956,6 +1956,15 @@   Just True @=? (fromFlag . globalNix . fromJust $ nixEnabledFlags)   Just False @=? (fromFlag . globalNix . fromJust $ nixDisabledFlags)   Nothing @=? (fromFlag . globalNix . fromJust $ nixDefaultFlags)++  -- Config file options+  defaultConfig <- loadConfig verbosity (Flag (basedir </> "nix-config/default-config"))+  trueConfig <- loadConfig verbosity (Flag (basedir </> "nix-config/nix-true"))+  falseConfig <- loadConfig verbosity (Flag (basedir </> "nix-config/nix-false"))++  Nothing @=? (fromFlag . globalNix . savedGlobalFlags $ defaultConfig)+  Just True @=? (fromFlag . globalNix . savedGlobalFlags $ trueConfig)+  Just False @=? (fromFlag . globalNix . savedGlobalFlags $ falseConfig)   where     fromFlag :: Flag Bool -> Maybe Bool     fromFlag (Flag x) = Just x
tests/UnitTests/Distribution/Client/Configure.hs view
@@ -18,26 +18,26 @@ import Distribution.Simple.Flag  tests :: [TestTree]-tests = +tests =     [ configureTests     ]  configureTests :: TestTree configureTests = testGroup "Configure tests"     [ testCase "New config" $ do-        let flags = (defaultNixStyleFlags ()) +        let flags = (defaultNixStyleFlags ())               { configFlags = mempty                   { configOptimization = Flag MaximumOptimisation                   , configVerbosity = Flag silent                   }               }         projConfig <- configureAction' flags [] defaultGlobalFlags-        +         Flag MaximumOptimisation @=?           (packageConfigOptimization . projectConfigLocalPackages $ snd projConfig)      , testCase "Replacement + new config" $ do-        let flags = (defaultNixStyleFlags ()) +        let flags = (defaultNixStyleFlags ())               { configExFlags = mempty                   { configAppend = Flag True }               , configFlags = mempty@@ -51,9 +51,9 @@          Flag NoOptimisation @=? packageConfigOptimization projectConfigLocalPackages         Flag silent         @=? projectConfigVerbosity projectConfigBuildOnly-    +     , testCase "Old + new config" $ do-        let flags = (defaultNixStyleFlags ()) +        let flags = (defaultNixStyleFlags ())               { configExFlags = mempty                   { configAppend = Flag True }               , configFlags = mempty@@ -65,9 +65,9 @@          Flag MaximumOptimisation @=? packageConfigOptimization projectConfigLocalPackages         Flag silent              @=? projectConfigVerbosity projectConfigBuildOnly-    +     , testCase "Old + new config, no appending" $ do-        let flags = (defaultNixStyleFlags ()) +        let flags = (defaultNixStyleFlags ())               { configFlags = mempty                   { configVerbosity = Flag silent }               , projectFlags = mempty@@ -77,9 +77,9 @@          NoFlag      @=? packageConfigOptimization projectConfigLocalPackages         Flag silent @=? projectConfigVerbosity projectConfigBuildOnly-    +     , testCase "Old + new config, backup check" $ do-        let flags = (defaultNixStyleFlags ()) +        let flags = (defaultNixStyleFlags ())               { configFlags = mempty                   { configVerbosity = Flag silent }               , projectFlags = mempty@@ -88,7 +88,7 @@             backup = projectFile <.> "local~"          exists <- doesFileExist backup-        when exists $ +        when exists $           removeFile backup          _ <- configureAction' flags [] defaultGlobalFlags
tests/UnitTests/Distribution/Client/Get.hs view
@@ -39,7 +39,7 @@   , askOption $ \(RunNetworkTests doRunNetTests) ->     testGroup "forkPackages, network tests" $     includeTestsIf doRunNetTests $-    [ testCase "git clone"                   testNetworkGitClone +    [ testCase "git clone"                   testNetworkGitClone     ]   ]   where@@ -234,7 +234,7 @@     case r of       Left e  -> return e       Right _ -> assertFailure $ "expected exception of type "-                              ++ show (typeOf (undefined :: e)) +                              ++ show (typeOf (undefined :: e))   -- | Expect that one line in a file matches exactly the given words (i.e. at
tests/UnitTests/Distribution/Client/IndexUtils.hs view
tests/UnitTests/Distribution/Client/Init/FileCreators.hs view
@@ -18,7 +18,7 @@ import Distribution.Simple.PackageIndex import Distribution.Verbosity -tests +tests     :: Verbosity     -> InitFlags     -> Compiler@@ -82,6 +82,6 @@            Left (BreakException ex) -> assertFailure $ show ex           Right _ -> return ()-        +      ]
tests/UnitTests/Distribution/Client/Init/Golden.hs view
@@ -68,7 +68,7 @@     pkgDir = evalPrompt (getPackageDir initFlags)       $ fromList ["."]     pkgName = evalPrompt (packageNamePrompt srcDb initFlags)-      $ fromList ["test-package", "y"]+      $ fromList ["test-package", "test-package", "y"]  goldenPkgDescTests     :: Verbosity@@ -215,7 +215,7 @@       (goldenTest "test-build-tools-with-comments.golden") $         let opts = WriteOpts False False False v pkgDir Library pkgName defaultCabalVersion         in runGoldenTest opts testArgs (emptyFlags {buildTools = Flag ["happy"]})-    +     , goldenVsString "Standalone tests, empty flags, not simple, no options, no comments"       (goldenTest "standalone-test-no-comments.golden") $         let opts = WriteOpts False False True v pkgDir TestSuite pkgName defaultCabalVersion@@ -256,7 +256,7 @@     , goldenVsString "Library, empty flags, not simple, no comments + no minimal"       (goldenCabal "cabal-lib-no-comments.golden") $         runGoldenTest (libProjArgs "N") emptyFlags-    +     , goldenVsString "Test suite, empty flags, not simple, with comments + no minimal"       (goldenCabal "cabal-test-suite-with-comments.golden") $         runGoldenTest (testProjArgs "Y") emptyFlags@@ -286,12 +286,12 @@               testStanza = mkTestStanza opts $ testTarget {_testDependencies = mangleBaseDep testTarget _testDependencies}            mkStanza $ pkgFields ++ [commonStanza, libStanza, testStanza]-        +         (Right (ProjectSettings opts pkgDesc Nothing Nothing (Just testTarget), _)) -> do           let pkgFields = mkPkgDescription opts pkgDesc               commonStanza = mkCommonStanza opts               testStanza = mkTestStanza opts $ testTarget {_testDependencies = mangleBaseDep testTarget _testDependencies}-          +           mkStanza $ pkgFields ++ [commonStanza, testStanza]          (Right (ProjectSettings _ _ l e t, _)) -> assertFailure $@@ -336,6 +336,7 @@ pkgArgs :: NonEmpty String pkgArgs = fromList     [ "5"+    , "foo-package"     , "foo-package"     , "y"     , "0.1.0.0"
tests/UnitTests/Distribution/Client/Init/Interactive.hs view
@@ -140,6 +140,7 @@               -- package name               , "test-package"               , "test-package"+              , "test-package"               -- version               , "3.1.2.3"               -- license@@ -246,6 +247,7 @@               -- package name               , "test-package"               , "test-package"+              , "test-package"               -- version               , "3.1.2.3"               -- license@@ -322,7 +324,7 @@             exe  @?= Nothing             test @?! Nothing           Left e -> assertFailure $ show e-    +     , testCase "Check the interactive library workflow" $ do         let inputs = fromList               -- package type@@ -337,6 +339,7 @@               -- package name               , "test-package"               , "test-package"+              , "test-package"               -- version               , "3.1.2.3"               -- license@@ -415,6 +418,7 @@               -- package name               , "test-package"               , "test-package"+              , "test-package"               -- version               , "3.1.2.3"               -- license@@ -507,6 +511,7 @@               -- package name               , "test-package"               , "test-package"+              , "test-package"               -- version               , "3.1.2.3"               -- license@@ -584,6 +589,7 @@               -- package name               , "test-package"               , "test-package"+              , "test-package"               -- version               , "3.1.2.3"               -- license@@ -667,6 +673,7 @@               -- package name               , "test-package"               , "test-package"+              , "test-package"               -- version               , "3.1.2.3"               -- license@@ -739,6 +746,7 @@         let inputs = fromList               [ "1"               -- pick the first cabal version in the list               , "my-test-package" -- package name+              , "my-test-package" -- current dir for the purpose of guessing the package name               , "y"               -- "yes to prompt internal to package name"               , "0.2.0.1"         -- package version               , "2"               -- pick the second license in the list@@ -796,15 +804,18 @@           (packageNamePrompt srcDb) (mkPackageName "test-package")           [ "test-package"           , "test-package"+          , "test-package"           ]       , testSimplePrompt "New package name 2"           (packageNamePrompt srcDb) (mkPackageName "test-package")           [ "test-package"+          , "test-package"           , ""           ]       , testSimplePrompt "Existing package name 1"           (packageNamePrompt srcDb) (mkPackageName "test-package")           [ "test-package"+          , "test-package"           , "cabal-install"           , "y"           , "test-package"@@ -812,6 +823,7 @@       , testSimplePrompt "Existing package name 2"           (packageNamePrompt srcDb) (mkPackageName "cabal-install")           [ "test-package"+          , "test-package"           , "cabal-install"           , "n"           ]@@ -919,14 +931,13 @@             , "Haskell2022"             ]         , testSimplePrompt "Invalid language"-            (`languagePrompt` "test") Haskell2010+            (`languagePrompt` "test") (UnknownLanguage "Lang_TS!")             [ "4"             , "Lang_TS!"-            , "1"             ]         ]     , testGroup "Check srcDirsPrompt output"-        [ testNumberedPrompt "Soruce dirs indices" srcDirsPrompt+        [ testNumberedPrompt "Source dirs indices" srcDirsPrompt             [[defaultSourceDir], ["lib"], ["src-lib"]]         , testSimplePrompt "Other source dir"             srcDirsPrompt ["src"]
tests/UnitTests/Distribution/Client/Init/NonInteractive.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE LambdaCase #-} module UnitTests.Distribution.Client.Init.NonInteractive   ( tests   ) where@@ -24,6 +25,8 @@ import qualified Data.Set as Set import Distribution.Client.Init.Utils (mkPackageNameDep, mkStringyDep) import Distribution.FieldGrammar.Newtypes+import Distribution.Simple.Command+import Distribution.Client.Setup (initCommand)  tests     :: Verbosity@@ -43,6 +46,9 @@     , testGroup "non-interactive tests"       [ nonInteractiveTests pkgIx srcDb comp       ]+    , testGroup "cli parser tests"+      [ cliListParserTests+      ]     ]  driverFunctionTest@@ -331,7 +337,7 @@               , "[\"test/Main.hs\", \"test/Foo.hs\", \"test/bar.y\"]"               ] -        case (_runPrompt $ createProject comp silent pkgIx srcDb (emptyFlags +        case (_runPrompt $ createProject comp silent pkgIx srcDb (emptyFlags             { initializeTestSuite = Flag True             , packageType = Flag LibraryAndExecutable             })) inputs of@@ -475,7 +481,7 @@               , "[\"test/Main.hs\", \"test/Foo.hs\", \"test/bar.y\"]"               ] -        case (_runPrompt $ createProject comp silent pkgIx srcDb (emptyFlags +        case (_runPrompt $ createProject comp silent pkgIx srcDb (emptyFlags             { initializeTestSuite = Flag True             , packageType = Flag Library             })) inputs of@@ -515,7 +521,7 @@             _testOtherExts    test @?= map EnableExtension [OverloadedStrings, LambdaCase, RankNTypes, RecordWildCards]             _testDependencies test @?! []             _testBuildTools   test @?= [mkStringyDep "happy:happy"]-            +             assertBool "The library should be a dependency of the test executable" $               mkPackageNameDep (_optPkgName opts) `elem` _testDependencies test @@ -1265,3 +1271,136 @@   case (_runPrompt $ f emptyFlags) (NEL.fromList inputs) of     Left  x -> g x     Right x -> h x++cliListParserTests :: TestTree+cliListParserTests = testGroup "cli list parser"+  [ testCase "Single extraSrc" $ do+      flags <- runParserTest ["-x", "Generated.hs"]+      flags @?= emptyFlags+        { extraSrc = Flag ["Generated.hs"]+        }+  , testCase "Multiple extraSrc" $ do+      flags <- runParserTest ["-x", "Gen1.hs", "-x", "Gen2.hs", "-x", "Gen3.hs"]+      flags @?= emptyFlags+        { extraSrc = Flag ["Gen1.hs", "Gen2.hs", "Gen3.hs"]+        }+  , testCase "Single extraDoc" $ do+      flags <- runParserTest ["--extra-doc-file", "README"]+      flags @?= emptyFlags+        { extraDoc = Flag $ ["README"]+        }+  , testCase "Multiple extraDoc" $ do+      flags <- runParserTest ["--extra-doc-file", "README",+                              "--extra-doc-file", "CHANGELOG",+                              "--extra-doc-file", "LICENSE"]+      flags @?= emptyFlags+        { extraDoc = Flag $ map fromString ["README", "CHANGELOG", "LICENSE"]+        }+  , testCase "Single exposedModules" $ do+      flags <- runParserTest ["-o", "Test"]+      flags @?= emptyFlags+        { exposedModules = Flag $ map fromString ["Test"]+        }+  , testCase "Multiple exposedModules" $ do+      flags <- runParserTest ["-o", "Test", "-o", "Test2", "-o", "Test3"]+      flags @?= emptyFlags+        { exposedModules = Flag $ map fromString ["Test", "Test2", "Test3"]+        }+  -- there is no otherModules cli flag+  -- , testCase "Single otherModules" $ do+  --     flags <- runParserTest ["-o", "Test"]+  --     flags @?= dummyFlags+  --       { otherModules = Flag $ map fromString ["Test"]+  --       }+  -- , testCase "Multiple otherModules" $ do+  --     flags <- runParserTest ["-o", "Test", "-o", "Test2", "-o", "Test3"]+  --     flags @?= dummyFlags+  --       { otherModules = Flag $ map fromString ["Test", "Test2", "Test3"]+  --       }+  , testCase "Single otherExts" $ do+      flags <- runParserTest ["--extension", "OverloadedStrings"]+      flags @?= emptyFlags+        { otherExts = Flag [EnableExtension OverloadedStrings]+        }+  , testCase "Multiple otherExts" $ do+      flags <- runParserTest ["--extension", "OverloadedStrings",+                              "--extension", "FlexibleInstances",+                              "--extension", "FlexibleContexts"]+      flags @?= emptyFlags+        { otherExts = Flag [EnableExtension OverloadedStrings,+                            EnableExtension FlexibleInstances,+                            EnableExtension FlexibleContexts]+        }+  , testCase "Single dependency" $ do+      flags <- runParserTest ["-d", "base"]+      flags @?= emptyFlags+        { dependencies = Flag [mkStringyDep "base"]+        }+  , testCase "Multiple dependency flags" $ do+      flags <- runParserTest ["-d", "base", "-d", "vector"]+      flags @?= emptyFlags+        { dependencies = Flag $ fmap mkStringyDep ["base", "vector"]+        }+  , testCase "Comma separated list of dependencies" $ do+      flags <- runParserTest ["-d", "base,vector"]+      flags @?= emptyFlags+        { dependencies = Flag $ fmap mkStringyDep ["base", "vector"]+        }+  , testCase "Single applicationDirs" $ do+      flags <- runParserTest ["--application-dir", "app"]+      flags @?= emptyFlags+        { applicationDirs = Flag ["app"]+        }+  , testCase "Multiple applicationDirs" $ do+      flags <- runParserTest ["--application-dir", "app",+                              "--application-dir", "exe",+                              "--application-dir", "srcapp"]+      flags @?= emptyFlags+        { applicationDirs = Flag ["app", "exe", "srcapp"]+        }+  , testCase "Single sourceDirs" $ do+      flags <- runParserTest ["--source-dir", "src"]+      flags @?= emptyFlags+        { sourceDirs = Flag ["src"]+        }+  , testCase "Multiple sourceDirs" $ do+      flags <- runParserTest ["--source-dir", "src",+                              "--source-dir", "lib",+                              "--source-dir", "sources"]+      flags @?= emptyFlags+        { sourceDirs = Flag ["src", "lib", "sources"]+        }+  , testCase "Single buildTools" $ do+      flags <- runParserTest ["--build-tool", "happy"]+      flags @?= emptyFlags+        { buildTools = Flag ["happy"]+        }+  , testCase "Multiple buildTools" $ do+      flags <- runParserTest ["--build-tool", "happy",+                              "--build-tool", "alex",+                              "--build-tool", "make"]+      flags @?= emptyFlags+        { buildTools = Flag ["happy", "alex", "make"]+        }+  , testCase "Single testDirs" $ do+      flags <- runParserTest ["--test-dir", "test"]+      flags @?= emptyFlags+        { testDirs = Flag ["test"]+        }+  , testCase "Multiple testDirs" $ do+      flags <- runParserTest ["--test-dir", "test",+                              "--test-dir", "tests",+                              "--test-dir", "testsuite"]+      flags @?= emptyFlags+        { testDirs = Flag ["test", "tests", "testsuite"]+        }+  ]+  where+    assumeAllParse :: CommandParse (InitFlags -> InitFlags, [String]) -> IO InitFlags+    assumeAllParse = \case+      CommandReadyToGo (flagsF, []) -> pure (flagsF emptyFlags)+      _ -> assertFailure "Expected successful parse"++    runParserTest :: [String] -> IO InitFlags+    runParserTest opts = do+      assumeAllParse $ commandParseArgs initCommand False opts
tests/UnitTests/Distribution/Client/Init/Simple.hs view
@@ -50,7 +50,12 @@     [ testCase "Simple lib createProject - no tests" $ do       let inputs = fromList             [ "1"           -- package type: Library-            , "simple-test" -- package dir (ignored, piped to current dir due to prompt monad)+            , "simple.test" -- package dir: used for determining package name;+                            -- note that . will be replaced with - in a sanitization step,+                            -- and we get the expected "simple-test" -- regression test for #8404+            , "simple.test" -- package dir again: the prompt monad needs extra parameter for every+                            -- IO call, and this one will be used for canonicalizePath,+                            -- which is called as a part of sanitization             , "n"           -- no tests             ] @@ -65,7 +70,7 @@         Right (settings', _) -> settings @=? settings'      , testCase "Simple lib createProject - with tests" $ do-      let inputs = fromList ["1", "simple-test", "y", "1"]+      let inputs = fromList ["1", "simple-test", "simple-test", "y", "1"]           flags = emptyFlags { packageType = Flag Library }           settings = ProjectSettings             (WriteOpts False False False v "/home/test/1" Library pkgName defaultCabalVersion)@@ -77,7 +82,7 @@         Right (settings', _) -> settings @=? settings'      , testCase "Simple exe createProject" $ do-      let inputs = fromList ["2", "simple-test"]+      let inputs = fromList ["2", "simple-test", "simple-test"]           flags = emptyFlags { packageType = Flag Executable }           settings = ProjectSettings             (WriteOpts False False False v "/home/test/2" Executable pkgName defaultCabalVersion)@@ -89,7 +94,7 @@         Right (settings', _) -> settings @=? settings'      , testCase "Simple lib+exe createProject - no tests" $ do-      let inputs = fromList ["2", "simple-test", "n"]+      let inputs = fromList ["2", "simple-test", "simple-test", "n"]           flags = emptyFlags { packageType = Flag LibraryAndExecutable }           settings = ProjectSettings             (WriteOpts False False False v "/home/test/2" LibraryAndExecutable pkgName defaultCabalVersion)@@ -100,7 +105,7 @@         Left e -> assertFailure $ "Failed to create simple lib+exe project: " ++ show e         Right (settings', _) -> settings @=? settings'     , testCase "Simple lib+exe createProject - with tests" $ do-      let inputs = fromList ["2", "simple-test", "y", "1"]+      let inputs = fromList ["2", "simple-test", "simple-test", "y", "1"]           flags = emptyFlags { packageType = Flag LibraryAndExecutable }           settings = ProjectSettings             (WriteOpts False False False v "/home/test/2" LibraryAndExecutable pkgName defaultCabalVersion)@@ -113,7 +118,7 @@         Right (settings', _) -> settings @=? settings'      , testCase "Simple standalone tests" $ do-      let inputs = fromList ["2", "simple-test", "y", "1"]+      let inputs = fromList ["2", "simple-test", "simple-test", "y", "1"]           flags = emptyFlags { packageType = Flag TestSuite }           settings = ProjectSettings             (WriteOpts False False False v "/home/test/2" TestSuite pkgName defaultCabalVersion)
tests/UnitTests/Distribution/Client/Init/Utils.hs view
@@ -51,7 +51,7 @@ emptyFlags :: InitFlags emptyFlags = mempty --- | Retireves the proper base version based on the GHC version+-- | Retrieves the proper base version based on the GHC version baseVersion :: Compiler -> VersionRange baseVersion Compiler {compilerId = CompilerId GHC ver} =   let ghcToBase = baseVersion' . prettyShow $ ver in@@ -67,7 +67,6 @@ baseVersion' "8.6.5"  = [4,12,0,0] baseVersion' "8.4.4"  = [4,11,1,0] baseVersion' "8.2.2"  = [4,10,1,0]-baseVersion' "8.0.2"  = [4,10,0,0] baseVersion' "7.10.3" = [4,9,0,0] baseVersion' "7.8.4"  = [4,8,0,0] baseVersion' "7.6.3"  = [4,7,0,0]
tests/UnitTests/Distribution/Client/InstallPlan.hs view
@@ -124,7 +124,7 @@             (Just ixu, Just ixv) -> ixu > ixv             _                    -> True         | let ixs = array (bounds g)-                          (zip (range (bounds g)) (repeat Nothing) ++ +                          (zip (range (bounds g)) (repeat Nothing) ++                            zip vs (map Just [0::Int ..]))         , (u,v) <- edges g ] 
tests/UnitTests/Distribution/Client/ProjectConfig.hs view
@@ -29,6 +29,7 @@ import Distribution.Simple.Program.Types import Distribution.Simple.Program.Db import Distribution.Simple.Utils (toUTF8BS)+import qualified Distribution.Simple.InstallDirs as InstallDirs import Distribution.Types.PackageVersionConstraint  import Distribution.Parsec@@ -456,6 +457,7 @@         projectConfigHcPath               <- arbitraryFlag arbitraryShortToken         projectConfigHcPkg                <- arbitraryFlag arbitraryShortToken         projectConfigHaddockIndex         <- arbitrary+        projectConfigInstallDirs          <- fixInstallDirs <$> arbitrary         projectConfigPackageDBs           <- shortListOf 2 arbitrary         projectConfigRemoteRepos          <- arbitrary         projectConfigLocalNoIndexRepos    <- arbitrary@@ -479,12 +481,14 @@         projectConfigOnlyConstrained      <- arbitrary         projectConfigPerComponent         <- arbitrary         projectConfigIndependentGoals     <- arbitrary+        projectConfigPreferOldest         <- arbitrary         projectConfigProgPathExtra        <- toNubList <$> listOf arbitraryShortToken         return ProjectConfigShared {..}       where         arbitraryConstraints :: Gen [(UserConstraint, ConstraintSource)]         arbitraryConstraints =             fmap (\uc -> (uc, projectConfigConstraintSource)) <$> arbitrary+        fixInstallDirs x = x {InstallDirs.includedir = mempty, InstallDirs.mandir = mempty, InstallDirs.flibdir = mempty}      shrink ProjectConfigShared {..} = runShrinker $ pure ProjectConfigShared         <*> shrinker projectConfigDistDir@@ -495,6 +499,7 @@         <*> shrinkerAla (fmap NonEmpty) projectConfigHcPath         <*> shrinkerAla (fmap NonEmpty) projectConfigHcPkg         <*> shrinker projectConfigHaddockIndex+        <*> shrinker projectConfigInstallDirs         <*> shrinker projectConfigPackageDBs         <*> shrinker projectConfigRemoteRepos         <*> shrinker projectConfigLocalNoIndexRepos@@ -518,6 +523,7 @@         <*> shrinker projectConfigOnlyConstrained         <*> shrinker projectConfigPerComponent         <*> shrinker projectConfigIndependentGoals+        <*> shrinker projectConfigPreferOldest         <*> shrinker projectConfigProgPathExtra       where         preShrink_Constraints  = map fst@@ -571,10 +577,13 @@         <*> arbitraryFlag arbitraryShortToken         <*> arbitrary         <*> arbitrary+        <*> arbitraryFlag arbitraryShortToken+        <*> arbitraryFlag arbitraryShortToken         <*> arbitrary         <*> arbitrary         <*> arbitrary         <*> arbitrary+        <*> arbitrary         <*> arbitraryFlag arbitraryShortToken         <*> arbitrary         <*> shortListOf 5 arbitrary@@ -634,6 +643,9 @@                          , packageConfigHaddockHscolourCss = x39                          , packageConfigHaddockContents = x40                          , packageConfigHaddockForHackage = x41+                         , packageConfigHaddockIndex = x54+                         , packageConfigHaddockBaseUrl = x55+                         , packageConfigHaddockLib = x56                          , packageConfigTestHumanLog = x44                          , packageConfigTestMachineLog = x45                          , packageConfigTestShowDetails = x46@@ -691,6 +703,9 @@                       , packageConfigHaddockHscolourCss = fmap getNonEmpty x39'                       , packageConfigHaddockContents = x40'                       , packageConfigHaddockForHackage = x41'+                      , packageConfigHaddockIndex = x54'+                      , packageConfigHaddockBaseUrl = x55'+                      , packageConfigHaddockLib = x56'                       , packageConfigTestHumanLog = x44'                       , packageConfigTestMachineLog = x45'                       , packageConfigTestShowDetails = x46'@@ -708,7 +723,8 @@           (x30', x31', x32', (x33', x33_1'), x34'),           (x35', x36', x37', x38', x43', x39'),           (x40', x41'),-          (x44', x45', x46', x47', x48', x49', x51', x52')))+          (x44', x45', x46', x47', x48', x49', x51', x52', x54', x55'),+          x56'))           <- shrink              (((preShrink_Paths x00, preShrink_Args x01, x02, x03, x04),                 (x05, x42, x06, x50, x07, x08, x09),@@ -722,7 +738,7 @@                  (x30, x31, x32, (x33, x33_1), x34),                  (x35, x36, fmap NonEmpty x37, x38, x43, fmap NonEmpty x39),                  (x40, x41),-                 (x44, x45, x46, x47, x48, x49, x51, x52)))+                 (x44, x45, x46, x47, x48, x49, x51, x52, x54, x55), x56))       ]       where         preShrink_Paths  = Map.map NonEmpty@@ -794,6 +810,9 @@  instance Arbitrary IndependentGoals where     arbitrary = IndependentGoals <$> arbitrary++instance Arbitrary PreferOldest where+    arbitrary = PreferOldest <$> arbitrary  instance Arbitrary StrongFlags where     arbitrary = StrongFlags <$> arbitrary
tests/UnitTests/Distribution/Client/TreeDiffInstances.hs view
@@ -54,6 +54,7 @@ instance ToExpr PackageConfig instance ToExpr PackageDB instance ToExpr PackageProperty+instance ToExpr PreferOldest instance ToExpr PreSolver instance ToExpr ProjectConfig instance ToExpr ProjectConfigBuildOnly
tests/UnitTests/Distribution/Client/VCS.hs view
@@ -301,7 +301,7 @@ -- -- So, given a source repo dir, the corresponding 'RepoState' and a number of -- target repo dirs, pick a sequence of (lists of) sync targets from the--- 'RepoState' and syncronise the target dirs with those targets, checking for+-- 'RepoState' and synchronise the target dirs with those targets, checking for -- each one that the actual working state matches the expected repo state. -- checkSyncRepos
tests/UnitTests/Distribution/Solver/Modular/DSL.hs view
@@ -474,12 +474,14 @@               }             }         pkgCheckErrors =-          -- We ignore these warnings because some unit tests test that the-          -- solver allows unknown extensions/languages when the compiler-          -- supports them.-          let ignore = ["Unknown extensions:", "Unknown languages:"]-          in [ err | err <- C.checkPackage (srcpkgDescription package) Nothing-             , not $ any (`isPrefixOf` C.explanation err) ignore ]+          -- We ignore unknown extensions/languages warnings because+          -- some there are some unit tests test in which the solver allows+          -- unknown extensions/languages when the compiler supports them.+          -- Furthermore we ignore missing upper bound warnings because+          -- they are not related to this test suite, and are tested+          -- with golden tests.+          let checks = C.checkPackage (srcpkgDescription package) Nothing+          in filter (\x -> not (isMissingUpperBound x) && not (isUnknownLangExt x)) checks     in if null pkgCheckErrors        then package        else error $ "invalid GenericPackageDescription for package "@@ -666,6 +668,18 @@         (directDeps, []) -> map mkDirect directDeps         _                -> error "mkSetupDeps: custom setup has non-simple deps" +    -- Check for `UnknownLanguages` and `UnknownExtensions`. See+    isUnknownLangExt :: C.PackageCheck -> Bool+    isUnknownLangExt pc = case C.explanation pc of+                            C.UnknownExtensions {} -> True+                            C.UnknownLanguages {} -> True+                            _ -> False+    isMissingUpperBound :: C.PackageCheck -> Bool+    isMissingUpperBound pc = case C.explanation pc of+                            C.MissingUpperBounds {} -> True+                            _ -> False++ mkSimpleVersion :: ExamplePkgVersion -> C.Version mkSimpleVersion n = C.mkVersion [n, 0, 0] @@ -733,6 +747,7 @@           -> FineGrainedConflicts           -> MinimizeConflictSet           -> IndependentGoals+          -> PreferOldest           -> ReorderGoals           -> AllowBootLibInstalls           -> OnlyConstrained@@ -745,7 +760,7 @@           -> EnableAllTests           -> Progress String String CI.SolverInstallPlan.SolverInstallPlan exResolve db exts langs pkgConfigDb targets mbj countConflicts-          fineGrainedConflicts minimizeConflictSet indepGoals reorder+          fineGrainedConflicts minimizeConflictSet indepGoals prefOldest reorder           allowBootLibInstalls onlyConstrained enableBj solveExes goalOrder           constraints prefs verbosity enableAllTests     = resolveDependencies C.buildPlatform compiler pkgConfigDb Modular params@@ -774,6 +789,7 @@                    $ setFineGrainedConflicts fineGrainedConflicts                    $ setMinimizeConflictSet minimizeConflictSet                    $ setIndependentGoals indepGoals+                   $ (if asBool prefOldest then setPreferenceDefault PreferAllOldest else id)                    $ setReorderGoals reorder                    $ setMaxBackjumps mbj                    $ setAllowBootLibInstalls allowBootLibInstalls
tests/UnitTests/Distribution/Solver/Modular/DSL/TestCaseUtils.hs view
@@ -7,6 +7,7 @@   , disableFineGrainedConflicts   , minimizeConflictSet   , independentGoals+  , preferOldest   , allowBootLibInstalls   , onlyConstrained   , disableBackjumping@@ -66,6 +67,10 @@ independentGoals :: SolverTest -> SolverTest independentGoals test = test { testIndepGoals = IndependentGoals True } +-- | Combinator to turn on --prefer-oldest+preferOldest :: SolverTest -> SolverTest+preferOldest test = test { testPreferOldest = PreferOldest True }+ allowBootLibInstalls :: SolverTest -> SolverTest allowBootLibInstalls test =     test { testAllowBootLibInstalls = AllowBootLibInstalls True }@@ -111,6 +116,7 @@   , testFineGrainedConflicts :: FineGrainedConflicts   , testMinimizeConflictSet  :: MinimizeConflictSet   , testIndepGoals           :: IndependentGoals+  , testPreferOldest         :: PreferOldest   , testAllowBootLibInstalls :: AllowBootLibInstalls   , testOnlyConstrained      :: OnlyConstrained   , testEnableBackjumping    :: EnableBackjumping@@ -208,6 +214,7 @@   , testFineGrainedConflicts = FineGrainedConflicts True   , testMinimizeConflictSet  = MinimizeConflictSet False   , testIndepGoals           = IndependentGoals False+  , testPreferOldest         = PreferOldest False   , testAllowBootLibInstalls = AllowBootLibInstalls False   , testOnlyConstrained      = OnlyConstrainedNone   , testEnableBackjumping    = EnableBackjumping True@@ -230,7 +237,7 @@                      testSupportedLangs testPkgConfigDb testTargets                      testMaxBackjumps (CountConflicts True)                      testFineGrainedConflicts testMinimizeConflictSet-                     testIndepGoals (ReorderGoals False) testAllowBootLibInstalls+                     testIndepGoals testPreferOldest (ReorderGoals False) testAllowBootLibInstalls                      testOnlyConstrained testEnableBackjumping testSolveExecutables                      (sortGoals <$> testGoalOrder) testConstraints                      testSoftConstraints testVerbosity testEnableAllTests
tests/UnitTests/Distribution/Solver/Modular/QuickCheck.hs view
@@ -57,7 +57,7 @@                 r2 = solve' mGoalOrder2 test { testTargets = targets2 }                 solve' goalOrder =                     solve (EnableBackjumping True) (FineGrainedConflicts True)-                          (ReorderGoals False) (CountConflicts True) indepGoals+                          (ReorderGoals False) (CountConflicts True) indepGoals (PreferOldest False)                           (getBlind <$> goalOrder)                 targets = testTargets test                 targets2 = case targetOrder of@@ -74,7 +74,7 @@                 r2 = solve' (IndependentGoals True)  test                 solve' indep =                     solve (EnableBackjumping True) (FineGrainedConflicts True)-                          reorderGoals (CountConflicts True) indep Nothing+                          reorderGoals (CountConflicts True) indep (PreferOldest False)Nothing              in counterexample (showResults r1 r2) $                 noneReachedBackjumpLimit [r1, r2] ==>                 isRight (resultPlan r1) `implies` isRight (resultPlan r2)@@ -85,7 +85,7 @@                 r2 = solve' (EnableBackjumping False) test                 solve' enableBj =                     solve enableBj (FineGrainedConflicts False) reorderGoals-                          (CountConflicts True) indepGoals Nothing+                          (CountConflicts True) indepGoals (PreferOldest False) Nothing              in counterexample (showResults r1 r2) $                 noneReachedBackjumpLimit [r1, r2] ==>                 isRight (resultPlan r1) === isRight (resultPlan r2)@@ -96,11 +96,22 @@                 r2 = solve' (FineGrainedConflicts False) test                 solve' fineGrainedConflicts =                     solve (EnableBackjumping True) fineGrainedConflicts-                    reorderGoals (CountConflicts True) indepGoals Nothing+                    reorderGoals (CountConflicts True) indepGoals (PreferOldest False) Nothing              in counterexample (showResults r1 r2) $                 noneReachedBackjumpLimit [r1, r2] ==>                 isRight (resultPlan r1) === isRight (resultPlan r2) +    , testPropertyWithSeed "prefer oldest does not affect solvability" $+          \test reorderGoals indepGoals ->+            let r1 = solve' (PreferOldest True)  test+                r2 = solve' (PreferOldest False) test+                solve' prefOldest  =+                    solve (EnableBackjumping True) (FineGrainedConflicts True)+                    reorderGoals (CountConflicts True) indepGoals prefOldest Nothing+             in counterexample (showResults r1 r2) $+                noneReachedBackjumpLimit [r1, r2] ==>+                isRight (resultPlan r1) === isRight (resultPlan r2)+     -- The next two tests use --no-count-conflicts, because the goal order used     -- with --count-conflicts depends on the total set of conflicts seen by the     -- solver. The solver explores more of the tree and encounters more@@ -116,7 +127,7 @@                 r2 = solve' (EnableBackjumping False) test                 solve' enableBj =                     solve enableBj (FineGrainedConflicts False) reorderGoals-                          (CountConflicts False) indepGoals Nothing+                          (CountConflicts False) indepGoals (PreferOldest False) Nothing              in counterexample (showResults r1 r2) $                 noneReachedBackjumpLimit [r1, r2] ==>                 resultPlan r1 === resultPlan r2@@ -128,7 +139,7 @@                 r2 = solve' (FineGrainedConflicts False) test                 solve' fineGrainedConflicts =                     solve (EnableBackjumping True) fineGrainedConflicts-                          reorderGoals (CountConflicts False) indepGoals Nothing+                          reorderGoals (CountConflicts False) indepGoals (PreferOldest False) Nothing              in counterexample (showResults r1 r2) $                 noneReachedBackjumpLimit [r1, r2] ==>                 resultPlan r1 === resultPlan r2@@ -163,10 +174,11 @@       -> ReorderGoals       -> CountConflicts       -> IndependentGoals+      -> PreferOldest       -> Maybe VarOrdering       -> SolverTest       -> Result-solve enableBj fineGrainedConflicts reorder countConflicts indep goalOrder test =+solve enableBj fineGrainedConflicts reorder countConflicts indep prefOldest goalOrder test =   let (lg, result) =         runProgress $ exResolve (unTestDb (testDb test)) Nothing Nothing                   (pkgConfigDbFromList [])@@ -175,7 +187,7 @@                   -- too much time and memory.                   (Just defaultMaxBackjumps)                   countConflicts fineGrainedConflicts-                  (MinimizeConflictSet False) indep reorder+                  (MinimizeConflictSet False) indep prefOldest reorder                   (AllowBootLibInstalls False) OnlyConstrainedNone enableBj                   (SolveExecutables True) (unVarOrdering <$> goalOrder)                   (testConstraints test) (testPreferences test) normal
tests/UnitTests/Distribution/Solver/Modular/Solver.hs view
@@ -30,6 +30,8 @@       testGroup "Simple dependencies" [           runTest $         mkTest db1 "alreadyInstalled"   ["A"]      (solverSuccess [])         , runTest $         mkTest db1 "installLatest"      ["B"]      (solverSuccess [("B", 2)])+        , runTest $ preferOldest+                  $         mkTest db1 "installOldest"      ["B"]      (solverSuccess [("B", 1)])         , runTest $         mkTest db1 "simpleDep1"         ["C"]      (solverSuccess [("B", 1), ("C", 1)])         , runTest $         mkTest db1 "simpleDep2"         ["D"]      (solverSuccess [("B", 2), ("D", 1)])         , runTest $         mkTest db1 "failTwoVersions"    ["C", "D"] anySolverFailure@@ -146,11 +148,17 @@         , runTest $ mkTest db12 "baseShim5" ["D"] anySolverFailure         , runTest $ mkTest db12 "baseShim6" ["E"] (solverSuccess [("E", 1), ("syb", 2)])         ]-    , testGroup "Base" [+    , testGroup "Base and Nonupgradable" [           runTest $ mkTest dbBase "Refuse to install base without --allow-boot-library-installs" ["base"] $                       solverFailure (isInfixOf "only already installed instances can be used")         , runTest $ allowBootLibInstalls $ mkTest dbBase "Install base with --allow-boot-library-installs" ["base"] $                       solverSuccess [("base", 1), ("ghc-prim", 1), ("integer-gmp", 1), ("integer-simple", 1)]+        , runTest $ mkTest dbNonupgrade "Refuse to install newer ghc requested by another library" ["A"] $+                      solverFailure (isInfixOf "rejecting: ghc-2.0.0 (constraint from non-upgradeable package requires installed instance)")+        , runTest $ mkTest dbNonupgrade "Refuse to install newer ghci requested by another library" ["B"] $+                      solverFailure (isInfixOf "rejecting: ghci-2.0.0 (constraint from non-upgradeable package requires installed instance)")+        , runTest $ mkTest dbNonupgrade "Refuse to install newer ghc-boot requested by another library" ["C"] $+                      solverFailure (isInfixOf "rejecting: ghc-boot-2.0.0 (constraint from non-upgradeable package requires installed instance)")         ]     , testGroup "reject-unconstrained" [           runTest $ onlyConstrained $ mkTest db12 "missing syb" ["E"] $@@ -1120,6 +1128,19 @@     , Right $ exAv "integer-simple" 1 []     , Right $ exAv "integer-gmp" 1 []     ]++dbNonupgrade :: ExampleDb+dbNonupgrade = [+    Left $ exInst "ghc" 1 "ghc-1" []+  , Left $ exInst "ghci" 1 "ghci-1" []+  , Left $ exInst "ghc-boot" 1 "ghc-boot-1" []+  , Right $ exAv "ghc" 2 []+  , Right $ exAv "ghci" 2 []+  , Right $ exAv "ghc-boot" 2 []+  , Right $ exAv "A" 1 [ExFix "ghc" 2]+  , Right $ exAv "B" 1 [ExFix "ghci" 2]+  , Right $ exAv "C" 1 [ExFix "ghc-boot" 2]+  ]  db13 :: ExampleDb db13 = [