Cabal 3.0.2.0 → 3.2.0.0
raw patch · 172 files changed
+2485/−1058 lines, 172 filesdep ~semigroupsdep ~taggedPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: semigroups, tagged
API changes (from Hackage documentation)
- Distribution.Compat.Parsing: endBy1 :: Alternative m => m a -> m sep -> m [a]
- Distribution.Compat.Parsing: sepBy1 :: Alternative m => m a -> m sep -> m [a]
- Distribution.Compat.Parsing: sepEndBy1 :: Alternative m => m a -> m sep -> m [a]
- Distribution.Simple.Utils: IODataModeBinary :: IODataMode
- Distribution.Simple.Utils: IODataModeText :: IODataMode
- Distribution.Types.GenericPackageDescription: Arch :: Arch -> ConfVar
- Distribution.Types.GenericPackageDescription: Flag :: FlagName -> ConfVar
- Distribution.Types.GenericPackageDescription: Impl :: CompilerFlavor -> VersionRange -> ConfVar
- Distribution.Types.GenericPackageDescription: MkFlag :: FlagName -> String -> Bool -> Bool -> Flag
- Distribution.Types.GenericPackageDescription: OS :: OS -> ConfVar
- Distribution.Types.GenericPackageDescription: [flagDefault] :: Flag -> Bool
- Distribution.Types.GenericPackageDescription: [flagDescription] :: Flag -> String
- Distribution.Types.GenericPackageDescription: [flagManual] :: Flag -> Bool
- Distribution.Types.GenericPackageDescription: [flagName] :: Flag -> FlagName
- Distribution.Types.GenericPackageDescription: data ConfVar
- Distribution.Types.GenericPackageDescription: data Flag
- Distribution.Types.GenericPackageDescription: data FlagAssignment
- Distribution.Types.GenericPackageDescription: data FlagName
- Distribution.Types.GenericPackageDescription: diffFlagAssignment :: FlagAssignment -> FlagAssignment -> FlagAssignment
- Distribution.Types.GenericPackageDescription: dispFlagAssignment :: FlagAssignment -> Doc
- Distribution.Types.GenericPackageDescription: emptyFlag :: FlagName -> Flag
- Distribution.Types.GenericPackageDescription: findDuplicateFlagAssignments :: FlagAssignment -> [FlagName]
- Distribution.Types.GenericPackageDescription: insertFlagAssignment :: FlagName -> Bool -> FlagAssignment -> FlagAssignment
- Distribution.Types.GenericPackageDescription: instance Control.DeepSeq.NFData Distribution.Types.GenericPackageDescription.ConfVar
- Distribution.Types.GenericPackageDescription: instance Control.DeepSeq.NFData Distribution.Types.GenericPackageDescription.Flag
- Distribution.Types.GenericPackageDescription: instance Control.DeepSeq.NFData Distribution.Types.GenericPackageDescription.FlagAssignment
- Distribution.Types.GenericPackageDescription: instance Control.DeepSeq.NFData Distribution.Types.GenericPackageDescription.FlagName
- Distribution.Types.GenericPackageDescription: instance Data.Binary.Class.Binary Distribution.Types.GenericPackageDescription.ConfVar
- Distribution.Types.GenericPackageDescription: instance Data.Binary.Class.Binary Distribution.Types.GenericPackageDescription.Flag
- Distribution.Types.GenericPackageDescription: instance Data.Binary.Class.Binary Distribution.Types.GenericPackageDescription.FlagAssignment
- Distribution.Types.GenericPackageDescription: instance Data.Binary.Class.Binary Distribution.Types.GenericPackageDescription.FlagName
- Distribution.Types.GenericPackageDescription: instance Data.Data.Data Distribution.Types.GenericPackageDescription.ConfVar
- Distribution.Types.GenericPackageDescription: instance Data.Data.Data Distribution.Types.GenericPackageDescription.Flag
- Distribution.Types.GenericPackageDescription: instance Data.Data.Data Distribution.Types.GenericPackageDescription.FlagName
- Distribution.Types.GenericPackageDescription: instance Data.String.IsString Distribution.Types.GenericPackageDescription.FlagName
- Distribution.Types.GenericPackageDescription: instance Distribution.Parsec.Parsec Distribution.Types.GenericPackageDescription.FlagName
- Distribution.Types.GenericPackageDescription: instance Distribution.Pretty.Pretty Distribution.Types.GenericPackageDescription.FlagName
- Distribution.Types.GenericPackageDescription: instance GHC.Base.Monoid Distribution.Types.GenericPackageDescription.FlagAssignment
- Distribution.Types.GenericPackageDescription: instance GHC.Base.Semigroup Distribution.Types.GenericPackageDescription.FlagAssignment
- Distribution.Types.GenericPackageDescription: instance GHC.Classes.Eq Distribution.Types.GenericPackageDescription.ConfVar
- Distribution.Types.GenericPackageDescription: instance GHC.Classes.Eq Distribution.Types.GenericPackageDescription.Flag
- Distribution.Types.GenericPackageDescription: instance GHC.Classes.Eq Distribution.Types.GenericPackageDescription.FlagAssignment
- Distribution.Types.GenericPackageDescription: instance GHC.Classes.Eq Distribution.Types.GenericPackageDescription.FlagName
- Distribution.Types.GenericPackageDescription: instance GHC.Classes.Ord Distribution.Types.GenericPackageDescription.FlagAssignment
- Distribution.Types.GenericPackageDescription: instance GHC.Classes.Ord Distribution.Types.GenericPackageDescription.FlagName
- Distribution.Types.GenericPackageDescription: instance GHC.Generics.Generic Distribution.Types.GenericPackageDescription.ConfVar
- Distribution.Types.GenericPackageDescription: instance GHC.Generics.Generic Distribution.Types.GenericPackageDescription.Flag
- Distribution.Types.GenericPackageDescription: instance GHC.Generics.Generic Distribution.Types.GenericPackageDescription.FlagAssignment
- Distribution.Types.GenericPackageDescription: instance GHC.Generics.Generic Distribution.Types.GenericPackageDescription.FlagName
- Distribution.Types.GenericPackageDescription: instance GHC.Read.Read Distribution.Types.GenericPackageDescription.FlagAssignment
- Distribution.Types.GenericPackageDescription: instance GHC.Read.Read Distribution.Types.GenericPackageDescription.FlagName
- Distribution.Types.GenericPackageDescription: instance GHC.Show.Show Distribution.Types.GenericPackageDescription.ConfVar
- Distribution.Types.GenericPackageDescription: instance GHC.Show.Show Distribution.Types.GenericPackageDescription.Flag
- Distribution.Types.GenericPackageDescription: instance GHC.Show.Show Distribution.Types.GenericPackageDescription.FlagAssignment
- Distribution.Types.GenericPackageDescription: instance GHC.Show.Show Distribution.Types.GenericPackageDescription.FlagName
- Distribution.Types.GenericPackageDescription: lookupFlagAssignment :: FlagName -> FlagAssignment -> Maybe Bool
- Distribution.Types.GenericPackageDescription: mkFlagAssignment :: [(FlagName, Bool)] -> FlagAssignment
- Distribution.Types.GenericPackageDescription: mkFlagName :: String -> FlagName
- Distribution.Types.GenericPackageDescription: nullFlagAssignment :: FlagAssignment -> Bool
- Distribution.Types.GenericPackageDescription: parsecFlagAssignment :: CabalParsing m => m FlagAssignment
- Distribution.Types.GenericPackageDescription: showFlagValue :: (FlagName, Bool) -> String
- Distribution.Types.GenericPackageDescription: unFlagAssignment :: FlagAssignment -> [(FlagName, Bool)]
- Distribution.Types.GenericPackageDescription: unFlagName :: FlagName -> String
- Distribution.Utils.IOData: IODataModeBinary :: IODataMode
- Distribution.Utils.IOData: IODataModeText :: IODataMode
- Distribution.Utils.IOData: hGetContents :: Handle -> IODataMode -> IO IOData
+ Distribution.Backpack: instance Distribution.Utils.Structured.Structured Distribution.Backpack.OpenModule
+ Distribution.Backpack: instance Distribution.Utils.Structured.Structured Distribution.Backpack.OpenUnitId
+ Distribution.Backpack.ModuleShape: instance Distribution.Utils.Structured.Structured Distribution.Backpack.ModuleShape.ModuleShape
+ Distribution.Compat.Graph: instance Distribution.Utils.Structured.Structured a => Distribution.Utils.Structured.Structured (Distribution.Compat.Graph.Graph a)
+ Distribution.Compat.Parsing: endByNonEmpty :: Alternative m => m a -> m sep -> m (NonEmpty a)
+ Distribution.Compat.Parsing: sepEndByNonEmpty :: Alternative m => m a -> m sep -> m (NonEmpty a)
+ Distribution.Compat.Prelude.Internal: Identity :: a -> Identity a
+ Distribution.Compat.Prelude.Internal: Proxy :: Proxy (t :: k)
+ Distribution.Compat.Prelude.Internal: [runIdentity] :: Identity a -> a
+ Distribution.Compat.Prelude.Internal: class Typeable a => Structured a
+ Distribution.Compat.Prelude.Internal: data Proxy (t :: k)
+ Distribution.Compat.Prelude.Internal: data Set a
+ Distribution.Compat.Prelude.Internal: newtype Identity a
+ Distribution.Compat.Prelude.Internal: toList :: Foldable t => t a -> [a]
+ Distribution.Compat.Prelude.Internal: type TypeRep = SomeTypeRep
+ Distribution.Compat.Prelude.Internal: typeRep :: forall k proxy (a :: k). Typeable a => proxy a -> TypeRep
+ Distribution.Compat.Semigroup: instance Distribution.Utils.Structured.Structured a => Distribution.Utils.Structured.Structured (Distribution.Compat.Semigroup.Last' a)
+ Distribution.Compat.Semigroup: instance Distribution.Utils.Structured.Structured a => Distribution.Utils.Structured.Structured (Distribution.Compat.Semigroup.Option' a)
+ Distribution.Compat.Semigroup: instance GHC.Generics.Generic (Distribution.Compat.Semigroup.Last' a)
+ Distribution.Compat.Semigroup: instance GHC.Generics.Generic (Distribution.Compat.Semigroup.Option' a)
+ Distribution.Compat.Time: instance Distribution.Utils.Structured.Structured Distribution.Compat.Time.ModTime
+ Distribution.Compat.Time: instance GHC.Generics.Generic Distribution.Compat.Time.ModTime
+ Distribution.Compat.Typeable: class Typeable (a :: k)
+ Distribution.Compat.Typeable: type TypeRep = SomeTypeRep
+ Distribution.Compat.Typeable: typeRep :: forall k proxy (a :: k). Typeable a => proxy a -> TypeRep
+ Distribution.Compiler: instance Distribution.Utils.Structured.Structured Distribution.Compiler.AbiTag
+ Distribution.Compiler: instance Distribution.Utils.Structured.Structured Distribution.Compiler.CompilerFlavor
+ Distribution.Compiler: instance Distribution.Utils.Structured.Structured Distribution.Compiler.CompilerId
+ Distribution.Compiler: instance Distribution.Utils.Structured.Structured a => Distribution.Utils.Structured.Structured (Distribution.Compiler.PerCompilerFlavor a)
+ Distribution.FieldGrammar: defaultFreeTextFieldDefST :: (Functor (g s), FieldGrammar g) => FieldName -> ALens' s ShortText -> g s ShortText
+ Distribution.FieldGrammar: freeTextFieldDefST :: FieldGrammar g => FieldName -> ALens' s ShortText -> g s ShortText
+ Distribution.FieldGrammar.Class: defaultFreeTextFieldDefST :: (Functor (g s), FieldGrammar g) => FieldName -> ALens' s ShortText -> g s ShortText
+ Distribution.FieldGrammar.Class: freeTextFieldDefST :: FieldGrammar g => FieldName -> ALens' s ShortText -> g s ShortText
+ Distribution.License: instance Distribution.Utils.Structured.Structured Distribution.License.License
+ Distribution.ModuleName: instance Distribution.Utils.Structured.Structured Distribution.ModuleName.ModuleName
+ Distribution.ModuleName: instance Distribution.Utils.Structured.Structured Distribution.ModuleName.ShortTextLst
+ Distribution.Parsec.Newtypes: alaSet :: sep -> Set a -> Set' sep (Identity a) a
+ Distribution.Parsec.Newtypes: alaSet' :: sep -> (a -> b) -> Set a -> Set' sep b a
+ Distribution.Parsec.Newtypes: data Set' sep b a
+ Distribution.Parsec.Newtypes: instance (Distribution.Compat.Newtype.Newtype a b, Distribution.Parsec.Newtypes.Sep sep, Distribution.Pretty.Pretty b) => Distribution.Pretty.Pretty (Distribution.Parsec.Newtypes.Set' sep b a)
+ Distribution.Parsec.Newtypes: instance (Distribution.Compat.Newtype.Newtype a b, GHC.Classes.Ord a, Distribution.Parsec.Newtypes.Sep sep, Distribution.Parsec.Parsec b) => Distribution.Parsec.Parsec (Distribution.Parsec.Newtypes.Set' sep b a)
+ Distribution.Parsec.Newtypes: instance Distribution.Compat.Newtype.Newtype (Data.Set.Internal.Set a) (Distribution.Parsec.Newtypes.Set' sep wrapper a)
+ Distribution.SPDX.License: instance Distribution.Utils.Structured.Structured Distribution.SPDX.License.License
+ Distribution.SPDX.LicenseExceptionId: instance Distribution.Utils.Structured.Structured Distribution.SPDX.LicenseExceptionId.LicenseExceptionId
+ Distribution.SPDX.LicenseExpression: instance Distribution.Utils.Structured.Structured Distribution.SPDX.LicenseExpression.LicenseExpression
+ Distribution.SPDX.LicenseExpression: instance Distribution.Utils.Structured.Structured Distribution.SPDX.LicenseExpression.SimpleLicenseExpression
+ Distribution.SPDX.LicenseId: instance Distribution.Utils.Structured.Structured Distribution.SPDX.LicenseId.LicenseId
+ Distribution.SPDX.LicenseReference: instance Distribution.Utils.Structured.Structured Distribution.SPDX.LicenseReference.LicenseRef
+ Distribution.Simple.Compiler: instance Distribution.Utils.Structured.Structured Distribution.Simple.Compiler.Compiler
+ Distribution.Simple.Compiler: instance Distribution.Utils.Structured.Structured Distribution.Simple.Compiler.DebugInfoLevel
+ Distribution.Simple.Compiler: instance Distribution.Utils.Structured.Structured Distribution.Simple.Compiler.OptimisationLevel
+ Distribution.Simple.Compiler: instance Distribution.Utils.Structured.Structured Distribution.Simple.Compiler.PackageDB
+ Distribution.Simple.Compiler: instance Distribution.Utils.Structured.Structured Distribution.Simple.Compiler.ProfDetailLevel
+ Distribution.Simple.Flag: instance Distribution.Utils.Structured.Structured a => Distribution.Utils.Structured.Structured (Distribution.Simple.Flag.Flag a)
+ Distribution.Simple.InstallDirs: instance Distribution.Utils.Structured.Structured Distribution.Simple.InstallDirs.PathTemplate
+ Distribution.Simple.InstallDirs: instance Distribution.Utils.Structured.Structured dir => Distribution.Utils.Structured.Structured (Distribution.Simple.InstallDirs.InstallDirs dir)
+ Distribution.Simple.InstallDirs.Internal: instance Distribution.Utils.Structured.Structured Distribution.Simple.InstallDirs.Internal.PathComponent
+ Distribution.Simple.InstallDirs.Internal: instance Distribution.Utils.Structured.Structured Distribution.Simple.InstallDirs.Internal.PathTemplateVariable
+ Distribution.Simple.PackageIndex: instance Distribution.Utils.Structured.Structured a => Distribution.Utils.Structured.Structured (Distribution.Simple.PackageIndex.PackageIndex a)
+ Distribution.Simple.Program: getProgramInvocationLBS :: Verbosity -> ProgramInvocation -> IO ByteString
+ Distribution.Simple.Program.Db: instance Distribution.Utils.Structured.Structured Distribution.Simple.Program.Db.ProgramDb
+ Distribution.Simple.Program.Find: instance Distribution.Utils.Structured.Structured Distribution.Simple.Program.Find.ProgramSearchPathEntry
+ Distribution.Simple.Program.Run: getProgramInvocationLBS :: Verbosity -> ProgramInvocation -> IO ByteString
+ Distribution.Simple.Program.Types: instance Distribution.Utils.Structured.Structured Distribution.Simple.Program.Types.ConfiguredProgram
+ Distribution.Simple.Program.Types: instance Distribution.Utils.Structured.Structured Distribution.Simple.Program.Types.ProgramLocation
+ Distribution.Simple.Setup: benchmarkOptions' :: ShowOrParseArgs -> [OptionField BenchmarkFlags]
+ Distribution.Simple.Setup: instance Distribution.Utils.Structured.Structured Distribution.Simple.Setup.ConfigFlags
+ Distribution.Simple.Setup: instance Distribution.Utils.Structured.Structured Distribution.Simple.Setup.HaddockTarget
+ Distribution.Simple.Setup: instance Distribution.Utils.Structured.Structured Distribution.Simple.Setup.TestShowDetails
+ Distribution.Simple.Utils: [IODataModeBinary] :: IODataMode ByteString
+ Distribution.Simple.Utils: [IODataModeText] :: IODataMode String
+ Distribution.Simple.Utils: class NFData mode => KnownIODataMode mode
+ Distribution.Simple.Utils: hGetIODataContents :: KnownIODataMode mode => Handle -> IO mode
+ Distribution.Simple.Utils: iodataMode :: KnownIODataMode mode => IODataMode mode
+ Distribution.Simple.Utils: safeHead :: [a] -> Maybe a
+ Distribution.Simple.Utils: safeInit :: [a] -> [a]
+ Distribution.Simple.Utils: safeLast :: [a] -> Maybe a
+ Distribution.Simple.Utils: toIOData :: KnownIODataMode mode => mode -> IOData
+ Distribution.System: instance Distribution.Utils.Structured.Structured Distribution.System.Arch
+ Distribution.System: instance Distribution.Utils.Structured.Structured Distribution.System.OS
+ Distribution.System: instance Distribution.Utils.Structured.Structured Distribution.System.Platform
+ Distribution.Types.AbiDependency: instance Distribution.Utils.Structured.Structured Distribution.Types.AbiDependency.AbiDependency
+ Distribution.Types.AbiHash: instance Distribution.Utils.Structured.Structured Distribution.Types.AbiHash.AbiHash
+ Distribution.Types.Benchmark: instance Distribution.Utils.Structured.Structured Distribution.Types.Benchmark.Benchmark
+ Distribution.Types.BenchmarkInterface: instance Distribution.Utils.Structured.Structured Distribution.Types.BenchmarkInterface.BenchmarkInterface
+ Distribution.Types.BenchmarkType: instance Distribution.Utils.Structured.Structured Distribution.Types.BenchmarkType.BenchmarkType
+ Distribution.Types.BuildInfo: instance Distribution.Utils.Structured.Structured Distribution.Types.BuildInfo.BuildInfo
+ Distribution.Types.BuildType: instance Distribution.Utils.Structured.Structured Distribution.Types.BuildType.BuildType
+ Distribution.Types.ComponentId: instance Distribution.Utils.Structured.Structured Distribution.Types.ComponentId.ComponentId
+ Distribution.Types.ComponentLocalBuildInfo: instance Distribution.Utils.Structured.Structured Distribution.Types.ComponentLocalBuildInfo.ComponentLocalBuildInfo
+ Distribution.Types.ComponentName: instance Distribution.Utils.Structured.Structured Distribution.Types.ComponentName.ComponentName
+ Distribution.Types.ComponentRequestedSpec: instance Distribution.Utils.Structured.Structured Distribution.Types.ComponentRequestedSpec.ComponentRequestedSpec
+ Distribution.Types.CondTree: instance (Distribution.Utils.Structured.Structured v, Distribution.Utils.Structured.Structured c, Distribution.Utils.Structured.Structured a) => Distribution.Utils.Structured.Structured (Distribution.Types.CondTree.CondBranch v c a)
+ Distribution.Types.CondTree: instance (Distribution.Utils.Structured.Structured v, Distribution.Utils.Structured.Structured c, Distribution.Utils.Structured.Structured a) => Distribution.Utils.Structured.Structured (Distribution.Types.CondTree.CondTree v c a)
+ Distribution.Types.Condition: instance Distribution.Utils.Structured.Structured c => Distribution.Utils.Structured.Structured (Distribution.Types.Condition.Condition c)
+ Distribution.Types.ConfVar: Arch :: Arch -> ConfVar
+ Distribution.Types.ConfVar: Flag :: FlagName -> ConfVar
+ Distribution.Types.ConfVar: Impl :: CompilerFlavor -> VersionRange -> ConfVar
+ Distribution.Types.ConfVar: OS :: OS -> ConfVar
+ Distribution.Types.ConfVar: data ConfVar
+ Distribution.Types.ConfVar: instance Control.DeepSeq.NFData Distribution.Types.ConfVar.ConfVar
+ Distribution.Types.ConfVar: instance Data.Binary.Class.Binary Distribution.Types.ConfVar.ConfVar
+ Distribution.Types.ConfVar: instance Data.Data.Data Distribution.Types.ConfVar.ConfVar
+ Distribution.Types.ConfVar: instance Distribution.Utils.Structured.Structured Distribution.Types.ConfVar.ConfVar
+ Distribution.Types.ConfVar: instance GHC.Classes.Eq Distribution.Types.ConfVar.ConfVar
+ Distribution.Types.ConfVar: instance GHC.Generics.Generic Distribution.Types.ConfVar.ConfVar
+ Distribution.Types.ConfVar: instance GHC.Show.Show Distribution.Types.ConfVar.ConfVar
+ Distribution.Types.Dependency: instance Distribution.Utils.Structured.Structured Distribution.Types.Dependency.Dependency
+ Distribution.Types.ExeDependency: instance Distribution.Utils.Structured.Structured Distribution.Types.ExeDependency.ExeDependency
+ Distribution.Types.Executable: instance Distribution.Utils.Structured.Structured Distribution.Types.Executable.Executable
+ Distribution.Types.ExecutableScope: instance Distribution.Utils.Structured.Structured Distribution.Types.ExecutableScope.ExecutableScope
+ Distribution.Types.ExposedModule: instance Distribution.Utils.Structured.Structured Distribution.Types.ExposedModule.ExposedModule
+ Distribution.Types.Flag: MkFlag :: FlagName -> String -> Bool -> Bool -> Flag
+ Distribution.Types.Flag: [flagDefault] :: Flag -> Bool
+ Distribution.Types.Flag: [flagDescription] :: Flag -> String
+ Distribution.Types.Flag: [flagManual] :: Flag -> Bool
+ Distribution.Types.Flag: [flagName] :: Flag -> FlagName
+ Distribution.Types.Flag: data Flag
+ Distribution.Types.Flag: data FlagAssignment
+ Distribution.Types.Flag: data FlagName
+ Distribution.Types.Flag: diffFlagAssignment :: FlagAssignment -> FlagAssignment -> FlagAssignment
+ Distribution.Types.Flag: dispFlagAssignment :: FlagAssignment -> Doc
+ Distribution.Types.Flag: emptyFlag :: FlagName -> Flag
+ Distribution.Types.Flag: findDuplicateFlagAssignments :: FlagAssignment -> [FlagName]
+ Distribution.Types.Flag: insertFlagAssignment :: FlagName -> Bool -> FlagAssignment -> FlagAssignment
+ Distribution.Types.Flag: instance Control.DeepSeq.NFData Distribution.Types.Flag.Flag
+ Distribution.Types.Flag: instance Control.DeepSeq.NFData Distribution.Types.Flag.FlagAssignment
+ Distribution.Types.Flag: instance Control.DeepSeq.NFData Distribution.Types.Flag.FlagName
+ Distribution.Types.Flag: instance Data.Binary.Class.Binary Distribution.Types.Flag.Flag
+ Distribution.Types.Flag: instance Data.Binary.Class.Binary Distribution.Types.Flag.FlagAssignment
+ Distribution.Types.Flag: instance Data.Binary.Class.Binary Distribution.Types.Flag.FlagName
+ Distribution.Types.Flag: instance Data.Data.Data Distribution.Types.Flag.Flag
+ Distribution.Types.Flag: instance Data.Data.Data Distribution.Types.Flag.FlagName
+ Distribution.Types.Flag: instance Data.String.IsString Distribution.Types.Flag.FlagName
+ Distribution.Types.Flag: instance Distribution.Parsec.Parsec Distribution.Types.Flag.FlagName
+ Distribution.Types.Flag: instance Distribution.Pretty.Pretty Distribution.Types.Flag.FlagName
+ Distribution.Types.Flag: instance Distribution.Utils.Structured.Structured Distribution.Types.Flag.Flag
+ Distribution.Types.Flag: instance Distribution.Utils.Structured.Structured Distribution.Types.Flag.FlagAssignment
+ Distribution.Types.Flag: instance Distribution.Utils.Structured.Structured Distribution.Types.Flag.FlagName
+ Distribution.Types.Flag: instance GHC.Base.Monoid Distribution.Types.Flag.FlagAssignment
+ Distribution.Types.Flag: instance GHC.Base.Semigroup Distribution.Types.Flag.FlagAssignment
+ Distribution.Types.Flag: instance GHC.Classes.Eq Distribution.Types.Flag.Flag
+ Distribution.Types.Flag: instance GHC.Classes.Eq Distribution.Types.Flag.FlagAssignment
+ Distribution.Types.Flag: instance GHC.Classes.Eq Distribution.Types.Flag.FlagName
+ Distribution.Types.Flag: instance GHC.Classes.Ord Distribution.Types.Flag.FlagAssignment
+ Distribution.Types.Flag: instance GHC.Classes.Ord Distribution.Types.Flag.FlagName
+ Distribution.Types.Flag: instance GHC.Generics.Generic Distribution.Types.Flag.Flag
+ Distribution.Types.Flag: instance GHC.Generics.Generic Distribution.Types.Flag.FlagAssignment
+ Distribution.Types.Flag: instance GHC.Generics.Generic Distribution.Types.Flag.FlagName
+ Distribution.Types.Flag: instance GHC.Read.Read Distribution.Types.Flag.FlagAssignment
+ Distribution.Types.Flag: instance GHC.Read.Read Distribution.Types.Flag.FlagName
+ Distribution.Types.Flag: instance GHC.Show.Show Distribution.Types.Flag.Flag
+ Distribution.Types.Flag: instance GHC.Show.Show Distribution.Types.Flag.FlagAssignment
+ Distribution.Types.Flag: instance GHC.Show.Show Distribution.Types.Flag.FlagName
+ Distribution.Types.Flag: lookupFlagAssignment :: FlagName -> FlagAssignment -> Maybe Bool
+ Distribution.Types.Flag: mkFlagAssignment :: [(FlagName, Bool)] -> FlagAssignment
+ Distribution.Types.Flag: mkFlagName :: String -> FlagName
+ Distribution.Types.Flag: nullFlagAssignment :: FlagAssignment -> Bool
+ Distribution.Types.Flag: parsecFlagAssignment :: CabalParsing m => m FlagAssignment
+ Distribution.Types.Flag: showFlagValue :: (FlagName, Bool) -> String
+ Distribution.Types.Flag: unFlagAssignment :: FlagAssignment -> [(FlagName, Bool)]
+ Distribution.Types.Flag: unFlagName :: FlagName -> String
+ Distribution.Types.ForeignLib: instance Distribution.Utils.Structured.Structured Distribution.Types.ForeignLib.ForeignLib
+ Distribution.Types.ForeignLib: instance Distribution.Utils.Structured.Structured Distribution.Types.ForeignLib.LibVersionInfo
+ Distribution.Types.ForeignLibOption: instance Distribution.Utils.Structured.Structured Distribution.Types.ForeignLibOption.ForeignLibOption
+ Distribution.Types.ForeignLibType: instance Distribution.Utils.Structured.Structured Distribution.Types.ForeignLibType.ForeignLibType
+ Distribution.Types.GenericPackageDescription: instance Distribution.Utils.Structured.Structured Distribution.Types.GenericPackageDescription.GenericPackageDescription
+ Distribution.Types.GivenComponent: instance Distribution.Utils.Structured.Structured Distribution.Types.GivenComponent.GivenComponent
+ Distribution.Types.IncludeRenaming: instance Distribution.Utils.Structured.Structured Distribution.Types.IncludeRenaming.IncludeRenaming
+ Distribution.Types.InstalledPackageInfo: instance Distribution.Utils.Structured.Structured Distribution.Types.InstalledPackageInfo.InstalledPackageInfo
+ Distribution.Types.LegacyExeDependency: instance Distribution.Utils.Structured.Structured Distribution.Types.LegacyExeDependency.LegacyExeDependency
+ Distribution.Types.Library: instance Distribution.Utils.Structured.Structured Distribution.Types.Library.Library
+ Distribution.Types.LibraryName: instance Distribution.Utils.Structured.Structured Distribution.Types.LibraryName.LibraryName
+ Distribution.Types.LibraryVisibility: instance Distribution.Utils.Structured.Structured Distribution.Types.LibraryVisibility.LibraryVisibility
+ Distribution.Types.LocalBuildInfo: instance Distribution.Utils.Structured.Structured Distribution.Types.LocalBuildInfo.LocalBuildInfo
+ Distribution.Types.Mixin: instance Distribution.Utils.Structured.Structured Distribution.Types.Mixin.Mixin
+ Distribution.Types.Module: instance Distribution.Utils.Structured.Structured Distribution.Types.Module.Module
+ Distribution.Types.ModuleReexport: instance Distribution.Utils.Structured.Structured Distribution.Types.ModuleReexport.ModuleReexport
+ Distribution.Types.ModuleRenaming: instance Distribution.Utils.Structured.Structured Distribution.Types.ModuleRenaming.ModuleRenaming
+ Distribution.Types.MungedPackageId: instance Distribution.Utils.Structured.Structured Distribution.Types.MungedPackageId.MungedPackageId
+ Distribution.Types.MungedPackageName: instance Distribution.Utils.Structured.Structured Distribution.Types.MungedPackageName.MungedPackageName
+ Distribution.Types.PackageDescription: instance Distribution.Utils.Structured.Structured Distribution.Types.PackageDescription.PackageDescription
+ Distribution.Types.PackageId: instance Distribution.Utils.Structured.Structured Distribution.Types.PackageId.PackageIdentifier
+ Distribution.Types.PackageName: instance Distribution.Utils.Structured.Structured Distribution.Types.PackageName.PackageName
+ Distribution.Types.PackageVersionConstraint: instance Distribution.Utils.Structured.Structured Distribution.Types.PackageVersionConstraint.PackageVersionConstraint
+ Distribution.Types.PkgconfigDependency: instance Distribution.Utils.Structured.Structured Distribution.Types.PkgconfigDependency.PkgconfigDependency
+ Distribution.Types.PkgconfigName: instance Distribution.Utils.Structured.Structured Distribution.Types.PkgconfigName.PkgconfigName
+ Distribution.Types.PkgconfigVersion: instance Distribution.Utils.Structured.Structured Distribution.Types.PkgconfigVersion.PkgconfigVersion
+ Distribution.Types.PkgconfigVersionRange: instance Distribution.Utils.Structured.Structured Distribution.Types.PkgconfigVersionRange.PkgconfigVersionRange
+ Distribution.Types.SetupBuildInfo: instance Distribution.Utils.Structured.Structured Distribution.Types.SetupBuildInfo.SetupBuildInfo
+ Distribution.Types.SourceRepo: instance Distribution.Utils.Structured.Structured Distribution.Types.SourceRepo.RepoKind
+ Distribution.Types.SourceRepo: instance Distribution.Utils.Structured.Structured Distribution.Types.SourceRepo.RepoType
+ Distribution.Types.SourceRepo: instance Distribution.Utils.Structured.Structured Distribution.Types.SourceRepo.SourceRepo
+ Distribution.Types.TestSuite: instance Distribution.Utils.Structured.Structured Distribution.Types.TestSuite.TestSuite
+ Distribution.Types.TestSuiteInterface: instance Distribution.Utils.Structured.Structured Distribution.Types.TestSuiteInterface.TestSuiteInterface
+ Distribution.Types.TestType: instance Distribution.Utils.Structured.Structured Distribution.Types.TestType.TestType
+ Distribution.Types.UnitId: instance Distribution.Utils.Structured.Structured Distribution.Types.UnitId.DefUnitId
+ Distribution.Types.UnitId: instance Distribution.Utils.Structured.Structured Distribution.Types.UnitId.UnitId
+ Distribution.Types.UnqualComponentName: instance Distribution.Utils.Structured.Structured Distribution.Types.UnqualComponentName.UnqualComponentName
+ Distribution.Types.Version: instance Distribution.Utils.Structured.Structured Distribution.Types.Version.Version
+ Distribution.Types.VersionRange.Internal: instance Distribution.Utils.Structured.Structured Distribution.Types.VersionRange.Internal.VersionRange
+ Distribution.Utils.Generic: safeHead :: [a] -> Maybe a
+ Distribution.Utils.Generic: safeInit :: [a] -> [a]
+ Distribution.Utils.Generic: safeLast :: [a] -> Maybe a
+ Distribution.Utils.Generic: unsnoc :: [a] -> Maybe ([a], a)
+ Distribution.Utils.Generic: unsnocNE :: NonEmpty a -> ([a], a)
+ Distribution.Utils.IOData: [IODataModeBinary] :: IODataMode ByteString
+ Distribution.Utils.IOData: [IODataModeText] :: IODataMode String
+ Distribution.Utils.IOData: class NFData mode => KnownIODataMode mode
+ Distribution.Utils.IOData: hGetIODataContents :: KnownIODataMode mode => Handle -> IO mode
+ Distribution.Utils.IOData: instance (a GHC.Types.~ GHC.Types.Char) => Distribution.Utils.IOData.KnownIODataMode [a]
+ Distribution.Utils.IOData: instance Distribution.Utils.IOData.KnownIODataMode Data.ByteString.Lazy.Internal.ByteString
+ Distribution.Utils.IOData: iodataMode :: KnownIODataMode mode => IODataMode mode
+ Distribution.Utils.IOData: toIOData :: KnownIODataMode mode => mode -> IOData
+ Distribution.Utils.IOData: withIOData :: IOData -> (forall mode. IODataMode mode -> mode -> r) -> r
+ Distribution.Utils.MD5: binaryGetMD5 :: Get MD5
+ Distribution.Utils.MD5: binaryPutMD5 :: MD5 -> Put
+ Distribution.Utils.MD5: md5 :: ByteString -> MD5
+ Distribution.Utils.MD5: showMD5 :: MD5 -> String
+ Distribution.Utils.MD5: type MD5 = Fingerprint
+ Distribution.Utils.NubList: instance Distribution.Utils.Structured.Structured a => Distribution.Utils.Structured.Structured (Distribution.Utils.NubList.NubList a)
+ Distribution.Utils.ShortText: instance Distribution.Utils.Structured.Structured Distribution.Utils.ShortText.ShortText
+ Distribution.Utils.ShortText: length :: ShortText -> Int
+ Distribution.Utils.ShortText: null :: ShortText -> Bool
+ Distribution.Utils.ShortText: unsafeFromUTF8BS :: ByteString -> ShortText
+ Distribution.Utils.Structured: Newtype :: !TypeRep -> !TypeVersion -> TypeName -> Structure -> Structure
+ Distribution.Utils.Structured: Nominal :: !TypeRep -> !TypeVersion -> TypeName -> [Structure] -> Structure
+ Distribution.Utils.Structured: Structure :: !TypeRep -> !TypeVersion -> TypeName -> SopStructure -> Structure
+ Distribution.Utils.Structured: class GStructured (f :: Type -> Type)
+ Distribution.Utils.Structured: class Typeable a => Structured a
+ Distribution.Utils.Structured: containerStructure :: forall f a. (Typeable f, Structured a) => Proxy (f a) -> Structure
+ Distribution.Utils.Structured: data Structure
+ Distribution.Utils.Structured: genericStructure :: forall a. (Typeable a, Generic a, GStructured (Rep a)) => Proxy a -> Structure
+ Distribution.Utils.Structured: hashStructure :: Structure -> MD5
+ Distribution.Utils.Structured: instance (Distribution.Utils.Structured.GStructuredProd f, Distribution.Utils.Structured.GStructuredProd g) => Distribution.Utils.Structured.GStructuredProd (f GHC.Generics.:*: g)
+ Distribution.Utils.Structured: instance (Distribution.Utils.Structured.GStructuredSum f, Distribution.Utils.Structured.GStructuredSum g) => Distribution.Utils.Structured.GStructuredSum (f GHC.Generics.:+: g)
+ Distribution.Utils.Structured: instance (Distribution.Utils.Structured.Structured a, Distribution.Utils.Structured.Structured b) => Distribution.Utils.Structured.Structured (Data.Either.Either a b)
+ Distribution.Utils.Structured: instance (Distribution.Utils.Structured.Structured a1, Distribution.Utils.Structured.Structured a2) => Distribution.Utils.Structured.Structured (a1, a2)
+ Distribution.Utils.Structured: instance (Distribution.Utils.Structured.Structured a1, Distribution.Utils.Structured.Structured a2, Distribution.Utils.Structured.Structured a3) => Distribution.Utils.Structured.Structured (a1, a2, a3)
+ Distribution.Utils.Structured: instance (Distribution.Utils.Structured.Structured a1, Distribution.Utils.Structured.Structured a2, Distribution.Utils.Structured.Structured a3, Distribution.Utils.Structured.Structured a4) => Distribution.Utils.Structured.Structured (a1, a2, a3, a4)
+ Distribution.Utils.Structured: instance (Distribution.Utils.Structured.Structured a1, Distribution.Utils.Structured.Structured a2, Distribution.Utils.Structured.Structured a3, Distribution.Utils.Structured.Structured a4, Distribution.Utils.Structured.Structured a5) => Distribution.Utils.Structured.Structured (a1, a2, a3, a4, a5)
+ Distribution.Utils.Structured: instance (Distribution.Utils.Structured.Structured a1, Distribution.Utils.Structured.Structured a2, Distribution.Utils.Structured.Structured a3, Distribution.Utils.Structured.Structured a4, Distribution.Utils.Structured.Structured a5, Distribution.Utils.Structured.Structured a6) => Distribution.Utils.Structured.Structured (a1, a2, a3, a4, a5, a6)
+ Distribution.Utils.Structured: instance (Distribution.Utils.Structured.Structured a1, Distribution.Utils.Structured.Structured a2, Distribution.Utils.Structured.Structured a3, Distribution.Utils.Structured.Structured a4, Distribution.Utils.Structured.Structured a5, Distribution.Utils.Structured.Structured a6, Distribution.Utils.Structured.Structured a7) => Distribution.Utils.Structured.Structured (a1, a2, a3, a4, a5, a6, a7)
+ Distribution.Utils.Structured: instance (Distribution.Utils.Structured.Structured k, Distribution.Utils.Structured.Structured v) => Distribution.Utils.Structured.Structured (Data.Map.Internal.Map k v)
+ Distribution.Utils.Structured: instance (i GHC.Types.~ GHC.Generics.C, GHC.Generics.Constructor c, Distribution.Utils.Structured.GStructuredProd f) => Distribution.Utils.Structured.GStructuredSum (GHC.Generics.M1 i c f)
+ Distribution.Utils.Structured: instance (i GHC.Types.~ GHC.Generics.D, GHC.Generics.Datatype c, Distribution.Utils.Structured.GStructuredSum f) => Distribution.Utils.Structured.GStructured (GHC.Generics.M1 i c f)
+ Distribution.Utils.Structured: instance (i GHC.Types.~ GHC.Generics.S, Distribution.Utils.Structured.GStructuredProd f) => Distribution.Utils.Structured.GStructuredProd (GHC.Generics.M1 i c f)
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.GStructuredProd GHC.Generics.U1
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.GStructuredSum GHC.Generics.V1
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured ()
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured Data.ByteString.Internal.ByteString
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured Data.ByteString.Lazy.Internal.ByteString
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured Data.IntSet.Internal.IntSet
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured Data.Text.Internal.Lazy.Text
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured Data.Text.Internal.Text
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured Data.Time.Calendar.Days.Day
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured Data.Time.Clock.Internal.DiffTime.DiffTime
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured Data.Time.Clock.Internal.NominalDiffTime.NominalDiffTime
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured Data.Time.Clock.Internal.UTCTime.UTCTime
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured Data.Time.Clock.Internal.UniversalTime.UniversalTime
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured Data.Time.LocalTime.Internal.LocalTime.LocalTime
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured Data.Time.LocalTime.Internal.TimeOfDay.TimeOfDay
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured Data.Time.LocalTime.Internal.TimeZone.TimeZone
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Int.Int16
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Int.Int32
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Int.Int64
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Int.Int8
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Integer.Type.Integer
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Types.Bool
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Types.Char
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Types.Double
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Types.Float
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Types.Int
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Types.Ordering
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Types.Word
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Word.Word16
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Word.Word32
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Word.Word64
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured GHC.Word.Word8
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured a => Data.Binary.Class.Binary (Distribution.Utils.Structured.Tag a)
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured a => Distribution.Utils.Structured.Structured (GHC.Base.NonEmpty a)
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured a => Distribution.Utils.Structured.Structured (GHC.Maybe.Maybe a)
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured a => Distribution.Utils.Structured.Structured (GHC.Real.Ratio a)
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured a => Distribution.Utils.Structured.Structured [a]
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured c => Distribution.Utils.Structured.GStructuredProd (GHC.Generics.K1 i c)
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured k => Distribution.Utils.Structured.Structured (Data.Set.Internal.Set k)
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured v => Distribution.Utils.Structured.Structured (Data.IntMap.Internal.IntMap v)
+ Distribution.Utils.Structured: instance Distribution.Utils.Structured.Structured v => Distribution.Utils.Structured.Structured (Data.Sequence.Internal.Seq v)
+ Distribution.Utils.Structured: instance GHC.Classes.Eq Distribution.Utils.Structured.Structure
+ Distribution.Utils.Structured: instance GHC.Classes.Ord Distribution.Utils.Structured.Structure
+ Distribution.Utils.Structured: instance GHC.Generics.Generic Distribution.Utils.Structured.Structure
+ Distribution.Utils.Structured: instance GHC.Show.Show Distribution.Utils.Structured.Structure
+ Distribution.Utils.Structured: nominalStructure :: Typeable a => Proxy a -> Structure
+ Distribution.Utils.Structured: structure :: (Structured a, Generic a, GStructured (Rep a)) => Proxy a -> Structure
+ Distribution.Utils.Structured: structureBuilder :: Structure -> Builder
+ Distribution.Utils.Structured: structureHash :: forall a. Structured a => Proxy a -> MD5
+ Distribution.Utils.Structured: structuredDecode :: forall a. (Binary a, Structured a) => ByteString -> a
+ Distribution.Utils.Structured: structuredDecodeFileOrFail :: (Binary a, Structured a) => FilePath -> IO (Either String a)
+ Distribution.Utils.Structured: structuredDecodeOrFailIO :: (Binary a, Structured a) => ByteString -> IO (Either String a)
+ Distribution.Utils.Structured: structuredEncode :: forall a. (Binary a, Structured a) => a -> ByteString
+ Distribution.Utils.Structured: structuredEncodeFile :: (Binary a, Structured a) => FilePath -> a -> IO ()
+ Distribution.Utils.Structured: type ConstructorName = String
+ Distribution.Utils.Structured: type MD5 = Fingerprint
+ Distribution.Utils.Structured: type SopStructure = [(ConstructorName, [Structure])]
+ Distribution.Utils.Structured: type TypeName = String
+ Distribution.Utils.Structured: type TypeVersion = Word32
+ Distribution.Utils.Structured: typeName :: Functor f => (TypeName -> f TypeName) -> Structure -> f Structure
+ Distribution.Utils.Structured: typeVersion :: Functor f => (TypeVersion -> f TypeVersion) -> Structure -> f Structure
+ Distribution.Verbosity: instance Distribution.Utils.Structured.Structured Distribution.Verbosity.Verbosity
+ Distribution.Verbosity.Internal: instance Distribution.Utils.Structured.Structured Distribution.Verbosity.Internal.VerbosityFlag
+ Distribution.Verbosity.Internal: instance Distribution.Utils.Structured.Structured Distribution.Verbosity.Internal.VerbosityLevel
+ Language.Haskell.Extension: CUSKs :: KnownExtension
+ Language.Haskell.Extension: ImportQualifiedPost :: KnownExtension
+ Language.Haskell.Extension: StandaloneKindSignatures :: KnownExtension
+ Language.Haskell.Extension: UnliftedNewtypes :: KnownExtension
+ Language.Haskell.Extension: instance Distribution.Utils.Structured.Structured Language.Haskell.Extension.Extension
+ Language.Haskell.Extension: instance Distribution.Utils.Structured.Structured Language.Haskell.Extension.KnownExtension
+ Language.Haskell.Extension: instance Distribution.Utils.Structured.Structured Language.Haskell.Extension.Language
- Distribution.Compat.Prelude.Internal: head :: [a] -> a
+ Distribution.Compat.Prelude.Internal: head :: NonEmpty a -> a
- Distribution.Compat.Prelude.Internal: init :: [a] -> [a]
+ Distribution.Compat.Prelude.Internal: init :: NonEmpty a -> [a]
- Distribution.Compat.Prelude.Internal: last :: [a] -> a
+ Distribution.Compat.Prelude.Internal: last :: NonEmpty a -> a
- Distribution.Compat.Prelude.Internal: tail :: [a] -> [a]
+ Distribution.Compat.Prelude.Internal: tail :: NonEmpty a -> [a]
- Distribution.Fields: runParseResult :: ParseResult a -> ([PWarning], Either (Maybe Version, [PError]) a)
+ Distribution.Fields: runParseResult :: ParseResult a -> ([PWarning], Either (Maybe Version, NonEmpty PError) a)
- Distribution.Fields.ParseResult: runParseResult :: ParseResult a -> ([PWarning], Either (Maybe Version, [PError]) a)
+ Distribution.Fields.ParseResult: runParseResult :: ParseResult a -> ([PWarning], Either (Maybe Version, NonEmpty PError) a)
- Distribution.InstalledPackageInfo: InstalledPackageInfo :: PackageId -> LibraryName -> ComponentId -> LibraryVisibility -> UnitId -> [(ModuleName, OpenModule)] -> String -> Either License License -> String -> String -> String -> String -> String -> String -> String -> String -> String -> AbiHash -> Bool -> Bool -> [ExposedModule] -> [ModuleName] -> Bool -> [FilePath] -> [FilePath] -> [FilePath] -> FilePath -> [String] -> [String] -> [String] -> [FilePath] -> [String] -> [UnitId] -> [AbiDependency] -> [String] -> [String] -> [String] -> [FilePath] -> [String] -> [FilePath] -> [FilePath] -> Maybe FilePath -> InstalledPackageInfo
+ Distribution.InstalledPackageInfo: InstalledPackageInfo :: PackageId -> LibraryName -> ComponentId -> LibraryVisibility -> UnitId -> [(ModuleName, OpenModule)] -> String -> Either License License -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> AbiHash -> Bool -> Bool -> [ExposedModule] -> [ModuleName] -> Bool -> [FilePath] -> [FilePath] -> [FilePath] -> FilePath -> [String] -> [String] -> [String] -> [FilePath] -> [String] -> [UnitId] -> [AbiDependency] -> [String] -> [String] -> [String] -> [FilePath] -> [String] -> [FilePath] -> [FilePath] -> Maybe FilePath -> InstalledPackageInfo
- Distribution.InstalledPackageInfo: [author] :: InstalledPackageInfo -> String
+ Distribution.InstalledPackageInfo: [author] :: InstalledPackageInfo -> !ShortText
- Distribution.InstalledPackageInfo: [category] :: InstalledPackageInfo -> String
+ Distribution.InstalledPackageInfo: [category] :: InstalledPackageInfo -> !ShortText
- Distribution.InstalledPackageInfo: [copyright] :: InstalledPackageInfo -> String
+ Distribution.InstalledPackageInfo: [copyright] :: InstalledPackageInfo -> !ShortText
- Distribution.InstalledPackageInfo: [description] :: InstalledPackageInfo -> String
+ Distribution.InstalledPackageInfo: [description] :: InstalledPackageInfo -> !ShortText
- Distribution.InstalledPackageInfo: [homepage] :: InstalledPackageInfo -> String
+ Distribution.InstalledPackageInfo: [homepage] :: InstalledPackageInfo -> !ShortText
- Distribution.InstalledPackageInfo: [maintainer] :: InstalledPackageInfo -> String
+ Distribution.InstalledPackageInfo: [maintainer] :: InstalledPackageInfo -> !ShortText
- Distribution.InstalledPackageInfo: [pkgUrl] :: InstalledPackageInfo -> String
+ Distribution.InstalledPackageInfo: [pkgUrl] :: InstalledPackageInfo -> !ShortText
- Distribution.InstalledPackageInfo: [stability] :: InstalledPackageInfo -> String
+ Distribution.InstalledPackageInfo: [stability] :: InstalledPackageInfo -> !ShortText
- Distribution.InstalledPackageInfo: [synopsis] :: InstalledPackageInfo -> String
+ Distribution.InstalledPackageInfo: [synopsis] :: InstalledPackageInfo -> !ShortText
- Distribution.InstalledPackageInfo: parseInstalledPackageInfo :: String -> Either [String] ([String], InstalledPackageInfo)
+ Distribution.InstalledPackageInfo: parseInstalledPackageInfo :: ByteString -> Either (NonEmpty String) ([String], InstalledPackageInfo)
- Distribution.PackageDescription: PackageDescription :: Either Version VersionRange -> PackageIdentifier -> Either License License -> [FilePath] -> String -> String -> String -> String -> [(CompilerFlavor, VersionRange)] -> String -> String -> String -> [SourceRepo] -> String -> String -> String -> [(String, String)] -> Maybe BuildType -> Maybe SetupBuildInfo -> Maybe Library -> [Library] -> [Executable] -> [ForeignLib] -> [TestSuite] -> [Benchmark] -> [FilePath] -> FilePath -> [FilePath] -> [FilePath] -> [FilePath] -> PackageDescription
+ Distribution.PackageDescription: PackageDescription :: Either Version VersionRange -> PackageIdentifier -> Either License License -> [FilePath] -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> [(CompilerFlavor, VersionRange)] -> !ShortText -> !ShortText -> !ShortText -> [SourceRepo] -> !ShortText -> !ShortText -> !ShortText -> [(String, String)] -> Maybe BuildType -> Maybe SetupBuildInfo -> Maybe Library -> [Library] -> [Executable] -> [ForeignLib] -> [TestSuite] -> [Benchmark] -> [FilePath] -> FilePath -> [FilePath] -> [FilePath] -> [FilePath] -> PackageDescription
- Distribution.PackageDescription: [author] :: PackageDescription -> String
+ Distribution.PackageDescription: [author] :: PackageDescription -> !ShortText
- Distribution.PackageDescription: [bugReports] :: PackageDescription -> String
+ Distribution.PackageDescription: [bugReports] :: PackageDescription -> !ShortText
- Distribution.PackageDescription: [category] :: PackageDescription -> String
+ Distribution.PackageDescription: [category] :: PackageDescription -> !ShortText
- Distribution.PackageDescription: [copyright] :: PackageDescription -> String
+ Distribution.PackageDescription: [copyright] :: PackageDescription -> !ShortText
- Distribution.PackageDescription: [description] :: PackageDescription -> String
+ Distribution.PackageDescription: [description] :: PackageDescription -> !ShortText
- Distribution.PackageDescription: [homepage] :: PackageDescription -> String
+ Distribution.PackageDescription: [homepage] :: PackageDescription -> !ShortText
- Distribution.PackageDescription: [maintainer] :: PackageDescription -> String
+ Distribution.PackageDescription: [maintainer] :: PackageDescription -> !ShortText
- Distribution.PackageDescription: [pkgUrl] :: PackageDescription -> String
+ Distribution.PackageDescription: [pkgUrl] :: PackageDescription -> !ShortText
- Distribution.PackageDescription: [stability] :: PackageDescription -> String
+ Distribution.PackageDescription: [stability] :: PackageDescription -> !ShortText
- Distribution.PackageDescription: [synopsis] :: PackageDescription -> String
+ Distribution.PackageDescription: [synopsis] :: PackageDescription -> !ShortText
- Distribution.PackageDescription.Parsec: runParseResult :: ParseResult a -> ([PWarning], Either (Maybe Version, [PError]) a)
+ Distribution.PackageDescription.Parsec: runParseResult :: ParseResult a -> ([PWarning], Either (Maybe Version, NonEmpty PError) a)
- Distribution.Parsec.Newtypes: parseSep :: (Sep sep, CabalParsing m) => P sep -> m a -> m [a]
+ Distribution.Parsec.Newtypes: parseSep :: (Sep sep, CabalParsing m) => Proxy sep -> m a -> m [a]
- Distribution.Parsec.Newtypes: prettySep :: Sep sep => P sep -> [Doc] -> Doc
+ Distribution.Parsec.Newtypes: prettySep :: Sep sep => Proxy sep -> [Doc] -> Doc
- Distribution.Simple.Program: ProgramInvocation :: FilePath -> [String] -> [(String, Maybe String)] -> [FilePath] -> Maybe FilePath -> Maybe String -> IOEncoding -> IOEncoding -> ProgramInvocation
+ Distribution.Simple.Program: ProgramInvocation :: FilePath -> [String] -> [(String, Maybe String)] -> [FilePath] -> Maybe FilePath -> Maybe IOData -> IOEncoding -> IOEncoding -> ProgramInvocation
- Distribution.Simple.Program: [progInvokeInput] :: ProgramInvocation -> Maybe String
+ Distribution.Simple.Program: [progInvokeInput] :: ProgramInvocation -> Maybe IOData
- Distribution.Simple.Program.Run: ProgramInvocation :: FilePath -> [String] -> [(String, Maybe String)] -> [FilePath] -> Maybe FilePath -> Maybe String -> IOEncoding -> IOEncoding -> ProgramInvocation
+ Distribution.Simple.Program.Run: ProgramInvocation :: FilePath -> [String] -> [(String, Maybe String)] -> [FilePath] -> Maybe FilePath -> Maybe IOData -> IOEncoding -> IOEncoding -> ProgramInvocation
- Distribution.Simple.Program.Run: [progInvokeInput] :: ProgramInvocation -> Maybe String
+ Distribution.Simple.Program.Run: [progInvokeInput] :: ProgramInvocation -> Maybe IOData
- Distribution.Simple.Utils: data IODataMode
+ Distribution.Simple.Utils: data IODataMode mode
- Distribution.Simple.Utils: rawSystemStdInOut :: Verbosity -> FilePath -> [String] -> Maybe FilePath -> Maybe [(String, String)] -> Maybe IOData -> IODataMode -> IO (IOData, String, ExitCode)
+ Distribution.Simple.Utils: rawSystemStdInOut :: KnownIODataMode mode => Verbosity -> FilePath -> [String] -> Maybe FilePath -> Maybe [(String, String)] -> Maybe IOData -> IODataMode mode -> IO (mode, String, ExitCode)
- Distribution.Simple.Utils: rawSystemStdout :: Verbosity -> FilePath -> [String] -> IO String
+ Distribution.Simple.Utils: rawSystemStdout :: forall mode. KnownIODataMode mode => Verbosity -> FilePath -> [String] -> IO mode
- Distribution.Types.InstalledPackageInfo: InstalledPackageInfo :: PackageId -> LibraryName -> ComponentId -> LibraryVisibility -> UnitId -> [(ModuleName, OpenModule)] -> String -> Either License License -> String -> String -> String -> String -> String -> String -> String -> String -> String -> AbiHash -> Bool -> Bool -> [ExposedModule] -> [ModuleName] -> Bool -> [FilePath] -> [FilePath] -> [FilePath] -> FilePath -> [String] -> [String] -> [String] -> [FilePath] -> [String] -> [UnitId] -> [AbiDependency] -> [String] -> [String] -> [String] -> [FilePath] -> [String] -> [FilePath] -> [FilePath] -> Maybe FilePath -> InstalledPackageInfo
+ Distribution.Types.InstalledPackageInfo: InstalledPackageInfo :: PackageId -> LibraryName -> ComponentId -> LibraryVisibility -> UnitId -> [(ModuleName, OpenModule)] -> String -> Either License License -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> AbiHash -> Bool -> Bool -> [ExposedModule] -> [ModuleName] -> Bool -> [FilePath] -> [FilePath] -> [FilePath] -> FilePath -> [String] -> [String] -> [String] -> [FilePath] -> [String] -> [UnitId] -> [AbiDependency] -> [String] -> [String] -> [String] -> [FilePath] -> [String] -> [FilePath] -> [FilePath] -> Maybe FilePath -> InstalledPackageInfo
- Distribution.Types.InstalledPackageInfo: [author] :: InstalledPackageInfo -> String
+ Distribution.Types.InstalledPackageInfo: [author] :: InstalledPackageInfo -> !ShortText
- Distribution.Types.InstalledPackageInfo: [category] :: InstalledPackageInfo -> String
+ Distribution.Types.InstalledPackageInfo: [category] :: InstalledPackageInfo -> !ShortText
- Distribution.Types.InstalledPackageInfo: [copyright] :: InstalledPackageInfo -> String
+ Distribution.Types.InstalledPackageInfo: [copyright] :: InstalledPackageInfo -> !ShortText
- Distribution.Types.InstalledPackageInfo: [description] :: InstalledPackageInfo -> String
+ Distribution.Types.InstalledPackageInfo: [description] :: InstalledPackageInfo -> !ShortText
- Distribution.Types.InstalledPackageInfo: [homepage] :: InstalledPackageInfo -> String
+ Distribution.Types.InstalledPackageInfo: [homepage] :: InstalledPackageInfo -> !ShortText
- Distribution.Types.InstalledPackageInfo: [maintainer] :: InstalledPackageInfo -> String
+ Distribution.Types.InstalledPackageInfo: [maintainer] :: InstalledPackageInfo -> !ShortText
- Distribution.Types.InstalledPackageInfo: [pkgUrl] :: InstalledPackageInfo -> String
+ Distribution.Types.InstalledPackageInfo: [pkgUrl] :: InstalledPackageInfo -> !ShortText
- Distribution.Types.InstalledPackageInfo: [stability] :: InstalledPackageInfo -> String
+ Distribution.Types.InstalledPackageInfo: [stability] :: InstalledPackageInfo -> !ShortText
- Distribution.Types.InstalledPackageInfo: [synopsis] :: InstalledPackageInfo -> String
+ Distribution.Types.InstalledPackageInfo: [synopsis] :: InstalledPackageInfo -> !ShortText
- Distribution.Types.InstalledPackageInfo.Lens: author :: Lens' InstalledPackageInfo String
+ Distribution.Types.InstalledPackageInfo.Lens: author :: Lens' InstalledPackageInfo ShortText
- Distribution.Types.InstalledPackageInfo.Lens: category :: Lens' InstalledPackageInfo String
+ Distribution.Types.InstalledPackageInfo.Lens: category :: Lens' InstalledPackageInfo ShortText
- Distribution.Types.InstalledPackageInfo.Lens: copyright :: Lens' InstalledPackageInfo String
+ Distribution.Types.InstalledPackageInfo.Lens: copyright :: Lens' InstalledPackageInfo ShortText
- Distribution.Types.InstalledPackageInfo.Lens: description :: Lens' InstalledPackageInfo String
+ Distribution.Types.InstalledPackageInfo.Lens: description :: Lens' InstalledPackageInfo ShortText
- Distribution.Types.InstalledPackageInfo.Lens: homepage :: Lens' InstalledPackageInfo String
+ Distribution.Types.InstalledPackageInfo.Lens: homepage :: Lens' InstalledPackageInfo ShortText
- Distribution.Types.InstalledPackageInfo.Lens: maintainer :: Lens' InstalledPackageInfo String
+ Distribution.Types.InstalledPackageInfo.Lens: maintainer :: Lens' InstalledPackageInfo ShortText
- Distribution.Types.InstalledPackageInfo.Lens: pkgUrl :: Lens' InstalledPackageInfo String
+ Distribution.Types.InstalledPackageInfo.Lens: pkgUrl :: Lens' InstalledPackageInfo ShortText
- Distribution.Types.InstalledPackageInfo.Lens: stability :: Lens' InstalledPackageInfo String
+ Distribution.Types.InstalledPackageInfo.Lens: stability :: Lens' InstalledPackageInfo ShortText
- Distribution.Types.InstalledPackageInfo.Lens: synopsis :: Lens' InstalledPackageInfo String
+ Distribution.Types.InstalledPackageInfo.Lens: synopsis :: Lens' InstalledPackageInfo ShortText
- Distribution.Types.PackageDescription: PackageDescription :: Either Version VersionRange -> PackageIdentifier -> Either License License -> [FilePath] -> String -> String -> String -> String -> [(CompilerFlavor, VersionRange)] -> String -> String -> String -> [SourceRepo] -> String -> String -> String -> [(String, String)] -> Maybe BuildType -> Maybe SetupBuildInfo -> Maybe Library -> [Library] -> [Executable] -> [ForeignLib] -> [TestSuite] -> [Benchmark] -> [FilePath] -> FilePath -> [FilePath] -> [FilePath] -> [FilePath] -> PackageDescription
+ Distribution.Types.PackageDescription: PackageDescription :: Either Version VersionRange -> PackageIdentifier -> Either License License -> [FilePath] -> !ShortText -> !ShortText -> !ShortText -> !ShortText -> [(CompilerFlavor, VersionRange)] -> !ShortText -> !ShortText -> !ShortText -> [SourceRepo] -> !ShortText -> !ShortText -> !ShortText -> [(String, String)] -> Maybe BuildType -> Maybe SetupBuildInfo -> Maybe Library -> [Library] -> [Executable] -> [ForeignLib] -> [TestSuite] -> [Benchmark] -> [FilePath] -> FilePath -> [FilePath] -> [FilePath] -> [FilePath] -> PackageDescription
- Distribution.Types.PackageDescription: [author] :: PackageDescription -> String
+ Distribution.Types.PackageDescription: [author] :: PackageDescription -> !ShortText
- Distribution.Types.PackageDescription: [bugReports] :: PackageDescription -> String
+ Distribution.Types.PackageDescription: [bugReports] :: PackageDescription -> !ShortText
- Distribution.Types.PackageDescription: [category] :: PackageDescription -> String
+ Distribution.Types.PackageDescription: [category] :: PackageDescription -> !ShortText
- Distribution.Types.PackageDescription: [copyright] :: PackageDescription -> String
+ Distribution.Types.PackageDescription: [copyright] :: PackageDescription -> !ShortText
- Distribution.Types.PackageDescription: [description] :: PackageDescription -> String
+ Distribution.Types.PackageDescription: [description] :: PackageDescription -> !ShortText
- Distribution.Types.PackageDescription: [homepage] :: PackageDescription -> String
+ Distribution.Types.PackageDescription: [homepage] :: PackageDescription -> !ShortText
- Distribution.Types.PackageDescription: [maintainer] :: PackageDescription -> String
+ Distribution.Types.PackageDescription: [maintainer] :: PackageDescription -> !ShortText
- Distribution.Types.PackageDescription: [pkgUrl] :: PackageDescription -> String
+ Distribution.Types.PackageDescription: [pkgUrl] :: PackageDescription -> !ShortText
- Distribution.Types.PackageDescription: [stability] :: PackageDescription -> String
+ Distribution.Types.PackageDescription: [stability] :: PackageDescription -> !ShortText
- Distribution.Types.PackageDescription: [synopsis] :: PackageDescription -> String
+ Distribution.Types.PackageDescription: [synopsis] :: PackageDescription -> !ShortText
- Distribution.Types.PackageDescription.Lens: author :: Lens' PackageDescription String
+ Distribution.Types.PackageDescription.Lens: author :: Lens' PackageDescription ShortText
- Distribution.Types.PackageDescription.Lens: bugReports :: Lens' PackageDescription String
+ Distribution.Types.PackageDescription.Lens: bugReports :: Lens' PackageDescription ShortText
- Distribution.Types.PackageDescription.Lens: category :: Lens' PackageDescription String
+ Distribution.Types.PackageDescription.Lens: category :: Lens' PackageDescription ShortText
- Distribution.Types.PackageDescription.Lens: copyright :: Lens' PackageDescription String
+ Distribution.Types.PackageDescription.Lens: copyright :: Lens' PackageDescription ShortText
- Distribution.Types.PackageDescription.Lens: description :: Lens' PackageDescription String
+ Distribution.Types.PackageDescription.Lens: description :: Lens' PackageDescription ShortText
- Distribution.Types.PackageDescription.Lens: homepage :: Lens' PackageDescription String
+ Distribution.Types.PackageDescription.Lens: homepage :: Lens' PackageDescription ShortText
- Distribution.Types.PackageDescription.Lens: licenseFiles :: Lens' PackageDescription [String]
+ Distribution.Types.PackageDescription.Lens: licenseFiles :: Lens' PackageDescription [FilePath]
- Distribution.Types.PackageDescription.Lens: maintainer :: Lens' PackageDescription String
+ Distribution.Types.PackageDescription.Lens: maintainer :: Lens' PackageDescription ShortText
- Distribution.Types.PackageDescription.Lens: pkgUrl :: Lens' PackageDescription String
+ Distribution.Types.PackageDescription.Lens: pkgUrl :: Lens' PackageDescription ShortText
- Distribution.Types.PackageDescription.Lens: stability :: Lens' PackageDescription String
+ Distribution.Types.PackageDescription.Lens: stability :: Lens' PackageDescription ShortText
- Distribution.Types.PackageDescription.Lens: synopsis :: Lens' PackageDescription String
+ Distribution.Types.PackageDescription.Lens: synopsis :: Lens' PackageDescription ShortText
- Distribution.Utils.IOData: data IODataMode
+ Distribution.Utils.IOData: data IODataMode mode
Files
- Cabal.cabal +23/−3
- ChangeLog.md +17/−0
- Distribution/Backpack.hs +2/−2
- Distribution/Backpack/ComponentsGraph.hs +2/−1
- Distribution/Backpack/Configure.hs +2/−1
- Distribution/Backpack/ModSubst.hs +1/−3
- Distribution/Backpack/ModuleShape.hs +3/−2
- Distribution/Backpack/PreModuleShape.hs +0/−1
- Distribution/Compat/Async.hs +148/−0
- Distribution/Compat/Binary.hs +8/−8
- Distribution/Compat/DList.hs +1/−1
- Distribution/Compat/Graph.hs +21/−16
- Distribution/Compat/Lens.hs +0/−1
- Distribution/Compat/Parsing.hs +6/−32
- Distribution/Compat/Prelude.hs +17/−5
- Distribution/Compat/Semigroup.hs +9/−2
- Distribution/Compat/Time.hs +5/−1
- Distribution/Compat/Typeable.hs +18/−0
- Distribution/Compiler.hs +6/−4
- Distribution/FieldGrammar.hs +1/−0
- Distribution/FieldGrammar/Class.hs +20/−2
- Distribution/FieldGrammar/FieldDescrs.hs +2/−0
- Distribution/FieldGrammar/Parsec.hs +54/−37
- Distribution/FieldGrammar/Pretty.hs +2/−0
- Distribution/Fields/ConfVar.hs +1/−1
- Distribution/Fields/Field.hs +1/−1
- Distribution/Fields/LexerMonad.hs +6/−5
- Distribution/Fields/ParseResult.hs +5/−4
- Distribution/Fields/Pretty.hs +0/−1
- Distribution/InstalledPackageInfo.hs +11/−10
- Distribution/License.hs +1/−1
- Distribution/ModuleName.hs +10/−8
- Distribution/PackageDescription.hs +2/−0
- Distribution/PackageDescription/Check.hs +24/−21
- Distribution/PackageDescription/Configuration.hs +0/−1
- Distribution/PackageDescription/FieldGrammar.hs +10/−10
- Distribution/PackageDescription/Parsec.hs +3/−4
- Distribution/PackageDescription/PrettyPrint.hs +4/−11
- Distribution/PackageDescription/Quirks.hs +6/−14
- Distribution/Parsec.hs +8/−7
- Distribution/Parsec/Newtypes.hs +45/−10
- Distribution/Pretty.hs +0/−1
- Distribution/SPDX/License.hs +1/−0
- Distribution/SPDX/LicenseExceptionId.hs +6/−0
- Distribution/SPDX/LicenseExpression.hs +2/−0
- Distribution/SPDX/LicenseId.hs +6/−0
- Distribution/SPDX/LicenseReference.hs +1/−0
- Distribution/Simple.hs +2/−2
- Distribution/Simple/Build.hs +5/−2
- Distribution/Simple/Build/Macros.hs +8/−4
- Distribution/Simple/BuildTarget.hs +4/−2
- Distribution/Simple/Compiler.hs +12/−6
- Distribution/Simple/Configure.hs +20/−15
- Distribution/Simple/Flag.hs +3/−1
- Distribution/Simple/GHC.hs +18/−16
- Distribution/Simple/GHCJS.hs +15/−12
- Distribution/Simple/Glob.hs +3/−1
- Distribution/Simple/Haddock.hs +23/−15
- Distribution/Simple/HaskellSuite.hs +8/−7
- Distribution/Simple/InstallDirs.hs +5/−2
- Distribution/Simple/InstallDirs/Internal.hs +5/−2
- Distribution/Simple/PackageIndex.hs +10/−7
- Distribution/Simple/PreProcess.hs +4/−5
- Distribution/Simple/PreProcess/Unlit.hs +4/−5
- Distribution/Simple/Program.hs +1/−0
- Distribution/Simple/Program/Db.hs +16/−8
- Distribution/Simple/Program/Find.hs +3/−1
- Distribution/Simple/Program/GHC.hs +9/−3
- Distribution/Simple/Program/HcPkg.hs +78/−55
- Distribution/Simple/Program/Internal.hs +2/−1
- Distribution/Simple/Program/Run.hs +51/−36
- Distribution/Simple/Program/Script.hs +9/−3
- Distribution/Simple/Program/Types.hs +4/−1
- Distribution/Simple/Setup.hs +46/−38
- Distribution/Simple/ShowBuildInfo.hs +4/−1
- Distribution/Simple/Test/LibV09.hs +3/−1
- Distribution/Simple/Test/Log.hs +1/−1
- Distribution/Simple/UHC.hs +5/−4
- Distribution/Simple/Utils.hs +57/−55
- Distribution/System.hs +3/−3
- Distribution/Types/AbiDependency.hs +3/−1
- Distribution/Types/AbiHash.hs +2/−2
- Distribution/Types/Benchmark.hs +1/−1
- Distribution/Types/BenchmarkInterface.hs +1/−1
- Distribution/Types/BenchmarkType.hs +1/−1
- Distribution/Types/BuildInfo.hs +2/−2
- Distribution/Types/BuildType.hs +1/−1
- Distribution/Types/ComponentId.hs +1/−0
- Distribution/Types/ComponentLocalBuildInfo.hs +3/−1
- Distribution/Types/ComponentName.hs +1/−0
- Distribution/Types/ComponentRequestedSpec.hs +4/−1
- Distribution/Types/CondTree.hs +3/−2
- Distribution/Types/Condition.hs +1/−1
- Distribution/Types/ConfVar.hs +25/−0
- Distribution/Types/Dependency.hs +1/−1
- Distribution/Types/DependencyMap.hs +0/−1
- Distribution/Types/ExeDependency.hs +1/−0
- Distribution/Types/Executable.hs +1/−1
- Distribution/Types/ExecutableScope.hs +1/−1
- Distribution/Types/ExposedModule.hs +3/−2
- Distribution/Types/Flag.hs +249/−0
- Distribution/Types/ForeignLib.hs +2/−2
- Distribution/Types/ForeignLibOption.hs +1/−1
- Distribution/Types/ForeignLibType.hs +1/−1
- Distribution/Types/GenericPackageDescription.hs +7/−260
- Distribution/Types/GenericPackageDescription/Lens.hs +3/−3
- Distribution/Types/GivenComponent.hs +1/−1
- Distribution/Types/IncludeRenaming.hs +1/−0
- Distribution/Types/InstalledPackageInfo.hs +12/−9
- Distribution/Types/InstalledPackageInfo/FieldGrammar.hs +9/−9
- Distribution/Types/InstalledPackageInfo/Lens.hs +11/−9
- Distribution/Types/LegacyExeDependency.hs +2/−1
- Distribution/Types/Library.hs +1/−1
- Distribution/Types/LibraryName.hs +1/−0
- Distribution/Types/LibraryVisibility.hs +1/−0
- Distribution/Types/LocalBuildInfo.hs +3/−1
- Distribution/Types/Mixin.hs +1/−0
- Distribution/Types/Module.hs +1/−0
- Distribution/Types/ModuleReexport.hs +1/−1
- Distribution/Types/ModuleRenaming.hs +1/−0
- Distribution/Types/MungedPackageId.hs +1/−0
- Distribution/Types/MungedPackageName.hs +4/−3
- Distribution/Types/PackageDescription.hs +23/−21
- Distribution/Types/PackageDescription/Lens.hs +44/−43
- Distribution/Types/PackageId.hs +6/−4
- Distribution/Types/PackageName.hs +1/−0
- Distribution/Types/PackageVersionConstraint.hs +1/−0
- Distribution/Types/PkgconfigDependency.hs +1/−0
- Distribution/Types/PkgconfigName.hs +1/−0
- Distribution/Types/PkgconfigVersion.hs +1/−0
- Distribution/Types/PkgconfigVersionRange.hs +1/−0
- Distribution/Types/SetupBuildInfo.hs +1/−1
- Distribution/Types/SourceRepo.hs +3/−3
- Distribution/Types/TestSuite.hs +1/−0
- Distribution/Types/TestSuiteInterface.hs +1/−0
- Distribution/Types/TestType.hs +1/−0
- Distribution/Types/UnitId.hs +3/−0
- Distribution/Types/UnqualComponentName.hs +1/−0
- Distribution/Types/Version.hs +2/−1
- Distribution/Types/VersionInterval.hs +3/−3
- Distribution/Types/VersionRange.hs +4/−1
- Distribution/Types/VersionRange/Internal.hs +2/−2
- Distribution/Utils/Generic.hs +64/−2
- Distribution/Utils/IOData.hs +58/−33
- Distribution/Utils/MD5.hs +54/−0
- Distribution/Utils/NubList.hs +7/−4
- Distribution/Utils/ShortText.hs +52/−4
- Distribution/Utils/Structured.hs +472/−0
- Distribution/Verbosity.hs +3/−2
- Distribution/Verbosity/Internal.hs +5/−2
- Language/Haskell/Extension.hs +17/−2
- doc/conf.py +1/−1
- doc/developing-packages.rst +16/−2
- doc/installing-packages.rst +60/−12
- doc/nix-local-build.rst +35/−5
- tests/CheckTests.hs +3/−1
- tests/HackageTests.hs +33/−15
- tests/Instances/TreeDiff.hs +3/−0
- tests/ParserTests.hs +11/−10
- tests/ParserTests/errors/big-version.cabal +1/−1
- tests/ParserTests/regressions/assoc-cpp-options.cabal +48/−0
- tests/ParserTests/regressions/assoc-cpp-options.check +1/−0
- tests/ParserTests/regressions/big-version.cabal +1/−1
- tests/ParserTests/regressions/big-version.expr +1/−1
- tests/ParserTests/regressions/big-version.format +1/−1
- tests/Test/Laws.hs +1/−1
- tests/UnitTests.hs +2/−0
- tests/UnitTests/Distribution/Simple/Program/GHC.hs +50/−1
- tests/UnitTests/Distribution/Simple/Utils.hs +3/−3
- tests/UnitTests/Distribution/Utils/Structured.hs +28/−0
- tests/UnitTests/Distribution/Version.hs +11/−6
- tests/UnitTests/Orphans.hs +10/−0
Cabal.cabal view
@@ -1,7 +1,7 @@ cabal-version: >=1.10 name: Cabal-version: 3.0.2.0-copyright: 2003-2019, Cabal Development Team (see AUTHORS file)+version: 3.2.0.0+copyright: 2003-2020, Cabal Development Team (see AUTHORS file) license: BSD3 license-file: LICENSE author: Cabal Development Team <cabal-devel@haskell.org>@@ -110,6 +110,8 @@ tests/ParserTests/regressions/Octree-0.5.cabal tests/ParserTests/regressions/Octree-0.5.expr tests/ParserTests/regressions/Octree-0.5.format+ tests/ParserTests/regressions/assoc-cpp-options.cabal+ tests/ParserTests/regressions/assoc-cpp-options.check tests/ParserTests/regressions/bad-glob-syntax.cabal tests/ParserTests/regressions/bad-glob-syntax.check tests/ParserTests/regressions/big-version.cabal@@ -289,9 +291,10 @@ else build-depends: unix >= 2.6.0.0 && < 2.8 - ghc-options: -Wall -fno-ignore-asserts -fwarn-tabs+ ghc-options: -Wall -fno-ignore-asserts -fwarn-tabs -fwarn-incomplete-uni-patterns if impl(ghc >= 8.0) ghc-options: -Wcompat -Wnoncanonical-monad-instances+ if impl(ghc <8.8) ghc-options: -Wnoncanonical-monadfail-instances @@ -300,6 +303,10 @@ -- already depends on `fail` and `semigroups` transitively build-depends: fail == 4.9.*, semigroups >= 0.18.3 && < 0.20 + if !impl(ghc >= 7.8)+ -- semigroups depends on tagged.+ build-depends: tagged >=0.8.6 && <0.9+ exposed-modules: Distribution.Backpack Distribution.Backpack.Configure@@ -315,6 +322,8 @@ Distribution.Utils.IOData Distribution.Utils.LogProgress Distribution.Utils.MapAccum+ Distribution.Utils.MD5+ Distribution.Utils.Structured Distribution.Compat.CreatePipe Distribution.Compat.Directory Distribution.Compat.Environment@@ -328,6 +337,7 @@ Distribution.Compat.Semigroup Distribution.Compat.Stack Distribution.Compat.Time+ Distribution.Compat.Typeable Distribution.Compat.DList Distribution.Compiler Distribution.InstalledPackageInfo@@ -417,6 +427,7 @@ Distribution.Types.BuildInfo Distribution.Types.BuildType Distribution.Types.ComponentInclude+ Distribution.Types.ConfVar Distribution.Types.Dependency Distribution.Types.ExeDependency Distribution.Types.LegacyExeDependency@@ -430,6 +441,7 @@ Distribution.Types.ExecutableScope Distribution.Types.Library Distribution.Types.LibraryVisibility+ Distribution.Types.Flag Distribution.Types.ForeignLib Distribution.Types.ForeignLibType Distribution.Types.ForeignLibOption@@ -538,6 +550,7 @@ Distribution.Backpack.Id Distribution.Utils.UnionFind Distribution.Utils.Base62+ Distribution.Compat.Async Distribution.Compat.CopyFile Distribution.Compat.GetShortPathName Distribution.Compat.MonadFail@@ -608,8 +621,10 @@ UnitTests.Distribution.Utils.Generic UnitTests.Distribution.Utils.NubList UnitTests.Distribution.Utils.ShortText+ UnitTests.Distribution.Utils.Structured UnitTests.Distribution.Version UnitTests.Distribution.PkgconfigVersion+ UnitTests.Orphans main-is: UnitTests.hs build-depends: array,@@ -652,6 +667,9 @@ ghc-options: -Wall default-language: Haskell2010 + if !impl(ghc >= 8.0)+ build-depends: semigroups+ if impl(ghc >= 7.8) build-depends: tree-diff >= 0.1 && <0.2@@ -676,6 +694,8 @@ Cabal ghc-options: -Wall default-language: Haskell2010+ if !impl(ghc >= 8.0)+ build-depends: semigroups test-suite custom-setup-tests type: exitcode-stdio-1.0
ChangeLog.md view
@@ -1,3 +1,20 @@+# 3.2.0.0 [Herbert Valerio Riedel](mailto:hvr@gnu.org) April 2020+ * Change free text `String` fields to use `ShortText` in package description+ and installed packge info.+ * Split `Distribution.Types.Flag` and `Distribution.Types.ConfVar`+ `Distribution.Types.GenericPackageDescription`.+ * Add GHC-8.10 support, including new extensions to+ `Language.Haskell.Extension`.+ * Use more `NonEmpty` instead of ordinary lists.+ * Add `Distribution.Utils.Structured` for fingeprinting `Binary` blobs.+ * Add `null`, `length` and `unsafeFromUTF8BS` to `Distribution.Utils.ShortText`.+ * Refactor `Distribution.Utils.IOData` module.+ * Rename `Distribution.Compat.MD5` to `Distribution.Utils.MD5`.+ * Add `safeHead`, `safeTail`, `safeLast` to `Distribution.Utils.Generic`.+ * Add `unsnoc` and `unsnocNE` to `Distribution.Utils.Generic`.+ * Add `Set'` modifier to `Distribution.Parsec.Newtypes`.+ * Add `Distribution.Compat.Async`.+ # 3.0.2.0 [Herbert Valerio Riedel](mailto:hvr@gnu.org) April 2020 * Disallow spaces around colon `:` in Dependency `build-depends` syntax ([#6538](https://github.com/haskell/cabal/pull/6538)).
Distribution/Backpack.hs view
@@ -54,7 +54,6 @@ import Distribution.Utils.Base62 import qualified Data.Map as Map-import Data.Set (Set) import qualified Data.Set as Set -----------------------------------------------------------------------@@ -99,7 +98,7 @@ -- TODO: cache holes? instance Binary OpenUnitId-+instance Structured OpenUnitId instance NFData OpenUnitId where rnf (IndefFullUnitId cid subst) = rnf cid `seq` rnf subst rnf (DefiniteUnitId uid) = rnf uid@@ -166,6 +165,7 @@ deriving (Generic, Read, Show, Eq, Ord, Typeable, Data) instance Binary OpenModule+instance Structured OpenModule instance NFData OpenModule where rnf (OpenModule uid mod_name) = rnf uid `seq` rnf mod_name
Distribution/Backpack/ComponentsGraph.hs view
@@ -19,6 +19,7 @@ import Distribution.Types.UnqualComponentName import Distribution.Compat.Graph (Graph, Node(..)) import qualified Distribution.Compat.Graph as Graph+import Distribution.Utils.Generic import Distribution.Pretty (pretty) import Text.PrettyPrint@@ -94,4 +95,4 @@ text $ "Components in the package depend on each other in a cyclic way:\n " ++ intercalate " depends on " [ "'" ++ showComponentName cname ++ "'"- | cname <- cnames ++ [head cnames] ]+ | cname <- cnames ++ maybeToList (safeHead cnames) ]
Distribution/Backpack/Configure.hs view
@@ -162,7 +162,8 @@ . map Right $ graph combined_graph = Graph.unionRight external_graph internal_graph- Just local_graph = Graph.closure combined_graph (map nodeKey graph)+ local_graph = fromMaybe (error "toComponentLocalBuildInfos: closure returned Nothing")+ $ Graph.closure combined_graph (map nodeKey graph) -- The database of transitively reachable installed packages that the -- external components the package (as a whole) depends on. This will be -- used in several ways:
Distribution/Backpack/ModSubst.hs view
@@ -13,12 +13,10 @@ import Prelude () import Distribution.Compat.Prelude hiding (mod) -import Distribution.ModuleName- import Distribution.Backpack+import Distribution.ModuleName import qualified Data.Map as Map-import Data.Set (Set) import qualified Data.Set as Set -- | Applying module substitutions to semantic objects.
Distribution/Backpack/ModuleShape.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} -- | See <https://github.com/ezyang/ghc-proposals/blob/backpack/proposals/0000-backpack.rst> module Distribution.Backpack.ModuleShape (@@ -17,7 +18,6 @@ import Distribution.Backpack import qualified Data.Map as Map-import Data.Set (Set) import qualified Data.Set as Set -----------------------------------------------------------------------@@ -30,9 +30,10 @@ modShapeProvides :: OpenModuleSubst, modShapeRequires :: Set ModuleName }- deriving (Eq, Show, Generic)+ deriving (Eq, Show, Generic, Typeable) instance Binary ModuleShape+instance Structured ModuleShape instance ModSubst ModuleShape where modSubst subst (ModuleShape provs reqs)
Distribution/Backpack/PreModuleShape.hs view
@@ -11,7 +11,6 @@ import Prelude () import Distribution.Compat.Prelude -import Data.Set (Set) import qualified Data.Set as Set import qualified Data.Map as Map
+ Distribution/Compat/Async.hs view
@@ -0,0 +1,148 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+-- | 'Async', yet using 'MVar's.+--+-- Adopted from @async@ library+-- Copyright (c) 2012, Simon Marlow+-- Licensed under BSD-3-Clause+--+-- @since 3.2.0.0+--+module Distribution.Compat.Async (+ AsyncM,+ withAsync, waitCatch,+ wait, asyncThreadId,+ cancel, uninterruptibleCancel, AsyncCancelled (..),+ -- * Cabal extras+ withAsyncNF,+ ) where++import Control.Concurrent (ThreadId, forkIO)+import Control.Concurrent.MVar (MVar, newEmptyMVar, putMVar, readMVar)+import Control.DeepSeq (NFData, force)+import Control.Exception+ (BlockedIndefinitelyOnMVar (..), Exception (..), SomeException (..), catch, evaluate, mask, throwIO, throwTo, try, uninterruptibleMask_)+import Control.Monad (void)+import Data.Typeable (Typeable)+import GHC.Exts (inline)++#if MIN_VERSION_base(4,7,0)+import Control.Exception (asyncExceptionFromException, asyncExceptionToException)+#endif++-- | Async, but based on 'MVar', as we don't depend on @stm@.+data AsyncM a = Async+ { asyncThreadId :: {-# UNPACK #-} !ThreadId+ -- ^ Returns the 'ThreadId' of the thread running+ -- the given 'Async'.+ , _asyncMVar :: MVar (Either SomeException a)+ }++-- | Spawn an asynchronous action in a separate thread, and pass its+-- @Async@ handle to the supplied function. When the function returns+-- or throws an exception, 'uninterruptibleCancel' is called on the @Async@.+--+-- > withAsync action inner = mask $ \restore -> do+-- > a <- async (restore action)+-- > restore (inner a) `finally` uninterruptibleCancel a+--+-- This is a useful variant of 'async' that ensures an @Async@ is+-- never left running unintentionally.+--+-- Note: a reference to the child thread is kept alive until the call+-- to `withAsync` returns, so nesting many `withAsync` calls requires+-- linear memory.+--+withAsync :: IO a -> (AsyncM a -> IO b) -> IO b+withAsync = inline withAsyncUsing forkIO++withAsyncNF :: NFData a => IO a -> (AsyncM a -> IO b) -> IO b+withAsyncNF m = inline withAsyncUsing forkIO (m >>= evaluateNF) where+ evaluateNF = evaluate . force++withAsyncUsing :: (IO () -> IO ThreadId) -> IO a -> (AsyncM a -> IO b) -> IO b+-- The bracket version works, but is slow. We can do better by+-- hand-coding it:+withAsyncUsing doFork = \action inner -> do+ var <- newEmptyMVar+ mask $ \restore -> do+ t <- doFork $ try (restore action) >>= putMVar var+ let a = Async t var+ r <- restore (inner a) `catchAll` \e -> do+ uninterruptibleCancel a+ throwIO e+ uninterruptibleCancel a+ return r++-- | Wait for an asynchronous action to complete, and return its+-- value. If the asynchronous action threw an exception, then the+-- exception is re-thrown by 'wait'.+--+-- > wait = atomically . waitSTM+--+{-# INLINE wait #-}+wait :: AsyncM a -> IO a+wait a = do+ res <- waitCatch a+ case res of+ Left (SomeException e) -> throwIO e+ Right x -> return x++-- | Wait for an asynchronous action to complete, and return either+-- @Left e@ if the action raised an exception @e@, or @Right a@ if it+-- returned a value @a@.+--+-- > waitCatch = atomically . waitCatchSTM+--+{-# INLINE waitCatch #-}+waitCatch :: AsyncM a -> IO (Either SomeException a)+waitCatch (Async _ var) = tryAgain (readMVar var)+ where+ -- See: https://github.com/simonmar/async/issues/14+ tryAgain f = f `catch` \BlockedIndefinitelyOnMVar -> f++catchAll :: IO a -> (SomeException -> IO a) -> IO a+catchAll = catch++-- | Cancel an asynchronous action by throwing the @AsyncCancelled@+-- exception to it, and waiting for the `Async` thread to quit.+-- Has no effect if the 'Async' has already completed.+--+-- > cancel a = throwTo (asyncThreadId a) AsyncCancelled <* waitCatch a+--+-- Note that 'cancel' will not terminate until the thread the 'Async'+-- refers to has terminated. This means that 'cancel' will block for+-- as long said thread blocks when receiving an asynchronous exception.+--+-- For example, it could block if:+--+-- * It's executing a foreign call, and thus cannot receive the asynchronous+-- exception;+-- * It's executing some cleanup handler after having received the exception,+-- and the handler is blocking.+{-# INLINE cancel #-}+cancel :: AsyncM a -> IO ()+cancel a@(Async t _) = do+ throwTo t AsyncCancelled+ void (waitCatch a)++-- | The exception thrown by `cancel` to terminate a thread.+data AsyncCancelled = AsyncCancelled+ deriving (Show, Eq+ , Typeable+ )++instance Exception AsyncCancelled where+#if MIN_VERSION_base(4,7,0)+ -- wraps in SomeAsyncException+ -- See https://github.com/ghc/ghc/commit/756a970eacbb6a19230ee3ba57e24999e4157b09+ fromException = asyncExceptionFromException+ toException = asyncExceptionToException+#endif++-- | Cancel an asynchronous action+--+-- This is a variant of `cancel`, but it is not interruptible.+{-# INLINE uninterruptibleCancel #-}+uninterruptibleCancel :: AsyncM a -> IO ()+uninterruptibleCancel = uninterruptibleMask_ . cancel
Distribution/Compat/Binary.hs view
@@ -18,12 +18,7 @@ #endif ) where -import Control.Exception (catch, evaluate)-#if __GLASGOW_HASKELL__ >= 711-import Control.Exception (pattern ErrorCall)-#else-import Control.Exception (ErrorCall(..))-#endif+import Control.Exception (ErrorCall (..), catch, evaluate) import Data.ByteString.Lazy (ByteString) #if __GLASGOW_HASKELL__ >= 708 || MIN_VERSION_binary(0,7,0)@@ -67,5 +62,10 @@ decodeOrFailIO :: Binary a => ByteString -> IO (Either String a) decodeOrFailIO bs =- catch (evaluate (decode bs) >>= return . Right)- $ \(ErrorCall str) -> return $ Left str+ catch (evaluate (decode bs) >>= return . Right) handler+ where+#if MIN_VERSION_base(4,9,0)+ handler (ErrorCallWithLocation str _) = return $ Left str+#else+ handler (ErrorCall str) = return $ Left str+#endif
Distribution/Compat/DList.hs view
@@ -19,7 +19,7 @@ ) where import Prelude ()-import Distribution.Compat.Prelude+import Distribution.Compat.Prelude hiding (toList) -- | Difference list. newtype DList a = DList ([a] -> [a])
Distribution/Compat/Graph.hs view
@@ -1,9 +1,10 @@-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE CPP #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE BangPatterns #-} ----------------------------------------------------------------------------- -- | -- Module : Distribution.Compat.Graph@@ -83,20 +84,21 @@ nodeValue, ) where +import Distribution.Compat.Prelude hiding (empty, lookup, null, toList) import Prelude ()-import qualified Distribution.Compat.Prelude as Prelude-import Distribution.Compat.Prelude hiding (lookup, null, empty) -import Data.Graph (SCC(..))-import qualified Data.Graph as G+import Data.Array ((!))+import Data.Either (partitionEithers)+import Data.Graph (SCC (..))+import Distribution.Utils.Structured (Structure (..), Structured (..)) -import qualified Data.Map.Strict as Map-import qualified Data.Set as Set-import qualified Data.Array as Array-import Data.Array ((!))-import qualified Data.Tree as Tree-import Data.Either (partitionEithers)-import qualified Data.Foldable as Foldable+import qualified Data.Array as Array+import qualified Data.Foldable as Foldable+import qualified Data.Graph as G+import qualified Data.Map.Strict as Map+import qualified Data.Set as Set+import qualified Data.Tree as Tree+import qualified Distribution.Compat.Prelude as Prelude -- | A graph of nodes @a@. The nodes are expected to have instance -- of class 'IsNode'.@@ -128,6 +130,9 @@ instance (IsNode a, Binary a, Show (Key a)) => Binary (Graph a) where put x = put (toList x) get = fmap fromDistinctList get++instance Structured a => Structured (Graph a) where+ structure p = Nominal (typeRep p) 0 "Graph" [structure (Proxy :: Proxy a)] instance (Eq (Key a), Eq a) => Eq (Graph a) where g1 == g2 = graphMap g1 == graphMap g2
Distribution/Compat/Lens.hs view
@@ -51,7 +51,6 @@ import Distribution.Compat.Prelude import Control.Applicative (Const (..))-import Data.Functor.Identity (Identity (..)) import Control.Monad.State.Class (MonadState (..), gets, modify) import qualified Distribution.Compat.DList as DList
Distribution/Compat/Parsing.hs view
@@ -25,13 +25,10 @@ , some -- from Control.Applicative, parsec many1 , many -- from Control.Applicative , sepBy- , sepBy1 , sepByNonEmpty- , sepEndBy1- -- , sepEndByNonEmpty+ , sepEndByNonEmpty , sepEndBy- , endBy1- -- , endByNonEmpty+ , endByNonEmpty , endBy , count , chainl@@ -58,6 +55,7 @@ import Control.Monad.Trans.Identity (IdentityT (..)) import Data.Foldable (asum) +import qualified Data.List.NonEmpty as NE import qualified Text.Parsec as Parsec -- | @choice ps@ tries to apply the parsers in the list @ps@ in order,@@ -96,36 +94,20 @@ -- -- > commaSep p = p `sepBy` (symbol ",") sepBy :: Alternative m => m a -> m sep -> m [a]-sepBy p sep = sepBy1 p sep <|> pure []+sepBy p sep = toList <$> sepByNonEmpty p sep <|> pure [] {-# INLINE sepBy #-} --- | @sepBy1 p sep@ parses /one/ or more occurrences of @p@, separated--- by @sep@. Returns a list of values returned by @p@.-sepBy1 :: Alternative m => m a -> m sep -> m [a]-sepBy1 p sep = (:) <$> p <*> many (sep *> p)--- toList <$> sepByNonEmpty p sep-{-# INLINE sepBy1 #-}- -- | @sepByNonEmpty p sep@ parses /one/ or more occurrences of @p@, separated -- by @sep@. Returns a non-empty list of values returned by @p@. sepByNonEmpty :: Alternative m => m a -> m sep -> m (NonEmpty a) sepByNonEmpty p sep = (:|) <$> p <*> many (sep *> p) {-# INLINE sepByNonEmpty #-} --- | @sepEndBy1 p sep@ parses /one/ or more occurrences of @p@,--- separated and optionally ended by @sep@. Returns a list of values--- returned by @p@.-sepEndBy1 :: Alternative m => m a -> m sep -> m [a]-sepEndBy1 p sep = (:) <$> p <*> ((sep *> sepEndBy p sep) <|> pure [])--- toList <$> sepEndByNonEmpty p sep--{- -- | @sepEndByNonEmpty p sep@ parses /one/ or more occurrences of @p@, -- separated and optionally ended by @sep@. Returns a non-empty list of values -- returned by @p@. sepEndByNonEmpty :: Alternative m => m a -> m sep -> m (NonEmpty a) sepEndByNonEmpty p sep = (:|) <$> p <*> ((sep *> sepEndBy p sep) <|> pure [])--} -- | @sepEndBy p sep@ parses /zero/ or more occurrences of @p@, -- separated and optionally ended by @sep@, ie. haskell style@@ -133,22 +115,14 @@ -- -- > haskellStatements = haskellStatement `sepEndBy` semi sepEndBy :: Alternative m => m a -> m sep -> m [a]-sepEndBy p sep = sepEndBy1 p sep <|> pure []+sepEndBy p sep = toList <$> sepEndByNonEmpty p sep <|> pure [] {-# INLINE sepEndBy #-} --- | @endBy1 p sep@ parses /one/ or more occurrences of @p@, separated--- and ended by @sep@. Returns a list of values returned by @p@.-endBy1 :: Alternative m => m a -> m sep -> m [a]-endBy1 p sep = some (p <* sep)-{-# INLINE endBy1 #-}--{- -- | @endByNonEmpty p sep@ parses /one/ or more occurrences of @p@, separated -- and ended by @sep@. Returns a non-empty list of values returned by @p@. endByNonEmpty :: Alternative m => m a -> m sep -> m (NonEmpty a)-endByNonEmpty p sep = some1 (p <* sep)+endByNonEmpty p sep = NE.some1 (p <* sep) {-# INLINE endByNonEmpty #-}--} -- | @endBy p sep@ parses /zero/ or more occurrences of @p@, separated -- and ended by @sep@. Returns a list of values returned by @p@.
Distribution/Compat/Prelude.hs view
@@ -33,11 +33,12 @@ -- * Common type-classes Semigroup (..), gmappend, gmempty,- Typeable,+ Typeable, TypeRep, typeRep, Data, Generic, NFData (..), genericRnf, Binary (..),+ Structured, Alternative (..), MonadPlus (..), IsString (..),@@ -45,6 +46,9 @@ -- * Some types IO, NoCallStackIO, Map,+ Set,+ Identity (..),+ Proxy (..), -- * Data.Maybe catMaybes, mapMaybe,@@ -61,6 +65,7 @@ -- * Data.List.NonEmpty NonEmpty((:|)), foldl1, foldr1,+ head, tail, last, init, -- * Data.Foldable Foldable, foldMap, foldr,@@ -68,6 +73,7 @@ find, foldl', traverse_, for_, any, all,+ toList, -- * Data.Traversable Traversable, traverse, sequenceA,@@ -100,7 +106,7 @@ ) where -- We also could hide few partial function import Prelude as BasePrelude hiding- ( IO, mapM, mapM_, sequence, null, length, foldr, any, all+ ( IO, mapM, mapM_, sequence, null, length, foldr, any, all, head, tail, last, init -- partial functions , read , foldr1, foldl1@@ -120,8 +126,9 @@ #if !MINVER_base_48 import Control.Applicative (Applicative (..), (<$), (<$>)) import Distribution.Compat.Semigroup (Monoid (..))+import Data.Foldable (toList) #else-import Data.Foldable (length, null)+import Data.Foldable (length, null, Foldable(toList)) #endif import Data.Foldable (Foldable (foldMap, foldr), find, foldl', for_, traverse_, any, all)@@ -131,14 +138,17 @@ import Control.Applicative (Alternative (..)) import Control.DeepSeq (NFData (..)) import Data.Data (Data)-import Data.Typeable (Typeable)+import Distribution.Compat.Typeable (Typeable, TypeRep, typeRep) import Distribution.Compat.Binary (Binary (..)) import Distribution.Compat.Semigroup (Semigroup (..), gmappend, gmempty) import GHC.Generics (Generic, Rep(..), V1, U1(U1), K1(unK1), M1(unM1), (:*:)((:*:)), (:+:)(L1,R1)) +import Data.Functor.Identity (Identity (..)) import Data.Map (Map)+import Data.Proxy (Proxy (..))+import Data.Set (Set) import Control.Arrow (first) import Control.Monad hiding (mapM)@@ -146,7 +156,7 @@ import Data.List (intercalate, intersperse, isPrefixOf, isSuffixOf, nub, nubBy, sort, sortBy, unfoldr)-import Data.List.NonEmpty (NonEmpty((:|)))+import Data.List.NonEmpty (NonEmpty((:|)), head, tail, init, last) import Data.Maybe import Data.String (IsString (..)) import Data.Int@@ -157,6 +167,8 @@ import qualified Prelude as OrigPrelude import Distribution.Compat.Stack++import Distribution.Utils.Structured (Structured) type IO a = WithCallStack (OrigPrelude.IO a) type NoCallStackIO a = OrigPrelude.IO a
Distribution/Compat/Semigroup.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}@@ -21,6 +22,8 @@ ) where import Distribution.Compat.Binary (Binary)+import Distribution.Utils.Structured (Structured)+import Data.Typeable (Typeable) import GHC.Generics -- Data.Semigroup is available since GHC 8.0/base-4.9 in `base`@@ -38,8 +41,10 @@ -- | A copy of 'Data.Semigroup.Last'. newtype Last' a = Last' { getLast' :: a }- deriving (Eq, Ord, Read, Show, Binary)+ deriving (Eq, Ord, Read, Show, Generic, Binary, Typeable) +instance Structured a => Structured (Last' a)+ instance Semigroup (Last' a) where _ <> b = b @@ -49,7 +54,9 @@ -- | A wrapper around 'Maybe', providing the 'Semigroup' and 'Monoid' instances -- implemented for 'Maybe' since @base-4.11@. newtype Option' a = Option' { getOption' :: Maybe a }- deriving (Eq, Ord, Read, Show, Binary, Functor)+ deriving (Eq, Ord, Read, Show, Binary, Generic, Functor, Typeable)++instance Structured a => Structured (Option' a) instance Semigroup a => Semigroup (Option' a) where Option' (Just a) <> Option' (Just b) = Option' (Just (a <> b))
Distribution/Compat/Time.hs view
@@ -1,4 +1,6 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE FlexibleContexts #-}@@ -55,7 +57,9 @@ -- | An opaque type representing a file's modification time, represented -- internally as a 64-bit unsigned integer in the Windows UTC format. newtype ModTime = ModTime Word64- deriving (Binary, Bounded, Eq, Ord)+ deriving (Binary, Generic, Bounded, Eq, Ord, Typeable)++instance Structured ModTime instance Show ModTime where show (ModTime x) = show x
+ Distribution/Compat/Typeable.hs view
@@ -0,0 +1,18 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE ScopedTypeVariables #-}+module Distribution.Compat.Typeable (+ Typeable,+ TypeRep,+ typeRep,+ ) where++#if MIN_VERSION_base(4,7,0)+import Data.Typeable (Typeable, TypeRep, typeRep)+#else+import Data.Typeable (Typeable, TypeRep, typeOf)+#endif++#if !MIN_VERSION_base(4,7,0)+typeRep :: forall a proxy. Typeable a => proxy a -> TypeRep+typeRep _ = typeOf (undefined :: a)+#endif
Distribution/Compiler.hs view
@@ -66,7 +66,7 @@ deriving (Generic, Show, Read, Eq, Ord, Typeable, Data) instance Binary CompilerFlavor-+instance Structured CompilerFlavor instance NFData CompilerFlavor where rnf = genericRnf knownCompilerFlavors :: [CompilerFlavor]@@ -125,6 +125,7 @@ deriving (Generic, Show, Read, Eq, Typeable, Data) instance Binary a => Binary (PerCompilerFlavor a)+instance Structured a => Structured (PerCompilerFlavor a) instance NFData a => NFData (PerCompilerFlavor a) perCompilerFlavorToList :: PerCompilerFlavor v -> [(CompilerFlavor, v)]@@ -143,10 +144,10 @@ -- ------------------------------------------------------------ data CompilerId = CompilerId CompilerFlavor Version- deriving (Eq, Generic, Ord, Read, Show)+ deriving (Eq, Generic, Ord, Read, Show, Typeable) instance Binary CompilerId-+instance Structured CompilerId instance NFData CompilerId where rnf = genericRnf instance Pretty CompilerId where@@ -192,9 +193,10 @@ data AbiTag = NoAbiTag | AbiTag String- deriving (Eq, Generic, Show, Read)+ deriving (Eq, Generic, Show, Read, Typeable) instance Binary AbiTag+instance Structured AbiTag instance Pretty AbiTag where pretty NoAbiTag = Disp.empty
Distribution/FieldGrammar.hs view
@@ -25,6 +25,7 @@ takeFields, runFieldParser, runFieldParser',+ defaultFreeTextFieldDefST, ) where import Distribution.Compat.Prelude
Distribution/FieldGrammar/Class.hs view
@@ -4,19 +4,19 @@ optionalField, optionalFieldDef, monoidalField,+ defaultFreeTextFieldDefST, ) where import Distribution.Compat.Lens import Distribution.Compat.Prelude import Prelude () -import Data.Functor.Identity (Identity (..))- import Distribution.CabalSpecVersion (CabalSpecVersion) import Distribution.Compat.Newtype (Newtype) import Distribution.Fields.Field import Distribution.Parsec (Parsec) import Distribution.Pretty (Pretty)+import Distribution.Utils.ShortText -- | 'FieldGrammar' is parametrised by --@@ -81,6 +81,12 @@ -> ALens' s String -- ^ lens into the field -> g s String + -- | @since 3.2.0.0+ freeTextFieldDefST+ :: FieldName+ -> ALens' s ShortText -- ^ lens into the field+ -> g s ShortText+ -- | Monoidal field. -- -- Values are combined with 'mappend'.@@ -159,3 +165,15 @@ -> ALens' s a -- ^ lens into the field -> g s a monoidalField fn = monoidalFieldAla fn Identity++-- | Default implementation for 'freeTextFieldDefST'.+defaultFreeTextFieldDefST+ :: (Functor (g s), FieldGrammar g)+ => FieldName+ -> ALens' s ShortText -- ^ lens into the field+ -> g s ShortText+defaultFreeTextFieldDefST fn l =+ toShortText <$> freeTextFieldDef fn (cloneLens l . st)+ where+ st :: Lens' ShortText String+ st f s = toShortText <$> f (fromShortText s)
Distribution/FieldGrammar/FieldDescrs.hs view
@@ -84,6 +84,8 @@ f s = showFreeText (aview l s) g s = cloneLens l (const parsecFreeText) s + freeTextFieldDefST = defaultFreeTextFieldDefST+ monoidalFieldAla fn _pack l = singletonF fn f g where f s = pretty (pack' _pack (aview l s)) g s = cloneLens l (\x -> mappend x . unpack' _pack <$> P.parsec) s
Distribution/FieldGrammar/Parsec.hs view
@@ -66,17 +66,18 @@ import Data.List (dropWhileEnd) import Data.Ord (comparing)-import Data.Set (Set) import Distribution.Compat.Newtype import Distribution.Compat.Prelude import Distribution.Simple.Utils (fromUTF8BS) import Prelude () -import qualified Data.ByteString as BS-import qualified Data.Map.Strict as Map-import qualified Data.Set as Set-import qualified Text.Parsec as P-import qualified Text.Parsec.Error as P+import qualified Data.ByteString as BS+import qualified Data.List.NonEmpty as NE+import qualified Data.Map.Strict as Map+import qualified Data.Set as Set+import qualified Distribution.Utils.ShortText as ShortText+import qualified Text.Parsec as P+import qualified Text.Parsec.Error as P import Distribution.CabalSpecVersion import Distribution.FieldGrammar.Class@@ -84,7 +85,7 @@ import Distribution.Fields.ParseResult import Distribution.Parsec import Distribution.Parsec.FieldLineStream-import Distribution.Parsec.Position (positionRow, positionCol)+import Distribution.Parsec.Position (positionCol, positionRow) ------------------------------------------------------------------------------- -- Auxiliary types@@ -156,12 +157,12 @@ uniqueFieldAla fn _pack _extract = ParsecFG (Set.singleton fn) Set.empty parser where parser v fields = case Map.lookup fn fields of- Nothing -> parseFatalFailure zeroPos $ show fn ++ " field missing"- Just [] -> parseFatalFailure zeroPos $ show fn ++ " field missing"- Just [x] -> parseOne v x- Just xs -> do+ Nothing -> parseFatalFailure zeroPos $ show fn ++ " field missing"+ Just [] -> parseFatalFailure zeroPos $ show fn ++ " field missing"+ Just [x] -> parseOne v x+ Just xs@(_:y:ys) -> do warnMultipleSingularFields fn xs- last <$> traverse (parseOne v) xs+ NE.last <$> traverse (parseOne v) (y:|ys) parseOne v (MkNamelessField pos fls) = unpack' _pack <$> runFieldParser pos parsec v fls@@ -169,24 +170,24 @@ booleanFieldDef fn _extract def = ParsecFG (Set.singleton fn) Set.empty parser where parser v fields = case Map.lookup fn fields of- Nothing -> pure def- Just [] -> pure def- Just [x] -> parseOne v x- Just xs -> do+ Nothing -> pure def+ Just [] -> pure def+ Just [x] -> parseOne v x+ Just xs@(_:y:ys) -> do warnMultipleSingularFields fn xs- last <$> traverse (parseOne v) xs+ NE.last <$> traverse (parseOne v) (y:|ys) parseOne v (MkNamelessField pos fls) = runFieldParser pos parsec v fls optionalFieldAla fn _pack _extract = ParsecFG (Set.singleton fn) Set.empty parser where parser v fields = case Map.lookup fn fields of- Nothing -> pure Nothing- Just [] -> pure Nothing- Just [x] -> parseOne v x- Just xs -> do+ Nothing -> pure Nothing+ Just [] -> pure Nothing+ Just [x] -> parseOne v x+ Just xs@(_:y:ys) -> do warnMultipleSingularFields fn xs- last <$> traverse (parseOne v) xs+ NE.last <$> traverse (parseOne v) (y:|ys) parseOne v (MkNamelessField pos fls) | null fls = pure Nothing@@ -195,12 +196,12 @@ optionalFieldDefAla fn _pack _extract def = ParsecFG (Set.singleton fn) Set.empty parser where parser v fields = case Map.lookup fn fields of- Nothing -> pure def- Just [] -> pure def- Just [x] -> parseOne v x- Just xs -> do+ Nothing -> pure def+ Just [] -> pure def+ Just [x] -> parseOne v x+ Just xs@(_:y:ys) -> do warnMultipleSingularFields fn xs- last <$> traverse (parseOne v) xs+ NE.last <$> traverse (parseOne v) (y:|ys) parseOne v (MkNamelessField pos fls) | null fls = pure def@@ -208,12 +209,12 @@ freeTextField fn _ = ParsecFG (Set.singleton fn) Set.empty parser where parser v fields = case Map.lookup fn fields of- Nothing -> pure Nothing- Just [] -> pure Nothing- Just [x] -> parseOne v x- Just xs -> do+ Nothing -> pure Nothing+ Just [] -> pure Nothing+ Just [x] -> parseOne v x+ Just xs@(_:y:ys) -> do warnMultipleSingularFields fn xs- last <$> traverse (parseOne v) xs+ NE.last <$> traverse (parseOne v) (y:|ys) parseOne v (MkNamelessField pos fls) | null fls = pure Nothing@@ -222,17 +223,33 @@ freeTextFieldDef fn _ = ParsecFG (Set.singleton fn) Set.empty parser where parser v fields = case Map.lookup fn fields of- Nothing -> pure ""- Just [] -> pure ""- Just [x] -> parseOne v x- Just xs -> do+ Nothing -> pure ""+ Just [] -> pure ""+ Just [x] -> parseOne v x+ Just xs@(_:y:ys) -> do warnMultipleSingularFields fn xs- last <$> traverse (parseOne v) xs+ NE.last <$> traverse (parseOne v) (y:|ys) parseOne v (MkNamelessField pos fls) | null fls = pure "" | v >= CabalSpecV3_0 = pure (fieldlinesToFreeText3 pos fls) | otherwise = pure (fieldlinesToFreeText fls)++ -- freeTextFieldDefST = defaultFreeTextFieldDefST+ freeTextFieldDefST fn _ = ParsecFG (Set.singleton fn) Set.empty parser where+ parser v fields = case Map.lookup fn fields of+ Nothing -> pure mempty+ Just [] -> pure mempty+ Just [x] -> parseOne v x+ Just xs@(_:y:ys) -> do+ warnMultipleSingularFields fn xs+ NE.last <$> traverse (parseOne v) (y:|ys)++ parseOne v (MkNamelessField pos fls) = case fls of+ [] -> pure mempty+ [FieldLine _ bs] -> pure (ShortText.unsafeFromUTF8BS bs)+ _ | v >= CabalSpecV3_0 -> pure (ShortText.toShortText $ fieldlinesToFreeText3 pos fls)+ | otherwise -> pure (ShortText.toShortText $ fieldlinesToFreeText fls) monoidalFieldAla fn _pack _extract = ParsecFG (Set.singleton fn) Set.empty parser where
Distribution/FieldGrammar/Pretty.hs view
@@ -72,6 +72,8 @@ showFT | v >= CabalSpecV3_0 = showFreeTextV3 | otherwise = showFreeText + freeTextFieldDefST = defaultFreeTextFieldDefST+ monoidalFieldAla fn _pack l = PrettyFG pp where pp v s = ppField fn (prettyVersioned v (pack' _pack (aview l s)))
Distribution/Fields/ConfVar.hs view
@@ -8,7 +8,7 @@ import Distribution.Fields.Field (SectionArg (..)) import Distribution.Fields.ParseResult import Distribution.Types.Condition-import Distribution.Types.GenericPackageDescription (ConfVar (..))+import Distribution.Types.ConfVar (ConfVar (..)) import Distribution.Version (anyVersion, earlierVersion, intersectVersionRanges, laterVersion, majorBoundVersion, mkVersion, noVersion, orEarlierVersion, orLaterVersion, thisVersion, unionVersionRanges,
Distribution/Fields/Field.hs view
@@ -73,7 +73,7 @@ -- | Section arguments, e.g. name of the library data SectionArg ann = SecArgName !ann !ByteString- -- ^ identifier, or omething which loos like number. Also many dot numbers, i.e. "7.6.3"+ -- ^ identifier, or something which looks like number. Also many dot numbers, i.e. "7.6.3" | SecArgStr !ann !ByteString -- ^ quoted string | SecArgOther !ann !ByteString
Distribution/Fields/LexerMonad.hs view
@@ -32,6 +32,7 @@ ) where import qualified Data.ByteString as B+import qualified Data.List.NonEmpty as NE import Distribution.Compat.Prelude import Distribution.Parsec.Position (Position (..), showPos) import Distribution.Parsec.Warning (PWarnType (..), PWarning (..))@@ -76,15 +77,15 @@ toPWarnings = map (uncurry toWarning) . Map.toList- . Map.fromListWith (++)- . map (\(LexWarning t p) -> (t, [p]))+ . Map.fromListWith (<>)+ . map (\(LexWarning t p) -> (t, pure p)) where toWarning LexWarningBOM poss =- PWarning PWTLexBOM (head poss) "Byte-order mark found at the beginning of the file"+ PWarning PWTLexBOM (NE.head poss) "Byte-order mark found at the beginning of the file" toWarning LexWarningNBSP poss =- PWarning PWTLexNBSP (head poss) $ "Non breaking spaces at " ++ intercalate ", " (map showPos poss)+ PWarning PWTLexNBSP (NE.head poss) $ "Non breaking spaces at " ++ intercalate ", " (NE.toList $ fmap showPos poss) toWarning LexWarningTab poss =- PWarning PWTLexTab (head poss) $ "Tabs used as indentation at " ++ intercalate ", " (map showPos poss)+ PWarning PWTLexTab (NE.head poss) $ "Tabs used as indentation at " ++ intercalate ", " (NE.toList $ fmap showPos poss) data LexState = LexState { curPos :: {-# UNPACK #-} !Position, -- ^ position at current input location
Distribution/Fields/ParseResult.hs view
@@ -50,13 +50,14 @@ -- | Destruct a 'ParseResult' into the emitted warnings and either -- a successful value or -- list of errors and possibly recovered a spec-version declaration.-runParseResult :: ParseResult a -> ([PWarning], Either (Maybe Version, [PError]) a)+runParseResult :: ParseResult a -> ([PWarning], Either (Maybe Version, NonEmpty PError) a) runParseResult pr = unPR pr emptyPRState failure success where- failure (PRState warns errs v) = (warns, Left (v, errs))- success (PRState warns [] _) x = (warns, Right x)+ failure (PRState warns [] v) = (warns, Left (v, PError zeroPos "panic" :| []))+ failure (PRState warns (err:errs) v) = (warns, Left (v, err :| errs)) where+ success (PRState warns [] _) x = (warns, Right x) -- If there are any errors, don't return the result- success (PRState warns errs v) _ = (warns, Left (v, errs))+ success (PRState warns (err:errs) v) _ = (warns, Left (v, err :| errs)) instance Functor ParseResult where fmap f (PR pr) = PR $ \ !s failure success ->
Distribution/Fields/Pretty.hs view
@@ -20,7 +20,6 @@ prettySectionArgs, ) where -import Data.Functor.Identity (Identity (..)) import Distribution.Compat.Prelude import Distribution.Pretty (showToken) import Prelude ()
Distribution/InstalledPackageInfo.hs view
@@ -43,7 +43,6 @@ import Distribution.Compat.Prelude import Prelude () -import Data.Set (Set) import Distribution.Backpack import Distribution.CabalSpecVersion (cabalSpecLatest) import Distribution.FieldGrammar@@ -53,6 +52,9 @@ import Distribution.Types.ComponentName import Distribution.Utils.Generic (toUTF8BS) +import Control.DeepSeq (deepseq)+import Data.ByteString (ByteString)+ import qualified Data.Map as Map import qualified Distribution.Fields as P import qualified Text.PrettyPrint as Disp@@ -60,7 +62,8 @@ import Distribution.Types.InstalledPackageInfo import Distribution.Types.InstalledPackageInfo.FieldGrammar -+-- $setup+-- >>> :set -XOverloadedStrings installedComponentId :: InstalledPackageInfo -> ComponentId installedComponentId ipi =@@ -92,19 +95,17 @@ -- Parsing -- | Return either errors, or IPI with list of warnings------ /Note:/ errors array /may/ be empty, but the parse is still failed (it's a bug though) parseInstalledPackageInfo- :: String- -> Either [String] ([String], InstalledPackageInfo)-parseInstalledPackageInfo s = case P.readFields (toUTF8BS s) of- Left err -> Left [show err]+ :: ByteString+ -> Either (NonEmpty String) ([String], InstalledPackageInfo)+parseInstalledPackageInfo s = case P.readFields s of+ Left err -> Left (show err :| []) Right fs -> case partitionFields fs of (fs', _) -> case P.runParseResult $ parseFieldGrammar cabalSpecLatest fs' ipiFieldGrammar of- (ws, Right x) -> Right (ws', x) where+ (ws, Right x) -> x `deepseq` Right (ws', x) where ws' = map (P.showPWarning "") ws (_, Left (_, errs)) -> Left errs' where- errs' = map (P.showPError "") errs+ errs' = fmap (P.showPError "") errs -- ----------------------------------------------------------------------------- -- Pretty-printing
Distribution/License.hs view
@@ -128,7 +128,7 @@ deriving (Generic, Read, Show, Eq, Typeable, Data) instance Binary License-+instance Structured License instance NFData License where rnf = genericRnf -- | The list of all currently recognised licenses.
Distribution/ModuleName.hs view
@@ -1,5 +1,5 @@ {-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveGeneric #-} ----------------------------------------------------------------------------- -- |@@ -23,17 +23,16 @@ validModuleComponent, ) where -import Prelude () import Distribution.Compat.Prelude--import Distribution.Utils.ShortText-import System.FilePath ( pathSeparator )+import Prelude () -import Distribution.Pretty import Distribution.Parsec+import Distribution.Pretty+import Distribution.Utils.ShortText (ShortText, fromShortText, toShortText)+import System.FilePath (pathSeparator) import qualified Distribution.Compat.CharParsing as P-import qualified Text.PrettyPrint as Disp+import qualified Text.PrettyPrint as Disp -- | A valid Haskell module name. --@@ -41,6 +40,7 @@ deriving (Eq, Generic, Ord, Read, Show, Typeable, Data) instance Binary ModuleName+instance Structured ModuleName instance NFData ModuleName where rnf (ModuleName ms) = rnf ms@@ -50,7 +50,7 @@ Disp.hcat (intersperse (Disp.char '.') (map Disp.text $ stlToStrings ms)) instance Parsec ModuleName where- parsec = fromComponents <$> P.sepBy1 component (P.char '.')+ parsec = fromComponents <$> toList <$> P.sepByNonEmpty component (P.char '.') where component = do c <- P.satisfy isUpper@@ -130,6 +130,8 @@ instance Binary ShortTextLst where put = put . stlToList get = stlFromList <$> get++instance Structured ShortTextLst stlToList :: ShortTextLst -> [ShortText] stlToList STLNil = []
Distribution/PackageDescription.hs view
@@ -137,3 +137,5 @@ import Distribution.Types.LibraryName import Distribution.Types.HookedBuildInfo import Distribution.Types.SourceRepo+import Distribution.Types.Flag+import Distribution.Types.ConfVar
Distribution/PackageDescription/Check.hs view
@@ -73,6 +73,7 @@ import qualified System.FilePath.Windows as FilePath.Windows (isValid) import qualified Data.Set as Set+import qualified Distribution.Utils.ShortText as ShortText import qualified Distribution.Types.BuildInfo.Lens as L import qualified Distribution.Types.GenericPackageDescription.Lens as L@@ -497,32 +498,32 @@ ++ "' use '" ++ prettyShow replacement ++ "'." | (ext, Just replacement) <- ourDeprecatedExtensions ] - , check (null (category pkg)) $+ , check (ShortText.null (category pkg)) $ PackageDistSuspicious "No 'category' field." - , check (null (maintainer pkg)) $+ , check (ShortText.null (maintainer pkg)) $ PackageDistSuspicious "No 'maintainer' field." - , check (null (synopsis pkg) && null (description pkg)) $+ , check (ShortText.null (synopsis pkg) && ShortText.null (description pkg)) $ PackageDistInexcusable "No 'synopsis' or 'description' field." - , check (null (description pkg) && not (null (synopsis pkg))) $+ , check (ShortText.null (description pkg) && not (ShortText.null (synopsis pkg))) $ PackageDistSuspicious "No 'description' field." - , check (null (synopsis pkg) && not (null (description pkg))) $+ , check (ShortText.null (synopsis pkg) && not (ShortText.null (description pkg))) $ PackageDistSuspicious "No 'synopsis' field." --TODO: recommend the bug reports URL, author and homepage fields --TODO: recommend not using the stability field --TODO: recommend specifying a source repo - , check (length (synopsis pkg) >= 80) $+ , check (ShortText.length (synopsis pkg) >= 80) $ PackageDistSuspicious "The 'synopsis' field is rather long (max 80 chars is recommended)." -- See also https://github.com/haskell/cabal/pull/3479- , check (not (null (description pkg))- && length (description pkg) <= length (synopsis pkg)) $+ , check (not (ShortText.null (description pkg))+ && ShortText.length (description pkg) <= ShortText.length (synopsis pkg)) $ PackageDistSuspicious $ "The 'description' field should be longer than the 'synopsis' " ++ "field. "@@ -546,10 +547,7 @@ ++ "for example 'tested-with: GHC==6.10.4, GHC==6.12.3' and not " ++ "'tested-with: GHC==6.10.4 && ==6.12.3'." - -- Disabled due to #5119: we generate loads of spurious instances of- -- this warning. Re-enabling this check should be part of the fix to- -- #5119.- , check (False && not (null depInternalLibraryWithExtraVersion)) $+ , check (not (null depInternalLibraryWithExtraVersion)) $ PackageBuildWarning $ "The package has an extraneous version range for a dependency on an " ++ "internal library: "@@ -1028,13 +1026,18 @@ checkCCFlags flags = check (any (`elem` flags) all_cLikeOptions) checkCPPOptions :: PackageDescription -> [PackageCheck]-checkCPPOptions pkg =- catMaybes [- checkAlternatives "cpp-options" "include-dirs"- [ (flag, dir) | flag@('-':'I':dir) <- all_cppOptions]+checkCPPOptions pkg = catMaybes+ [ checkAlternatives "cpp-options" "include-dirs"+ [ (flag, dir) | flag@('-':'I':dir) <- all_cppOptions ] ]- where all_cppOptions = [ opts | bi <- allBuildInfo pkg- , opts <- cppOptions bi ]+ +++ [ PackageBuildWarning $ "'cpp-options': " ++ opt ++ " is not portable C-preprocessor flag"+ | opt <- all_cppOptions+ -- "-I" is handled above, we allow only -DNEWSTUFF and -UOLDSTUFF+ , not $ any (`isPrefixOf` opt) ["-D", "-U", "-I" ]+ ]+ where+ all_cppOptions = [ opts | bi <- allBuildInfo pkg, opts <- cppOptions bi ] checkAlternatives :: String -> String -> [(String, String)] -> Maybe PackageCheck@@ -1589,8 +1592,8 @@ boundedAbove :: VersionRange -> Bool boundedAbove vr = case asVersionIntervals vr of- [] -> True -- this is the inconsistent version range.- intervals -> case last intervals of+ [] -> True -- this is the inconsistent version range.+ (x:xs) -> case last (x:|xs) of (_, UpperBound _ _) -> True (_, NoUpperBound ) -> False @@ -2143,7 +2146,7 @@ Right (_:_) -> Just noSplit where -- drop the '/' between the name and prefix:- remainder = init h : rest+ remainder = safeInit h : rest where nameMax, prefixMax :: Int
Distribution/PackageDescription/Configuration.hs view
@@ -65,7 +65,6 @@ import qualified Data.Map.Strict as Map.Strict import qualified Data.Map.Lazy as Map-import Data.Set ( Set ) import qualified Data.Set as Set import Data.Tree ( Tree(Node) )
Distribution/PackageDescription/FieldGrammar.hs view
@@ -76,18 +76,18 @@ <*> blurFieldGrammar L.package packageIdentifierGrammar <*> optionalFieldDefAla "license" SpecLicense L.licenseRaw (Left SPDX.NONE) <*> licenseFilesGrammar- <*> freeTextFieldDef "copyright" L.copyright- <*> freeTextFieldDef "maintainer" L.maintainer- <*> freeTextFieldDef "author" L.author- <*> freeTextFieldDef "stability" L.stability+ <*> freeTextFieldDefST "copyright" L.copyright+ <*> freeTextFieldDefST "maintainer" L.maintainer+ <*> freeTextFieldDefST "author" L.author+ <*> freeTextFieldDefST "stability" L.stability <*> monoidalFieldAla "tested-with" (alaList' FSep TestedWith) L.testedWith- <*> freeTextFieldDef "homepage" L.homepage- <*> freeTextFieldDef "package-url" L.pkgUrl- <*> freeTextFieldDef "bug-reports" L.bugReports+ <*> freeTextFieldDefST "homepage" L.homepage+ <*> freeTextFieldDefST "package-url" L.pkgUrl+ <*> freeTextFieldDefST "bug-reports" L.bugReports <*> pure [] -- source-repos are stanza- <*> freeTextFieldDef "synopsis" L.synopsis- <*> freeTextFieldDef "description" L.description- <*> freeTextFieldDef "category" L.category+ <*> freeTextFieldDefST "synopsis" L.synopsis+ <*> freeTextFieldDefST "description" L.description+ <*> freeTextFieldDefST "category" L.category <*> prefixedFields "x-" L.customFieldsPD <*> optionalField "build-type" L.buildTypeRaw <*> pure Nothing -- custom-setup
Distribution/PackageDescription/Parsec.hs view
@@ -36,6 +36,7 @@ import Prelude () import Control.Applicative (Const (..))+import Control.DeepSeq (deepseq) import Control.Monad (guard) import Control.Monad.State.Strict (StateT, execStateT) import Control.Monad.Trans.Class (lift)@@ -70,9 +71,7 @@ import Distribution.Types.UnqualComponentName (UnqualComponentName, mkUnqualComponentName) import Distribution.Utils.Generic (breakMaybe, unfoldrM, validateUTF8) import Distribution.Verbosity (Verbosity)-import Distribution.Version- (LowerBound (..), Version, asVersionIntervals, mkVersion, orLaterVersion, version0,- versionNumbers)+import Distribution.Version (LowerBound (..), Version, asVersionIntervals, mkVersion, orLaterVersion, version0, versionNumbers) import qualified Data.ByteString as BS import qualified Data.ByteString.Char8 as BS8@@ -200,7 +199,7 @@ gpd1 <- view stateGpd <$> execStateT (goSections specVer sectionFields) (SectionS gpd Map.empty) checkForUndefinedFlags gpd1- return gpd1+ gpd1 `deepseq` return gpd1 where safeLast :: [a] -> Maybe a safeLast = listToMaybe . reverse
Distribution/PackageDescription/PrettyPrint.hs view
@@ -126,17 +126,10 @@ thenDoc = go thenTree ppIf (CondBranch c thenTree (Just elseTree)) =- case (False, False) of- -- case (isEmpty thenDoc, isEmpty elseDoc) of- (True, True) -> mempty- (False, True) -> [ ppIfCondition c thenDoc ]- (True, False) -> [ ppIfCondition (cNot c) elseDoc ]- (False, False) -> [ ppIfCondition c thenDoc- , PrettySection () "else" [] elseDoc- ]- where- thenDoc = go thenTree- elseDoc = go elseTree+ -- See #6193+ [ ppIfCondition c (go thenTree)+ , PrettySection () "else" [] (go elseTree)+ ] ppCondLibrary :: CabalSpecVersion -> Maybe (CondTree ConfVar [Dependency] Library) -> [PrettyField ()] ppCondLibrary _ Nothing = mempty
Distribution/PackageDescription/Quirks.hs view
@@ -1,19 +1,17 @@-{-# LANGUAGE RankNTypes #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RankNTypes #-} -- | -- -- @since 2.2.0.0 module Distribution.PackageDescription.Quirks (patchQuirks) where -import Prelude ()-import Distribution.Compat.Prelude-import GHC.Fingerprint (Fingerprint (..), fingerprintData)-import Foreign.Ptr (castPtr)-import System.IO.Unsafe (unsafeDupablePerformIO)+import Distribution.Compat.Prelude+import Distribution.Utils.MD5+import GHC.Fingerprint (Fingerprint (..))+import Prelude () import qualified Data.ByteString as BS-import qualified Data.ByteString.Unsafe as BS-import qualified Data.Map as Map+import qualified Data.Map as Map -- | Patch legacy @.cabal@ file contents to allow parsec parser to accept -- all of Hackage.@@ -30,13 +28,7 @@ where output = f bs -md5 :: BS.ByteString -> Fingerprint-md5 bs = unsafeDupablePerformIO $ BS.unsafeUseAsCStringLen bs $ \(ptr, len) ->- fingerprintData (castPtr ptr) len- -- | 'patches' contains first 256 bytes, pre- and post-fingerprints and a patch function.------ patches :: Map.Map (BS.ByteString, Fingerprint) (Fingerprint, BS.ByteString -> BS.ByteString) patches = Map.fromList -- http://hackage.haskell.org/package/unicode-transforms-0.3.3
Distribution/Parsec.hs view
@@ -42,7 +42,6 @@ ) where import Data.Char (digitToInt, intToDigit)-import Data.Functor.Identity (Identity (..)) import Data.List (transpose) import Distribution.CabalSpecVersion import Distribution.Compat.Prelude@@ -260,8 +259,8 @@ parsecLeadingCommaList p = do c <- P.optional comma case c of- Nothing -> P.sepEndBy1 lp comma <|> pure []- Just _ -> P.sepBy1 lp comma+ Nothing -> toList <$> P.sepEndByNonEmpty lp comma <|> pure []+ Just _ -> toList <$> P.sepByNonEmpty lp comma where lp = p <* P.spaces comma = P.char ',' *> P.spaces P.<?> "comma"@@ -269,7 +268,7 @@ parsecOptCommaList :: CabalParsing m => m a -> m [a] parsecOptCommaList p = P.sepBy (p <* P.spaces) (P.optional comma) where- comma = P.char ',' *> P.spaces+ comma = P.char ',' *> P.spaces -- | Like 'parsecOptCommaList' but --@@ -290,7 +289,7 @@ c <- P.optional comma case c of Nothing -> sepEndBy1Start <|> pure []- Just _ -> P.sepBy1 lp comma+ Just _ -> toList <$> P.sepByNonEmpty lp comma where lp = p <* P.spaces comma = P.char ',' *> P.spaces P.<?> "comma"@@ -311,7 +310,7 @@ parsecMaybeQuoted p = parsecQuoted p <|> p parsecUnqualComponentName :: CabalParsing m => m String-parsecUnqualComponentName = intercalate "-" <$> P.sepBy1 component (P.char '-')+parsecUnqualComponentName = intercalate "-" <$> toList <$> P.sepByNonEmpty component (P.char '-') where component :: CabalParsing m => m String component = do@@ -380,7 +379,9 @@ nomore :: m () nomore = P.notFollowedBy anyd <|> toomuch - (low, ex : high) = splitAt bd dps+ (low, ex, high) = case splitAt bd dps of+ (low', ex' : high') -> (low', ex', high')+ (_, _) -> error "escapeCode: Logic error" in ((:) <$> P.choice low <*> atMost (length bds) anyd) <* nomore <|> ((:) <$> ex <*> ([] <$ nomore <|> bounded'' dps bds)) <|> if not (null bds)
Distribution/Parsec/Newtypes.hs view
@@ -18,6 +18,10 @@ Sep (..), -- ** Type List,+ -- * Set+ alaSet,+ alaSet',+ Set', -- * Version & License SpecVersion (..), TestedWith (..),@@ -33,16 +37,15 @@ import Distribution.Compat.Prelude import Prelude () -import Data.Functor.Identity (Identity (..)) import Distribution.CabalSpecVersion import Distribution.Compiler (CompilerFlavor) import Distribution.License (License) import Distribution.Parsec import Distribution.Pretty-import Distribution.Version- (LowerBound (..), Version, VersionRange, anyVersion, asVersionIntervals, mkVersion)+import Distribution.Version (LowerBound (..), Version, VersionRange, anyVersion, asVersionIntervals, mkVersion) import Text.PrettyPrint (Doc, comma, fsep, punctuate, vcat, (<+>)) +import qualified Data.Set as Set import qualified Distribution.Compat.CharParsing as P import qualified Distribution.SPDX as SPDX @@ -61,13 +64,10 @@ -- | Paragraph fill list without commas. Displayed with 'fsep'. data NoCommaFSep = NoCommaFSep --- | Proxy, internal to this module.-data P sep = P- class Sep sep where- prettySep :: P sep -> [Doc] -> Doc+ prettySep :: Proxy sep -> [Doc] -> Doc - parseSep :: CabalParsing m => P sep -> m a -> m [a]+ parseSep :: CabalParsing m => Proxy sep -> m a -> m [a] instance Sep CommaVCat where prettySep _ = vcat . punctuate comma@@ -116,10 +116,45 @@ instance Newtype [a] (List sep wrapper a) instance (Newtype a b, Sep sep, Parsec b) => Parsec (List sep b a) where- parsec = pack . map (unpack :: b -> a) <$> parseSep (P :: P sep) parsec+ parsec = pack . map (unpack :: b -> a) <$> parseSep (Proxy :: Proxy sep) parsec instance (Newtype a b, Sep sep, Pretty b) => Pretty (List sep b a) where- pretty = prettySep (P :: P sep) . map (pretty . (pack :: a -> b)) . unpack+ pretty = prettySep (Proxy :: Proxy sep) . map (pretty . (pack :: a -> b)) . unpack++-- | Like 'List', but for 'Set'.+--+-- @since 3.2.0.0+newtype Set' sep b a = Set' { _getSet :: Set a }++-- | 'alaSet' and 'alaSet'' are simply 'Set'' constructor, with additional phantom+-- arguments to constraint the resulting type+--+-- >>> :t alaSet VCat+-- alaSet VCat :: Set a -> Set' VCat (Identity a) a+--+-- >>> :t alaSet' FSep Token+-- alaSet' FSep Token :: Set String -> Set' FSep Token String+--+-- >>> unpack' (alaSet' FSep Token) <$> eitherParsec "foo bar foo"+-- Right (fromList ["bar","foo"])+--+-- @since 3.2.0.0+alaSet :: sep -> Set a -> Set' sep (Identity a) a+alaSet _ = Set'++-- | More general version of 'alaSet'.+--+-- @since 3.2.0.0+alaSet' :: sep -> (a -> b) -> Set a -> Set' sep b a+alaSet' _ _ = Set'++instance Newtype (Set a) (Set' sep wrapper a)++instance (Newtype a b, Ord a, Sep sep, Parsec b) => Parsec (Set' sep b a) where+ parsec = pack . Set.fromList . map (unpack :: b -> a) <$> parseSep (Proxy :: Proxy sep) parsec++instance (Newtype a b, Sep sep, Pretty b) => Pretty (Set' sep b a) where+ pretty = prettySep (Proxy :: Proxy sep) . map (pretty . (pack :: a -> b)) . Set.toList . unpack -- | Haskell string or @[^ ,]+@ newtype Token = Token { getToken :: String }
Distribution/Pretty.hs view
@@ -12,7 +12,6 @@ Separator, ) where -import Data.Functor.Identity (Identity (..)) import Distribution.CabalSpecVersion import Distribution.Compat.Prelude import Prelude ()
Distribution/SPDX/License.hs view
@@ -44,6 +44,7 @@ deriving (Show, Read, Eq, Ord, Typeable, Data, Generic) instance Binary License+instance Structured License instance NFData License where rnf NONE = ()
Distribution/SPDX/LicenseExceptionId.hs view
@@ -12,9 +12,11 @@ import Distribution.Compat.Prelude import Prelude () +import Distribution.Compat.Lens (set) import Distribution.Pretty import Distribution.Parsec import Distribution.Utils.Generic (isAsciiAlphaNum)+import Distribution.Utils.Structured (Structured (..), nominalStructure, typeVersion) import Distribution.SPDX.LicenseListVersion import qualified Data.Binary.Get as Binary@@ -74,6 +76,10 @@ if i > fromIntegral (fromEnum (maxBound :: LicenseExceptionId)) then fail "Too large LicenseExceptionId tag" else return (toEnum (fromIntegral i))++-- note: remember to bump version each time the definition changes+instance Structured LicenseExceptionId where+ structure p = set typeVersion 306 $ nominalStructure p instance Pretty LicenseExceptionId where pretty = Disp.text . licenseExceptionId
Distribution/SPDX/LicenseExpression.hs view
@@ -60,6 +60,8 @@ instance Binary LicenseExpression instance Binary SimpleLicenseExpression+instance Structured SimpleLicenseExpression+instance Structured LicenseExpression instance Pretty LicenseExpression where pretty = go 0
Distribution/SPDX/LicenseId.hs view
@@ -15,9 +15,11 @@ import Distribution.Compat.Prelude import Prelude () +import Distribution.Compat.Lens (set) import Distribution.Pretty import Distribution.Parsec import Distribution.Utils.Generic (isAsciiAlphaNum)+import Distribution.Utils.Structured (Structured (..), nominalStructure, typeVersion) import Distribution.SPDX.LicenseListVersion import qualified Data.Binary.Get as Binary@@ -412,6 +414,10 @@ if i > fromIntegral (fromEnum (maxBound :: LicenseId)) then fail "Too large LicenseId tag" else return (toEnum (fromIntegral i))++-- note: remember to bump version each time the definition changes+instance Structured LicenseId where+ structure p = set typeVersion 306 $ nominalStructure p instance Pretty LicenseId where pretty = Disp.text . licenseId
Distribution/SPDX/LicenseReference.hs view
@@ -34,6 +34,7 @@ licenseDocumentRef = _lrDocument instance Binary LicenseRef+instance Structured LicenseRef instance NFData LicenseRef where rnf (LicenseRef d l) = rnf d `seq` rnf l
Distribution/Simple.hs view
@@ -524,9 +524,9 @@ ++ "but the package does not have a library." sanityCheckHookedBuildInfo verbosity pkg_descr (_, hookExes)- | not (null nonExistant)+ | exe1 : _ <- nonExistant = die' verbosity $ "The buildinfo contains info for an executable called '"- ++ prettyShow (head nonExistant) ++ "' but the package does not have a "+ ++ prettyShow exe1 ++ "' but the package does not have a " ++ "executable with that name." where pkgExeNames = nub (map exeName (executables pkg_descr))
Distribution/Simple/Build.hs view
@@ -30,6 +30,7 @@ import Prelude () import Distribution.Compat.Prelude+import Distribution.Utils.Generic import Distribution.Types.ComponentLocalBuildInfo import Distribution.Types.ComponentRequestedSpec@@ -154,7 +155,9 @@ target <- readTargetInfos verbosity pkg_descr lbi args >>= \r -> case r of -- This seems DEEPLY questionable.- [] -> return (head (allTargetsInBuildOrder' pkg_descr lbi))+ [] -> case allTargetsInBuildOrder' pkg_descr lbi of+ (target:_) -> return target+ [] -> die' verbosity $ "Failed to determine target." [target] -> return target _ -> die' verbosity $ "The 'repl' command does not support multiple targets at once." let componentsToBuild = neededTargetsInBuildOrder' pkg_descr lbi [nodeKey target]@@ -180,7 +183,7 @@ componentInitialBuildSteps distPref pkg_descr lbi clbi verbosity buildComponent verbosity NoFlag pkg_descr lbi' suffixes comp clbi distPref- | subtarget <- init componentsToBuild ]+ | subtarget <- safeInit componentsToBuild ] -- REPL for target components let clbi = targetCLBI target
Distribution/Simple/Build/Macros.hs view
@@ -109,9 +109,9 @@ ++ generateMacros "TOOL_" progname version | prog <- progs , isJust . programVersion $ prog- , let progid = programId prog ++ "-" ++ prettyShow version- progname = map fixchar (programId prog)- Just version = programVersion prog+ , let progid = programId prog ++ "-" ++ prettyShow version+ progname = map fixchar (programId prog)+ version = fromMaybe version0 (programVersion prog) ] -- | Common implementation of 'generatePackageVersionMacros' and@@ -131,7 +131,11 @@ ] ,"\n"] where- (major1:major2:minor:_) = map show (versionNumbers version ++ repeat 0)+ (major1,major2,minor) = case map show (versionNumbers version) of+ [] -> ("0", "0", "0")+ [x] -> (x, "0", "0")+ [x,y] -> (x, y, "0")+ (x:y:z:_) -> (x, y, z) -- | Generate the @CURRENT_COMPONENT_ID@ definition for the component ID -- of the current package.
Distribution/Simple/BuildTarget.hs view
@@ -58,6 +58,7 @@ import Control.Monad ( msum ) import Data.List ( stripPrefix, groupBy, partition )+import qualified Data.List.NonEmpty as NE import Data.Either ( partitionEithers ) import System.FilePath as FilePath ( dropExtension, normalise, splitDirectories, joinPath, splitPath@@ -318,8 +319,9 @@ where classifyMatchErrors errs- | not (null expected) = let (things, got:_) = unzip expected in- BuildTargetExpected userTarget things got+ | Just expected' <- NE.nonEmpty expected+ = let (things, got:|_) = NE.unzip expected' in+ BuildTargetExpected userTarget (NE.toList things) got | not (null nosuch) = BuildTargetNoSuch userTarget nosuch | otherwise = error $ "resolveBuildTarget: internal error in matching" where
Distribution/Simple/Compiler.hs view
@@ -103,6 +103,7 @@ deriving (Eq, Generic, Typeable, Show, Read) instance Binary Compiler+instance Structured Compiler showCompilerId :: Compiler -> String showCompilerId = prettyShow . compilerId@@ -171,9 +172,10 @@ data PackageDB = GlobalPackageDB | UserPackageDB | SpecificPackageDB FilePath- deriving (Eq, Generic, Ord, Show, Read)+ deriving (Eq, Generic, Ord, Show, Read, Typeable) instance Binary PackageDB+instance Structured PackageDB -- | We typically get packages from several databases, and stack them -- together. This type lets us be explicit about that stacking. For example@@ -197,8 +199,9 @@ -- the top of the stack. -- registrationPackageDB :: PackageDBStack -> PackageDB-registrationPackageDB [] = error "internal error: empty package db set"-registrationPackageDB dbs = last dbs+registrationPackageDB dbs = case safeLast dbs of+ Nothing -> error "internal error: empty package db set"+ Just p -> p -- | Make package paths absolute @@ -223,9 +226,10 @@ data OptimisationLevel = NoOptimisation | NormalOptimisation | MaximumOptimisation- deriving (Bounded, Enum, Eq, Generic, Read, Show)+ deriving (Bounded, Enum, Eq, Generic, Read, Show, Typeable) instance Binary OptimisationLevel+instance Structured OptimisationLevel flagToOptimisationLevel :: Maybe String -> OptimisationLevel flagToOptimisationLevel Nothing = NormalOptimisation@@ -250,9 +254,10 @@ | MinimalDebugInfo | NormalDebugInfo | MaximalDebugInfo- deriving (Bounded, Enum, Eq, Generic, Read, Show)+ deriving (Bounded, Enum, Eq, Generic, Read, Show, Typeable) instance Binary DebugInfoLevel+instance Structured DebugInfoLevel flagToDebugInfoLevel :: Maybe String -> DebugInfoLevel flagToDebugInfoLevel Nothing = NormalDebugInfo@@ -405,9 +410,10 @@ | ProfDetailToplevelFunctions | ProfDetailAllFunctions | ProfDetailOther String- deriving (Eq, Generic, Read, Show)+ deriving (Eq, Generic, Read, Show, Typeable) instance Binary ProfDetailLevel+instance Structured ProfDetailLevel flagToProfDetailLevel :: String -> ProfDetailLevel flagToProfDetailLevel "" = ProfDetailDefault
Distribution/Simple/Configure.hs view
@@ -54,7 +54,7 @@ , platformDefines, ) where -import Prelude ()+import qualified Prelude (tail) import Distribution.Compat.Prelude import Distribution.Compiler@@ -113,7 +113,8 @@ import Control.Exception ( ErrorCall, Exception, evaluate, throw, throwIO, try ) import Control.Monad ( forM, forM_ )-import Distribution.Compat.Binary ( decodeOrFailIO, encode )+import Data.List.NonEmpty ( nonEmpty )+import Distribution.Utils.Structured ( structuredDecodeOrFailIO, structuredEncode ) import Distribution.Compat.Directory ( listDirectory ) import Data.ByteString.Lazy ( ByteString ) import qualified Data.ByteString as BS@@ -211,7 +212,7 @@ Right x -> x let getStoredValue = do- result <- decodeOrFailIO (BLC8.tail body)+ result <- structuredDecodeOrFailIO (BLC8.tail body) case result of Left _ -> throw ConfigStateFileNoParse Right x -> return x@@ -256,7 +257,7 @@ writePersistBuildConfig distPref lbi = do createDirectoryIfMissing False distPref writeFileAtomic (localBuildInfoFile distPref) $- BLC8.unlines [showHeader pkgId, encode lbi]+ BLC8.unlines [showHeader pkgId, structuredEncode lbi] where pkgId = localPackage lbi @@ -971,7 +972,7 @@ -- Reinterpret the "package name" as an unqualified component -- name = LSubLibName $ packageNameToUnqualComponentName depName- -- Check whether a libray exists and is visible.+ -- Check whether a library exists and is visible. -- We don't disambiguate between dependency on non-existent or private -- library yet, so we just return a bool and later report a generic error. visible lib = maybe@@ -1314,19 +1315,22 @@ -- It's an external package, normal situation do_external_external =- case PackageIndex.lookupDependency installedIndex dep_pkgname vr of- [] -> Left (DependencyNotExists dep_pkgname)- pkgs -> Right $ head $ snd $ last pkgs+ case pickLastIPI $ PackageIndex.lookupDependency installedIndex dep_pkgname vr of+ Nothing -> Left (DependencyNotExists dep_pkgname)+ Just pkg -> Right pkg -- It's an internal library, being looked up externally do_external_internal :: LibraryName -> Either FailedDependency InstalledPackageInfo do_external_internal ln =- case PackageIndex.lookupInternalDependency installedIndex+ case pickLastIPI $ PackageIndex.lookupInternalDependency installedIndex (packageName pkgid) vr ln of- [] -> Left (DependencyMissingInternal dep_pkgname (packageName pkgid))- pkgs -> Right $ head $ snd $ last pkgs+ Nothing -> Left (DependencyMissingInternal dep_pkgname (packageName pkgid))+ Just pkg -> Right pkg + pickLastIPI :: [(Version, [InstalledPackageInfo])] -> Maybe InstalledPackageInfo+ pickLastIPI pkgs = safeHead . snd . last =<< nonEmpty pkgs+ reportSelectedDependencies :: Verbosity -> [ResolvedDependency] -> IO () reportSelectedDependencies verbosity deps =@@ -1772,7 +1776,7 @@ findOffendingHdr = ifBuildsWith allHeaders ccArgs (return Nothing)- (go . tail . inits $ allHeaders)+ (go . Prelude.tail . inits $ allHeaders) -- inits always contains at least [] where go [] = return Nothing -- cannot happen go (hdrs:hdrsInits) =@@ -1781,9 +1785,10 @@ -- If that works, try compiling too (ifBuildsWith hdrs ccArgs (go hdrsInits)- (return . Just . Right . last $ hdrs))- (return . Just . Left . last $ hdrs)+ (return . fmap Right . safeLast $ hdrs))+ (return . fmap Left . safeLast $ hdrs) + cppArgs = "-E":commonCppArgs -- preprocess only ccArgs = "-c":commonCcArgs -- don't try to link @@ -2003,7 +2008,7 @@ -- database to which the package is installed are relative to the -- prefix of the package depsPrefixRelative = do- pkgr <- GHC.pkgRoot verbosity lbi (last (withPackageDB lbi))+ pkgr <- GHC.pkgRoot verbosity lbi (registrationPackageDB (withPackageDB lbi)) traverse_ (doCheck pkgr) ipkgs where doCheck pkgr ipkg
Distribution/Simple/Flag.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-} -----------------------------------------------------------------------------@@ -51,9 +52,10 @@ -- Its monoid instance gives us the behaviour where it starts out as -- 'NoFlag' and later flags override earlier ones. ---data Flag a = Flag a | NoFlag deriving (Eq, Generic, Show, Read)+data Flag a = Flag a | NoFlag deriving (Eq, Generic, Show, Read, Typeable) instance Binary a => Binary (Flag a)+instance Structured a => Structured (Flag a) instance Functor Flag where fmap f (Flag x) = Flag (f x)
Distribution/Simple/GHC.hs view
@@ -138,11 +138,11 @@ (userMaybeSpecifyPath "ghc" hcPath conf0) let implInfo = ghcVersionImplInfo ghcVersion - -- Cabal currently supports ghc >= 7.0.1 && < 8.10- unless (ghcVersion < mkVersion [8,10]) $+ -- Cabal currently supports ghc >= 7.0.1 && < 8.12+ unless (ghcVersion < mkVersion [8,12]) $ warn verbosity $ "Unknown/unsupported 'ghc' version detected "- ++ "(Cabal " ++ prettyShow cabalVersion ++ " supports 'ghc' version < 8.10): "+ ++ "(Cabal " ++ prettyShow cabalVersion ++ " supports 'ghc' version < 8.12): " ++ programPath ghcProg ++ " is version " ++ prettyShow ghcVersion -- This is slightly tricky, we have to configure ghc first, then we use the@@ -317,7 +317,7 @@ getGhcInfo :: Verbosity -> ConfiguredProgram -> IO [(String, String)] getGhcInfo verbosity ghcProg = Internal.getGhcInfo verbosity implInfo ghcProg where- Just version = programVersion ghcProg+ version = fromMaybe (error "GHC.getGhcInfo: no ghc version") $ programVersion ghcProg implInfo = ghcVersionImplInfo version -- | Given a single package DB, return all installed packages.@@ -363,7 +363,7 @@ return $! mconcat indices where- Just ghcProg = lookupProgram ghcProgram progdb+ ghcProg = fromMaybe (error "GHC.toPackageIndex: no ghc program") $ lookupProgram ghcProgram progdb getLibDir :: Verbosity -> LocalBuildInfo -> IO FilePath getLibDir verbosity lbi =@@ -396,7 +396,7 @@ platformAndVersion = Internal.ghcPlatformAndVersionString platform ghcVersion packageConfFileName = "package.conf.d"- Just ghcVersion = programVersion ghcProg+ ghcVersion = fromMaybe (error "GHC.getUserPackageDB: no ghc version") $ programVersion ghcProg checkPackageDbEnvVar :: Verbosity -> IO () checkPackageDbEnvVar verbosity =@@ -475,7 +475,7 @@ if isFileStyle then return path else return (path </> "package.cache") - Just ghcProg = lookupProgram ghcProgram progdb+ ghcProg = fromMaybe (error "GHC.toPackageIndex: no ghc program") $ lookupProgram ghcProgram progdb -- -----------------------------------------------------------------------------@@ -1139,24 +1139,26 @@ -- https://github.com/haskell/cabal/pull/4539#discussion_r118981753. decodeMainIsArg :: String -> Maybe ModuleName decodeMainIsArg arg- | not (null main_fn) && isLower (head main_fn)+ | headOf main_fn isLower -- The arg looked like "Foo.Bar.baz" = Just (ModuleName.fromString main_mod)- | isUpper (head arg) -- The arg looked like "Foo" or "Foo.Bar"+ | headOf arg isUpper -- The arg looked like "Foo" or "Foo.Bar" = Just (ModuleName.fromString arg) | otherwise -- The arg looked like "baz" = Nothing where+ headOf :: String -> (Char -> Bool) -> Bool+ headOf str pred' = any pred' (safeHead str)+ (main_mod, main_fn) = splitLongestPrefix arg (== '.') splitLongestPrefix :: String -> (Char -> Bool) -> (String,String) splitLongestPrefix str pred' | null r_pre = (str, [])- | otherwise = (reverse (tail r_pre), reverse r_suf)- -- 'tail' drops the char satisfying 'pred'+ | otherwise = (reverse (safeTail r_pre), reverse r_suf)+ -- 'safeTail' drops the char satisfying 'pred' where (r_suf, r_pre) = break pred' (reverse str) - -- | A collection of: -- * C input files -- * C++ input files@@ -2030,9 +2032,9 @@ , HcPkg.suppressFilesCheck = v >= [6,6] } where- v = versionNumbers ver- Just ghcPkgProg = lookupProgram ghcPkgProgram progdb- Just ver = programVersion ghcPkgProg+ v = versionNumbers ver+ ghcPkgProg = fromMaybe (error "GHC.hcPkgInfo: no ghc program") $ lookupProgram ghcPkgProgram progdb+ ver = fromMaybe (error "GHC.hcPkgInfo: no ghc version") $ programVersion ghcPkgProg registerPackage :: Verbosity@@ -2049,7 +2051,7 @@ pkgRoot verbosity lbi = pkgRoot' where pkgRoot' GlobalPackageDB =- let Just ghcProg = lookupProgram ghcProgram (withPrograms lbi)+ let ghcProg = fromMaybe (error "GHC.pkgRoot: no ghc program") $ lookupProgram ghcProgram (withPrograms lbi) in fmap takeDirectory (getGlobalPackageDB verbosity ghcProg) pkgRoot' UserPackageDB = do appDir <- getAppUserDataDirectory "ghc"
Distribution/Simple/GHCJS.hs view
@@ -241,7 +241,7 @@ getGhcInfo :: Verbosity -> ConfiguredProgram -> IO [(String, String)] getGhcInfo verbosity ghcjsProg = Internal.getGhcInfo verbosity implInfo ghcjsProg where- Just version = programVersion ghcjsProg+ version = fromMaybe (error "GHCJS.getGhcInfo: no version") $ programVersion ghcjsProg implInfo = ghcVersionImplInfo version -- | Given a single package DB, return all installed packages.@@ -275,7 +275,7 @@ return $! (mconcat indices) where- Just ghcjsProg = lookupProgram ghcjsProgram progdb+ ghcjsProg = fromMaybe (error "GHCJS.toPackageIndex no ghcjs program") $ lookupProgram ghcjsProgram progdb getLibDir :: Verbosity -> LocalBuildInfo -> IO FilePath getLibDir verbosity lbi =@@ -307,7 +307,7 @@ platformAndVersion = Internal.ghcPlatformAndVersionString platform ghcjsVersion packageConfFileName = "package.conf.d"- Just ghcjsVersion = programVersion ghcjsProg+ ghcjsVersion = fromMaybe (error "GHCJS.getUserPackageDB: no version") $ programVersion ghcjsProg checkPackageDbEnvVar :: Verbosity -> IO () checkPackageDbEnvVar verbosity =@@ -360,7 +360,7 @@ if isFileStyle then return path else return (path </> "package.cache") - Just ghcjsProg = lookupProgram ghcjsProgram progdb+ ghcjsProg = fromMaybe (error "GHCJS.toPackageIndex no ghcjs program") $ lookupProgram ghcjsProgram progdb toJSLibName :: String -> String@@ -926,21 +926,24 @@ -- https://github.com/haskell/cabal/pull/4539#discussion_r118981753. decodeMainIsArg :: String -> Maybe ModuleName decodeMainIsArg arg- | not (null main_fn) && isLower (head main_fn)+ | headOf main_fn isLower -- The arg looked like "Foo.Bar.baz" = Just (ModuleName.fromString main_mod)- | isUpper (head arg) -- The arg looked like "Foo" or "Foo.Bar"+ | headOf arg isUpper -- The arg looked like "Foo" or "Foo.Bar" = Just (ModuleName.fromString arg) | otherwise -- The arg looked like "baz" = Nothing where+ headOf :: String -> (Char -> Bool) -> Bool+ headOf str pred' = any pred' (safeHead str)+ (main_mod, main_fn) = splitLongestPrefix arg (== '.') splitLongestPrefix :: String -> (Char -> Bool) -> (String,String) splitLongestPrefix str pred' | null r_pre = (str, [])- | otherwise = (reverse (tail r_pre), reverse r_suf)- -- 'tail' drops the char satisfying 'pred'+ | otherwise = (reverse (safeTail r_pre), reverse r_suf)+ -- 'safeTail' drops the char satisfying 'pred' where (r_suf, r_pre) = break pred' (reverse str) @@ -1779,8 +1782,8 @@ } where v7_10 = mkVersion [7,10]- Just ghcjsPkgProg = lookupProgram ghcjsPkgProgram progdb- Just ver = programVersion ghcjsPkgProg+ ghcjsPkgProg = fromMaybe (error "GHCJS.hcPkgInfo no ghcjs program") $ lookupProgram ghcjsPkgProgram progdb+ ver = fromMaybe (error "GHCJS.hcPkgInfo no ghcjs version") $ programVersion ghcjsPkgProg registerPackage :: Verbosity@@ -1797,7 +1800,7 @@ pkgRoot verbosity lbi = pkgRoot' where pkgRoot' GlobalPackageDB =- let Just ghcjsProg = lookupProgram ghcjsProgram (withPrograms lbi)+ let ghcjsProg = fromMaybe (error "GHCJS.pkgRoot: no ghcjs program") $ lookupProgram ghcjsProgram (withPrograms lbi) in fmap takeDirectory (getGlobalPackageDB verbosity ghcjsProg) pkgRoot' UserPackageDB = do appDir <- getAppUserDataDirectory "ghcjs"@@ -1827,4 +1830,4 @@ ) where script = exe <.> "jsexe" </> "all" <.> "js"- Just ghcjsProg = lookupProgram ghcjsProgram progdb+ ghcjsProg = fromMaybe (error "GHCJS.runCmd: no ghcjs program") $ lookupProgram ghcjsProgram progdb
Distribution/Simple/Glob.hs view
@@ -37,6 +37,8 @@ import System.Directory (getDirectoryContents, doesDirectoryExist, doesFileExist) import System.FilePath (joinPath, splitExtensions, splitDirectories, takeFileName, (</>), (<.>)) +import qualified Data.List.NonEmpty as NE+ -- Note throughout that we use splitDirectories, not splitPath. On -- Posix, this makes no difference, but, because Windows accepts both -- slash and backslash as its path separators, if we left in the@@ -151,7 +153,7 @@ fileGlobMatchesSegments pat' segs GlobFinal final -> case final of FinalMatch Recursive multidot ext -> do- let (candidateBase, candidateExts) = splitExtensions (last $ seg:segs)+ let (candidateBase, candidateExts) = splitExtensions (NE.last $ seg:|segs) guard (not (null candidateBase)) checkExt multidot ext candidateExts FinalMatch NonRecursive multidot ext -> do
Distribution/Simple/Haddock.hs view
@@ -66,6 +66,7 @@ import Distribution.Parsec (simpleParsec) import Distribution.Utils.NubList import Distribution.Version+import qualified Distribution.Utils.ShortText as ShortText import Distribution.Verbosity import Language.Haskell.Extension@@ -352,20 +353,23 @@ ghcArgs = fromMaybe [] . lookup "ghc" . haddockProgramArgs $ flags fromPackageDescription :: HaddockTarget -> PackageDescription -> HaddockArgs-fromPackageDescription haddockTarget pkg_descr =- mempty { argInterfaceFile = Flag $ haddockName pkg_descr,- argPackageName = Flag $ packageId $ pkg_descr,- argOutputDir = Dir $- "doc" </> "html" </> haddockDirName haddockTarget pkg_descr,- argPrologue = Flag $ if null desc then synopsis pkg_descr- else desc,- argTitle = Flag $ showPkg ++ subtitle- }- where- desc = PD.description pkg_descr- showPkg = prettyShow (packageId pkg_descr)- subtitle | null (synopsis pkg_descr) = ""- | otherwise = ": " ++ synopsis pkg_descr+fromPackageDescription haddockTarget pkg_descr = mempty+ { argInterfaceFile = Flag $ haddockName pkg_descr+ , argPackageName = Flag $ packageId $ pkg_descr+ , argOutputDir = Dir $+ "doc" </> "html" </> haddockDirName haddockTarget pkg_descr+ , argPrologue = Flag $ ShortText.fromShortText $+ if ShortText.null desc+ then synopsis pkg_descr+ else desc+ , argTitle = Flag $ showPkg ++ subtitle+ }+ where+ desc = PD.description pkg_descr+ showPkg = prettyShow (packageId pkg_descr)+ subtitle+ | ShortText.null (synopsis pkg_descr) = ""+ | otherwise = ": " ++ ShortText.fromShortText (synopsis pkg_descr) componentGhcOptions :: Verbosity -> LocalBuildInfo -> BuildInfo -> ComponentLocalBuildInfo -> FilePath@@ -521,7 +525,11 @@ haddockVersionMacro = "-D__HADDOCK_VERSION__=" ++ show (v1 * 1000 + v2 * 10 + v3) where- [v1, v2, v3] = take 3 $ versionNumbers haddockVersion ++ [0,0]+ (v1, v2, v3) = case versionNumbers haddockVersion of+ [] -> (0,0,0)+ [x] -> (x,0,0)+ [x,y] -> (x,y,0)+ (x:y:z:_) -> (x,y,z) getGhcLibDir :: Verbosity -> LocalBuildInfo -> IO HaddockArgs
Distribution/Simple/HaskellSuite.hs view
@@ -9,6 +9,7 @@ import Data.Either (partitionEithers) import qualified Data.Map as Map (empty)+import qualified Data.List.NonEmpty as NE import Distribution.Simple.Program import Distribution.Simple.Compiler as Compiler@@ -91,15 +92,15 @@ hstoolVersion = findProgramVersion "--hspkg-version" id numericVersion :: Verbosity -> FilePath -> IO (Maybe Version)-numericVersion = findProgramVersion "--compiler-version" (last . words)+numericVersion = findProgramVersion "--compiler-version" (fromMaybe "" . safeLast . words) getCompilerVersion :: Verbosity -> ConfiguredProgram -> IO (String, Version) getCompilerVersion verbosity prog = do output <- rawSystemStdout verbosity (programPath prog) ["--compiler-version"] let parts = words output- name = concat $ init parts -- there shouldn't be any spaces in the name anyway- versionStr = last parts+ name = concat $ safeInit parts -- there shouldn't be any spaces in the name anyway+ versionStr = fromMaybe "" $ safeLast parts version <- maybe (die' verbosity "haskell-suite: couldn't determine compiler version") return $ simpleParsec versionStr@@ -137,9 +138,9 @@ where parsePackages str =- case partitionEithers $ map parseInstalledPackageInfo (splitPkgs str) of+ case partitionEithers $ map (parseInstalledPackageInfo . toUTF8BS) (splitPkgs str) of ([], ok) -> Right [ pkg | (_, pkg) <- ok ]- (msgss, _) -> Left (concat msgss)+ (msgss, _) -> Left (foldMap NE.toList msgss) splitPkgs :: String -> [String] splitPkgs = map unlines . splitWith ("---" ==) . lines@@ -216,8 +217,8 @@ runProgramInvocation verbosity $ (programInvocation hspkg- ["update", packageDbOpt $ last packageDbs])- { progInvokeInput = Just $ showInstalledPackageInfo installedPkgInfo }+ ["update", packageDbOpt $ registrationPackageDB packageDbs])+ { progInvokeInput = Just $ IODataText $ showInstalledPackageInfo installedPkgInfo } initPackageDB :: Verbosity -> ProgramDb -> FilePath -> IO () initPackageDB verbosity progdb dbPath =
Distribution/Simple/InstallDirs.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-}@@ -98,9 +99,10 @@ htmldir :: dir, haddockdir :: dir, sysconfdir :: dir- } deriving (Eq, Read, Show, Functor, Generic)+ } deriving (Eq, Read, Show, Functor, Generic, Typeable) instance Binary dir => Binary (InstallDirs dir)+instance Structured dir => Structured (InstallDirs dir) instance (Semigroup dir, Monoid dir) => Monoid (InstallDirs dir) where mempty = gmempty@@ -352,9 +354,10 @@ -- substituted for to get a real 'FilePath'. -- newtype PathTemplate = PathTemplate [PathComponent]- deriving (Eq, Ord, Generic)+ deriving (Eq, Ord, Generic, Typeable) instance Binary PathTemplate+instance Structured PathTemplate type PathTemplateEnv = [(PathTemplateVariable, PathTemplate)]
Distribution/Simple/InstallDirs/Internal.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} module Distribution.Simple.InstallDirs.Internal ( PathComponent(..)@@ -10,9 +11,10 @@ data PathComponent = Ordinary FilePath | Variable PathTemplateVariable- deriving (Eq, Ord, Generic)+ deriving (Eq, Ord, Generic, Typeable) instance Binary PathComponent+instance Structured PathComponent data PathTemplateVariable = PrefixVar -- ^ The @$prefix@ path variable@@ -39,9 +41,10 @@ | TestSuiteResultVar -- ^ The result of the test suite being run, eg -- @pass@, @fail@, or @error@. | BenchmarkNameVar -- ^ The name of the benchmark being run- deriving (Eq, Ord, Generic)+ deriving (Eq, Ord, Generic, Typeable) instance Binary PathTemplateVariable+instance Structured PathTemplateVariable instance Show PathTemplateVariable where show PrefixVar = "prefix"
Distribution/Simple/PackageIndex.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-}@@ -112,6 +113,7 @@ import qualified Data.Array as Array import qualified Data.Graph as Graph import Data.List as List ( groupBy, deleteBy, deleteFirstsBy )+import qualified Data.List.NonEmpty as NE import qualified Data.Tree as Tree import Control.Monad import Distribution.Compat.Stack@@ -143,9 +145,10 @@ -- preserved. See #1463 for discussion. packageIdIndex :: !(Map (PackageName, LibraryName) (Map Version [a])) - } deriving (Eq, Generic, Show, Read)+ } deriving (Eq, Generic, Show, Read, Typeable) instance Binary a => Binary (PackageIndex a)+instance Structured a => Structured (PackageIndex a) -- | The default package index which contains 'InstalledPackageInfo'. Normally -- use this.@@ -210,20 +213,20 @@ -- ones. -- fromList :: [IPI.InstalledPackageInfo] -> InstalledPackageIndex-fromList pkgs = mkPackageIndex pids pnames+fromList pkgs = mkPackageIndex pids ((fmap . fmap) toList pnames) where pids = Map.fromList [ (installedUnitId pkg, pkg) | pkg <- pkgs ] pnames = Map.fromList- [ (liftM2 (,) packageName IPI.sourceLibName (head pkgsN), pvers)- | pkgsN <- groupBy (equating (liftM2 (,) packageName IPI.sourceLibName))+ [ (liftM2 (,) packageName IPI.sourceLibName (NE.head pkgsN), pvers)+ | pkgsN <- NE.groupBy (equating (liftM2 (,) packageName IPI.sourceLibName)) . sortBy (comparing (liftM3 (,,) packageName IPI.sourceLibName packageVersion)) $ pkgs , let pvers = Map.fromList- [ (packageVersion (head pkgsNV),- nubBy (equating installedUnitId) (reverse pkgsNV))- | pkgsNV <- groupBy (equating packageVersion) pkgsN+ [ (packageVersion (NE.head pkgsNV),+ NE.nubBy (equating installedUnitId) (NE.reverse pkgsNV))+ | pkgsNV <- NE.groupBy (equating packageVersion) pkgsN ] ]
Distribution/Simple/PreProcess.hs view
@@ -269,7 +269,7 @@ let (srcStem, ext) = splitExtension psrcRelFile psrcFile = psrcLoc </> psrcRelFile pp = fromMaybe (error "Distribution.Simple.PreProcess: Just expected")- (lookup (tailNotNull ext) handlers)+ (lookup (safeTail ext) handlers) -- Preprocessing files for 'sdist' is different from preprocessing -- for 'build'. When preprocessing for sdist we preprocess to -- avoid that the user has to have the preprocessors available.@@ -296,8 +296,6 @@ where dirName = takeDirectory- tailNotNull [] = []- tailNotNull x = tail x -- FIXME: This is a somewhat nasty hack. GHC requires that hs-boot files -- be in the same place as the hs files, so if we put the hs file in dist/@@ -727,8 +725,9 @@ pp $ buildDir lbi </> nm' </> nm' ++ "-tmp" TestSuiteLibV09 _ _ -> pp $ buildDir lbi </> stubName test </> stubName test ++ "-tmp"- TestSuiteUnsupported tt -> die' verbosity $ "No support for preprocessing test "- ++ "suite type " ++ prettyShow tt+ TestSuiteUnsupported tt ->+ die' verbosity $ "No support for preprocessing test suite type " +++ prettyShow tt CBench bm -> do let nm' = unUnqualComponentName $ benchmarkName bm case benchmarkInterface bm of
Distribution/Simple/PreProcess/Unlit.hs view
@@ -17,6 +17,7 @@ import Prelude () import Distribution.Compat.Prelude+import Distribution.Utils.Generic (safeTail, safeLast, safeInit) import Data.List (mapAccumL) @@ -33,12 +34,10 @@ classify :: String -> Classified classify ('>':s) = BirdTrack s classify ('#':s) = case tokens s of- (line:file:_) | all isDigit line- && length file >= 2- && head file == '"'- && last file == '"'+ (line:file@('"':_:_):_) | all isDigit line+ && safeLast file == Just '"' -- this shouldn't fail as we tested for 'all isDigit'- -> Line (fromMaybe (error $ "panic! read @Int " ++ show line) $ readMaybe line) (tail (init file)) -- TODO:eradicateNoParse+ -> Line (fromMaybe (error $ "panic! read @Int " ++ show line) $ readMaybe line) (safeTail (safeInit file)) -- TODO:eradicateNoParse _ -> CPP s where tokens = unfoldr $ \str -> case lex str of (t@(_:_), str'):_ -> Just (t, str')
Distribution/Simple/Program.hs view
@@ -61,6 +61,7 @@ , programInvocation , runProgramInvocation , getProgramInvocationOutput+ , getProgramInvocationLBS -- * The collection of unconfigured and configured programs , builtinPrograms
Distribution/Simple/Program/Db.hs view
@@ -1,6 +1,6 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE RankNTypes #-} {-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE RankNTypes #-} ----------------------------------------------------------------------------- -- |@@ -61,19 +61,21 @@ ) where -import Prelude () import Distribution.Compat.Prelude+import Prelude () -import Distribution.Simple.Program.Types-import Distribution.Simple.Program.Find+import Distribution.Pretty import Distribution.Simple.Program.Builtin+import Distribution.Simple.Program.Find+import Distribution.Simple.Program.Types import Distribution.Simple.Utils-import Distribution.Version-import Distribution.Pretty+import Distribution.Utils.Structured (Structure (..), Structured (..)) import Distribution.Verbosity+import Distribution.Version import Control.Monad (join)-import Data.Tuple (swap)+import Data.Tuple (swap)+ import qualified Data.Map as Map -- ------------------------------------------------------------@@ -150,6 +152,12 @@ progSearchPath = searchpath, configuredProgs = progs }++instance Structured ProgramDb where+ structure p = Nominal (typeRep p) 0 "ProgramDb"+ [ structure (Proxy :: Proxy ProgramSearchPath)+ , structure (Proxy :: Proxy ConfiguredProgs)+ ] -- | The 'Read'\/'Show' and 'Binary' instances do not preserve all the
Distribution/Simple/Program/Find.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-}@@ -67,9 +68,10 @@ data ProgramSearchPathEntry = ProgramSearchPathDir FilePath -- ^ A specific dir | ProgramSearchPathDefault -- ^ The system default- deriving (Eq, Generic)+ deriving (Eq, Generic, Typeable) instance Binary ProgramSearchPathEntry+instance Structured ProgramSearchPathEntry defaultProgramSearchPath :: ProgramSearchPath defaultProgramSearchPath = [ProgramSearchPathDefault]
Distribution/Simple/Program/GHC.hs view
@@ -45,7 +45,6 @@ import Data.List (stripPrefix) import qualified Data.Map as Map import Data.Monoid (All(..), Any(..), Endo(..))-import Data.Set (Set) import qualified Data.Set as Set normaliseGhcArgs :: Maybe Version -> PackageDescription -> [String] -> [String]@@ -56,7 +55,7 @@ supportedGHCVersions :: VersionRange supportedGHCVersions = intersectVersionRanges (orLaterVersion (mkVersion [8,0]))- (earlierVersion (mkVersion [8,9]))+ (earlierVersion (mkVersion [8,11])) from :: Monoid m => [Int] -> m -> m from version flags@@ -193,6 +192,11 @@ ] , from [8,4] ["show-loaded-modules"] , from [8,6] [ "ghci-leak-check", "no-it" ]+ , from [8,10]+ [ "defer-diagnostics" -- affects printing of diagnostics+ , "keep-going" -- try harder, the build will still fail if it's erroneous+ , "print-axiom-incomps" -- print more debug info for closed type families+ ] ] , flagIn . invertibleFlagSet "-d" $ [ "ppr-case-as-let", "ppr-ticks" ] , isOptIntFlag@@ -764,8 +768,10 @@ --------------- -- Inputs - , [ prettyShow modu | modu <- flags ghcOptInputModules ]+ -- Specify the input file(s) first, so that in ghci the `main-is` module is+ -- in scope instead of the first module defined in `other-modules`. , flags ghcOptInputFiles+ , [ prettyShow modu | modu <- flags ghcOptInputModules ] , concat [ [ "-o", out] | out <- flag ghcOptOutputFile ] , concat [ [ "-dyno", out] | out <- flag ghcOptOutputDynFile ]
Distribution/Simple/Program/HcPkg.hs view
@@ -1,5 +1,7 @@-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE OverloadedStrings #-} ----------------------------------------------------------------------------- -- |@@ -42,29 +44,28 @@ listInvocation, ) where -import Prelude () import Distribution.Compat.Prelude hiding (init)--import Data.Either (partitionEithers)+import Prelude () +import Distribution.Compat.Exception import Distribution.InstalledPackageInfo+import Distribution.Parsec+import Distribution.Pretty import Distribution.Simple.Compiler-import Distribution.Simple.Program.Types import Distribution.Simple.Program.Run+import Distribution.Simple.Program.Types import Distribution.Simple.Utils-import Distribution.Parsec-import Distribution.Pretty import Distribution.Types.ComponentId import Distribution.Types.PackageId import Distribution.Types.UnitId import Distribution.Verbosity-import Distribution.Compat.Exception -import Data.List- ( stripPrefix )-import System.FilePath as FilePath- ( (</>), (<.>)- , splitPath, splitDirectories, joinPath, isPathSeparator )+import Data.List (stripPrefix)+import System.FilePath as FilePath (isPathSeparator, joinPath, splitDirectories, splitPath, (<.>), (</>))++import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy as LBS+import qualified Data.List.NonEmpty as NE import qualified System.FilePath.Posix as FilePath.Posix -- | Information about the features and capabilities of an @hc-pkg@@@ -161,7 +162,7 @@ -- | registerMultiInstance registerOptions , recacheMultiInstance hpi- = do let pkgdb = last packagedbs+ = do let pkgdb = registrationPackageDB packagedbs writeRegistrationFileDirectly verbosity hpi pkgdb pkgInfo recache hpi verbosity pkgdb @@ -224,9 +225,9 @@ describe :: HcPkgInfo -> Verbosity -> PackageDBStack -> PackageId -> IO [InstalledPackageInfo] describe hpi verbosity packagedb pid = do - output <- getProgramInvocationOutput verbosity+ output <- getProgramInvocationLBS verbosity (describeInvocation hpi verbosity packagedb pid)- `catchIO` \_ -> return ""+ `catchIO` \_ -> return mempty case parsePackages output of Left ok -> return ok@@ -249,7 +250,7 @@ dump :: HcPkgInfo -> Verbosity -> PackageDB -> IO [InstalledPackageInfo] dump hpi verbosity packagedb = do - output <- getProgramInvocationOutput verbosity+ output <- getProgramInvocationLBS verbosity (dumpInvocation hpi verbosity packagedb) `catchIO` \e -> die' verbosity $ programId (hcPkgProgram hpi) ++ " dump failed: " ++ displayException e@@ -259,27 +260,51 @@ _ -> die' verbosity $ "failed to parse output of '" ++ programId (hcPkgProgram hpi) ++ " dump'" -parsePackages :: String -> Either [InstalledPackageInfo] [String]-parsePackages str =- case partitionEithers $ map parseInstalledPackageInfo (splitPkgs str) of- ([], ok) -> Left [ setUnitId . maybe id mungePackagePaths (pkgRoot pkg) $ pkg | (_, pkg) <- ok ]- (msgss, _) -> Right (concat msgss) ---TODO: this could be a lot faster. We're doing normaliseLineEndings twice--- and converting back and forth with lines/unlines.-splitPkgs :: String -> [String]-splitPkgs = checkEmpty . map unlines . splitWith ("---" ==) . lines+parsePackages :: LBS.ByteString -> Either [InstalledPackageInfo] [String]+parsePackages lbs0 =+ case traverse parseInstalledPackageInfo $ splitPkgs lbs0 of+ Right ok -> Left [ setUnitId . maybe id mungePackagePaths (pkgRoot pkg) $ pkg | (_, pkg) <- ok ]+ Left msgs -> Right (NE.toList msgs) where- -- Handle the case of there being no packages at all.- checkEmpty [s] | all isSpace s = []- checkEmpty ss = ss+ splitPkgs :: LBS.ByteString -> [BS.ByteString]+ splitPkgs = checkEmpty . doSplit+ where+ -- Handle the case of there being no packages at all.+ checkEmpty [s] | BS.all isSpace8 s = []+ checkEmpty ss = ss - splitWith :: (a -> Bool) -> [a] -> [[a]]- splitWith p xs = ys : case zs of- [] -> []- _:ws -> splitWith p ws- where (ys,zs) = break p xs+ isSpace8 :: Word8 -> Bool+ isSpace8 9 = True -- '\t'+ isSpace8 10 = True -- '\n'+ isSpace8 13 = True -- '\r'+ isSpace8 32 = True -- ' '+ isSpace8 _ = False + doSplit :: LBS.ByteString -> [BS.ByteString]+ doSplit lbs = go (LBS.findIndices (\w -> w == 10 || w == 13) lbs)+ where+ go :: [Int64] -> [BS.ByteString]+ go [] = [ LBS.toStrict lbs ]+ go (idx:idxs) =+ let (pfx, sfx) = LBS.splitAt idx lbs+ in case foldr (<|>) Nothing $ map (`lbsStripPrefix` sfx) separators of+ Just sfx' -> LBS.toStrict pfx : doSplit sfx'+ Nothing -> go idxs++ separators :: [LBS.ByteString]+ separators = ["\n---\n", "\r\n---\r\n", "\r---\r"]++lbsStripPrefix :: LBS.ByteString -> LBS.ByteString -> Maybe LBS.ByteString+#if MIN_VERSION_bytestring(0,10,8)+lbsStripPrefix pfx lbs = LBS.stripPrefix pfx lbs+#else+lbsStripPrefix pfx lbs+ | LBS.isPrefixOf pfx lbs = Just (LBS.drop (LBS.length pfx) lbs)+ | otherwise = Nothing+#endif++ mungePackagePaths :: FilePath -> InstalledPackageInfo -> InstalledPackageInfo -- Perform path/URL variable substitution as per the Cabal ${pkgroot} spec -- (http://www.haskell.org/pipermail/libraries/2009-May/011772.html)@@ -375,7 +400,7 @@ -> ProgramInvocation registerInvocation hpi verbosity packagedbs pkgInfo registerOptions = (programInvocation (hcPkgProgram hpi) (args "-")) {- progInvokeInput = Just (showInstalledPackageInfo pkgInfo),+ progInvokeInput = Just $ IODataText $ showInstalledPackageInfo pkgInfo, progInvokeInputEncoding = IOEncodingUTF8 } where@@ -385,9 +410,7 @@ | otherwise = "register" args file = [cmdname, file]- ++ (if noPkgDbStack hpi- then [packageDbOpts hpi (last packagedbs)]- else packageDbStackOpts hpi packagedbs)+ ++ packageDbStackOpts hpi packagedbs ++ [ "--enable-multi-instance" | registerMultiInstance registerOptions ] ++ [ "--force-files"@@ -422,9 +445,7 @@ describeInvocation hpi verbosity packagedbs pkgid = programInvocation (hcPkgProgram hpi) $ ["describe", prettyShow pkgid]- ++ (if noPkgDbStack hpi- then [packageDbOpts hpi (last packagedbs)]- else packageDbStackOpts hpi packagedbs)+ ++ packageDbStackOpts hpi packagedbs ++ verbosityOpts hpi verbosity hideInvocation :: HcPkgInfo -> Verbosity -> PackageDB -> PackageId@@ -459,19 +480,21 @@ packageDbStackOpts :: HcPkgInfo -> PackageDBStack -> [String]-packageDbStackOpts hpi dbstack = case dbstack of- (GlobalPackageDB:UserPackageDB:dbs) -> "--global"- : "--user"- : map specific dbs- (GlobalPackageDB:dbs) -> "--global"- : ("--no-user-" ++ packageDbFlag hpi)- : map specific dbs- _ -> ierror- where- specific (SpecificPackageDB db) = "--" ++ packageDbFlag hpi ++ "=" ++ db- specific _ = ierror- ierror :: a- ierror = error ("internal error: unexpected package db stack: " ++ show dbstack)+packageDbStackOpts hpi dbstack+ | noPkgDbStack hpi = [packageDbOpts hpi (registrationPackageDB dbstack)]+ | otherwise = case dbstack of+ (GlobalPackageDB:UserPackageDB:dbs) -> "--global"+ : "--user"+ : map specific dbs+ (GlobalPackageDB:dbs) -> "--global"+ : ("--no-user-" ++ packageDbFlag hpi)+ : map specific dbs+ _ -> ierror+ where+ specific (SpecificPackageDB db) = "--" ++ packageDbFlag hpi ++ "=" ++ db+ specific _ = ierror+ ierror :: a+ ierror = error ("internal error: unexpected package db stack: " ++ show dbstack) packageDbFlag :: HcPkgInfo -> String packageDbFlag hpi
Distribution/Simple/Program/Internal.hs view
@@ -13,6 +13,7 @@ import Prelude () import Distribution.Compat.Prelude+import Distribution.Utils.Generic(safeTail) -- | Extract the version number from the output of 'strip --version'. --@@ -29,7 +30,7 @@ filterPar' :: Int -> [String] -> [String] filterPar' _ [] = [] filterPar' n (x:xs)- | n >= 0 && "(" `isPrefixOf` x = filterPar' (n+1) ((tail x):xs)+ | n >= 0 && "(" `isPrefixOf` x = filterPar' (n+1) ((safeTail x):xs) | n > 0 && ")" `isSuffixOf` x = filterPar' (n-1) xs | n > 0 = filterPar' n xs | otherwise = x:filterPar' n xs
Distribution/Simple/Program/Run.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE RankNTypes #-} ----------------------------------------------------------------------------- -- |@@ -22,24 +23,27 @@ runProgramInvocation, getProgramInvocationOutput,+ getProgramInvocationLBS, getProgramInvocationOutputAndErrors, getEffectiveEnvironment, ) where -import Prelude () import Distribution.Compat.Prelude+import Prelude () +import Distribution.Compat.Environment import Distribution.Simple.Program.Types import Distribution.Simple.Utils+import Distribution.Utils.Generic import Distribution.Verbosity-import Distribution.Compat.Environment -import qualified Data.Map as Map+import System.Exit (ExitCode (..), exitWith) import System.FilePath-import System.Exit- ( ExitCode(..), exitWith ) +import qualified Data.ByteString.Lazy as LBS+import qualified Data.Map as Map+ -- | Represents a specific invocation of a specific program. -- -- This is used as an intermediate type between deciding how to call a program@@ -54,17 +58,18 @@ -- Extra paths to add to PATH progInvokePathEnv :: [FilePath], progInvokeCwd :: Maybe FilePath,- progInvokeInput :: Maybe String,- progInvokeInputEncoding :: IOEncoding,+ progInvokeInput :: Maybe IOData,+ progInvokeInputEncoding :: IOEncoding, -- ^ TODO: remove this, make user decide when constructing 'progInvokeInput'. progInvokeOutputEncoding :: IOEncoding } data IOEncoding = IOEncodingText -- locale mode text | IOEncodingUTF8 -- always utf8 -encodeToIOData :: IOEncoding -> String -> IOData-encodeToIOData IOEncodingText = IODataText-encodeToIOData IOEncodingUTF8 = IODataBinary . toUTF8LBS+encodeToIOData :: IOEncoding -> IOData -> IOData+encodeToIOData _ iod@(IODataBinary _) = iod+encodeToIOData IOEncodingText iod@(IODataText _) = iod+encodeToIOData IOEncodingUTF8 (IODataText str) = IODataBinary (toUTF8LBS str) emptyProgramInvocation :: ProgramInvocation emptyProgramInvocation =@@ -155,32 +160,41 @@ die' verbosity $ "'" ++ progInvokePath inv ++ "' exited with an error:\n" ++ errors return output +getProgramInvocationLBS :: Verbosity -> ProgramInvocation -> IO LBS.ByteString+getProgramInvocationLBS verbosity inv = do+ (output, errors, exitCode) <- getProgramInvocationIODataAndErrors verbosity inv IODataModeBinary+ when (exitCode /= ExitSuccess) $+ die' verbosity $ "'" ++ progInvokePath inv ++ "' exited with an error:\n" ++ errors+ return output getProgramInvocationOutputAndErrors :: Verbosity -> ProgramInvocation -> IO (String, String, ExitCode)-getProgramInvocationOutputAndErrors verbosity- ProgramInvocation {- progInvokePath = path,- progInvokeArgs = args,- progInvokeEnv = envOverrides,- progInvokePathEnv = extraPath,- progInvokeCwd = mcwd,- progInvokeInput = minputStr,- progInvokeOutputEncoding = encoding- } = do- let mode = case encoding of IOEncodingUTF8 -> IODataModeBinary- IOEncodingText -> IODataModeText-- decode (IODataBinary b) = normaliseLineEndings (fromUTF8LBS b)- decode (IODataText s) = s+getProgramInvocationOutputAndErrors verbosity inv = case progInvokeOutputEncoding inv of+ IOEncodingText -> do+ (output, errors, exitCode) <- getProgramInvocationIODataAndErrors verbosity inv IODataModeText+ return (output, errors, exitCode)+ IOEncodingUTF8 -> do+ (output', errors, exitCode) <- getProgramInvocationIODataAndErrors verbosity inv IODataModeBinary+ return (normaliseLineEndings (fromUTF8LBS output'), errors, exitCode) +getProgramInvocationIODataAndErrors+ :: KnownIODataMode mode => Verbosity -> ProgramInvocation -> IODataMode mode+ -> IO (mode, String, ExitCode)+getProgramInvocationIODataAndErrors+ verbosity+ ProgramInvocation+ { progInvokePath = path+ , progInvokeArgs = args+ , progInvokeEnv = envOverrides+ , progInvokePathEnv = extraPath+ , progInvokeCwd = mcwd+ , progInvokeInput = minputStr+ , progInvokeInputEncoding = encoding+ }+ mode = do pathOverride <- getExtraPathEnv envOverrides extraPath menv <- getEffectiveEnvironment (envOverrides ++ pathOverride)- (output, errors, exitCode) <- rawSystemStdInOut verbosity- path args- mcwd menv- input mode- return (decode output, errors, exitCode)+ rawSystemStdInOut verbosity path args mcwd menv input mode where input = encodeToIOData encoding <$> minputStr @@ -243,13 +257,14 @@ chunkSize = maxCommandLineSize - fixedArgSize in case splitChunks chunkSize args of- [] -> [ simple ]+ [] -> [ simple ] - [c] -> [ simple `appendArgs` c ]+ [c] -> [ simple `appendArgs` c ] - (c:cs) -> [ initial `appendArgs` c ]- ++ [ middle `appendArgs` c'| c' <- init cs ]- ++ [ final `appendArgs` c'| let c' = last cs ]+ (c:c2:cs) | (xs, x) <- unsnocNE (c2:|cs) ->+ [ initial `appendArgs` c ]+ ++ [ middle `appendArgs` c'| c' <- xs ]+ ++ [ final `appendArgs` x ] where appendArgs :: ProgramInvocation -> [String] -> ProgramInvocation
Distribution/Simple/Program/Script.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE GADTs #-} ----------------------------------------------------------------------------- -- | -- Module : Distribution.Simple.Program.Script@@ -20,6 +21,7 @@ import Distribution.Compat.Prelude import Distribution.Simple.Program.Run+import Distribution.Simple.Utils import Distribution.System -- | Generate a system script, either POSIX shell script or Windows batch file@@ -45,8 +47,8 @@ ++ concatMap setEnv envExtra ++ [ "cd " ++ quote cwd | cwd <- maybeToList mcwd ] ++ [ (case minput of- Nothing -> ""- Just input -> "echo " ++ quote input ++ " | ")+ Nothing -> ""+ Just input -> "echo " ++ quote (iodataToText input) ++ " | ") ++ unwords (map quote $ path : args) ++ " \"$@\""] where@@ -60,7 +62,11 @@ escape ('\'':cs) = "'\\''" ++ escape cs escape (c :cs) = c : escape cs +iodataToText :: IOData -> String+iodataToText (IODataText str) = str+iodataToText (IODataBinary lbs) = fromUTF8LBS lbs + -- | Generate a Windows batch file that invokes a program. -- invocationAsBatchFile :: ProgramInvocation -> String@@ -81,7 +87,7 @@ Just input -> [ "(" ]- ++ [ "echo " ++ escape line | line <- lines input ]+ ++ [ "echo " ++ escape line | line <- lines $ iodataToText input ] ++ [ ") | " ++ "\"" ++ path ++ "\"" ++ concatMap (\arg -> ' ':quote arg) args ]
Distribution/Simple/Program/Types.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-}@@ -133,6 +134,7 @@ deriving (Eq, Generic, Read, Show, Typeable) instance Binary ConfiguredProgram+instance Structured ConfiguredProgram -- | Where a program was found. Also tells us whether it's specified by user or -- not. This includes not just the path, but the program as well.@@ -142,9 +144,10 @@ -- eg. --ghc-path=\/usr\/bin\/ghc-6.6 | FoundOnSystem { locationPath :: FilePath } -- ^The program was found automatically.- deriving (Eq, Generic, Read, Show)+ deriving (Eq, Generic, Read, Show, Typeable) instance Binary ProgramLocation+instance Structured ProgramLocation -- | The full path of a configured program. programPath :: ConfiguredProgram -> FilePath
Distribution/Simple/Setup.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-}@@ -57,7 +58,8 @@ defaultBenchmarkFlags, benchmarkCommand, CopyDest(..), configureArgs, configureOptions, configureCCompiler, configureLinker,- buildOptions, haddockOptions, installDirsOptions, testOptions',+ buildOptions, haddockOptions, installDirsOptions,+ testOptions', benchmarkOptions', programDbOptions, programDbPaths', programFlagsDescription, replOptions,@@ -126,7 +128,7 @@ data GlobalFlags = GlobalFlags { globalVersion :: Flag Bool, globalNumericVersion :: Flag Bool- } deriving (Generic)+ } deriving (Generic, Typeable) defaultGlobalFlags :: GlobalFlags defaultGlobalFlags = GlobalFlags {@@ -282,9 +284,10 @@ -- tools (like cabal-install) so they can add multiple-public-libraries -- compatibility to older ghcs by checking visibility externally. }- deriving (Generic, Read, Show)+ deriving (Generic, Read, Show, Typeable) instance Binary ConfigFlags+instance Structured ConfigFlags -- | More convenient version of 'configPrograms'. Results in an -- 'error' if internal invariant is violated.@@ -1034,7 +1037,7 @@ sDistListSources :: Flag FilePath, sDistVerbosity :: Flag Verbosity }- deriving (Show, Generic)+ deriving (Show, Generic, Typeable) defaultSDistFlags :: SDistFlags defaultSDistFlags = SDistFlags {@@ -1107,7 +1110,7 @@ regArgs :: [String], regCabalFilePath :: Flag FilePath }- deriving (Show, Generic)+ deriving (Show, Generic, Typeable) defaultRegisterFlags :: RegisterFlags defaultRegisterFlags = RegisterFlags {@@ -1221,7 +1224,7 @@ hscolourVerbosity :: Flag Verbosity, hscolourCabalFilePath :: Flag FilePath }- deriving (Show, Generic)+ deriving (Show, Generic, Typeable) emptyHscolourFlags :: HscolourFlags emptyHscolourFlags = mempty@@ -1314,7 +1317,7 @@ doctestDistPref :: Flag FilePath, doctestVerbosity :: Flag Verbosity }- deriving (Show, Generic)+ deriving (Show, Generic, Typeable) defaultDoctestFlags :: DoctestFlags defaultDoctestFlags = DoctestFlags {@@ -1382,9 +1385,10 @@ -- from documentation tarballs, and we might also want to use different -- flags than for development builds, so in this case we store the generated -- documentation in @<dist>/doc/html/<package id>-docs@.-data HaddockTarget = ForHackage | ForDevelopment deriving (Eq, Show, Generic)+data HaddockTarget = ForHackage | ForDevelopment deriving (Eq, Show, Generic, Typeable) instance Binary HaddockTarget+instance Structured HaddockTarget instance Pretty HaddockTarget where pretty ForHackage = Disp.text "for-hackage"@@ -1417,7 +1421,7 @@ haddockCabalFilePath :: Flag FilePath, haddockArgs :: [String] }- deriving (Show, Generic)+ deriving (Show, Generic, Typeable) defaultHaddockFlags :: HaddockFlags defaultHaddockFlags = HaddockFlags {@@ -1590,7 +1594,7 @@ cleanVerbosity :: Flag Verbosity, cleanCabalFilePath :: Flag FilePath }- deriving (Show, Generic)+ deriving (Show, Generic, Typeable) defaultCleanFlags :: CleanFlags defaultCleanFlags = CleanFlags {@@ -1648,7 +1652,7 @@ buildArgs :: [String], buildCabalFilePath :: Flag FilePath }- deriving (Read, Show, Generic)+ deriving (Read, Show, Generic, Typeable) defaultBuildFlags :: BuildFlags defaultBuildFlags = BuildFlags {@@ -1738,7 +1742,7 @@ replReload :: Flag Bool, replReplOptions :: [String] }- deriving (Show, Generic)+ deriving (Show, Generic, Typeable) defaultReplFlags :: ReplFlags defaultReplFlags = ReplFlags {@@ -1837,9 +1841,10 @@ -- ------------------------------------------------------------ data TestShowDetails = Never | Failures | Always | Streaming | Direct- deriving (Eq, Ord, Enum, Bounded, Generic, Show)+ deriving (Eq, Ord, Enum, Bounded, Generic, Show, Typeable) instance Binary TestShowDetails+instance Structured TestShowDetails knownTestShowDetails :: [TestShowDetails] knownTestShowDetails = [minBound..maxBound]@@ -1875,7 +1880,7 @@ testFailWhenNoTestSuites :: Flag Bool, -- TODO: think about if/how options are passed to test exes testOptions :: [PathTemplate]- } deriving (Generic)+ } deriving (Generic, Typeable) defaultTestFlags :: TestFlags defaultTestFlags = TestFlags {@@ -1995,7 +2000,7 @@ benchmarkDistPref :: Flag FilePath, benchmarkVerbosity :: Flag Verbosity, benchmarkOptions :: [PathTemplate]- } deriving (Generic)+ } deriving (Generic, Typeable) defaultBenchmarkFlags :: BenchmarkFlags defaultBenchmarkFlags = BenchmarkFlags {@@ -2026,30 +2031,33 @@ , "BENCHCOMPONENTS [FLAGS]" ] , commandDefaultFlags = defaultBenchmarkFlags- , commandOptions = \showOrParseArgs ->- [ optionVerbosity benchmarkVerbosity- (\v flags -> flags { benchmarkVerbosity = v })- , optionDistPref- benchmarkDistPref (\d flags -> flags { benchmarkDistPref = d })- showOrParseArgs- , option [] ["benchmark-options"]- ("give extra options to benchmark executables "- ++ "(name templates can use $pkgid, $compiler, "- ++ "$os, $arch, $benchmark)")- benchmarkOptions (\v flags -> flags { benchmarkOptions = v })- (reqArg' "TEMPLATES" (map toPathTemplate . splitArgs)- (const []))- , option [] ["benchmark-option"]- ("give extra option to benchmark executables "- ++ "(no need to quote options containing spaces, "- ++ "name template can use $pkgid, $compiler, "- ++ "$os, $arch, $benchmark)")- benchmarkOptions (\v flags -> flags { benchmarkOptions = v })- (reqArg' "TEMPLATE" (\x -> [toPathTemplate x])- (map fromPathTemplate))- ]+ , commandOptions = benchmarkOptions' } +benchmarkOptions' :: ShowOrParseArgs -> [OptionField BenchmarkFlags]+benchmarkOptions' showOrParseArgs =+ [ optionVerbosity benchmarkVerbosity+ (\v flags -> flags { benchmarkVerbosity = v })+ , optionDistPref+ benchmarkDistPref (\d flags -> flags { benchmarkDistPref = d })+ showOrParseArgs+ , option [] ["benchmark-options"]+ ("give extra options to benchmark executables "+ ++ "(name templates can use $pkgid, $compiler, "+ ++ "$os, $arch, $benchmark)")+ benchmarkOptions (\v flags -> flags { benchmarkOptions = v })+ (reqArg' "TEMPLATES" (map toPathTemplate . splitArgs)+ (const []))+ , option [] ["benchmark-option"]+ ("give extra option to benchmark executables "+ ++ "(no need to quote options containing spaces, "+ ++ "name template can use $pkgid, $compiler, "+ ++ "$os, $arch, $benchmark)")+ benchmarkOptions (\v flags -> flags { benchmarkOptions = v })+ (reqArg' "TEMPLATE" (\x -> [toPathTemplate x])+ (map fromPathTemplate))+ ]+ emptyBenchmarkFlags :: BenchmarkFlags emptyBenchmarkFlags = mempty @@ -2225,7 +2233,7 @@ data ShowBuildInfoFlags = ShowBuildInfoFlags { buildInfoBuildFlags :: BuildFlags , buildInfoOutputFile :: Maybe FilePath- } deriving Show+ } deriving (Show, Typeable) defaultShowBuildFlags :: ShowBuildInfoFlags defaultShowBuildFlags =
Distribution/Simple/ShowBuildInfo.hs view
@@ -56,6 +56,9 @@ module Distribution.Simple.ShowBuildInfo (mkBuildInfo) where +import Distribution.Compat.Prelude+import Prelude ()+ import qualified Distribution.Simple.GHC as GHC import qualified Distribution.Simple.Program.GHC as GHC @@ -122,7 +125,7 @@ ] where bi = componentBuildInfo comp- Just comp = lookupComponent pkg_descr name+ comp = fromMaybe (error $ "mkBuildInfo: no component " ++ prettyShow name) $ lookupComponent pkg_descr name compType = case comp of CLib _ -> "lib" CExe _ -> "exe"
Distribution/Simple/Test/LibV09.hs view
@@ -207,7 +207,9 @@ writeSimpleTestStub t dir = do createDirectoryIfMissing True dir let filename = dir </> stubFilePath t- PD.TestSuiteLibV09 _ m = PD.testInterface t+ m = case PD.testInterface t of+ PD.TestSuiteLibV09 _ m' -> m'+ _ -> error "writeSimpleTestStub: invalid TestSuite passed" writeFile filename $ simpleTestStub m -- | Source code for library test suite stub executable
Distribution/Simple/Test/Log.hs view
@@ -143,7 +143,7 @@ where addTriple (p1, f1, e1) (p2, f2, e2) = (p1 + p2, f1 + f2, e1 + e2) --- | Print a summary of a single test case's result to the console, supressing+-- | Print a summary of a single test case's result to the console, suppressing -- output for certain verbosity or test filter levels. summarizeTest :: Verbosity -> TestShowDetails -> TestLogs -> IO () summarizeTest _ _ (GroupLogs {}) = return ()
Distribution/Simple/UHC.hs view
@@ -24,7 +24,6 @@ import Prelude () import Distribution.Compat.Prelude-import Data.Foldable (toList) import Distribution.InstalledPackageInfo import Distribution.Package hiding (installedUnitId)@@ -117,9 +116,11 @@ getGlobalPackageDir verbosity progdb = do output <- getDbProgramOutput verbosity uhcProgram progdb ["--meta-pkgdir-system"]- -- call to "lines" necessary, because pkgdir contains an extra newline at the end- let [pkgdir] = lines output+ -- we need to trim because pkgdir contains an extra newline at the end+ let pkgdir = trimEnd output return pkgdir+ where+ trimEnd = reverse . dropWhile isSpace . reverse getUserPackageDir :: NoCallStackIO FilePath getUserPackageDir = do@@ -278,7 +279,7 @@ -> InstalledPackageInfo -> IO () registerPackage verbosity comp progdb packageDbs installedPkgInfo = do- dbdir <- case last packageDbs of+ dbdir <- case registrationPackageDB packageDbs of GlobalPackageDB -> getGlobalPackageDir verbosity progdb UserPackageDB -> getUserPackageDir SpecificPackageDB dir -> return dir
Distribution/Simple/Utils.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE CPP #-}+{-# LANGUAGE GADTs #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-}@@ -60,7 +61,8 @@ -- "Distribution.Utils.IOData" for convience as they're -- exposed in the API of 'rawSystemStdInOut' IOData(..),- IODataMode(..),+ KnownIODataMode (..),+ IODataMode (..), -- * copying files createDirectoryIfMissingVerbose,@@ -150,7 +152,10 @@ ordNub, ordNubBy, ordNubRight,+ safeHead, safeTail,+ safeLast,+ safeInit, unintersperse, wrapText, wrapLine,@@ -169,11 +174,12 @@ import Distribution.Compat.Prelude import Distribution.Utils.Generic-import Distribution.Utils.IOData (IOData(..), IODataMode(..))+import Distribution.Utils.IOData (IOData(..), IODataMode (..), KnownIODataMode (..)) import qualified Distribution.Utils.IOData as IOData import Distribution.ModuleName as ModuleName import Distribution.System import Distribution.Version+import Distribution.Compat.Async import Distribution.Compat.CopyFile import Distribution.Compat.Internal.TempFile import Distribution.Compat.Exception@@ -199,8 +205,6 @@ import Distribution.Pretty import Distribution.Parsec -import Control.Concurrent.MVar- ( newEmptyMVar, putMVar, takeMVar ) import Data.Typeable ( cast ) import qualified Data.ByteString.Lazy as BS@@ -225,9 +229,9 @@ ( unsafeInterleaveIO ) import qualified Control.Exception as Exception +import Foreign.C.Error (Errno (..), ePIPE) import Data.Time.Clock.POSIX (getPOSIXTime, POSIXTime)-import Control.Exception (IOException, evaluate, throwIO)-import Control.Concurrent (forkIO)+import Control.Exception (IOException, evaluate, throwIO, fromException) import Numeric (showFFloat) import qualified System.Process as Process ( CreateProcess(..), StdStream(..), proc)@@ -235,6 +239,8 @@ ( ProcessHandle, createProcess, rawSystem, runInteractiveProcess , showCommandForUser, waitForProcess) +import qualified GHC.IO.Exception as GHC+ import qualified Text.PrettyPrint as Disp -- We only get our own version number when we're building with ourselves@@ -244,7 +250,7 @@ #elif defined(CABAL_VERSION) cabalVersion = mkVersion [CABAL_VERSION] #else-cabalVersion = mkVersion [1,9999] --used when bootstrapping+cabalVersion = mkVersion [3,0] --used when bootstrapping #endif -- ----------------------------------------------------------------------------@@ -792,11 +798,10 @@ -- -- The output is assumed to be text in the locale encoding. ---rawSystemStdout :: Verbosity -> FilePath -> [String] -> IO String+rawSystemStdout :: forall mode. KnownIODataMode mode => Verbosity -> FilePath -> [String] -> IO mode rawSystemStdout verbosity path args = withFrozenCallStack $ do- (IODataText output, errors, exitCode) <- rawSystemStdInOut verbosity path args- Nothing Nothing- Nothing IODataModeText+ (output, errors, exitCode) <- rawSystemStdInOut verbosity path args+ Nothing Nothing Nothing (IOData.iodataMode :: IODataMode mode) when (exitCode /= ExitSuccess) $ die' verbosity errors return output@@ -805,15 +810,16 @@ -- also supply some input. Also provides control over whether the binary/text -- mode of the input and output. ---rawSystemStdInOut :: Verbosity+rawSystemStdInOut :: KnownIODataMode mode+ => Verbosity -> FilePath -- ^ Program location -> [String] -- ^ Arguments -> Maybe FilePath -- ^ New working dir or inherit -> Maybe [(String, String)] -- ^ New environment or inherit -> Maybe IOData -- ^ input text and binary mode- -> IODataMode -- ^ output in binary mode- -> IO (IOData, String, ExitCode) -- ^ output, errors, exit-rawSystemStdInOut verbosity path args mcwd menv input outputMode = withFrozenCallStack $ do+ -> IODataMode mode -- ^ iodata mode, acts as proxy+ -> IO (mode, String, ExitCode) -- ^ output, errors, exit+rawSystemStdInOut verbosity path args mcwd menv input _ = withFrozenCallStack $ do printRawCommandAndArgs verbosity path args Exception.bracket@@ -828,53 +834,49 @@ -- fork off a couple threads to pull on the stderr and stdout -- so if the process writes to stderr we do not block. - err <- hGetContents errh-- out <- IOData.hGetContents outh outputMode+ withAsyncNF (hGetContents errh) $ \errA -> withAsyncNF (IOData.hGetIODataContents outh) $ \outA -> do+ -- push all the input, if any+ ignoreSigPipe $ case input of+ Nothing -> hClose inh+ Just inputData -> IOData.hPutContents inh inputData - mv <- newEmptyMVar- let force str = do- mberr <- Exception.try (evaluate (rnf str) >> return ())- putMVar mv (mberr :: Either IOError ())- _ <- forkIO $ force out- _ <- forkIO $ force err+ -- wait for both to finish+ mberr1 <- waitCatch outA+ mberr2 <- waitCatch errA - -- push all the input, if any- case input of- Nothing -> return ()- Just inputData -> do- -- input mode depends on what the caller wants- IOData.hPutContents inh inputData- --TODO: this probably fails if the process refuses to consume- -- or if it closes stdin (eg if it exits)+ -- wait for the program to terminate+ exitcode <- waitForProcess pid - -- wait for both to finish, in either order- mberr1 <- takeMVar mv- mberr2 <- takeMVar mv+ -- get the stderr, so it can be added to error message+ err <- reportOutputIOError mberr2 - -- wait for the program to terminate- exitcode <- waitForProcess pid- unless (exitcode == ExitSuccess) $- debug verbosity $ path ++ " returned " ++ show exitcode- ++ if null err then "" else- " with error message:\n" ++ err- ++ case input of- Nothing -> ""- Just d | IOData.null d -> ""- Just (IODataText inp) -> "\nstdin input:\n" ++ inp- Just (IODataBinary inp) -> "\nstdin input (binary):\n" ++ show inp+ unless (exitcode == ExitSuccess) $+ debug verbosity $ path ++ " returned " ++ show exitcode+ ++ if null err then "" else+ " with error message:\n" ++ err+ ++ case input of+ Nothing -> ""+ Just d | IOData.null d -> ""+ Just (IODataText inp) -> "\nstdin input:\n" ++ inp+ Just (IODataBinary inp) -> "\nstdin input (binary):\n" ++ show inp - -- Check if we we hit an exception while consuming the output- -- (e.g. a text decoding error)- reportOutputIOError mberr1- reportOutputIOError mberr2+ -- Check if we we hit an exception while consuming the output+ -- (e.g. a text decoding error)+ out <- reportOutputIOError mberr1 - return (out, err, exitcode)+ return (out, err, exitcode) where- reportOutputIOError :: Either IOError () -> NoCallStackIO ()- reportOutputIOError =- either (\e -> throwIO (ioeSetFileName e ("output of " ++ path)))- return+ reportOutputIOError :: Either Exception.SomeException a -> NoCallStackIO a+ reportOutputIOError (Right x) = return x+ reportOutputIOError (Left exc) = case fromException exc of+ Just ioe -> throwIO (ioeSetFileName ioe ("output of " ++ path))+ Nothing -> throwIO exc++ ignoreSigPipe :: NoCallStackIO () -> NoCallStackIO ()+ ignoreSigPipe = Exception.handle $ \e -> case e of+ GHC.IOError { GHC.ioe_type = GHC.ResourceVanished, GHC.ioe_errno = Just ioe }+ | Errno ioe == ePIPE -> return ()+ _ -> throwIO e -- | Look for a program and try to find it's version number. It can accept -- either an absolute path or the name of a program binary, in which case we
Distribution/System.hs view
@@ -101,7 +101,7 @@ deriving (Eq, Generic, Ord, Show, Read, Typeable, Data) instance Binary OS-+instance Structured OS instance NFData OS where rnf = genericRnf knownOSs :: [OS]@@ -169,7 +169,7 @@ deriving (Eq, Generic, Ord, Show, Read, Typeable, Data) instance Binary Arch-+instance Structured Arch instance NFData Arch where rnf = genericRnf knownArches :: [Arch]@@ -217,7 +217,7 @@ deriving (Eq, Generic, Ord, Show, Read, Typeable, Data) instance Binary Platform-+instance Structured Platform instance NFData Platform where rnf = genericRnf instance Pretty Platform where
Distribution/Types/AbiDependency.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} module Distribution.Types.AbiDependency where @@ -25,7 +26,7 @@ depUnitId :: Package.UnitId, depAbiHash :: Package.AbiHash }- deriving (Eq, Generic, Read, Show)+ deriving (Eq, Generic, Read, Show, Typeable) instance Pretty AbiDependency where pretty (AbiDependency uid abi) =@@ -39,4 +40,5 @@ return (AbiDependency uid abi) instance Binary AbiDependency+instance Structured AbiDependency instance NFData AbiDependency where rnf = genericRnf
Distribution/Types/AbiHash.hs view
@@ -25,7 +25,7 @@ -- -- @since 2.0.0.2 newtype AbiHash = AbiHash ShortText- deriving (Eq, Show, Read, Generic)+ deriving (Eq, Show, Read, Generic, Typeable) -- | Construct a 'AbiHash' from a 'String' --@@ -51,7 +51,7 @@ fromString = mkAbiHash instance Binary AbiHash-+instance Structured AbiHash instance NFData AbiHash where rnf = genericRnf instance Pretty AbiHash where
Distribution/Types/Benchmark.hs view
@@ -31,7 +31,7 @@ deriving (Generic, Show, Read, Eq, Typeable, Data) instance Binary Benchmark-+instance Structured Benchmark instance NFData Benchmark where rnf = genericRnf instance L.HasBuildInfo Benchmark where
Distribution/Types/BenchmarkInterface.hs view
@@ -34,7 +34,7 @@ deriving (Eq, Generic, Read, Show, Typeable, Data) instance Binary BenchmarkInterface-+instance Structured BenchmarkInterface instance NFData BenchmarkInterface where rnf = genericRnf instance Monoid BenchmarkInterface where
Distribution/Types/BenchmarkType.hs view
@@ -23,7 +23,7 @@ deriving (Generic, Show, Read, Eq, Typeable, Data) instance Binary BenchmarkType-+instance Structured BenchmarkType instance NFData BenchmarkType where rnf = genericRnf knownBenchmarkTypes :: [BenchmarkType]
Distribution/Types/BuildInfo.hs view
@@ -82,7 +82,7 @@ -- Example 2: a library that is being built by a foreing tool (e.g. rust) -- and copied and registered together with this library. The -- logic on how this library is built will have to be encoded in a- -- custom Setup for now. Oherwise cabal would need to lear how to+ -- custom Setup for now. Otherwise cabal would need to lear how to -- call arbitrary library builders. extraLibFlavours :: [String], -- ^ Hidden Flag. This set of strings, will be appended to all libraries when -- copying. E.g. [libHS<name>_<flavour> | flavour <- extraLibFlavours]. This@@ -109,7 +109,7 @@ deriving (Generic, Show, Read, Eq, Typeable, Data) instance Binary BuildInfo-+instance Structured BuildInfo instance NFData BuildInfo where rnf = genericRnf instance Monoid BuildInfo where
Distribution/Types/BuildType.hs view
@@ -27,7 +27,7 @@ deriving (Generic, Show, Read, Eq, Typeable, Data) instance Binary BuildType-+instance Structured BuildType instance NFData BuildType where rnf = genericRnf knownBuildTypes :: [BuildType]
Distribution/Types/ComponentId.hs view
@@ -56,6 +56,7 @@ fromString = mkComponentId instance Binary ComponentId+instance Structured ComponentId instance Pretty ComponentId where pretty = text . unComponentId
Distribution/Types/ComponentLocalBuildInfo.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE TypeFamilies #-} @@ -108,9 +109,10 @@ componentExeDeps :: [UnitId], componentInternalDeps :: [UnitId] }- deriving (Generic, Read, Show)+ deriving (Generic, Read, Show, Typeable) instance Binary ComponentLocalBuildInfo+instance Structured ComponentLocalBuildInfo instance IsNode ComponentLocalBuildInfo where type Key ComponentLocalBuildInfo = UnitId
Distribution/Types/ComponentName.hs view
@@ -28,6 +28,7 @@ deriving (Eq, Generic, Ord, Read, Show, Typeable) instance Binary ComponentName+instance Structured ComponentName -- Build-target-ish syntax instance Pretty ComponentName where
Distribution/Types/ComponentRequestedSpec.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} module Distribution.Types.ComponentRequestedSpec ( -- $buildable_vs_enabled_components@@ -66,8 +67,10 @@ = ComponentRequestedSpec { testsRequested :: Bool , benchmarksRequested :: Bool } | OneComponentRequestedSpec ComponentName- deriving (Generic, Read, Show, Eq)+ deriving (Generic, Read, Show, Eq, Typeable)+ instance Binary ComponentRequestedSpec+instance Structured ComponentRequestedSpec -- | The default set of enabled components. Historically tests and -- benchmarks are NOT enabled by default.
Distribution/Types/CondTree.hs view
@@ -3,6 +3,7 @@ {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE DeriveFoldable #-} {-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE ScopedTypeVariables #-} module Distribution.Types.CondTree ( CondTree(..),@@ -63,7 +64,7 @@ deriving (Show, Eq, Typeable, Data, Generic, Functor, Foldable, Traversable) instance (Binary v, Binary c, Binary a) => Binary (CondTree v c a)-+instance (Structured v, Structured c, Structured a) => Structured (CondTree v c a) instance (NFData v, NFData c, NFData a) => NFData (CondTree v c a) where rnf = genericRnf -- | A 'CondBranch' represents a conditional branch, e.g., @if@@ -85,7 +86,7 @@ foldMap f (CondBranch _ c (Just a)) = foldMap f c `mappend` foldMap f a instance (Binary v, Binary c, Binary a) => Binary (CondBranch v c a)-+instance (Structured v, Structured c, Structured a) => Structured (CondBranch v c a) instance (NFData v, NFData c, NFData a) => NFData (CondBranch v c a) where rnf = genericRnf condIfThen :: Condition v -> CondTree v c a -> CondBranch v c a
Distribution/Types/Condition.hs view
@@ -97,7 +97,7 @@ mplus = mappend instance Binary c => Binary (Condition c)-+instance Structured c => Structured (Condition c) instance NFData c => NFData (Condition c) where rnf = genericRnf -- | Simplify the condition and return its free variables.
+ Distribution/Types/ConfVar.hs view
@@ -0,0 +1,25 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+module Distribution.Types.ConfVar (+ ConfVar(..),+ ) where++import Prelude ()+import Distribution.Compat.Prelude++import Distribution.Types.Flag+import Distribution.Types.VersionRange+import Distribution.Compiler+import Distribution.System++-- | A @ConfVar@ represents the variable type used.+data ConfVar = OS OS+ | Arch Arch+ | Flag FlagName+ | Impl CompilerFlavor VersionRange+ deriving (Eq, Show, Typeable, Data, Generic)++instance Binary ConfVar+instance Structured ConfVar++instance NFData ConfVar where rnf = genericRnf
Distribution/Types/Dependency.hs view
@@ -29,7 +29,6 @@ import Distribution.Types.UnqualComponentName import Text.PrettyPrint ((<+>))-import Data.Set (Set) import qualified Data.Set as Set -- | Describes a dependency on a source package (API)@@ -53,6 +52,7 @@ depLibraries (Dependency _ _ cs) = cs instance Binary Dependency+instance Structured Dependency instance NFData Dependency where rnf = genericRnf instance Pretty Dependency where
Distribution/Types/DependencyMap.hs view
@@ -13,7 +13,6 @@ import Distribution.Types.LibraryName import Distribution.Version -import Data.Set (Set) import qualified Data.Map.Lazy as Map -- | A map of dependencies. Newtyped since the default monoid instance is not
Distribution/Types/ExeDependency.hs view
@@ -27,6 +27,7 @@ deriving (Generic, Read, Show, Eq, Typeable, Data) instance Binary ExeDependency+instance Structured ExeDependency instance NFData ExeDependency where rnf = genericRnf instance Pretty ExeDependency where
Distribution/Types/Executable.hs view
@@ -30,7 +30,7 @@ buildInfo f l = (\x -> l { buildInfo = x }) <$> f (buildInfo l) instance Binary Executable-+instance Structured Executable instance NFData Executable where rnf = genericRnf instance Monoid Executable where
Distribution/Types/ExecutableScope.hs view
@@ -28,7 +28,7 @@ pri = ExecutablePrivate <$ P.string "private" instance Binary ExecutableScope-+instance Structured ExecutableScope instance NFData ExecutableScope where rnf = genericRnf -- | 'Any' like semigroup, where 'ExecutablePrivate' is 'Any True'
Distribution/Types/ExposedModule.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} module Distribution.Types.ExposedModule where @@ -17,7 +18,7 @@ exposedName :: ModuleName, exposedReexport :: Maybe OpenModule }- deriving (Eq, Generic, Read, Show)+ deriving (Eq, Generic, Read, Show, Typeable) instance Pretty ExposedModule where pretty (ExposedModule m reexport) =@@ -40,5 +41,5 @@ return (ExposedModule m reexport) instance Binary ExposedModule-+instance Structured ExposedModule instance NFData ExposedModule where rnf = genericRnf
+ Distribution/Types/Flag.hs view
@@ -0,0 +1,249 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+module Distribution.Types.Flag (+ Flag(..),+ emptyFlag,+ FlagName,+ mkFlagName,+ unFlagName,+ FlagAssignment,+ mkFlagAssignment,+ unFlagAssignment,+ lookupFlagAssignment,+ insertFlagAssignment,+ diffFlagAssignment,+ findDuplicateFlagAssignments,+ nullFlagAssignment,+ showFlagValue,+ dispFlagAssignment,+ parsecFlagAssignment,+ ) where++import Prelude ()+import Distribution.Compat.Prelude+import Distribution.Utils.ShortText+import Distribution.Utils.Generic (lowercase)++import Distribution.Parsec+import Distribution.Pretty++import qualified Data.Map as Map+import qualified Text.PrettyPrint as Disp+import qualified Distribution.Compat.CharParsing as P++-- -----------------------------------------------------------------------------+-- The Flag' type++-- | A flag can represent a feature to be included, or a way of linking+-- a target against its dependencies, or in fact whatever you can think of.+data Flag = MkFlag+ { flagName :: FlagName+ , flagDescription :: String+ , flagDefault :: Bool+ , flagManual :: Bool+ }+ deriving (Show, Eq, Typeable, Data, Generic)++instance Binary Flag+instance Structured Flag++instance NFData Flag where rnf = genericRnf++-- | A 'Flag' initialized with default parameters.+emptyFlag :: FlagName -> Flag+emptyFlag name = MkFlag+ { flagName = name+ , flagDescription = ""+ , flagDefault = True+ , flagManual = False+ }++-- | A 'FlagName' is the name of a user-defined configuration flag+--+-- Use 'mkFlagName' and 'unFlagName' to convert from/to a 'String'.+--+-- This type is opaque since @Cabal-2.0@+--+-- @since 2.0.0.2+newtype FlagName = FlagName ShortText+ deriving (Eq, Generic, Ord, Show, Read, Typeable, Data, NFData)++-- | Construct a 'FlagName' from a 'String'+--+-- 'mkFlagName' is the inverse to 'unFlagName'+--+-- Note: No validations are performed to ensure that the resulting+-- 'FlagName' is valid+--+-- @since 2.0.0.2+mkFlagName :: String -> FlagName+mkFlagName = FlagName . toShortText++-- | 'mkFlagName'+--+-- @since 2.0.0.2+instance IsString FlagName where+ fromString = mkFlagName++-- | Convert 'FlagName' to 'String'+--+-- @since 2.0.0.2+unFlagName :: FlagName -> String+unFlagName (FlagName s) = fromShortText s++instance Binary FlagName+instance Structured FlagName++instance Pretty FlagName where+ pretty = Disp.text . unFlagName++instance Parsec FlagName where+ -- Note: we don't check that FlagName doesn't have leading dash,+ -- cabal check will do that.+ parsec = mkFlagName . lowercase <$> parsec'+ where+ parsec' = (:) <$> lead <*> rest+ lead = P.satisfy (\c -> isAlphaNum c || c == '_')+ rest = P.munch (\c -> isAlphaNum c || c == '_' || c == '-')++-- | A 'FlagAssignment' is a total or partial mapping of 'FlagName's to+-- 'Bool' flag values. It represents the flags chosen by the user or+-- discovered during configuration. For example @--flags=foo --flags=-bar@+-- becomes @[("foo", True), ("bar", False)]@+--+newtype FlagAssignment+ = FlagAssignment { getFlagAssignment :: Map.Map FlagName (Int, Bool) }+ deriving (Binary, Generic, NFData, Typeable)++instance Structured FlagAssignment++instance Eq FlagAssignment where+ (==) (FlagAssignment m1) (FlagAssignment m2)+ = fmap snd m1 == fmap snd m2++instance Ord FlagAssignment where+ compare (FlagAssignment m1) (FlagAssignment m2)+ = fmap snd m1 `compare` fmap snd m2++-- | Combines pairs of values contained in the 'FlagAssignment' Map.+--+-- The last flag specified takes precedence, and we record the number+-- of times we have seen the flag.+--+combineFlagValues :: (Int, Bool) -> (Int, Bool) -> (Int, Bool)+combineFlagValues (c1, _) (c2, b2) = (c1 + c2, b2)++-- The 'Semigroup' instance currently is right-biased.+--+-- If duplicate flags are specified, we want the last flag specified to+-- take precedence and we want to know how many times the flag has been+-- specified so that we have the option of warning the user about+-- supplying duplicate flags.+instance Semigroup FlagAssignment where+ (<>) (FlagAssignment m1) (FlagAssignment m2)+ = FlagAssignment (Map.unionWith combineFlagValues m1 m2)++instance Monoid FlagAssignment where+ mempty = FlagAssignment Map.empty+ mappend = (<>)++-- | Construct a 'FlagAssignment' from a list of flag/value pairs.+--+-- If duplicate flags occur in the input list, the later entries+-- in the list will take precedence.+--+-- @since 2.2.0+mkFlagAssignment :: [(FlagName, Bool)] -> FlagAssignment+mkFlagAssignment =+ FlagAssignment .+ Map.fromListWith (flip combineFlagValues) . fmap (fmap (\b -> (1, b)))++-- | Deconstruct a 'FlagAssignment' into a list of flag/value pairs.+--+-- @ 'null' ('findDuplicateFlagAssignments' fa) ==> ('mkFlagAssignment' . 'unFlagAssignment') fa == fa @+--+-- @since 2.2.0+unFlagAssignment :: FlagAssignment -> [(FlagName, Bool)]+unFlagAssignment = fmap (fmap snd) . Map.toList . getFlagAssignment++-- | Test whether 'FlagAssignment' is empty.+--+-- @since 2.2.0+nullFlagAssignment :: FlagAssignment -> Bool+nullFlagAssignment = Map.null . getFlagAssignment++-- | Lookup the value for a flag+--+-- Returns 'Nothing' if the flag isn't contained in the 'FlagAssignment'.+--+-- @since 2.2.0+lookupFlagAssignment :: FlagName -> FlagAssignment -> Maybe Bool+lookupFlagAssignment fn = fmap snd . Map.lookup fn . getFlagAssignment++-- | Insert or update the boolean value of a flag.+--+-- If the flag is already present in the 'FlagAssigment', the+-- value will be updated and the fact that multiple values have+-- been provided for that flag will be recorded so that a+-- warning can be generated later on.+--+-- @since 2.2.0+insertFlagAssignment :: FlagName -> Bool -> FlagAssignment -> FlagAssignment+-- TODO: this currently just shadows prior values for an existing+-- flag; rather than enforcing uniqueness at construction, it's+-- verified later on via `D.C.Dependency.configuredPackageProblems`+insertFlagAssignment flag val =+ FlagAssignment .+ Map.insertWith (flip combineFlagValues) flag (1, val) . getFlagAssignment++-- | Remove all flag-assignments from the first 'FlagAssignment' that+-- are contained in the second 'FlagAssignment'+--+-- NB/TODO: This currently only removes flag assignments which also+-- match the value assignment! We should review the code which uses+-- this operation to figure out if this it's not enough to only+-- compare the flagnames without the values.+--+-- @since 2.2.0+diffFlagAssignment :: FlagAssignment -> FlagAssignment -> FlagAssignment+diffFlagAssignment fa1 fa2 = FlagAssignment+ (Map.difference (getFlagAssignment fa1) (getFlagAssignment fa2))++-- | Find the 'FlagName's that have been listed more than once.+--+-- @since 2.2.0+findDuplicateFlagAssignments :: FlagAssignment -> [FlagName]+findDuplicateFlagAssignments =+ Map.keys . Map.filter ((> 1) . fst) . getFlagAssignment++-- | @since 2.2.0+instance Read FlagAssignment where+ readsPrec p s = [ (FlagAssignment x, rest) | (x,rest) <- readsPrec p s ]++-- | @since 2.2.0+instance Show FlagAssignment where+ showsPrec p (FlagAssignment xs) = showsPrec p xs++-- | String representation of a flag-value pair.+showFlagValue :: (FlagName, Bool) -> String+showFlagValue (f, True) = '+' : unFlagName f+showFlagValue (f, False) = '-' : unFlagName f++-- | Pretty-prints a flag assignment.+dispFlagAssignment :: FlagAssignment -> Disp.Doc+dispFlagAssignment = Disp.hsep . map (Disp.text . showFlagValue) . unFlagAssignment++-- | Parses a flag assignment.+parsecFlagAssignment :: CabalParsing m => m FlagAssignment+parsecFlagAssignment = mkFlagAssignment <$>+ P.sepBy (onFlag <|> offFlag) P.skipSpaces1+ where+ onFlag = do+ _ <- P.optional (P.char '+')+ f <- parsec+ return (f, True)+ offFlag = do+ _ <- P.char '-'+ f <- parsec+ return (f, False)
Distribution/Types/ForeignLib.hs view
@@ -82,7 +82,7 @@ return (mkLibVersionInfo t) instance Binary LibVersionInfo-+instance Structured LibVersionInfo instance NFData LibVersionInfo where rnf = genericRnf instance Pretty LibVersionInfo where@@ -135,7 +135,7 @@ buildInfo f l = (\x -> l { foreignLibBuildInfo = x }) <$> f (foreignLibBuildInfo l) instance Binary ForeignLib-+instance Structured ForeignLib instance NFData ForeignLib where rnf = genericRnf instance Semigroup ForeignLib where
Distribution/Types/ForeignLibOption.hs view
@@ -34,5 +34,5 @@ _ -> fail "unrecognized foreign-library option" instance Binary ForeignLibOption-+instance Structured ForeignLibOption instance NFData ForeignLibOption where rnf = genericRnf
Distribution/Types/ForeignLibType.hs view
@@ -42,7 +42,7 @@ _ -> ForeignLibTypeUnknown instance Binary ForeignLibType-+instance Structured ForeignLibType instance NFData ForeignLibType where rnf = genericRnf instance Semigroup ForeignLibType where
Distribution/Types/GenericPackageDescription.hs view
@@ -6,32 +6,10 @@ module Distribution.Types.GenericPackageDescription ( GenericPackageDescription(..), emptyGenericPackageDescription,- Flag(..),- emptyFlag,- FlagName,- mkFlagName,- unFlagName,- FlagAssignment,- mkFlagAssignment,- unFlagAssignment,- lookupFlagAssignment,- insertFlagAssignment,- diffFlagAssignment,- findDuplicateFlagAssignments,- nullFlagAssignment,- showFlagValue,- dispFlagAssignment,- parsecFlagAssignment,- ConfVar(..), ) where import Prelude () import Distribution.Compat.Prelude-import Distribution.Utils.ShortText-import Distribution.Utils.Generic (lowercase)-import qualified Text.PrettyPrint as Disp-import qualified Data.Map as Map-import qualified Distribution.Compat.CharParsing as P -- lens import Distribution.Compat.Lens as L@@ -39,21 +17,17 @@ import Distribution.Types.PackageDescription +import Distribution.Types.Benchmark+import Distribution.Types.CondTree+import Distribution.Types.ConfVar import Distribution.Types.Dependency-import Distribution.Types.Library-import Distribution.Types.ForeignLib import Distribution.Types.Executable+import Distribution.Types.Flag+import Distribution.Types.ForeignLib+import Distribution.Types.Library import Distribution.Types.TestSuite-import Distribution.Types.Benchmark import Distribution.Types.UnqualComponentName-import Distribution.Types.CondTree- import Distribution.Package-import Distribution.Version-import Distribution.Compiler-import Distribution.System-import Distribution.Parsec-import Distribution.Pretty -- --------------------------------------------------------------------------- -- The 'GenericPackageDescription' type@@ -80,7 +54,7 @@ packageId = packageId . packageDescription instance Binary GenericPackageDescription-+instance Structured GenericPackageDescription instance NFData GenericPackageDescription where rnf = genericRnf emptyGenericPackageDescription :: GenericPackageDescription@@ -100,230 +74,3 @@ <*> (traverse . L._2 . traverse . L.buildInfo) f x4 <*> (traverse . L._2 . traverse . L.buildInfo) f x5 <*> (traverse . L._2 . traverse . L.buildInfo) f x6---- -------------------------------------------------------------------------------- The Flag' type---- | A flag can represent a feature to be included, or a way of linking--- a target against its dependencies, or in fact whatever you can think of.-data Flag = MkFlag- { flagName :: FlagName- , flagDescription :: String- , flagDefault :: Bool- , flagManual :: Bool- }- deriving (Show, Eq, Typeable, Data, Generic)--instance Binary Flag--instance NFData Flag where rnf = genericRnf---- | A 'Flag' initialized with default parameters.-emptyFlag :: FlagName -> Flag-emptyFlag name = MkFlag- { flagName = name- , flagDescription = ""- , flagDefault = True- , flagManual = False- }---- | A 'FlagName' is the name of a user-defined configuration flag------ Use 'mkFlagName' and 'unFlagName' to convert from/to a 'String'.------ This type is opaque since @Cabal-2.0@------ @since 2.0.0.2-newtype FlagName = FlagName ShortText- deriving (Eq, Generic, Ord, Show, Read, Typeable, Data, NFData)---- | Construct a 'FlagName' from a 'String'------ 'mkFlagName' is the inverse to 'unFlagName'------ Note: No validations are performed to ensure that the resulting--- 'FlagName' is valid------ @since 2.0.0.2-mkFlagName :: String -> FlagName-mkFlagName = FlagName . toShortText---- | 'mkFlagName'------ @since 2.0.0.2-instance IsString FlagName where- fromString = mkFlagName---- | Convert 'FlagName' to 'String'------ @since 2.0.0.2-unFlagName :: FlagName -> String-unFlagName (FlagName s) = fromShortText s--instance Binary FlagName--instance Pretty FlagName where- pretty = Disp.text . unFlagName--instance Parsec FlagName where- -- Note: we don't check that FlagName doesn't have leading dash,- -- cabal check will do that.- parsec = mkFlagName . lowercase <$> parsec'- where- parsec' = (:) <$> lead <*> rest- lead = P.satisfy (\c -> isAlphaNum c || c == '_')- rest = P.munch (\c -> isAlphaNum c || c == '_' || c == '-')---- | A 'FlagAssignment' is a total or partial mapping of 'FlagName's to--- 'Bool' flag values. It represents the flags chosen by the user or--- discovered during configuration. For example @--flags=foo --flags=-bar@--- becomes @[("foo", True), ("bar", False)]@----newtype FlagAssignment- = FlagAssignment { getFlagAssignment :: Map.Map FlagName (Int, Bool) }- deriving (Binary, Generic, NFData)--instance Eq FlagAssignment where- (==) (FlagAssignment m1) (FlagAssignment m2)- = fmap snd m1 == fmap snd m2--instance Ord FlagAssignment where- compare (FlagAssignment m1) (FlagAssignment m2)- = fmap snd m1 `compare` fmap snd m2---- | Combines pairs of values contained in the 'FlagAssignment' Map.------ The last flag specified takes precedence, and we record the number--- of times we have seen the flag.----combineFlagValues :: (Int, Bool) -> (Int, Bool) -> (Int, Bool)-combineFlagValues (c1, _) (c2, b2) = (c1 + c2, b2)---- The 'Semigroup' instance currently is right-biased.------ If duplicate flags are specified, we want the last flag specified to--- take precedence and we want to know how many times the flag has been--- specified so that we have the option of warning the user about--- supplying duplicate flags.-instance Semigroup FlagAssignment where- (<>) (FlagAssignment m1) (FlagAssignment m2)- = FlagAssignment (Map.unionWith combineFlagValues m1 m2)--instance Monoid FlagAssignment where- mempty = FlagAssignment Map.empty- mappend = (<>)---- | Construct a 'FlagAssignment' from a list of flag/value pairs.------ If duplicate flags occur in the input list, the later entries--- in the list will take precedence.------ @since 2.2.0-mkFlagAssignment :: [(FlagName, Bool)] -> FlagAssignment-mkFlagAssignment =- FlagAssignment .- Map.fromListWith (flip combineFlagValues) . fmap (fmap (\b -> (1, b)))---- | Deconstruct a 'FlagAssignment' into a list of flag/value pairs.------ @ 'null' ('findDuplicateFlagAssignments' fa) ==> ('mkFlagAssignment' . 'unFlagAssignment') fa == fa @------ @since 2.2.0-unFlagAssignment :: FlagAssignment -> [(FlagName, Bool)]-unFlagAssignment = fmap (fmap snd) . Map.toList . getFlagAssignment---- | Test whether 'FlagAssignment' is empty.------ @since 2.2.0-nullFlagAssignment :: FlagAssignment -> Bool-nullFlagAssignment = Map.null . getFlagAssignment---- | Lookup the value for a flag------ Returns 'Nothing' if the flag isn't contained in the 'FlagAssignment'.------ @since 2.2.0-lookupFlagAssignment :: FlagName -> FlagAssignment -> Maybe Bool-lookupFlagAssignment fn = fmap snd . Map.lookup fn . getFlagAssignment---- | Insert or update the boolean value of a flag.------ If the flag is already present in the 'FlagAssigment', the--- value will be updated and the fact that multiple values have--- been provided for that flag will be recorded so that a--- warning can be generated later on.------ @since 2.2.0-insertFlagAssignment :: FlagName -> Bool -> FlagAssignment -> FlagAssignment--- TODO: this currently just shadows prior values for an existing--- flag; rather than enforcing uniqueness at construction, it's--- verified later on via `D.C.Dependency.configuredPackageProblems`-insertFlagAssignment flag val =- FlagAssignment .- Map.insertWith (flip combineFlagValues) flag (1, val) . getFlagAssignment---- | Remove all flag-assignments from the first 'FlagAssignment' that--- are contained in the second 'FlagAssignment'------ NB/TODO: This currently only removes flag assignments which also--- match the value assignment! We should review the code which uses--- this operation to figure out if this it's not enough to only--- compare the flagnames without the values.------ @since 2.2.0-diffFlagAssignment :: FlagAssignment -> FlagAssignment -> FlagAssignment-diffFlagAssignment fa1 fa2 = FlagAssignment- (Map.difference (getFlagAssignment fa1) (getFlagAssignment fa2))---- | Find the 'FlagName's that have been listed more than once.------ @since 2.2.0-findDuplicateFlagAssignments :: FlagAssignment -> [FlagName]-findDuplicateFlagAssignments =- Map.keys . Map.filter ((> 1) . fst) . getFlagAssignment---- | @since 2.2.0-instance Read FlagAssignment where- readsPrec p s = [ (FlagAssignment x, rest) | (x,rest) <- readsPrec p s ]---- | @since 2.2.0-instance Show FlagAssignment where- showsPrec p (FlagAssignment xs) = showsPrec p xs---- | String representation of a flag-value pair.-showFlagValue :: (FlagName, Bool) -> String-showFlagValue (f, True) = '+' : unFlagName f-showFlagValue (f, False) = '-' : unFlagName f---- | Pretty-prints a flag assignment.-dispFlagAssignment :: FlagAssignment -> Disp.Doc-dispFlagAssignment = Disp.hsep . map (Disp.text . showFlagValue) . unFlagAssignment---- | Parses a flag assignment.-parsecFlagAssignment :: CabalParsing m => m FlagAssignment-parsecFlagAssignment = mkFlagAssignment <$>- P.sepBy (onFlag <|> offFlag) P.skipSpaces1- where- onFlag = do- _ <- P.optional (P.char '+')- f <- parsec- return (f, True)- offFlag = do- _ <- P.char '-'- f <- parsec- return (f, False)--- {-# DEPRECATED parseFlagAssignment "Use parsecFlagAssignment. This symbol will be removed in Cabal-3.0 (est. Mar 2019)." #-}---- -------------------------------------------------------------------------------- The 'CondVar' type---- | A @ConfVar@ represents the variable type used.-data ConfVar = OS OS- | Arch Arch- | Flag FlagName- | Impl CompilerFlavor VersionRange- deriving (Eq, Show, Typeable, Data, Generic)--instance Binary ConfVar--instance NFData ConfVar where rnf = genericRnf
Distribution/Types/GenericPackageDescription/Lens.hs view
@@ -21,9 +21,9 @@ import Distribution.Types.PackageDescription (PackageDescription) import Distribution.Types.Benchmark (Benchmark) import Distribution.Types.ForeignLib (ForeignLib)-import Distribution.Types.GenericPackageDescription- ( GenericPackageDescription(GenericPackageDescription)- , Flag(MkFlag), FlagName, ConfVar (..))+import Distribution.Types.GenericPackageDescription (GenericPackageDescription(GenericPackageDescription) )+import Distribution.Types.Flag (Flag(MkFlag), FlagName)+import Distribution.Types.ConfVar (ConfVar (..)) import Distribution.Types.Library (Library) import Distribution.Types.TestSuite (TestSuite) import Distribution.Types.UnqualComponentName (UnqualComponentName)
Distribution/Types/GivenComponent.hs view
@@ -25,4 +25,4 @@ deriving (Generic, Read, Show, Eq, Typeable) instance Binary GivenComponent-+instance Structured GivenComponent
Distribution/Types/IncludeRenaming.hs view
@@ -30,6 +30,7 @@ deriving (Show, Read, Eq, Ord, Typeable, Data, Generic) instance Binary IncludeRenaming+instance Structured IncludeRenaming instance NFData IncludeRenaming where rnf = genericRnf
Distribution/Types/InstalledPackageInfo.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE OverloadedStrings #-} module Distribution.Types.InstalledPackageInfo ( InstalledPackageInfo (..), emptyInstalledPackageInfo,@@ -25,6 +26,7 @@ import Distribution.Types.MungedPackageId import Distribution.Types.MungedPackageName import Distribution.Version (nullVersion)+import Distribution.Utils.ShortText (ShortText) import qualified Distribution.Package as Package import qualified Distribution.SPDX as SPDX@@ -50,15 +52,15 @@ instantiatedWith :: [(ModuleName, OpenModule)], compatPackageKey :: String, license :: Either SPDX.License License,- copyright :: String,- maintainer :: String,- author :: String,- stability :: String,- homepage :: String,- pkgUrl :: String,- synopsis :: String,- description :: String,- category :: String,+ copyright :: !ShortText,+ maintainer :: !ShortText,+ author :: !ShortText,+ stability :: !ShortText,+ homepage :: !ShortText,+ pkgUrl :: !ShortText,+ synopsis :: !ShortText,+ description :: !ShortText,+ category :: !ShortText, -- these parts are required by an installed package only: abiHash :: AbiHash, indefinite :: Bool,@@ -93,6 +95,7 @@ deriving (Eq, Generic, Typeable, Read, Show) instance Binary InstalledPackageInfo+instance Structured InstalledPackageInfo instance NFData InstalledPackageInfo where rnf = genericRnf
Distribution/Types/InstalledPackageInfo/FieldGrammar.hs view
@@ -67,15 +67,15 @@ <+> optionalFieldDefAla "instantiated-with" InstWith L.instantiatedWith [] <+> optionalFieldDefAla "key" CompatPackageKey L.compatPackageKey "" <+> optionalFieldDefAla "license" SpecLicenseLenient L.license (Left SPDX.NONE)- <+> freeTextFieldDef "copyright" L.copyright- <+> freeTextFieldDef "maintainer" L.maintainer- <+> freeTextFieldDef "author" L.author- <+> freeTextFieldDef "stability" L.stability- <+> freeTextFieldDef "homepage" L.homepage- <+> freeTextFieldDef "package-url" L.pkgUrl- <+> freeTextFieldDef "synopsis" L.synopsis- <+> freeTextFieldDef "description" L.description- <+> freeTextFieldDef "category" L.category+ <+> freeTextFieldDefST "copyright" L.copyright+ <+> freeTextFieldDefST "maintainer" L.maintainer+ <+> freeTextFieldDefST "author" L.author+ <+> freeTextFieldDefST "stability" L.stability+ <+> freeTextFieldDefST "homepage" L.homepage+ <+> freeTextFieldDefST "package-url" L.pkgUrl+ <+> freeTextFieldDefST "synopsis" L.synopsis+ <+> freeTextFieldDefST "description" L.description+ <+> freeTextFieldDefST "category" L.category -- Installed fields <+> optionalFieldDef "abi" L.abiHash (mkAbiHash "") <+> booleanFieldDef "indefinite" L.indefinite False
Distribution/Types/InstalledPackageInfo/Lens.hs view
@@ -14,7 +14,9 @@ import Distribution.Types.InstalledPackageInfo (AbiDependency, ExposedModule, InstalledPackageInfo) import Distribution.Types.LibraryName (LibraryName) import Distribution.Types.LibraryVisibility (LibraryVisibility)+import Distribution.Utils.ShortText (ShortText) + import qualified Distribution.SPDX as SPDX import qualified Distribution.Types.InstalledPackageInfo as T @@ -46,39 +48,39 @@ license f s = fmap (\x -> s { T.license = x }) (f (T.license s)) {-# INLINE license #-} -copyright :: Lens' InstalledPackageInfo String+copyright :: Lens' InstalledPackageInfo ShortText copyright f s = fmap (\x -> s { T.copyright = x }) (f (T.copyright s)) {-# INLINE copyright #-} -maintainer :: Lens' InstalledPackageInfo String+maintainer :: Lens' InstalledPackageInfo ShortText maintainer f s = fmap (\x -> s { T.maintainer = x }) (f (T.maintainer s)) {-# INLINE maintainer #-} -author :: Lens' InstalledPackageInfo String+author :: Lens' InstalledPackageInfo ShortText author f s = fmap (\x -> s { T.author = x }) (f (T.author s)) {-# INLINE author #-} -stability :: Lens' InstalledPackageInfo String+stability :: Lens' InstalledPackageInfo ShortText stability f s = fmap (\x -> s { T.stability = x }) (f (T.stability s)) {-# INLINE stability #-} -homepage :: Lens' InstalledPackageInfo String+homepage :: Lens' InstalledPackageInfo ShortText homepage f s = fmap (\x -> s { T.homepage = x }) (f (T.homepage s)) {-# INLINE homepage #-} -pkgUrl :: Lens' InstalledPackageInfo String+pkgUrl :: Lens' InstalledPackageInfo ShortText pkgUrl f s = fmap (\x -> s { T.pkgUrl = x }) (f (T.pkgUrl s)) {-# INLINE pkgUrl #-} -synopsis :: Lens' InstalledPackageInfo String+synopsis :: Lens' InstalledPackageInfo ShortText synopsis f s = fmap (\x -> s { T.synopsis = x }) (f (T.synopsis s)) {-# INLINE synopsis #-} -description :: Lens' InstalledPackageInfo String+description :: Lens' InstalledPackageInfo ShortText description f s = fmap (\x -> s { T.description = x }) (f (T.description s)) {-# INLINE description #-} -category :: Lens' InstalledPackageInfo String+category :: Lens' InstalledPackageInfo ShortText category f s = fmap (\x -> s { T.category = x }) (f (T.category s)) {-# INLINE category #-}
Distribution/Types/LegacyExeDependency.hs view
@@ -27,6 +27,7 @@ deriving (Generic, Read, Show, Eq, Typeable, Data) instance Binary LegacyExeDependency+instance Structured LegacyExeDependency instance NFData LegacyExeDependency where rnf = genericRnf instance Pretty LegacyExeDependency where@@ -40,7 +41,7 @@ verRange <- parsecMaybeQuoted parsec <|> pure anyVersion pure $ LegacyExeDependency name verRange where- nameP = intercalate "-" <$> P.sepBy1 component (P.char '-')+ nameP = intercalate "-" <$> toList <$> P.sepByNonEmpty component (P.char '-') component = do cs <- P.munch1 (\c -> isAlphaNum c || c == '+' || c == '_') if all isDigit cs then fail "invalid component" else return cs
Distribution/Types/Library.hs view
@@ -34,7 +34,7 @@ buildInfo f l = (\x -> l { libBuildInfo = x }) <$> f (libBuildInfo l) instance Binary Library-+instance Structured Library instance NFData Library where rnf = genericRnf emptyLibrary :: Library
Distribution/Types/LibraryName.hs view
@@ -28,6 +28,7 @@ deriving (Eq, Generic, Ord, Read, Show, Typeable, Data) instance Binary LibraryName+instance Structured LibraryName instance NFData LibraryName where rnf = genericRnf -- | Pretty print 'LibraryName' in build-target-ish syntax.
Distribution/Types/LibraryVisibility.hs view
@@ -38,6 +38,7 @@ _ -> fail $ "Unknown visibility: " ++ name instance Binary LibraryVisibility+instance Structured LibraryVisibility instance NFData LibraryVisibility where rnf = genericRnf instance Semigroup LibraryVisibility where
Distribution/Types/LocalBuildInfo.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE RankNTypes #-}@@ -156,9 +157,10 @@ progPrefix :: PathTemplate, -- ^Prefix to be prepended to installed executables progSuffix :: PathTemplate, -- ^Suffix to be appended to installed executables relocatable :: Bool -- ^Whether to build a relocatable package- } deriving (Generic, Read, Show)+ } deriving (Generic, Read, Show, Typeable) instance Binary LocalBuildInfo+instance Structured LocalBuildInfo ------------------------------------------------------------------------------- -- Accessor functions
Distribution/Types/Mixin.hs view
@@ -22,6 +22,7 @@ deriving (Show, Read, Eq, Ord, Typeable, Data, Generic) instance Binary Mixin+instance Structured Mixin instance NFData Mixin where rnf = genericRnf
Distribution/Types/Module.hs view
@@ -29,6 +29,7 @@ deriving (Generic, Read, Show, Eq, Ord, Typeable, Data) instance Binary Module+instance Structured Module instance Pretty Module where pretty (Module uid mod_name) =
Distribution/Types/ModuleReexport.hs view
@@ -28,7 +28,7 @@ deriving (Eq, Generic, Read, Show, Typeable, Data) instance Binary ModuleReexport-+instance Structured ModuleReexport instance NFData ModuleReexport where rnf = genericRnf instance Pretty ModuleReexport where
Distribution/Types/ModuleRenaming.hs view
@@ -69,6 +69,7 @@ instance Binary ModuleRenaming where+instance Structured ModuleRenaming where instance NFData ModuleRenaming where rnf = genericRnf
Distribution/Types/MungedPackageId.hs view
@@ -31,6 +31,7 @@ deriving (Generic, Read, Show, Eq, Ord, Typeable, Data) instance Binary MungedPackageId+instance Structured MungedPackageId -- | --
Distribution/Types/MungedPackageName.hs view
@@ -34,6 +34,7 @@ deriving (Generic, Read, Show, Eq, Ord, Typeable, Data) instance Binary MungedPackageName+instance Structured MungedPackageName instance NFData MungedPackageName where rnf = genericRnf -- | Computes the package name for a library. If this is the public@@ -68,7 +69,7 @@ -- >>> prettyShow $ MungedPackageName "servant" LMainLibName -- "servant" ----- >>> prettyShow $ MungedPackageName "servant" (LSubLibName "lackey") +-- >>> prettyShow $ MungedPackageName "servant" (LSubLibName "lackey") -- "z-servant-z-lackey" -- instance Pretty MungedPackageName where@@ -77,7 +78,7 @@ -- indefinite package for us. pretty = Disp.text . encodeCompatPackageName' --- | +-- | -- -- >>> simpleParsec "servant" :: Maybe MungedPackageName -- Just (MungedPackageName (PackageName "servant") LMainLibName)@@ -137,7 +138,7 @@ parseZDashCode :: CabalParsing m => m [String] parseZDashCode = do- ns <- P.sepBy1 (some (P.satisfy (/= '-'))) (P.char '-')+ ns <- toList <$> P.sepByNonEmpty (some (P.satisfy (/= '-'))) (P.char '-') return (go ns) where go ns = case break (=="z") ns of
Distribution/Types/PackageDescription.hs view
@@ -88,6 +88,7 @@ import Distribution.License import Distribution.Package import Distribution.Version+import Distribution.Utils.ShortText import qualified Distribution.SPDX as SPDX @@ -113,18 +114,18 @@ package :: PackageIdentifier, licenseRaw :: Either SPDX.License License, licenseFiles :: [FilePath],- copyright :: String,- maintainer :: String,- author :: String,- stability :: String,+ copyright :: !ShortText,+ maintainer :: !ShortText,+ author :: !ShortText,+ stability :: !ShortText, testedWith :: [(CompilerFlavor,VersionRange)],- homepage :: String,- pkgUrl :: String,- bugReports :: String,+ homepage :: !ShortText,+ pkgUrl :: !ShortText,+ bugReports :: !ShortText, sourceRepos :: [SourceRepo],- synopsis :: String, -- ^A one-line summary of this package- description :: String, -- ^A more verbose description of this package- category :: String,+ synopsis :: !ShortText, -- ^A one-line summary of this package+ description :: !ShortText, -- ^A more verbose description of this package+ category :: !ShortText, customFieldsPD :: [(String,String)], -- ^Custom fields starting -- with x-, stored in a -- simple assoc-list.@@ -152,6 +153,7 @@ deriving (Generic, Show, Read, Eq, Typeable, Data) instance Binary PackageDescription+instance Structured PackageDescription instance NFData PackageDescription where rnf = genericRnf @@ -223,18 +225,18 @@ licenseFiles = [], specVersionRaw = Right anyVersion, buildTypeRaw = Nothing,- copyright = "",- maintainer = "",- author = "",- stability = "",+ copyright = mempty,+ maintainer = mempty,+ author = mempty,+ stability = mempty, testedWith = [],- homepage = "",- pkgUrl = "",- bugReports = "",+ homepage = mempty,+ pkgUrl = mempty,+ bugReports = mempty, sourceRepos = [],- synopsis = "",- description = "",- category = "",+ synopsis = mempty,+ description = mempty,+ category = mempty, customFieldsPD = [], setupBuildInfo = Nothing, library = Nothing,@@ -473,6 +475,6 @@ <*> (traverse . L.buildInfo) f x6 -- benchmarks <*> pure a20 -- data files <*> pure a21 -- data dir- <*> pure a22 -- exta src files+ <*> pure a22 -- extra src files <*> pure a23 -- extra temp files <*> pure a24 -- extra doc files
Distribution/Types/PackageDescription/Lens.hs view
@@ -1,5 +1,5 @@ {-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE RankNTypes #-} module Distribution.Types.PackageDescription.Lens ( PackageDescription, module Distribution.Types.PackageDescription.Lens,@@ -9,27 +9,28 @@ import Distribution.Compat.Prelude import Prelude () -import Distribution.Compiler (CompilerFlavor)-import Distribution.License (License)-import Distribution.ModuleName (ModuleName)-import Distribution.Types.Benchmark (Benchmark, benchmarkModules)-import Distribution.Types.Benchmark.Lens (benchmarkName, benchmarkBuildInfo)-import Distribution.Types.BuildInfo (BuildInfo)-import Distribution.Types.BuildType (BuildType)-import Distribution.Types.ComponentName (ComponentName(..))-import Distribution.Types.Executable (Executable, exeModules)-import Distribution.Types.Executable.Lens (exeName, exeBuildInfo)-import Distribution.Types.ForeignLib (ForeignLib, foreignLibModules)-import Distribution.Types.ForeignLib.Lens (foreignLibName, foreignLibBuildInfo)-import Distribution.Types.Library (Library, explicitLibModules)-import Distribution.Types.Library.Lens (libName, libBuildInfo)-import Distribution.Types.PackageDescription (PackageDescription)-import Distribution.Types.PackageId (PackageIdentifier)-import Distribution.Types.SetupBuildInfo (SetupBuildInfo)-import Distribution.Types.SourceRepo (SourceRepo)-import Distribution.Types.TestSuite (TestSuite, testModules)-import Distribution.Types.TestSuite.Lens (testName, testBuildInfo)-import Distribution.Version (Version, VersionRange)+import Distribution.Compiler (CompilerFlavor)+import Distribution.License (License)+import Distribution.ModuleName (ModuleName)+import Distribution.Types.Benchmark (Benchmark, benchmarkModules)+import Distribution.Types.Benchmark.Lens (benchmarkBuildInfo, benchmarkName)+import Distribution.Types.BuildInfo (BuildInfo)+import Distribution.Types.BuildType (BuildType)+import Distribution.Types.ComponentName (ComponentName (..))+import Distribution.Types.Executable (Executable, exeModules)+import Distribution.Types.Executable.Lens (exeBuildInfo, exeName)+import Distribution.Types.ForeignLib (ForeignLib, foreignLibModules)+import Distribution.Types.ForeignLib.Lens (foreignLibBuildInfo, foreignLibName)+import Distribution.Types.Library (Library, explicitLibModules)+import Distribution.Types.Library.Lens (libBuildInfo, libName)+import Distribution.Types.PackageDescription (PackageDescription)+import Distribution.Types.PackageId (PackageIdentifier)+import Distribution.Types.SetupBuildInfo (SetupBuildInfo)+import Distribution.Types.SourceRepo (SourceRepo)+import Distribution.Types.TestSuite (TestSuite, testModules)+import Distribution.Types.TestSuite.Lens (testBuildInfo, testName)+import Distribution.Utils.ShortText (ShortText)+import Distribution.Version (Version, VersionRange) import qualified Distribution.SPDX as SPDX import qualified Distribution.Types.PackageDescription as T@@ -42,23 +43,23 @@ licenseRaw f s = fmap (\x -> s { T.licenseRaw = x }) (f (T.licenseRaw s)) {-# INLINE licenseRaw #-} -licenseFiles :: Lens' PackageDescription [String]+licenseFiles :: Lens' PackageDescription [FilePath] licenseFiles f s = fmap (\x -> s { T.licenseFiles = x }) (f (T.licenseFiles s)) {-# INLINE licenseFiles #-} -copyright :: Lens' PackageDescription String+copyright :: Lens' PackageDescription ShortText copyright f s = fmap (\x -> s { T.copyright = x }) (f (T.copyright s)) {-# INLINE copyright #-} -maintainer :: Lens' PackageDescription String+maintainer :: Lens' PackageDescription ShortText maintainer f s = fmap (\x -> s { T.maintainer = x }) (f (T.maintainer s)) {-# INLINE maintainer #-} -author :: Lens' PackageDescription String+author :: Lens' PackageDescription ShortText author f s = fmap (\x -> s { T.author = x }) (f (T.author s)) {-# INLINE author #-} -stability :: Lens' PackageDescription String+stability :: Lens' PackageDescription ShortText stability f s = fmap (\x -> s { T.stability = x }) (f (T.stability s)) {-# INLINE stability #-} @@ -66,15 +67,15 @@ testedWith f s = fmap (\x -> s { T.testedWith = x }) (f (T.testedWith s)) {-# INLINE testedWith #-} -homepage :: Lens' PackageDescription String+homepage :: Lens' PackageDescription ShortText homepage f s = fmap (\x -> s { T.homepage = x }) (f (T.homepage s)) {-# INLINE homepage #-} -pkgUrl :: Lens' PackageDescription String+pkgUrl :: Lens' PackageDescription ShortText pkgUrl f s = fmap (\x -> s { T.pkgUrl = x }) (f (T.pkgUrl s)) {-# INLINE pkgUrl #-} -bugReports :: Lens' PackageDescription String+bugReports :: Lens' PackageDescription ShortText bugReports f s = fmap (\x -> s { T.bugReports = x }) (f (T.bugReports s)) {-# INLINE bugReports #-} @@ -82,15 +83,15 @@ sourceRepos f s = fmap (\x -> s { T.sourceRepos = x }) (f (T.sourceRepos s)) {-# INLINE sourceRepos #-} -synopsis :: Lens' PackageDescription String+synopsis :: Lens' PackageDescription ShortText synopsis f s = fmap (\x -> s { T.synopsis = x }) (f (T.synopsis s)) {-# INLINE synopsis #-} -description :: Lens' PackageDescription String+description :: Lens' PackageDescription ShortText description f s = fmap (\x -> s { T.description = x }) (f (T.description s)) {-# INLINE description #-} -category :: Lens' PackageDescription String+category :: Lens' PackageDescription ShortText category f s = fmap (\x -> s { T.category = x }) (f (T.category s)) {-# INLINE category #-} @@ -165,18 +166,18 @@ componentModules cname = case cname of CLibName name -> componentModules' name allLibraries libName explicitLibModules- CFLibName name -> + CFLibName name -> componentModules' name (foreignLibs . traverse) foreignLibName foreignLibModules- CExeName name -> + CExeName name -> componentModules' name (executables . traverse) exeName exeModules- CTestName name -> + CTestName name -> componentModules' name (testSuites . traverse) testName testModules CBenchName name -> componentModules' name (benchmarks . traverse) benchmarkName benchmarkModules where componentModules' :: (Eq name, Monoid r)- => name + => name -> Traversal' PackageDescription a -> Lens' a name -> (a -> [ModuleName])@@ -192,21 +193,21 @@ -- | @since 2.4 componentBuildInfo :: ComponentName -> Traversal' PackageDescription BuildInfo componentBuildInfo cname = case cname of- CLibName name -> + CLibName name -> componentBuildInfo' name allLibraries libName libBuildInfo- CFLibName name -> + CFLibName name -> componentBuildInfo' name (foreignLibs . traverse) foreignLibName foreignLibBuildInfo- CExeName name -> + CExeName name -> componentBuildInfo' name (executables . traverse) exeName exeBuildInfo- CTestName name -> + CTestName name -> componentBuildInfo' name (testSuites . traverse) testName testBuildInfo CBenchName name -> componentBuildInfo' name (benchmarks . traverse) benchmarkName benchmarkBuildInfo where componentBuildInfo' :: Eq name- => name + => name -> Traversal' PackageDescription a- -> Lens' a name + -> Lens' a name -> Traversal' a BuildInfo -> Traversal' PackageDescription BuildInfo componentBuildInfo' name pdL nameL biL =
Distribution/Types/PackageId.hs view
@@ -13,6 +13,7 @@ import Distribution.Types.PackageName import Distribution.Version (Version, nullVersion) +import qualified Data.List.NonEmpty as NE import qualified Distribution.Compat.CharParsing as P import qualified Text.PrettyPrint as Disp @@ -28,6 +29,7 @@ deriving (Generic, Read, Show, Eq, Ord, Typeable, Data) instance Binary PackageIdentifier+instance Structured PackageIdentifier instance Pretty PackageIdentifier where pretty (PackageIdentifier n v)@@ -58,10 +60,10 @@ -- instance Parsec PackageIdentifier where parsec = do- xs' <- P.sepBy1 component (P.char '-')- (v, xs) <- case simpleParsec (last xs') of- Nothing -> return (nullVersion, xs') -- all components are version- Just v -> return (v, init xs')+ xs' <- P.sepByNonEmpty component (P.char '-')+ (v, xs) <- case simpleParsec (NE.last xs') of+ Nothing -> return (nullVersion, toList xs') -- all components are version+ Just v -> return (v, NE.init xs') if not (null xs) && all (\c -> all (/= '.') c && not (all isDigit c)) xs then return $ PackageIdentifier (mkPackageName (intercalate "-" xs)) v else fail "all digits or a dot in a portion of package name"
Distribution/Types/PackageName.hs view
@@ -46,6 +46,7 @@ fromString = mkPackageName instance Binary PackageName+instance Structured PackageName instance Pretty PackageName where pretty = Disp.text . unPackageName
Distribution/Types/PackageVersionConstraint.hs view
@@ -24,6 +24,7 @@ deriving (Generic, Read, Show, Eq, Typeable, Data) instance Binary PackageVersionConstraint+instance Structured PackageVersionConstraint instance NFData PackageVersionConstraint where rnf = genericRnf instance Pretty PackageVersionConstraint where
Distribution/Types/PkgconfigDependency.hs view
@@ -25,6 +25,7 @@ deriving (Generic, Read, Show, Eq, Typeable, Data) instance Binary PkgconfigDependency+instance Structured PkgconfigDependency instance NFData PkgconfigDependency where rnf = genericRnf instance Pretty PkgconfigDependency where
Distribution/Types/PkgconfigName.hs view
@@ -47,6 +47,7 @@ fromString = mkPkgconfigName instance Binary PkgconfigName+instance Structured PkgconfigName -- pkg-config allows versions and other letters in package names, eg -- "gtk+-2.0" is a valid pkg-config package _name_. It then has a package
Distribution/Types/PkgconfigVersion.hs view
@@ -34,6 +34,7 @@ PkgconfigVersion a `compare` PkgconfigVersion b = rpmvercmp a b instance Binary PkgconfigVersion+instance Structured PkgconfigVersion instance NFData PkgconfigVersion where rnf = genericRnf instance Pretty PkgconfigVersion where
Distribution/Types/PkgconfigVersionRange.hs view
@@ -37,6 +37,7 @@ deriving (Generic, Read, Show, Eq, Typeable, Data) instance Binary PkgconfigVersionRange+instance Structured PkgconfigVersionRange instance NFData PkgconfigVersionRange where rnf = genericRnf instance Pretty PkgconfigVersionRange where
Distribution/Types/SetupBuildInfo.hs view
@@ -28,7 +28,7 @@ deriving (Generic, Show, Eq, Read, Typeable, Data) instance Binary SetupBuildInfo-+instance Structured SetupBuildInfo instance NFData SetupBuildInfo where rnf = genericRnf instance Monoid SetupBuildInfo where
Distribution/Types/SourceRepo.hs view
@@ -95,7 +95,7 @@ } instance Binary SourceRepo-+instance Structured SourceRepo instance NFData SourceRepo where rnf = genericRnf -- | What this repo info is for, what it represents.@@ -115,7 +115,7 @@ deriving (Eq, Generic, Ord, Read, Show, Typeable, Data) instance Binary RepoKind-+instance Structured RepoKind instance NFData RepoKind where rnf = genericRnf -- | An enumeration of common source control systems. The fields used in the@@ -128,7 +128,7 @@ deriving (Eq, Generic, Ord, Read, Show, Typeable, Data) instance Binary RepoType-+instance Structured RepoType instance NFData RepoType where rnf = genericRnf knownRepoTypes :: [RepoType]
Distribution/Types/TestSuite.hs view
@@ -34,6 +34,7 @@ buildInfo f l = (\x -> l { testBuildInfo = x }) <$> f (testBuildInfo l) instance Binary TestSuite+instance Structured TestSuite instance NFData TestSuite where rnf = genericRnf
Distribution/Types/TestSuiteInterface.hs view
@@ -39,6 +39,7 @@ deriving (Eq, Generic, Read, Show, Typeable, Data) instance Binary TestSuiteInterface+instance Structured TestSuiteInterface instance NFData TestSuiteInterface where rnf = genericRnf
Distribution/Types/TestType.hs view
@@ -22,6 +22,7 @@ deriving (Generic, Show, Read, Eq, Typeable, Data) instance Binary TestType+instance Structured TestType instance NFData TestType where rnf = genericRnf
Distribution/Types/UnitId.hs view
@@ -66,6 +66,7 @@ deriving (Generic, Read, Show, Eq, Ord, Typeable, Data, NFData) instance Binary UnitId+instance Structured UnitId -- | The textual format for 'UnitId' coincides with the format -- GHC accepts for @-package-id@.@@ -113,6 +114,8 @@ -- unfilled holes. newtype DefUnitId = DefUnitId { unDefUnitId :: UnitId } deriving (Generic, Read, Show, Eq, Ord, Typeable, Data, Binary, NFData, Pretty)++instance Structured DefUnitId -- Workaround for a GHC 8.0.1 bug, see -- https://github.com/haskell/cabal/issues/4793#issuecomment-334258288
Distribution/Types/UnqualComponentName.hs view
@@ -49,6 +49,7 @@ fromString = mkUnqualComponentName instance Binary UnqualComponentName+instance Structured UnqualComponentName instance Pretty UnqualComponentName where pretty = showToken . unUnqualComponentName
Distribution/Types/Version.hs view
@@ -81,6 +81,7 @@ return (mkVersion v) instance Binary Version+instance Structured Version instance NFData Version where rnf (PV0 _) = ()@@ -92,7 +93,7 @@ (map Disp.int $ versionNumbers ver)) instance Parsec Version where- parsec = mkVersion <$> P.sepBy1 versionDigitParser (P.char '.') <* tags+ parsec = mkVersion <$> toList <$> P.sepByNonEmpty versionDigitParser (P.char '.') <* tags where tags = do ts <- many $ P.char '-' *> some (P.satisfy isAlphaNum)
Distribution/Types/VersionInterval.hs view
@@ -118,9 +118,9 @@ doesNotTouch' ((_,u), (l',_)) = doesNotTouch u l' adjacentIntervals :: [(VersionInterval, VersionInterval)]- adjacentIntervals- | null intervals = []- | otherwise = zip intervals (tail intervals)+ adjacentIntervals = case intervals of+ [] -> []+ (_:tl) -> zip intervals tl checkInvariant :: VersionIntervals -> VersionIntervals checkInvariant is = assert (invariant is) is
Distribution/Types/VersionRange.hs view
@@ -39,6 +39,7 @@ import Distribution.Compat.Prelude import Distribution.Types.Version import Distribution.Types.VersionRange.Internal+import Distribution.Utils.Generic import Prelude () -- | Fold over the basic syntactic structure of a 'VersionRange'.@@ -130,7 +131,9 @@ -- | @since 2.2 wildcardUpperBound :: Version -> Version wildcardUpperBound = alterVersion $- \lowerBound -> init lowerBound ++ [last lowerBound + 1]+ \lowerBound -> case unsnoc lowerBound of+ Nothing -> []+ Just (xs, x) -> xs ++ [x + 1] isWildcardRange :: Version -> Version -> Bool isWildcardRange ver1 ver2 = check (versionNumbers ver1) (versionNumbers ver2)
Distribution/Types/VersionRange/Internal.hs view
@@ -60,7 +60,7 @@ deriving ( Data, Eq, Generic, Read, Show, Typeable ) instance Binary VersionRange-+instance Structured VersionRange instance NFData VersionRange where rnf = genericRnf -- | The version range @-any@. That is, a version range containing all@@ -381,7 +381,7 @@ -- a plain version without tags or wildcards verPlain :: CabalParsing m => m Version- verPlain = mkVersion <$> P.sepBy1 digitParser (P.char '.')+ verPlain = mkVersion <$> toList <$> P.sepByNonEmpty digitParser (P.char '.') -- either wildcard or normal version verOrWild :: CabalParsing m => m (Bool, Version)
Distribution/Utils/Generic.hs view
@@ -64,13 +64,18 @@ ordNub, ordNubBy, ordNubRight,+ safeHead, safeTail,+ safeLast,+ safeInit, unintersperse, wrapText, wrapLine, unfoldrM, spanMaybe, breakMaybe,+ unsnoc,+ unsnocNE, -- * FilePath stuff isAbsoluteOnAnyPlatform,@@ -280,11 +285,11 @@ -- -- Example: ----- >>> tail $ Data.List.dropWhileEnd (<3) [undefined, 5, 4, 3, 2, 1]+-- >>> safeTail $ Data.List.dropWhileEnd (<3) [undefined, 5, 4, 3, 2, 1] -- *** Exception: Prelude.undefined -- ... ----- >>> tail $ dropWhileEndLE (<3) [undefined, 5, 4, 3, 2, 1]+-- >>> safeTail $ dropWhileEndLE (<3) [undefined, 5, 4, 3, 2, 1] -- [5,4,3] -- -- >>> take 3 $ Data.List.dropWhileEnd (<3) [5, 4, 3, 2, 1, undefined]@@ -363,11 +368,35 @@ where bSet = Set.fromList b +-- | A total variant of 'head'.+--+-- @since 3.2.0.0+safeHead :: [a] -> Maybe a+safeHead [] = Nothing+safeHead (x:_) = Just x+ -- | A total variant of 'tail'.+--+-- @since 3.2.0.0 safeTail :: [a] -> [a] safeTail [] = [] safeTail (_:xs) = xs +-- | A total variant of 'last'.+--+-- @since 3.2.0.0+safeLast :: [a] -> Maybe a+safeLast [] = Nothing+safeLast (x:xs) = Just (foldl (\_ a -> a) x xs)++-- | A total variant of 'init'.+--+-- @since 3.2.0.0+safeInit :: [a] -> [a]+safeInit [] = []+safeInit [_] = []+safeInit (x:xs) = x : safeInit xs+ equating :: Eq a => (b -> a) -> b -> b -> Bool equating p x y = p x == p y @@ -453,6 +482,39 @@ case m of Nothing -> return [] Just (a, b') -> liftM (a :) (go b')++-- | The opposite of 'snoc', which is the reverse of 'cons'+--+-- Example:+--+-- >>> unsnoc [1, 2, 3]+-- Just ([1,2],3)+--+-- >>> unsnoc []+-- Nothing+--+-- @since 3.2.0.0+--+unsnoc :: [a] -> Maybe ([a], a)+unsnoc [] = Nothing+unsnoc (x:xs) = Just (unsnocNE (x :| xs))++-- | Like 'unsnoc', but for 'NonEmpty' so without the 'Maybe'+--+-- Example:+--+-- >>> unsnocNE (1 :| [2, 3])+-- ([1,2],3)+--+-- >>> unsnocNE (1 :| [])+-- ([],1)+--+-- @since 3.2.0.0+--+unsnocNE :: NonEmpty a -> ([a], a)+unsnocNE (x:|xs) = go x xs where+ go y [] = ([], y)+ go y (z:zs) = let ~(ws, w) = go z zs in (y : ws, w) -- ------------------------------------------------------------ -- * FilePath stuff
Distribution/Utils/IOData.hs view
@@ -1,14 +1,17 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE RankNTypes #-} -- | @since 2.2.0 module Distribution.Utils.IOData ( -- * 'IOData' & 'IODataMode' type- IOData(..)- , IODataMode(..)+ IOData (..)+ , IODataMode (..)+ , KnownIODataMode (..)+ , withIOData , null- , hGetContents , hPutContents ) where -import qualified Data.ByteString.Lazy as BS+import qualified Data.ByteString.Lazy as LBS import Distribution.Compat.Prelude hiding (null) import qualified Prelude import qualified System.IO@@ -16,46 +19,68 @@ -- | Represents either textual or binary data passed via I/O functions -- which support binary/text mode ----- @since 2.2.0-data IOData = IODataText String- -- ^ How Text gets encoded is usually locale-dependent.- | IODataBinary BS.ByteString- -- ^ Raw binary which gets read/written in binary mode.+-- @since 2.2+data IOData+ = IODataText String+ -- ^ How Text gets encoded is usually locale-dependent.+ | IODataBinary LBS.ByteString+ -- ^ Raw binary which gets read/written in binary mode. +withIOData :: IOData -> (forall mode. IODataMode mode -> mode -> r) -> r+withIOData (IODataText str) k = k IODataModeText str+withIOData (IODataBinary lbs) k = k IODataModeBinary lbs+ -- | Test whether 'IOData' is empty------ @since 2.2.0 null :: IOData -> Bool-null (IODataText s) = Prelude.null s-null (IODataBinary b) = BS.null b+null (IODataText s) = Prelude.null s+null (IODataBinary b) = LBS.null b instance NFData IOData where- rnf (IODataText s) = rnf s- rnf (IODataBinary bs) = rnf bs+ rnf (IODataText s) = rnf s+ rnf (IODataBinary lbs) = rnf lbs -data IODataMode = IODataModeText | IODataModeBinary+-- | @since 2.2+class NFData mode => KnownIODataMode mode where+ -- | 'IOData' Wrapper for 'System.IO.hGetContents'+ --+ -- __Note__: This operation uses lazy I/O. Use 'NFData' to force all+ -- data to be read and consequently the internal file handle to be+ -- closed.+ --+ hGetIODataContents :: System.IO.Handle -> Prelude.IO mode --- | 'IOData' Wrapper for 'System.IO.hGetContents'------ __Note__: This operation uses lazy I/O. Use 'NFData' to force all--- data to be read and consequently the internal file handle to be--- closed.------ @since 2.2.0-hGetContents :: System.IO.Handle -> IODataMode -> Prelude.IO IOData-hGetContents h IODataModeText = do- System.IO.hSetBinaryMode h False- IODataText <$> System.IO.hGetContents h-hGetContents h IODataModeBinary = do- System.IO.hSetBinaryMode h True- IODataBinary <$> BS.hGetContents h+ toIOData :: mode -> IOData+ iodataMode :: IODataMode mode +-- | @since 3.2+data IODataMode mode where+ IODataModeText :: IODataMode String+ IODataModeBinary :: IODataMode LBS.ByteString++instance a ~ Char => KnownIODataMode [a] where+ hGetIODataContents h = do+ System.IO.hSetBinaryMode h False+ System.IO.hGetContents h++ toIOData = IODataText+ iodataMode = IODataModeText++instance KnownIODataMode LBS.ByteString where+ hGetIODataContents h = do+ System.IO.hSetBinaryMode h True+ LBS.hGetContents h++ toIOData = IODataBinary+ iodataMode = IODataModeBinary+ -- | 'IOData' Wrapper for 'System.IO.hPutStr' and 'System.IO.hClose' ----- This is the dual operation ot 'ioDataHGetContents',+-- This is the dual operation ot 'hGetIODataContents', -- and consequently the handle is closed with `hClose`. ----- @since 2.2.0+-- /Note:/ this performs lazy-IO.+--+-- @since 2.2 hPutContents :: System.IO.Handle -> IOData -> Prelude.IO () hPutContents h (IODataText c) = do System.IO.hSetBinaryMode h False@@ -63,5 +88,5 @@ System.IO.hClose h hPutContents h (IODataBinary c) = do System.IO.hSetBinaryMode h True- BS.hPutStr h c+ LBS.hPutStr h c System.IO.hClose h
+ Distribution/Utils/MD5.hs view
@@ -0,0 +1,54 @@+module Distribution.Utils.MD5 (+ MD5,+ showMD5,+ md5,+ -- * Binary+ binaryPutMD5,+ binaryGetMD5,+ ) where++import Data.Binary (Get, Put)+import Data.Binary.Get (getWord64le)+import Data.Binary.Put (putWord64le)+import Foreign.Ptr (castPtr)+import GHC.Fingerprint (Fingerprint (..), fingerprintData)+import Numeric (showHex)+import System.IO.Unsafe (unsafeDupablePerformIO)++import qualified Data.ByteString as BS+import qualified Data.ByteString.Unsafe as BS++type MD5 = Fingerprint++-- | Show 'MD5' in human readable form+--+-- >>> showMD5 (Fingerprint 123 456)+-- "000000000000007b00000000000001c8"+--+-- >>> showMD5 $ md5 $ BS.pack [0..127]+-- "37eff01866ba3f538421b30b7cbefcac"+--+-- @since 3.2.0.0+showMD5 :: MD5 -> String+showMD5 (Fingerprint a b) = pad a' ++ pad b' where+ a' = showHex a ""+ b' = showHex b ""+ pad s = replicate (16 - length s) '0' ++ s++-- | @since 3.2.0.0+md5 :: BS.ByteString -> MD5+md5 bs = unsafeDupablePerformIO $ BS.unsafeUseAsCStringLen bs $ \(ptr, len) ->+ fingerprintData (castPtr ptr) len++-- | @since 3.2.0.0+binaryPutMD5 :: MD5 -> Put+binaryPutMD5 (Fingerprint a b) = do+ putWord64le a+ putWord64le b++-- | @since 3.2.0.0+binaryGetMD5 :: Get MD5+binaryGetMD5 = do+ a <- getWord64le+ b <- getWord64le+ return (Fingerprint a b)
Distribution/Utils/NubList.hs view
@@ -1,5 +1,6 @@-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE ScopedTypeVariables #-} module Distribution.Utils.NubList ( NubList -- opaque , toNubList -- smart construtor@@ -12,8 +13,8 @@ , overNubListR ) where -import Prelude () import Distribution.Compat.Prelude+import Prelude () import Distribution.Simple.Utils @@ -66,7 +67,7 @@ -- | Helper used by NubList/NubListR's Read instances. readNubList :: (Read a) => ([a] -> l a) -> R.ReadPrec (l a)-readNubList toList = R.parens . R.prec 10 $ fmap toList R.readPrec+readNubList listToL = R.parens . R.prec 10 $ fmap listToL R.readPrec -- | Binary instance for 'NubList a' is the same as for '[a]'. For 'put', we -- just pull off constructor and put the list. For 'get', we get the list and@@ -74,6 +75,8 @@ instance (Ord a, Binary a) => Binary (NubList a) where put (NubList l) = put l get = fmap toNubList get++instance Structured a => Structured (NubList a) -- | NubListR : A right-biased version of 'NubList'. That is @toNubListR -- ["-XNoFoo", "-XFoo", "-XNoFoo"]@ will result in @["-XFoo", "-XNoFoo"]@,
Distribution/Utils/ShortText.hs view
@@ -1,22 +1,37 @@-{-# LANGUAGE CPP #-}+{-# LANGUAGE CPP #-} {-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveGeneric #-} +-- | Compact representation of short 'Strings'+--+-- This module is designed to be import qualifeid+--+-- @+-- import Distribution.Utils.ShortText (ShortText)+-- import qualifeid Distribution.Utils.ShortText as ShortText+-- @ module Distribution.Utils.ShortText ( -- * 'ShortText' type ShortText , toShortText , fromShortText+ , unsafeFromUTF8BS + -- * Operations+ , null+ , length+ -- * internal utilities , decodeStringUtf8 , encodeStringUtf8 ) where +import Distribution.Compat.Prelude hiding (length, null) import Prelude ()-import Distribution.Compat.Prelude-import Distribution.Utils.String +import Distribution.Utils.String (decodeStringUtf8, encodeStringUtf8)+import Distribution.Utils.Structured (Structured (..), nominalStructure)+ #if defined(MIN_VERSION_bytestring) # if MIN_VERSION_bytestring(0,10,4) # define HAVE_SHORTBYTESTRING 1@@ -40,8 +55,13 @@ #define MIN_VERSION_binary(x, y, z) 0 #endif +import qualified Data.ByteString as BS+import qualified Data.List as List+ #if HAVE_SHORTBYTESTRING import qualified Data.ByteString.Short as BS.Short+#else+import Distribution.Utils.Generic (fromUTF8BS) #endif -- | Construct 'ShortText' from 'String'@@ -50,6 +70,16 @@ -- | Convert 'ShortText' to 'String' fromShortText :: ShortText -> String +-- | Convert from UTF-8 encoded strict 'ByteString'.+--+-- @since 3.2.0.0+unsafeFromUTF8BS :: BS.ByteString -> ShortText++-- | Text whether 'ShortText' is empty.+--+-- @since 3.2.0.0+null :: ShortText -> Bool+ -- | Compact representation of short 'Strings' -- -- The data is stored internally as UTF8 in an@@ -75,9 +105,14 @@ get = fmap (ST . BS.Short.toShort) get # endif + toShortText = ST . BS.Short.pack . encodeStringUtf8 fromShortText = decodeStringUtf8 . BS.Short.unpack . unST++unsafeFromUTF8BS = ST . BS.Short.toShort++null = BS.Short.null . unST #else newtype ShortText = ST { unST :: String } deriving (Eq,Ord,Generic,Data,Typeable)@@ -89,8 +124,14 @@ toShortText = ST fromShortText = unST++unsafeFromUTF8BS = ST . fromUTF8BS++null = List.null . unST #endif +instance Structured ShortText where structure = nominalStructure+ instance NFData ShortText where rnf = rnf . unST @@ -109,3 +150,10 @@ instance IsString ShortText where fromString = toShortText++-- | /O(n)/. Length in characters. /Slow/ as converts to string.+--+-- @since 3.2.0.0+length :: ShortText -> Int+length = List.length . fromShortText+-- Note: avoid using it, we use it @cabal check@ implementation, where it's ok.
+ Distribution/Utils/Structured.hs view
@@ -0,0 +1,472 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DefaultSignatures #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+#if __GLASGOW_HASKELL__ >= 711+{-# LANGUAGE PatternSynonyms #-}+#endif+#if __GLASGOW_HASKELL__ >= 800+{-# LANGUAGE TypeInType #-}+#endif+-- |+--+-- Copyright: (c) 2019 Oleg Grenrus+--+-- Structurally tag binary serialisaton stream.+-- Useful when most 'Binary' instances are 'Generic' derived.+--+-- Say you have a data type+--+-- @+-- data Record = Record+-- { _recordFields :: HM.HashMap Text (Integer, ByteString)+-- , _recordEnabled :: Bool+-- }+-- deriving (Eq, Show, Generic)+--+-- instance 'Binary' Record+-- instance 'Structured' Record+-- @+--+-- then you can serialise and deserialise @Record@ values with a structure tag by simply+--+-- @+-- 'structuredEncode' record :: 'LBS.ByteString'+-- 'structuredDecode' lbs :: IO Record+-- @+--+-- If structure of @Record@ changes in between, deserialisation will fail early.+--+-- Technically, 'Structured' is not related to 'Binary', and may+-- be useful in other uses.+--+module Distribution.Utils.Structured (+ -- * Encoding and decoding+ -- | These functions operate like @binary@'s counterparts,+ -- but the serialised version has a structure hash in front.+ structuredEncode,+ structuredEncodeFile,+ structuredDecode,+ structuredDecodeOrFailIO,+ structuredDecodeFileOrFail,+ -- * Structured class+ Structured (structure),+ MD5,+ structureHash,+ structureBuilder,+ genericStructure,+ GStructured,+ nominalStructure,+ containerStructure,+ -- * Structure type+ Structure (..),+ TypeName,+ ConstructorName,+ TypeVersion,+ SopStructure,+ hashStructure,+ typeVersion,+ typeName,+ ) where++import Data.Int (Int16, Int32, Int64, Int8)+import Data.List.NonEmpty (NonEmpty)+import Data.Proxy (Proxy (..))+import Data.Ratio (Ratio)+import Data.Word (Word, Word16, Word32, Word64, Word8)++import qualified Control.Monad.Trans.State.Strict as State++import Control.Exception (ErrorCall (..), catch, evaluate)++import GHC.Generics++import qualified Data.ByteString as BS+import qualified Data.ByteString.Lazy as LBS+import qualified Data.ByteString.Lazy.Builder as Builder+import qualified Data.IntMap as IM+import qualified Data.IntSet as IS+import qualified Data.Map as Map+import qualified Data.Sequence as Seq+import qualified Data.Set as Set+import qualified Data.Text as T+import qualified Data.Text.Lazy as LT+import qualified Data.Time as Time+import qualified Distribution.Compat.Binary as Binary++#ifdef MIN_VERSION_aeson+import qualified Data.Aeson as Aeson+#endif++#if __GLASGOW_HASKELL__ >= 800+import Data.Kind (Type)+#else+#define Type *+#endif++import Distribution.Compat.Typeable (Typeable, TypeRep, typeRep)+import Distribution.Utils.MD5++import Data.Monoid (mconcat)++import qualified Data.Semigroup+import qualified Data.Foldable++#if !MIN_VERSION_base(4,8,0)+import Control.Applicative (pure)+import Data.Traversable (traverse)+#endif++#if !MIN_VERSION_base(4,7,0)+import Data.Typeable (Typeable1, typeOf1)+#endif+++-------------------------------------------------------------------------------+-- Types+-------------------------------------------------------------------------------++type TypeName = String+type ConstructorName = String++-- | A sematic version of a data type. Usually 0.+type TypeVersion = Word32++-- | Structure of a datatype.+--+-- It can be infinite, as far as 'TypeRep's involved are finite.+-- (e.g. polymorphic recursion might cause troubles).+--+data Structure+ = Nominal !TypeRep !TypeVersion TypeName [Structure] -- ^ nominal, yet can be parametrised by other structures.+ | Newtype !TypeRep !TypeVersion TypeName Structure -- ^ a newtype wrapper+ | Structure !TypeRep !TypeVersion TypeName SopStructure -- ^ sum-of-products structure+ deriving (Eq, Ord, Show, Generic)++type SopStructure = [(ConstructorName, [Structure])]++-- | A MD5 hash digest of 'Structure'.+hashStructure :: Structure -> MD5+hashStructure = md5 . LBS.toStrict . Builder.toLazyByteString . structureBuilder++-- | A van-Laarhoven lens into 'TypeVersion' of 'Structure'+--+-- @+-- 'typeVersion' :: Lens' 'Structure' 'TypeVersion'+-- @+typeVersion :: Functor f => (TypeVersion -> f TypeVersion) -> Structure -> f Structure+typeVersion f (Nominal t v n s) = fmap (\v' -> Nominal t v' n s) (f v)+typeVersion f (Newtype t v n s) = fmap (\v' -> Newtype t v' n s) (f v)+typeVersion f (Structure t v n s) = fmap (\v' -> Structure t v' n s) (f v)++-- | A van-Laarhoven lens into 'TypeName' of 'Structure'+--+-- @+-- 'typeName' :: Lens' 'Structure' 'TypeName'+-- @+typeName :: Functor f => (TypeName -> f TypeName) -> Structure -> f Structure+typeName f (Nominal t v n s) = fmap (\n' -> Nominal t v n' s) (f n)+typeName f (Newtype t v n s) = fmap (\n' -> Newtype t v n' s) (f n)+typeName f (Structure t v n s) = fmap (\n' -> Structure t v n' s) (f n)++-------------------------------------------------------------------------------+-- Builder+-------------------------------------------------------------------------------++-- | Flatten 'Structure' into something we can calculate hash of.+--+-- As 'Structure' can be potentially infinite. For mutually recursive types,+-- we keep track of 'TypeRep's, and put just 'TypeRep' name when it's occurred+-- another time.+structureBuilder :: Structure -> Builder.Builder+structureBuilder s0 = State.evalState (go s0) Map.empty where+ go :: Structure -> State.State (Map.Map String (NonEmpty TypeRep)) Builder.Builder+ go (Nominal t v n s) = withTypeRep t $ do+ s' <- traverse go s+ return $ mconcat $ Builder.word8 1 : Builder.word32LE v : Builder.stringUtf8 n : s'++ go (Newtype t v n s) = withTypeRep t $ do+ s' <- go s+ return $ mconcat [Builder.word8 2, Builder.word32LE v, Builder.stringUtf8 n, s']++ go (Structure t v n s) = withTypeRep t $ do+ s' <- goSop s+ return $ mconcat [Builder.word8 3, Builder.word32LE v, Builder.stringUtf8 n, s']++ withTypeRep t k = do+ acc <- State.get+ case insert t acc of+ Nothing -> return $ mconcat [ Builder.word8 0, Builder.stringUtf8 (show t) ]+ Just acc' -> do+ State.put acc'+ k ++ goSop :: SopStructure -> State.State (Map.Map String (NonEmpty TypeRep)) Builder.Builder+ goSop sop = do+ parts <- traverse part sop+ return $ mconcat parts++ part (cn, s) = do+ s' <- traverse go s+ return $ Data.Monoid.mconcat [ Builder.stringUtf8 cn, mconcat s' ]++ insert :: TypeRep -> Map.Map String (NonEmpty TypeRep) -> Maybe (Map.Map String (NonEmpty TypeRep))+ insert tr m = case Map.lookup trShown m of+ Nothing -> inserted+ Just ne | tr `Data.Foldable.elem` ne -> Nothing+ | otherwise -> inserted+ where+ inserted = Just (Map.insertWith (Data.Semigroup.<>) trShown (pure tr) m)+ trShown = show tr++-------------------------------------------------------------------------------+-- Classes+-------------------------------------------------------------------------------++-- | Class of types with a known 'Structure'.+--+-- For regular data types 'Structured' can be derived generically.+--+-- @+-- data Record = Record { a :: Int, b :: Bool, c :: [Char] } deriving ('Generic')+-- instance 'Structured' Record+-- @+--+-- @since 3.2.0.0+--+class Typeable a => Structured a where+ structure :: Proxy a -> Structure+ default structure :: (Generic a, GStructured (Rep a)) => Proxy a -> Structure+ structure = genericStructure++ -- This member is hidden. It's there to precalc+ structureHash' :: Tagged a MD5+ structureHash' = Tagged (hashStructure (structure (Proxy :: Proxy a)))++-- private Tagged+newtype Tagged a b = Tagged { untag :: b }++-- | Semantically @'hashStructure' . 'structure'@.+structureHash :: forall a. Structured a => Proxy a -> MD5+structureHash _ = untag (structureHash' :: Tagged a MD5)++-------------------------------------------------------------------------------+-- Functions+-------------------------------------------------------------------------------++-- | Structured 'Binary.encode'.+-- Encode a value to using binary serialisation to a lazy 'LBS.ByteString'.+-- Encoding starts with 16 byte large structure hash.+structuredEncode+ :: forall a. (Binary.Binary a, Structured a)+ => a -> LBS.ByteString+structuredEncode x = Binary.encode (Tag :: Tag a, x)++-- | Lazily serialise a value to a file+structuredEncodeFile :: (Binary.Binary a, Structured a) => FilePath -> a -> IO ()+structuredEncodeFile f = LBS.writeFile f . structuredEncode++-- | Structured 'Binary.decode'.+-- Decode a value from a lazy 'LBS.ByteString', reconstructing the original structure.+-- Throws pure exception on invalid inputs.+structuredDecode+ :: forall a. (Binary.Binary a, Structured a)+ => LBS.ByteString -> a+structuredDecode lbs = snd (Binary.decode lbs :: (Tag a, a))++structuredDecodeOrFailIO :: (Binary.Binary a, Structured a) => LBS.ByteString -> IO (Either String a)+structuredDecodeOrFailIO bs =+ catch (evaluate (structuredDecode bs) >>= return . Right) handler+ where+#if MIN_VERSION_base(4,9,0)+ handler (ErrorCallWithLocation str _) = return $ Left str+#else+ handler (ErrorCall str) = return $ Left str+#endif++-- | Lazily reconstruct a value previously written to a file.+structuredDecodeFileOrFail :: (Binary.Binary a, Structured a) => FilePath -> IO (Either String a)+structuredDecodeFileOrFail f = structuredDecodeOrFailIO =<< LBS.readFile f++-------------------------------------------------------------------------------+-- Helper data+-------------------------------------------------------------------------------++data Tag a = Tag++instance Structured a => Binary.Binary (Tag a) where+ get = do+ actual <- binaryGetMD5+ if actual == expected+ then return Tag+ else fail $ concat+ [ "Non-matching structured hashes: "+ , showMD5 actual+ , "; expected: "+ , showMD5 expected+ ]+ where+ expected = untag (structureHash' :: Tagged a MD5)++ put _ = binaryPutMD5 expected+ where+ expected = untag (structureHash' :: Tagged a MD5)++-------------------------------------------------------------------------------+-- Smart constructors+-------------------------------------------------------------------------------++-- | Use 'Typeable' to infer name+nominalStructure :: Typeable a => Proxy a -> Structure+nominalStructure p = Nominal tr 0 (show tr) [] where+ tr = typeRep p++#if MIN_VERSION_base(4,7,0)+containerStructure :: forall f a. (Typeable f, Structured a) => Proxy (f a) -> Structure+containerStructure _ = Nominal faTypeRep 0 (show fTypeRep)+ [ structure (Proxy :: Proxy a)+ ]+ where+ fTypeRep = typeRep (Proxy :: Proxy f)+ faTypeRep = typeRep (Proxy :: Proxy (f a))++#else+containerStructure :: forall f a. (Typeable1 f, Structured a) => Proxy (f a) -> Structure+containerStructure _ = Nominal faTypeRep 0 (show fTypeRep)+ [ structure (Proxy :: Proxy a)+ ]+ where+ fTypeRep = typeOf1 (undefined :: f ())+ faTypeRep = typeRep (Proxy :: Proxy (f a))+#endif++-------------------------------------------------------------------------------+-- Generic+-------------------------------------------------------------------------------++-- | Derive 'structure' genrically.+genericStructure :: forall a. (Typeable a, Generic a, GStructured (Rep a)) => Proxy a -> Structure+genericStructure _ = gstructured (typeRep (Proxy :: Proxy a)) (Proxy :: Proxy (Rep a)) 0++-- | Used to implement 'genericStructure'.+class GStructured (f :: Type -> Type) where+ gstructured :: TypeRep -> Proxy f -> TypeVersion -> Structure++instance (i ~ D, Datatype c, GStructuredSum f) => GStructured (M1 i c f) where+ gstructured tr _ v = case sop of+#if MIN_VERSION_base(4,7,0)+ [(_, [s])] | isNewtype p -> Newtype tr v name s+#endif+ _ -> Structure tr v name sop+ where+ p = undefined :: M1 i c f ()+ name = datatypeName p+ sop = gstructuredSum (Proxy :: Proxy f) []++class GStructuredSum (f :: Type -> Type) where+ gstructuredSum :: Proxy f -> SopStructure -> SopStructure++instance (i ~ C, Constructor c, GStructuredProd f) => GStructuredSum (M1 i c f) where+ gstructuredSum _ xs = (name, prod) : xs+ where+ name = conName (undefined :: M1 i c f ())+ prod = gstructuredProd (Proxy :: Proxy f) []++instance (GStructuredSum f, GStructuredSum g) => GStructuredSum (f :+: g) where+ gstructuredSum _ xs+ = gstructuredSum (Proxy :: Proxy f)+ $ gstructuredSum (Proxy :: Proxy g) xs++instance GStructuredSum V1 where+ gstructuredSum _ = id++class GStructuredProd (f :: Type -> Type) where+ gstructuredProd :: Proxy f -> [Structure] -> [Structure]++instance (i ~ S, GStructuredProd f) => GStructuredProd (M1 i c f) where+ gstructuredProd _ = gstructuredProd (Proxy :: Proxy f)++instance Structured c => GStructuredProd (K1 i c) where+ gstructuredProd _ xs = structure (Proxy :: Proxy c) : xs++instance GStructuredProd U1 where+ gstructuredProd _ = id++instance (GStructuredProd f, GStructuredProd g) => GStructuredProd (f :*: g) where+ gstructuredProd _ xs+ = gstructuredProd (Proxy :: Proxy f)+ $ gstructuredProd (Proxy :: Proxy g) xs++-------------------------------------------------------------------------------+-- instances+-------------------------------------------------------------------------------++instance Structured ()+instance Structured Bool+instance Structured Ordering++instance Structured Char where structure = nominalStructure+instance Structured Int where structure = nominalStructure+instance Structured Integer where structure = nominalStructure++instance Structured Data.Word.Word where structure = nominalStructure++instance Structured Int8 where structure = nominalStructure+instance Structured Int16 where structure = nominalStructure+instance Structured Int32 where structure = nominalStructure+instance Structured Int64 where structure = nominalStructure++instance Structured Word8 where structure = nominalStructure+instance Structured Word16 where structure = nominalStructure+instance Structured Word32 where structure = nominalStructure+instance Structured Word64 where structure = nominalStructure++instance Structured Float where structure = nominalStructure+instance Structured Double where structure = nominalStructure++instance Structured a => Structured (Maybe a)+instance (Structured a, Structured b) => Structured (Either a b)+instance Structured a => Structured (Ratio a) where structure = containerStructure+instance Structured a => Structured [a] where structure = containerStructure+instance Structured a => Structured (NonEmpty a) where structure = containerStructure++instance (Structured a1, Structured a2) => Structured (a1, a2)+instance (Structured a1, Structured a2, Structured a3) => Structured (a1, a2, a3)+instance (Structured a1, Structured a2, Structured a3, Structured a4) => Structured (a1, a2, a3, a4)+instance (Structured a1, Structured a2, Structured a3, Structured a4, Structured a5) => Structured (a1, a2, a3, a4, a5)+instance (Structured a1, Structured a2, Structured a3, Structured a4, Structured a5, Structured a6) => Structured (a1, a2, a3, a4, a5, a6)+instance (Structured a1, Structured a2, Structured a3, Structured a4, Structured a5, Structured a6, Structured a7) => Structured (a1, a2, a3, a4, a5, a6, a7)++instance Structured BS.ByteString where structure = nominalStructure+instance Structured LBS.ByteString where structure = nominalStructure++instance Structured T.Text where structure = nominalStructure+instance Structured LT.Text where structure = nominalStructure++instance (Structured k, Structured v) => Structured (Map.Map k v) where structure _ = Nominal (typeRep (Proxy :: Proxy (Map.Map k v))) 0 "Map" [ structure (Proxy :: Proxy k), structure (Proxy :: Proxy v) ]+instance (Structured k) => Structured (Set.Set k) where structure = containerStructure+instance (Structured v) => Structured (IM.IntMap v) where structure = containerStructure+instance Structured IS.IntSet where structure = nominalStructure+instance (Structured v) => Structured (Seq.Seq v) where structure = containerStructure++instance Structured Time.UTCTime where structure = nominalStructure+instance Structured Time.DiffTime where structure = nominalStructure+instance Structured Time.UniversalTime where structure = nominalStructure+instance Structured Time.NominalDiffTime where structure = nominalStructure+instance Structured Time.Day where structure = nominalStructure+instance Structured Time.TimeZone where structure = nominalStructure+instance Structured Time.TimeOfDay where structure = nominalStructure+instance Structured Time.LocalTime where structure = nominalStructure++-- Proxy isn't Typeable in base-4.8 / base++-- #if __GLASGOW_HASKELL__ >= 800+-- instance (Typeable k, Typeable (a :: k)) => Structured (Proxy a)+-- #else+-- instance (Typeable a) => Structured (Proxy a) where+-- structure p = Structure (typeRep p) 0 "Proxy" [("Proxy",[])]+-- #endif
Distribution/Verbosity.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} -----------------------------------------------------------------------------@@ -55,7 +56,6 @@ import Distribution.ReadE import Data.List (elemIndex)-import Data.Set (Set) import Distribution.Parsec import Distribution.Verbosity.Internal @@ -66,7 +66,7 @@ vLevel :: VerbosityLevel, vFlags :: Set VerbosityFlag, vQuiet :: Bool- } deriving (Generic, Show, Read)+ } deriving (Generic, Show, Read, Typeable) mkVerbosity :: VerbosityLevel -> Verbosity mkVerbosity l = Verbosity { vLevel = l, vFlags = Set.empty, vQuiet = False }@@ -86,6 +86,7 @@ maxBound = mkVerbosity maxBound instance Binary Verbosity+instance Structured Verbosity -- We shouldn't print /anything/ unless an error occurs in silent mode silent :: Verbosity
Distribution/Verbosity/Internal.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} module Distribution.Verbosity.Internal ( VerbosityLevel(..)@@ -8,9 +9,10 @@ import Distribution.Compat.Prelude data VerbosityLevel = Silent | Normal | Verbose | Deafening- deriving (Generic, Show, Read, Eq, Ord, Enum, Bounded)+ deriving (Generic, Show, Read, Eq, Ord, Enum, Bounded, Typeable) instance Binary VerbosityLevel+instance Structured VerbosityLevel data VerbosityFlag = VCallStack@@ -18,6 +20,7 @@ | VNoWrap | VMarkOutput | VTimestamp- deriving (Generic, Show, Read, Eq, Ord, Enum, Bounded)+ deriving (Generic, Show, Read, Eq, Ord, Enum, Bounded, Typeable) instance Binary VerbosityFlag+instance Structured VerbosityFlag
Language/Haskell/Extension.hs view
@@ -23,7 +23,7 @@ classifyExtension, ) where -import Prelude ()+import qualified Prelude (head) import Distribution.Compat.Prelude import Data.Array (Array, accumArray, bounds, Ix(inRange), (!))@@ -58,6 +58,7 @@ deriving (Generic, Show, Read, Eq, Typeable, Data) instance Binary Language+instance Structured Language instance NFData Language where rnf = genericRnf @@ -109,6 +110,7 @@ deriving (Generic, Show, Read, Eq, Ord, Typeable, Data) instance Binary Extension+instance Structured Extension instance NFData Extension where rnf = genericRnf @@ -825,9 +827,22 @@ -- * <https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#deriving-instances-for-empty-data-types> | EmptyDataDeriving + -- | Enable detection of complete user-supplied kind signatures.+ | CUSKs++ -- | Allows the syntax @import M qualified@.+ | ImportQualifiedPost++ -- | Allow the use of standalone kind signatures.+ | StandaloneKindSignatures++ -- | Enable unlifted newtypes.+ | UnliftedNewtypes+ deriving (Generic, Show, Read, Eq, Ord, Enum, Bounded, Typeable, Data) instance Binary KnownExtension+instance Structured KnownExtension instance NFData KnownExtension where rnf = genericRnf @@ -889,6 +904,6 @@ knownExtensionTable :: Array Char [(String, KnownExtension)] knownExtensionTable = accumArray (flip (:)) [] ('A', 'Z')- [ (head str, (str, extension))+ [ (Prelude.head str, (str, extension)) -- assume KnownExtension's Show returns a non-empty string | extension <- [toEnum 0 ..] , let str = show extension ]
doc/conf.py view
@@ -13,7 +13,7 @@ sys.path.insert(0, os.path.abspath('.')) import cabaldomain -version = "3.0.2.0"+version = "3.2.0.0" extensions = ['sphinx.ext.extlinks', 'sphinx.ext.todo']
doc/developing-packages.rst view
@@ -2184,14 +2184,28 @@ :pkg-field:`other-modules`, :pkg-field:`library:exposed-modules` or :pkg-field:`executable:main-is` fields. +.. pkg-field:: hs-source-dir: directory list+ :deprecated: 2.0+ :removed: 3.0+ :default: ``.``++ Root directories for the module hierarchy.++ Deprecated in favor of :pkg-field:`hs-source-dirs`.+ .. pkg-field:: hs-source-dirs: directory list :default: ``.`` Root directories for the module hierarchy. - For backwards compatibility, the old variant ``hs-source-dir`` is- also recognized.+ .. note::++ Components can share source directories but modules found there will be+ recompiled even if other components already built them, i.e., if a+ library and an executable share a source directory and the executable+ depends on the library and imports its ``Foo`` module, ``Foo`` will be+ compiled twice, once as part of the library and again for the executable. .. pkg-field:: default-extensions: identifier list
doc/installing-packages.rst view
@@ -57,7 +57,7 @@ anything; packages downloaded from this repository will be cached under ``~/.cabal/packages/hackage.haskell.org`` (or whatever name you specify; you can change the prefix by changing the value of-``remote-repo-cache``). If you want, you can configure multiple+:cfg-field:`remote-repo-cache`). If you want, you can configure multiple repositories, and ``cabal`` will combine them and be able to download packages from any of them. @@ -90,15 +90,40 @@ ``cabal`` will download the ``root.json`` field and use it without verification. Although this bootstrapping step is then unsafe, all subsequent access is secure (provided that the downloaded ``root.json``-was not tempered with). Of course, adding ``root-keys`` and+was not tampered with). Of course, adding ``root-keys`` and ``key-threshold`` to your repository specification only shifts the problem, because now you somehow need to make sure that the key IDs you received were the right ones. How that is done is however outside the scope of ``cabal`` proper. More information about the security infrastructure can be found at-https://github.com/well-typed/hackage-security.+https://github.com/haskell/hackage-security. +Local no-index repositories+^^^^^^^^^^^^^^^^^^^^^^^^^^^++It's possible to use a directory of `.tar.gz` package files as a local package+repository.++::++ repository my-local-repository+ url: file+noindex:///absolute/path/to/directory++``cabal`` will construct the index automatically from the+``package-name-version.tar.gz`` files in the directory, and will use optional+corresponding ``package-name-version.cabal`` files as new revisions.++The index is cached inside the given directory. If the directory is not+writable, you can append ``#shared-cache`` fragment to the URI,+then the cache will be stored inside the :cfg-field:`remote-repo-cache` directory.+The part of the path will be used to determine the cache key part.++.. note::+ The URI scheme ``file:`` is interpreted as a remote repository,+ as described in the previous sections, thus requiring manual construction+ of ``01-index.tar`` file.+ Legacy repositories ^^^^^^^^^^^^^^^^^^^ @@ -120,7 +145,7 @@ ``http://hackage.haskell.org/packages/archive`` will be silently translated to ``http://hackage.haskell.org/``. -The second kind of legacy repositories are so-called “local”+The second kind of legacy repositories are so-called “(legacy) local” repositories: ::@@ -340,7 +365,7 @@ $ cabal build It can be occasionally useful to run the compiler-specific package-manager tool (e.g. ``ghc-pkg``) tool on the sandbox package DB directly+manager tool (e.g. ``ghc-pkg``) on the sandbox package DB directly (for example, you may need to unregister some packages). The ``cabal sandbox hc-pkg`` command is a convenient wrapper that runs the compiler-specific package manager tool with the arguments:@@ -1228,7 +1253,8 @@ Specify that a particular dependency should used for a particular package name. In particular, it declares that any reference to- *pkgname* in a ``build-depends`` should be resolved to *ipid*.+ *pkgname* in a :pkg-field:`build-depends` should be resolved to+ *ipid*. .. option:: --exact-configuration @@ -1314,8 +1340,8 @@ $ cabal install --constraint="bar == 2.1" - Version bounds have the same syntax as ``build-depends``. As- a special case, the following prevents ``bar`` from being+ Version bounds have the same syntax as :pkg-field:`build-depends`.+ As a special case, the following prevents ``bar`` from being used at all: ::@@ -1354,11 +1380,11 @@ $ cabal install --constraint="bar test" --constraint="bar bench" By default, constraints only apply to build dependencies- (``build-depends``), build dependencies of build+ (:pkg-field:`build-depends`), build dependencies of build dependencies, and so on. Constraints normally do not apply to dependencies of the ``Setup.hs`` script of any package- (``setup-depends``) nor do they apply to build tools- (``build-tool-depends``) or the dependencies of build+ (:pkg-field:`setup-depends`) nor do they apply to build tools+ (:pkg-field:`build-tool-depends`) or the dependencies of build tools. To explicitly apply a constraint to a setup or build tool dependency, you can add a qualifier to the constraint as follows:@@ -1671,6 +1697,8 @@ Keeps the configuration information so it is not necessary to run the configure step again before building. +.. _setup-test:+ setup test ---------- @@ -1715,7 +1743,7 @@ .. option:: --test-option=option - give an extra option to the test executables. There is no need to+ Give an extra option to the test executables. There is no need to quote options containing spaces because a single option is assumed, so options will not be split on spaces. @@ -1725,6 +1753,26 @@ execution context. The text executable path and test arguments are passed as arguments to the wrapper and it is expected that the wrapper will return the test's return code, as well as a copy of stdout/stderr.++.. _setup-bench:++setup bench+-----------++Run the benchmarks specified in the package description file. Aside+from the following flags, Cabal accepts the name of one or more benchmarks+on the command line after ``bench``. When supplied, Cabal will run+only the named benchmarks, otherwise, Cabal will run all benchmarks in+the package.++.. option:: --benchmark-options=options+ Give extra options to the benchmark executables.++.. option:: --benchmark-option=option++ Give an extra option to the benchmark executables. There is no need to+ quote options containing spaces because a single option is assumed,+ so options will not be split on spaces. .. _setup-sdist:
doc/nix-local-build.rst view
@@ -51,7 +51,7 @@ :: - $ cabal v2-build+ $ cabal v2-build all To build a specific package, you can either run ``v2-build`` from the directory of the package in question:@@ -653,6 +653,14 @@ ``autogen-modules`` is able to replace uses of the hooks to add generated modules, along with the custom publishing of Haddock documentation to Hackage. +.. warning::++ Packages that use Backpack will stop working if uploaded to+ Hackage, due to `issue #6005 <https://github.com/haskell/cabal/issues/6005>`_.+ While this is happening, we recommend not uploading these packages+ to Hackage (and instead referencing the package directly+ as a ``source-repository-package``).+ Configuring builds with cabal.project ===================================== @@ -1829,6 +1837,7 @@ ``haddock`` command). .. cfg-field:: haddock-html-location: templated path+ --html-location=TEMPLATE :synopsis: Haddock HTML templates location. Specify a template for the location of HTML documentation for@@ -1839,15 +1848,19 @@ :: - html-location: 'http://hackage.haskell.org/packages/archive/$pkg/latest/doc/html'+ html-location: http://hackage.haskell.org/packages/archive/$pkg/latest/doc/html + The command line variant of this flag is ``--html-location`` (for+ the ``haddock`` subcommand).++ ::++ --html-location='http://hackage.haskell.org/packages/archive/$pkg/latest/doc/html'+ Here the argument is quoted to prevent substitution by the shell. If this option is omitted, the location for each package is obtained using the package tool (e.g. ``ghc-pkg``). - The command line variant of this flag is ``--html-location`` (for- the ``haddock`` subcommand).- .. cfg-field:: haddock-executables: boolean :synopsis: Generate documentation for executables. @@ -2101,6 +2114,23 @@ The command line variant of this field is ``--(no-)count-conflicts``.++.. cfg-field:: fine-grained-conflicts: boolean+ --fine-grained-conflicts+ --no-fine-grained-conflicts+ :synopsis: Skip a version of a package if it does not resolve any conflicts+ encountered in the last version (solver optimization).++ :default: True++ When enabled, the solver will skip a version of a package if it does not+ resolve any of the conflicts encountered in the last version of that+ package. For example, if ``foo-1.2`` depended on ``bar``, and the solver+ couldn't find consistent versions for ``bar``'s dependencies, then the+ solver would skip ``foo-1.1`` if it also depended on ``bar``.++ The command line variant of this field is+ ``--(no-)fine-grained-conflicts``. .. cfg-field:: minimize-conflict-set: boolean --minimize-conflict-set
tests/CheckTests.hs view
@@ -17,6 +17,7 @@ import qualified Data.ByteString as BS import qualified Data.ByteString.Char8 as BS8+import qualified Data.List.NonEmpty as NE tests :: TestTree tests = checkTests@@ -38,6 +39,7 @@ , checkTest "cxx-options-with-optimization.cabal" , checkTest "ghc-option-j.cabal" , checkTest "multiple-libs-2.cabal"+ , checkTest "assoc-cpp-options.cabal" ] checkTest :: FilePath -> TestTree@@ -52,7 +54,7 @@ -- D.PD.Check functionality. unlines (map (showPWarning fp) ws) ++ unlines (map show (checkPackage gpd Nothing))- Left (_, errs) -> unlines $ map (("ERROR: " ++) . showPError fp) errs+ Left (_, errs) -> unlines $ map (("ERROR: " ++) . showPError fp) $ NE.toList errs where input = "tests" </> "ParserTests" </> "regressions" </> fp correct = replaceExtension input "check"
tests/HackageTests.hs view
@@ -70,6 +70,9 @@ import qualified Distribution.Types.PackageDescription.Lens as L import qualified Options.Applicative as O +-- import Distribution.Types.BuildInfo (BuildInfo (cppOptions))+-- import qualified Distribution.Types.BuildInfo.Lens as L+ #ifdef MIN_VERSION_tree_diff import Data.TreeDiff (ediff) import Data.TreeDiff.Pretty (ansiWlEditExprCompact)@@ -165,36 +168,50 @@ parseCheckTest :: FilePath -> B.ByteString -> IO CheckResult parseCheckTest fpath bs = do- let (_warnings, parsec) = Parsec.runParseResult $- Parsec.parseGenericPackageDescription bs+ let (warnings, parsec) = Parsec.runParseResult $+ Parsec.parseGenericPackageDescription bs case parsec of Right gpd -> do let checks = checkPackage gpd Nothing+ let w [] = 0+ w _ = 1++ -- Look into invalid cpp options+ -- _ <- L.traverseBuildInfos checkCppFlags gpd+ -- one for file, many checks- return (CheckResult 1 0 0 0 0 0 <> foldMap toCheckResult checks)+ return (CheckResult 1 (w warnings) 0 0 0 0 0 <> foldMap toCheckResult checks) Left (_, errors) -> do traverse_ (putStrLn . Parsec.showPError fpath) errors exitFailure -data CheckResult = CheckResult !Int !Int !Int !Int !Int !Int+-- checkCppFlags :: BuildInfo -> IO BuildInfo+-- checkCppFlags bi = do+-- for_ (cppOptions bi) $ \opt ->+-- unless (any (`isPrefixOf` opt) ["-D", "-U", "-I"]) $+-- putStrLn opt+-- +-- return bi +data CheckResult = CheckResult !Int !Int !Int !Int !Int !Int !Int+ instance NFData CheckResult where rnf !_ = () instance Semigroup CheckResult where- CheckResult n a b c d e <> CheckResult n' a' b' c' d' e' =- CheckResult (n + n') (a + a') (b + b') (c + c') (d + d') (e + e')+ CheckResult n w a b c d e <> CheckResult n' w' a' b' c' d' e' =+ CheckResult (n + n') (w + w') (a + a') (b + b') (c + c') (d + d') (e + e') instance Monoid CheckResult where- mempty = CheckResult 0 0 0 0 0 0+ mempty = CheckResult 0 0 0 0 0 0 0 mappend = (<>) toCheckResult :: PackageCheck -> CheckResult-toCheckResult PackageBuildImpossible {} = CheckResult 0 1 0 0 0 0-toCheckResult PackageBuildWarning {} = CheckResult 0 0 1 0 0 0-toCheckResult PackageDistSuspicious {} = CheckResult 0 0 0 1 0 0-toCheckResult PackageDistSuspiciousWarn {} = CheckResult 0 0 0 0 1 0-toCheckResult PackageDistInexcusable {} = CheckResult 0 0 0 0 0 1+toCheckResult PackageBuildImpossible {} = CheckResult 0 0 1 0 0 0 0+toCheckResult PackageBuildWarning {} = CheckResult 0 0 0 1 0 0 0+toCheckResult PackageDistSuspicious {} = CheckResult 0 0 0 0 1 0 0+toCheckResult PackageDistSuspiciousWarn {} = CheckResult 0 0 0 0 0 1 0+toCheckResult PackageDistInexcusable {} = CheckResult 0 0 0 0 0 0 1 ------------------------------------------------------------------------------- -- Roundtrip test@@ -214,8 +231,8 @@ let x1 = x0 & L.packageDescription . L.licenseFiles %~ stripEmpty let y2 = y1 & L.packageDescription . L.licenseFiles %~ stripEmpty - let y = y2 & L.packageDescription . L.description .~ ""- let x = x1 & L.packageDescription . L.description .~ ""+ let y = y2 & L.packageDescription . L.description .~ mempty+ let x = x1 & L.packageDescription . L.description .~ mempty assertEqual' bs' x y @@ -309,8 +326,9 @@ checkP = checkA <$> prefixP checkA pfx = do- CheckResult n a b c d e <- parseIndex pfx parseCheckTest+ CheckResult n w a b c d e <- parseIndex pfx parseCheckTest putStrLn $ show n ++ " files processed"+ putStrLn $ show w ++ " have lexer/parser warnings" putStrLn $ show a ++ " build impossible" putStrLn $ show b ++ " build warning" putStrLn $ show c ++ " build dist suspicious"
tests/Instances/TreeDiff.hs view
@@ -36,6 +36,7 @@ import Distribution.Types.PkgconfigDependency import Distribution.Types.UnitId (DefUnitId, UnitId) import Distribution.Types.UnqualComponentName+import Distribution.Utils.ShortText (ShortText, fromShortText) ------------------------------------------------------------------------------- -- instances@@ -94,3 +95,5 @@ instance ToExpr TestType instance ToExpr UnitId where toExpr = defaultExprViaShow instance ToExpr UnqualComponentName where toExpr = defaultExprViaShow++instance ToExpr ShortText where toExpr = toExpr . fromShortText
tests/ParserTests.hs view
@@ -26,6 +26,7 @@ import qualified Data.ByteString as BS import qualified Data.ByteString.Char8 as BS8+import qualified Data.List.NonEmpty as NE import qualified Distribution.InstalledPackageInfo as IPI @@ -137,7 +138,7 @@ "UNXPECTED SUCCESS\n" ++ showGenericPackageDescription gpd Left (v, errs) ->- unlines $ ("VERSION: " ++ show v) : map (showPError fp) errs+ unlines $ ("VERSION: " ++ show v) : map (showPError fp) (NE.toList errs) where input = "tests" </> "ParserTests" </> "errors" </> fp correct = replaceExtension input "errors"@@ -206,7 +207,7 @@ unlines (map (showPWarning fp) warns) ++ showGenericPackageDescription gpd Left (_, errs) ->- unlines $ "ERROR" : map (showPError fp) errs+ unlines $ "ERROR" : map (showPError fp) (NE.toList errs) where input = "tests" </> "ParserTests" </> "regressions" </> fp correct = replaceExtension input "format"@@ -219,7 +220,7 @@ let (_, x) = runParseResult res case x of Right gpd -> pure (toExpr gpd)- Left (_, errs) -> fail $ unlines $ "ERROR" : map (showPError fp) errs+ Left (_, errs) -> fail $ unlines $ "ERROR" : map (showPError fp) (NE.toList errs) where input = "tests" </> "ParserTests" </> "regressions" </> fp exprFile = replaceExtension input "expr"@@ -255,7 +256,7 @@ case x' of Right gpd -> pure gpd Left (_, errs) -> do- void $ assertFailure $ unlines (map (showPError fp) errs)+ void $ assertFailure $ unlines (map (showPError fp) $ NE.toList errs) fail "failure" input = "tests" </> "ParserTests" </> "regressions" </> fp @@ -282,7 +283,7 @@ ipiFormatGoldenTest :: FilePath -> TestTree ipiFormatGoldenTest fp = cabalGoldenTest "format" correct $ do- contents <- readFile input+ contents <- BS.readFile input let res = IPI.parseInstalledPackageInfo contents return $ toUTF8BS $ case res of Left err -> "ERROR " ++ show err@@ -295,7 +296,7 @@ #ifdef MIN_VERSION_tree_diff ipiTreeDiffGoldenTest :: FilePath -> TestTree ipiTreeDiffGoldenTest fp = ediffGolden goldenTest "expr" exprFile $ do- contents <- readFile input+ contents <- BS.readFile input let res = IPI.parseInstalledPackageInfo contents case res of Left err -> fail $ "ERROR " ++ show err@@ -307,10 +308,10 @@ ipiFormatRoundTripTest :: FilePath -> TestTree ipiFormatRoundTripTest fp = testCase "roundtrip" $ do- contents <- readFile input+ contents <- BS.readFile input x <- parse contents let contents' = IPI.showInstalledPackageInfo x- y <- parse contents'+ y <- parse (toUTF8BS contents') -- ghc-pkg prints pkgroot itself, based on cli arguments! let x' = x { IPI.pkgRoot = Nothing }@@ -320,11 +321,11 @@ -- Complete round-trip let contents2 = IPI.showFullInstalledPackageInfo x- z <- parse contents2+ z <- parse (toUTF8BS contents2) assertEqual "re-parsed doesn't match" x z where- parse :: String -> IO IPI.InstalledPackageInfo+ parse :: BS.ByteString -> IO IPI.InstalledPackageInfo parse c = do case IPI.parseInstalledPackageInfo c of Right (_, ipi) -> return ipi
tests/ParserTests/errors/big-version.cabal view
@@ -1,5 +1,5 @@ cabal-version: 3.0-name: big-vesion+name: big-version -- 10 digits version: 1234567890
+ tests/ParserTests/regressions/assoc-cpp-options.cabal view
@@ -0,0 +1,48 @@+cabal-version: 1.12+name: assoc+version: 1.1+license: BSD3+license-file: LICENSE+synopsis: swap and assoc: Symmetric and Semigroupy Bifunctors+category: Data+description:+ Provides generalisations of+ @swap :: (a,b) -> (b,a)@ and+ @assoc :: ((a,b),c) -> (a,(b,c))@+ to+ @Bifunctor@s supporting similar operations (e.g. @Either@, @These@).++author: Oleg Grenrus <oleg.grenrus@iki.fi>+maintainer: Oleg Grenrus <oleg.grenrus@iki.fi>+build-type: Simple+tested-with:+ GHC ==7.0.4+ || ==7.2.2+ || ==7.4.2+ || ==7.6.3+ || ==7.8.4+ || ==7.10.3+ || ==8.0.2+ || ==8.2.2+ || ==8.4.4+ || ==8.6.5+ || ==8.8.1++source-repository head+ type: git+ location: https://github.com/phadej/assoc.git++library+ default-language: Haskell2010+ hs-source-dirs: src+ build-depends:+ base >=4.3 && <4.13+ , bifunctors >=5.5.4 && <5.6++ cpp-options: -traditional++ exposed-modules:+ Data.Bifunctor.Assoc+ Data.Bifunctor.Swap++ other-extensions: TypeFamilies
+ tests/ParserTests/regressions/assoc-cpp-options.check view
@@ -0,0 +1,1 @@+'cpp-options': -traditional is not portable C-preprocessor flag
tests/ParserTests/regressions/big-version.cabal view
@@ -1,5 +1,5 @@ cabal-version: 3.0-name: big-vesion+name: big-version -- 9 digits version: 123456789
tests/ParserTests/regressions/big-version.expr view
@@ -82,7 +82,7 @@ licenseRaw = Left NONE, maintainer = "", package = PackageIdentifier- {pkgName = `PackageName "big-vesion"`,+ {pkgName = `PackageName "big-version"`, pkgVersion = `mkVersion [123456789]`}, pkgUrl = "", setupBuildInfo = Nothing,
tests/ParserTests/regressions/big-version.format view
@@ -1,5 +1,5 @@ cabal-version: 3.0-name: big-vesion+name: big-version version: 123456789 library
tests/Test/Laws.hs view
@@ -53,7 +53,7 @@ monoid_2 x y z = (x `mappend` y) `mappend` z == x `mappend` (y `mappend` z) --- | The 'mconcat' definition. It can be overidden for the sake of effeciency+-- | The 'mconcat' definition. It can be overidden for the sake of efficiency -- but it must still satisfy the property given by the default definition: -- -- > mconcat = foldr mappend mempty
tests/UnitTests.hs view
@@ -24,6 +24,7 @@ import qualified UnitTests.Distribution.Utils.Generic import qualified UnitTests.Distribution.Utils.NubList import qualified UnitTests.Distribution.Utils.ShortText+import qualified UnitTests.Distribution.Utils.Structured import qualified UnitTests.Distribution.Version (versionTests) import qualified UnitTests.Distribution.PkgconfigVersion (pkgconfigVersionTests) import qualified UnitTests.Distribution.SPDX (spdxTests)@@ -67,6 +68,7 @@ UnitTests.Distribution.PkgconfigVersion.pkgconfigVersionTests , testGroup "Distribution.SPDX" UnitTests.Distribution.SPDX.spdxTests+ , UnitTests.Distribution.Utils.Structured.tests ] extraOptions :: [OptionDescription]
tests/UnitTests/Distribution/Simple/Program/GHC.hs view
@@ -19,6 +19,14 @@ options_8_8_all assertListEquals flags options_8_8_affects+ , testCase "options added in GHC-8.10" $ do+ let flags :: [String]+ flags = normaliseGhcArgs+ (Just $ mkVersion [8,10,1])+ emptyPackageDescription+ options_8_10_all++ assertListEquals flags options_8_10_affects ] ] @@ -35,7 +43,7 @@ ] ---------------------------------------------------------------------------------- Options+-- GHC 8.8 ------------------------------------------------------------------------------- -- | Options added in GHC-8.8, to generate:@@ -90,4 +98,45 @@ , "-hiesuf" , "-keep-hscpp-file" , "-keep-hscpp-files"+ ]++-------------------------------------------------------------------------------+-- GHC 8.10+-------------------------------------------------------------------------------++options_8_10_all :: [String]+options_8_10_all =+ [ "-ddump-cmm-verbose-by-proc"+ , "-ddump-stg-final"+ , "-ddump-stg-unarised"+ , "-Wderiving-defaults"+ , "-Winferred-safe-imports"+ , "-Wmissing-safe-haskell-mode"+ , "-Wno-deriving-defaults"+ , "-Wno-inferred-safe-imports"+ , "-Wno-missing-safe-haskell-mode"+ , "-Wno-prepositive-qualified-module"+ , "-Wno-redundant-record-wildcards"+ , "-Wno-unused-packages"+ , "-Wno-unused-record-wildcards"+ , "-Wprepositive-qualified-module"+ , "-Wredundant-record-wildcards"+ , "-Wunused-packages"+ , "-Wunused-record-wildcards"+ , "-fdefer-diagnostics"+ , "-fkeep-going"+ , "-fprint-axiom-incomps"+ , "-fno-defer-diagnostics"+ , "-fno-keep-going"+ , "-fno-print-axiom-incomps"+ ] ++ options_8_10_affects++options_8_10_affects :: [String]+options_8_10_affects =+ [ "-dno-typeable-binds"+ , "-fbinary-blob-threshold"+ , "-fmax-pmcheck-models"+ , "-fplugin-trustworthy"+ , "-include-cpp-deps"+ , "-optcxx" ]
tests/UnitTests/Distribution/Simple/Utils.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE GADTs #-} module UnitTests.Distribution.Simple.Utils ( tests ) where@@ -69,7 +70,7 @@ hClose handleExe -- Compile- (IODataText resOutput, resErrors, resExitCode) <- rawSystemStdInOut normal+ (resOutput, resErrors, resExitCode) <- rawSystemStdInOut normal ghcPath ["-o", filenameExe, filenameHs] Nothing Nothing Nothing IODataModeText@@ -82,8 +83,7 @@ Nothing Nothing Nothing IODataModeText -- not binary mode output, ie utf8 text mode so try to decode case res of- Right (IODataText x1, x2, x3) -> assertFailure $ "expected IO decoding exception: " ++ show (x1,x2,x3)- Right (IODataBinary _, _, _) -> assertFailure "internal error"+ Right (x1, x2, x3) -> assertFailure $ "expected IO decoding exception: " ++ show (x1,x2,x3) Left err | isDoesNotExistError err -> Exception.throwIO err -- no ghc! | otherwise -> return ()
+ tests/UnitTests/Distribution/Utils/Structured.hs view
@@ -0,0 +1,28 @@+{-# LANGUAGE CPP #-}+module UnitTests.Distribution.Utils.Structured (tests) where++import Data.Proxy (Proxy (..))+import Distribution.Utils.Structured (structureHash)+import GHC.Fingerprint (Fingerprint (..))+import Test.Tasty (TestTree, testGroup)+import Test.Tasty.HUnit (testCase, (@?=))++import Distribution.SPDX.License (License)+import Distribution.Types.VersionRange (VersionRange)++#if MIN_VERSION_base(4,7,0)+import Distribution.Types.LocalBuildInfo (LocalBuildInfo)+#endif++import UnitTests.Orphans ()++tests :: TestTree+tests = testGroup "Distribution.Utils.Structured"+ -- This test also verifies that structureHash doesn't loop.+ [ testCase "VersionRange" $ structureHash (Proxy :: Proxy VersionRange) @?= Fingerprint 0x3827faffd22242bf 0xfd0c337e60fc808b+ , testCase "SPDX.License" $ structureHash (Proxy :: Proxy License) @?= Fingerprint 0xd3d4a09f517f9f75 0xbc3d16370d5a853a+ -- The difference is in encoding of newtypes+#if MIN_VERSION_base(4,7,0)+ , testCase "LocalBuildInfo" $ structureHash (Proxy :: Proxy LocalBuildInfo) @?= Fingerprint 0xb48ff44b0e5d96ff 0xfc099544337e90ab+#endif+ ]
tests/UnitTests/Distribution/Version.hs view
@@ -12,6 +12,7 @@ import Distribution.Types.VersionRange.Internal import Distribution.Parsec (simpleParsec) import Distribution.Pretty+import Distribution.Utils.Generic import Data.Typeable (typeOf) import Math.NumberTheory.Logarithms (intLog2)@@ -317,7 +318,9 @@ withinRange v' (withinVersion v) == (v' >= v && v' < upper v) where- upper = alterVersion $ \numbers -> init numbers ++ [last numbers + 1]+ upper = alterVersion $ \numbers -> case unsnoc numbers of+ Nothing -> []+ Just (xs, x) -> xs ++ [x + 1] prop_foldVersionRange :: VersionRange -> Property prop_foldVersionRange range =@@ -342,7 +345,9 @@ expandVR (VersionRangeParens v) = expandVR v expandVR v = v - upper = alterVersion $ \numbers -> init numbers ++ [last numbers + 1]+ upper = alterVersion $ \numbers -> case unsnoc numbers of+ Nothing -> []+ Just (xs, x) -> xs ++ [x + 1] prop_isAnyVersion1 :: VersionRange -> Version -> Property prop_isAnyVersion1 range version =@@ -362,11 +367,11 @@ prop_isSpecificVersion1 :: VersionRange -> NonEmptyList Version -> Property prop_isSpecificVersion1 range (NonEmpty versions) = isJust version && not (null versions') ==>- allEqual (fromJust version : versions')+ allEqual (fromJust version) versions' where- version = isSpecificVersion range- versions' = filter (`withinRange` range) versions- allEqual xs = and (zipWith (==) xs (tail xs))+ version = isSpecificVersion range+ versions' = filter (`withinRange` range) versions+ allEqual x xs = and (zipWith (==) (x:xs) xs) prop_isSpecificVersion2 :: VersionRange -> Property prop_isSpecificVersion2 range =
+ tests/UnitTests/Orphans.hs view
@@ -0,0 +1,10 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}+module UnitTests.Orphans where++#if !MIN_VERSION_base(4,7,0)+import GHC.Fingerprint (Fingerprint (..))++deriving instance Show Fingerprint+#endif