{-# LANGUAGE MultiWayIf        #-}
{-# LANGUAGE NamedFieldPuns    #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards   #-}
module HaskellCI.Auxiliary (
    Auxiliary (..),
    auxiliary,
    pkgNameDirVariable',
    pkgNameDirVariable,
) where

import HaskellCI.Prelude

import qualified Data.Set                                     as S
import qualified Distribution.CabalSpecVersion                as C
import qualified Distribution.FieldGrammar.Pretty             as C
import qualified Distribution.Fields.Pretty                   as C
import qualified Distribution.Pretty                          as C
import qualified Distribution.Types.GenericPackageDescription as C
import qualified Distribution.Types.VersionRange              as C
import qualified Network.URI                                  as URI
import qualified Text.PrettyPrint                             as PP

import Cabal.Optimization
import Cabal.Project
import Cabal.SourceRepo
import HaskellCI.Compiler
import HaskellCI.Config
import HaskellCI.Config.Components
import HaskellCI.Config.CopyFields
import HaskellCI.Config.Docspec
import HaskellCI.Config.Doctest
import HaskellCI.Jobs
import HaskellCI.List
import HaskellCI.Package

-- | Auxiliary definitions, probably useful for all backends
data Auxiliary = Auxiliary
    { Auxiliary -> [Package]
pkgs                    :: [Package]
    , Auxiliary -> [URI]
uris                    :: [URI]
    , Auxiliary -> [Char]
projectName             :: String
    , Auxiliary -> Bool
doctestEnabled          :: Bool
    , Auxiliary -> Bool
docspecEnabled          :: Bool
    , Auxiliary -> CompilerRange
hasTests                :: CompilerRange
    , Auxiliary -> Bool
hasLibrary              :: Bool
    , Auxiliary -> [Char] -> [PrettyField ()]
extraCabalProjectFields :: FilePath -> [C.PrettyField ()]
    , Auxiliary -> [Char]
testShowDetails         :: String
    , Auxiliary -> Bool
anyJobUsesHeadHackage   :: Bool
    , Auxiliary -> Bool
anyJobUsesPreviewGHC    :: Bool
    , Auxiliary -> Bool
runHaddock              :: Bool
    , Auxiliary -> [Char]
haddockFlags            :: String
    }

auxiliary :: Config -> Project URI Void Package -> JobVersions -> Auxiliary
auxiliary :: Config -> Project URI Void Package -> JobVersions -> Auxiliary
auxiliary Config {Bool
Natural
[Char]
[[Char]]
[PrettyField ()]
[PackageName]
[Installed]
[ConstraintSet]
Maybe [Char]
Maybe Version
Maybe Jobs
Set [Char]
Set Fold
Map Version [Char]
Version
VersionRange
Ubuntu
PackageScope
HLintConfig
DoctestConfig
DocspecConfig
CopyFields
Components
TestedWithJobs
cfgCabalInstallVersion :: Maybe Version
cfgJobs :: Maybe Jobs
cfgUbuntu :: Ubuntu
cfgTestedWith :: TestedWithJobs
cfgEnabledJobs :: VersionRange
cfgCopyFields :: CopyFields
cfgLocalGhcOptions :: [[Char]]
cfgSubmodules :: Bool
cfgCache :: Bool
cfgInstallDeps :: Bool
cfgInstalled :: [Installed]
cfgTests :: VersionRange
cfgRunTests :: VersionRange
cfgBenchmarks :: VersionRange
cfgHaddock :: VersionRange
cfgHaddockComponents :: Components
cfgNoTestsNoBench :: VersionRange
cfgUnconstrainted :: VersionRange
cfgHeadHackage :: VersionRange
cfgHeadHackageOverride :: Bool
cfgGhcjsTests :: Bool
cfgGhcjsTools :: [PackageName]
cfgTestOutputDirect :: Bool
cfgCheck :: Bool
cfgOnlyBranches :: [[Char]]
cfgIrcChannels :: [[Char]]
cfgIrcNickname :: Maybe [Char]
cfgIrcPassword :: Maybe [Char]
cfgIrcIfInOriginRepo :: Bool
cfgEmailNotifications :: Bool
cfgProjectName :: Maybe [Char]
cfgFolds :: Set Fold
cfgGhcHead :: Bool
cfgPostgres :: Bool
cfgGoogleChrome :: Bool
cfgEnv :: Map Version [Char]
cfgAllowFailures :: VersionRange
cfgLastInSeries :: Bool
cfgLinuxJobs :: VersionRange
cfgMacosJobs :: VersionRange
cfgGhcupCabal :: Bool
cfgGhcupJobs :: VersionRange
cfgGhcupVersion :: Version
cfgApt :: Set [Char]
cfgTravisPatches :: [[Char]]
cfgGitHubPatches :: [[Char]]
cfgInsertVersion :: Bool
cfgErrorMissingMethods :: PackageScope
cfgDoctest :: DoctestConfig
cfgDocspec :: DocspecConfig
cfgHLint :: HLintConfig
cfgConstraintSets :: [ConstraintSet]
cfgRawProject :: [PrettyField ()]
cfgRawTravis :: [Char]
cfgGitHubActionName :: Maybe [Char]
cfgTimeoutMinutes :: Natural
cfgCabalInstallVersion :: Config -> Maybe Version
cfgJobs :: Config -> Maybe Jobs
cfgUbuntu :: Config -> Ubuntu
cfgTestedWith :: Config -> TestedWithJobs
cfgEnabledJobs :: Config -> VersionRange
cfgCopyFields :: Config -> CopyFields
cfgLocalGhcOptions :: Config -> [[Char]]
cfgSubmodules :: Config -> Bool
cfgCache :: Config -> Bool
cfgInstallDeps :: Config -> Bool
cfgInstalled :: Config -> [Installed]
cfgTests :: Config -> VersionRange
cfgRunTests :: Config -> VersionRange
cfgBenchmarks :: Config -> VersionRange
cfgHaddock :: Config -> VersionRange
cfgHaddockComponents :: Config -> Components
cfgNoTestsNoBench :: Config -> VersionRange
cfgUnconstrainted :: Config -> VersionRange
cfgHeadHackage :: Config -> VersionRange
cfgHeadHackageOverride :: Config -> Bool
cfgGhcjsTests :: Config -> Bool
cfgGhcjsTools :: Config -> [PackageName]
cfgTestOutputDirect :: Config -> Bool
cfgCheck :: Config -> Bool
cfgOnlyBranches :: Config -> [[Char]]
cfgIrcChannels :: Config -> [[Char]]
cfgIrcNickname :: Config -> Maybe [Char]
cfgIrcPassword :: Config -> Maybe [Char]
cfgIrcIfInOriginRepo :: Config -> Bool
cfgEmailNotifications :: Config -> Bool
cfgProjectName :: Config -> Maybe [Char]
cfgFolds :: Config -> Set Fold
cfgGhcHead :: Config -> Bool
cfgPostgres :: Config -> Bool
cfgGoogleChrome :: Config -> Bool
cfgEnv :: Config -> Map Version [Char]
cfgAllowFailures :: Config -> VersionRange
cfgLastInSeries :: Config -> Bool
cfgLinuxJobs :: Config -> VersionRange
cfgMacosJobs :: Config -> VersionRange
cfgGhcupCabal :: Config -> Bool
cfgGhcupJobs :: Config -> VersionRange
cfgGhcupVersion :: Config -> Version
cfgApt :: Config -> Set [Char]
cfgTravisPatches :: Config -> [[Char]]
cfgGitHubPatches :: Config -> [[Char]]
cfgInsertVersion :: Config -> Bool
cfgErrorMissingMethods :: Config -> PackageScope
cfgDoctest :: Config -> DoctestConfig
cfgDocspec :: Config -> DocspecConfig
cfgHLint :: Config -> HLintConfig
cfgConstraintSets :: Config -> [ConstraintSet]
cfgRawProject :: Config -> [PrettyField ()]
cfgRawTravis :: Config -> [Char]
cfgGitHubActionName :: Config -> Maybe [Char]
cfgTimeoutMinutes :: Config -> Natural
..} Project URI Void Package
prj JobVersions {Set CompilerVersion
allVersions :: Set CompilerVersion
linuxVersions :: Set CompilerVersion
macosVersions :: Set CompilerVersion
allVersions :: JobVersions -> Set CompilerVersion
linuxVersions :: JobVersions -> Set CompilerVersion
macosVersions :: JobVersions -> Set CompilerVersion
..} = Auxiliary {Bool
[Char]
[URI]
[Package]
CompilerRange
[Char] -> [PrettyField ()]
pkgs :: [Package]
uris :: [URI]
projectName :: [Char]
doctestEnabled :: Bool
docspecEnabled :: Bool
hasTests :: CompilerRange
hasLibrary :: Bool
extraCabalProjectFields :: [Char] -> [PrettyField ()]
testShowDetails :: [Char]
anyJobUsesHeadHackage :: Bool
anyJobUsesPreviewGHC :: Bool
runHaddock :: Bool
haddockFlags :: [Char]
pkgs :: [Package]
uris :: [URI]
projectName :: [Char]
doctestEnabled :: Bool
docspecEnabled :: Bool
testShowDetails :: [Char]
hasTests :: CompilerRange
hasLibrary :: Bool
runHaddock :: Bool
haddockFlags :: [Char]
extraCabalProjectFields :: [Char] -> [PrettyField ()]
anyJobUsesHeadHackage :: Bool
anyJobUsesPreviewGHC :: Bool
..}
  where
    pkgs :: [Package]
pkgs = Project URI Void Package -> [Package]
forall uri opt pkg. Project uri opt pkg -> [pkg]
prjPackages Project URI Void Package
prj
    uris :: [URI]
uris = Project URI Void Package -> [URI]
forall uri opt pkg. Project uri opt pkg -> [uri]
prjUriPackages Project URI Void Package
prj
    projectName :: [Char]
projectName = [Char] -> Maybe [Char] -> [Char]
forall a. a -> Maybe a -> a
fromMaybe [Char]
"ci" (Maybe [Char]
cfgProjectName Maybe [Char] -> Maybe [Char] -> Maybe [Char]
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Package -> [Char]
pkgName (Package -> [Char]) -> Maybe Package -> Maybe [Char]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Package] -> Maybe Package
forall a. [a] -> Maybe a
listToMaybe [Package]
pkgs)

    doctestEnabled :: Bool
doctestEnabled = (CompilerVersion -> Bool) -> Set CompilerVersion -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> (Version -> Bool) -> CompilerVersion -> Bool
forall a. a -> (Version -> a) -> CompilerVersion -> a
maybeGHC Bool
False (Version -> VersionRange -> Bool
`C.withinRange` DoctestConfig -> VersionRange
cfgDoctestEnabled DoctestConfig
cfgDoctest)) Set CompilerVersion
linuxVersions
    docspecEnabled :: Bool
docspecEnabled = (CompilerVersion -> Bool) -> Set CompilerVersion -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Bool -> (Version -> Bool) -> CompilerVersion -> Bool
forall a. a -> (Version -> a) -> CompilerVersion -> a
maybeGHC Bool
False (Version -> VersionRange -> Bool
`C.withinRange` DocspecConfig -> VersionRange
cfgDocspecEnabled DocspecConfig
cfgDocspec)) Set CompilerVersion
linuxVersions

    testShowDetails :: [Char]
testShowDetails
        | Bool
cfgTestOutputDirect = [Char]
" --test-show-details=direct"
        | Bool
otherwise           = [Char]
""

    -- version range which has tests
    hasTests :: CompilerRange
    hasTests :: CompilerRange
hasTests = Set CompilerVersion -> CompilerRange
RangePoints (Set CompilerVersion -> CompilerRange)
-> Set CompilerVersion -> CompilerRange
forall a b. (a -> b) -> a -> b
$ [Set CompilerVersion] -> Set CompilerVersion
forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
S.unions
        [ Set CompilerVersion
pkgJobs
        | Pkg{GenericPackageDescription
pkgGpd :: GenericPackageDescription
pkgGpd :: Package -> GenericPackageDescription
pkgGpd,Set CompilerVersion
pkgJobs :: Set CompilerVersion
pkgJobs :: Package -> Set CompilerVersion
pkgJobs} <- [Package]
pkgs
        , Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
-> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
 -> Bool)
-> [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
-> Bool
forall a b. (a -> b) -> a -> b
$ GenericPackageDescription
-> [(UnqualComponentName, CondTree ConfVar [Dependency] TestSuite)]
C.condTestSuites GenericPackageDescription
pkgGpd
        ]

    hasLibrary :: Bool
hasLibrary = (Package -> Bool) -> [Package] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (\Pkg{GenericPackageDescription
pkgGpd :: Package -> GenericPackageDescription
pkgGpd :: GenericPackageDescription
pkgGpd} -> Maybe (CondTree ConfVar [Dependency] Library) -> Bool
forall a. Maybe a -> Bool
isJust (Maybe (CondTree ConfVar [Dependency] Library) -> Bool)
-> Maybe (CondTree ConfVar [Dependency] Library) -> Bool
forall a b. (a -> b) -> a -> b
$ GenericPackageDescription
-> Maybe (CondTree ConfVar [Dependency] Library)
C.condLibrary GenericPackageDescription
pkgGpd) [Package]
pkgs

    runHaddock :: Bool
runHaddock = Bool -> Bool
not (VersionRange -> VersionRange -> Bool
equivVersionRanges VersionRange
C.noVersion VersionRange
cfgHaddock)
        Bool -> Bool -> Bool
&& case Components
cfgHaddockComponents of
            Components
ComponentsAll  -> Bool
True
            Components
ComponentsLibs -> Bool
hasLibrary

    haddockFlags :: [Char]
haddockFlags = case Components
cfgHaddockComponents of
        Components
ComponentsAll  -> [Char]
" --haddock-all"
        Components
ComponentsLibs -> [Char]
""

    extraCabalProjectFields :: FilePath -> [C.PrettyField ()]
    extraCabalProjectFields :: [Char] -> [PrettyField ()]
extraCabalProjectFields [Char]
rootdir = ListBuilder (PrettyField ()) () -> [PrettyField ()]
forall x. ListBuilder x () -> [x]
buildList (ListBuilder (PrettyField ()) () -> [PrettyField ()])
-> ListBuilder (PrettyField ()) () -> [PrettyField ()]
forall a b. (a -> b) -> a -> b
$ do
        -- generate package fields for URI packages.
        [URI]
-> (URI -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [URI]
uris ((URI -> ListBuilder (PrettyField ()) ())
 -> ListBuilder (PrettyField ()) ())
-> (URI -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ \URI
uri ->
            PrettyField () -> ListBuilder (PrettyField ()) ()
forall x. x -> ListBuilder x ()
item (PrettyField () -> ListBuilder (PrettyField ()) ())
-> PrettyField () -> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ () -> FieldName -> Doc -> PrettyField ()
forall ann. ann -> FieldName -> Doc -> PrettyField ann
C.PrettyField () FieldName
"packages" (Doc -> PrettyField ()) -> Doc -> PrettyField ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc
PP.text ([Char] -> Doc) -> [Char] -> Doc
forall a b. (a -> b) -> a -> b
$ case URI -> [Char]
URI.uriScheme URI
uri of
                [Char]
"file:" -> [Char]
rootdir [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ URI -> [Char]
URI.uriPath URI
uri
                [Char]
_       -> ([Char] -> [Char]) -> URI -> [Char] -> [Char]
uriToString [Char] -> [Char]
forall a. a -> a
id URI
uri [Char]
""

        -- copy fields from original cabal.project
        case CopyFields
cfgCopyFields of
            CopyFields
CopyFieldsNone -> () -> ListBuilder (PrettyField ()) ()
forall a. a -> ListBuilder (PrettyField ()) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
            CopyFields
CopyFieldsSome -> ListBuilder (PrettyField ()) ()
copyFieldsSome
            CopyFields
CopyFieldsAll  -> ListBuilder (PrettyField ()) ()
copyFieldsSome ListBuilder (PrettyField ()) ()
-> ListBuilder (PrettyField ()) ()
-> ListBuilder (PrettyField ()) ()
forall a b.
ListBuilder (PrettyField ()) a
-> ListBuilder (PrettyField ()) b -> ListBuilder (PrettyField ()) b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (PrettyField () -> ListBuilder (PrettyField ()) ())
-> [PrettyField ()] -> ListBuilder (PrettyField ()) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
(a -> f b) -> t a -> f ()
traverse_ PrettyField () -> ListBuilder (PrettyField ()) ()
forall x. x -> ListBuilder x ()
item (Project URI Void Package -> [PrettyField ()]
forall uri opt pkg. Project uri opt pkg -> [PrettyField ()]
prjOtherFields Project URI Void Package
prj)

        -- local ghc-options
        Bool
-> ListBuilder (PrettyField ()) ()
-> ListBuilder (PrettyField ()) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ([[Char]] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [[Char]]
cfgLocalGhcOptions) (ListBuilder (PrettyField ()) ()
 -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
-> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ [Package]
-> (Package -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [Package]
pkgs ((Package -> ListBuilder (PrettyField ()) ())
 -> ListBuilder (PrettyField ()) ())
-> (Package -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ \Pkg{[Char]
pkgName :: Package -> [Char]
pkgName :: [Char]
pkgName} -> do
            let s :: [Char]
s = [[Char]] -> [Char]
unwords ([[Char]] -> [Char]) -> [[Char]] -> [Char]
forall a b. (a -> b) -> a -> b
$ ([Char] -> [Char]) -> [[Char]] -> [[Char]]
forall a b. (a -> b) -> [a] -> [b]
map (Doc -> [Char]
forall a. Show a => a -> [Char]
show (Doc -> [Char]) -> ([Char] -> Doc) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Char] -> Doc
C.showToken) [[Char]]
cfgLocalGhcOptions
            PrettyField () -> ListBuilder (PrettyField ()) ()
forall x. x -> ListBuilder x ()
item (PrettyField () -> ListBuilder (PrettyField ()) ())
-> PrettyField () -> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ () -> FieldName -> [Doc] -> [PrettyField ()] -> PrettyField ()
forall ann.
ann -> FieldName -> [Doc] -> [PrettyField ann] -> PrettyField ann
C.PrettySection () FieldName
"package" [[Char] -> Doc
PP.text [Char]
pkgName] ([PrettyField ()] -> PrettyField ())
-> [PrettyField ()] -> PrettyField ()
forall a b. (a -> b) -> a -> b
$ ListBuilder (PrettyField ()) () -> [PrettyField ()]
forall x. ListBuilder x () -> [x]
buildList (ListBuilder (PrettyField ()) () -> [PrettyField ()])
-> ListBuilder (PrettyField ()) () -> [PrettyField ()]
forall a b. (a -> b) -> a -> b
$
                PrettyField () -> ListBuilder (PrettyField ()) ()
forall x. x -> ListBuilder x ()
item (PrettyField () -> ListBuilder (PrettyField ()) ())
-> PrettyField () -> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ () -> FieldName -> Doc -> PrettyField ()
forall ann. ann -> FieldName -> Doc -> PrettyField ann
C.PrettyField () FieldName
"ghc-options" (Doc -> PrettyField ()) -> Doc -> PrettyField ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc
PP.text [Char]
s

        -- raw-project is after local-ghc-options so we can override per package.
        (PrettyField () -> ListBuilder (PrettyField ()) ())
-> [PrettyField ()] -> ListBuilder (PrettyField ()) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
(a -> f b) -> t a -> f ()
traverse_ PrettyField () -> ListBuilder (PrettyField ()) ()
forall x. x -> ListBuilder x ()
item [PrettyField ()]
cfgRawProject
      where
        copyFieldsSome :: ListBuilder (C.PrettyField ()) ()
        copyFieldsSome :: ListBuilder (PrettyField ()) ()
copyFieldsSome = do
            [[Char]]
-> ([Char] -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (Project URI Void Package -> [[Char]]
forall uri opt pkg. Project uri opt pkg -> [[Char]]
prjConstraints Project URI Void Package
prj) (([Char] -> ListBuilder (PrettyField ()) ())
 -> ListBuilder (PrettyField ()) ())
-> ([Char] -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ \[Char]
xs -> do
                let s :: [Char]
s = [[Char]] -> [Char]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([Char] -> [[Char]]
lines [Char]
xs)
                PrettyField () -> ListBuilder (PrettyField ()) ()
forall x. x -> ListBuilder x ()
item (PrettyField () -> ListBuilder (PrettyField ()) ())
-> PrettyField () -> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ () -> FieldName -> Doc -> PrettyField ()
forall ann. ann -> FieldName -> Doc -> PrettyField ann
C.PrettyField () FieldName
"constraints" (Doc -> PrettyField ()) -> Doc -> PrettyField ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc
PP.text [Char]
s

            [[Char]]
-> ([Char] -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (Project URI Void Package -> [[Char]]
forall uri opt pkg. Project uri opt pkg -> [[Char]]
prjAllowNewer Project URI Void Package
prj) (([Char] -> ListBuilder (PrettyField ()) ())
 -> ListBuilder (PrettyField ()) ())
-> ([Char] -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ \[Char]
xs -> do
                let s :: [Char]
s = [[Char]] -> [Char]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([Char] -> [[Char]]
lines [Char]
xs)
                PrettyField () -> ListBuilder (PrettyField ()) ()
forall x. x -> ListBuilder x ()
item (PrettyField () -> ListBuilder (PrettyField ()) ())
-> PrettyField () -> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ () -> FieldName -> Doc -> PrettyField ()
forall ann. ann -> FieldName -> Doc -> PrettyField ann
C.PrettyField () FieldName
"allow-newer" (Doc -> PrettyField ()) -> Doc -> PrettyField ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc
PP.text [Char]
s

            Bool
-> ListBuilder (PrettyField ()) ()
-> ListBuilder (PrettyField ()) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Project URI Void Package -> Bool
forall uri opt pkg. Project uri opt pkg -> Bool
prjReorderGoals Project URI Void Package
prj) (ListBuilder (PrettyField ()) ()
 -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
-> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$
                PrettyField () -> ListBuilder (PrettyField ()) ()
forall x. x -> ListBuilder x ()
item (PrettyField () -> ListBuilder (PrettyField ()) ())
-> PrettyField () -> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ () -> FieldName -> Doc -> PrettyField ()
forall ann. ann -> FieldName -> Doc -> PrettyField ann
C.PrettyField () FieldName
"reorder-goals" (Doc -> PrettyField ()) -> Doc -> PrettyField ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc
PP.text [Char]
"True"

            Maybe Int
-> (Int -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (Project URI Void Package -> Maybe Int
forall uri opt pkg. Project uri opt pkg -> Maybe Int
prjMaxBackjumps Project URI Void Package
prj) ((Int -> ListBuilder (PrettyField ()) ())
 -> ListBuilder (PrettyField ()) ())
-> (Int -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ \Int
bj ->
                PrettyField () -> ListBuilder (PrettyField ()) ()
forall x. x -> ListBuilder x ()
item (PrettyField () -> ListBuilder (PrettyField ()) ())
-> PrettyField () -> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ () -> FieldName -> Doc -> PrettyField ()
forall ann. ann -> FieldName -> Doc -> PrettyField ann
C.PrettyField () FieldName
"max-backjumps" (Doc -> PrettyField ()) -> Doc -> PrettyField ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc
PP.text ([Char] -> Doc) -> [Char] -> Doc
forall a b. (a -> b) -> a -> b
$ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
bj

            case Project URI Void Package -> Optimization
forall uri opt pkg. Project uri opt pkg -> Optimization
prjOptimization Project URI Void Package
prj of
                Optimization
OptimizationOn      -> () -> ListBuilder (PrettyField ()) ()
forall a. a -> ListBuilder (PrettyField ()) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
                Optimization
OptimizationOff     -> PrettyField () -> ListBuilder (PrettyField ()) ()
forall x. x -> ListBuilder x ()
item (PrettyField () -> ListBuilder (PrettyField ()) ())
-> PrettyField () -> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ () -> FieldName -> Doc -> PrettyField ()
forall ann. ann -> FieldName -> Doc -> PrettyField ann
C.PrettyField () FieldName
"optimization" (Doc -> PrettyField ()) -> Doc -> PrettyField ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc
PP.text [Char]
"False"
                OptimizationLevel Int
l -> PrettyField () -> ListBuilder (PrettyField ()) ()
forall x. x -> ListBuilder x ()
item (PrettyField () -> ListBuilder (PrettyField ()) ())
-> PrettyField () -> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ () -> FieldName -> Doc -> PrettyField ()
forall ann. ann -> FieldName -> Doc -> PrettyField ann
C.PrettyField () FieldName
"optimization" (Doc -> PrettyField ()) -> Doc -> PrettyField ()
forall a b. (a -> b) -> a -> b
$ [Char] -> Doc
PP.text ([Char] -> Doc) -> [Char] -> Doc
forall a b. (a -> b) -> a -> b
$ Int -> [Char]
forall a. Show a => a -> [Char]
show Int
l

            [SourceRepositoryPackage Maybe]
-> (SourceRepositoryPackage Maybe
    -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (Project URI Void Package -> [SourceRepositoryPackage Maybe]
forall uri opt pkg.
Project uri opt pkg -> [SourceRepositoryPackage Maybe]
prjSourceRepos Project URI Void Package
prj) ((SourceRepositoryPackage Maybe -> ListBuilder (PrettyField ()) ())
 -> ListBuilder (PrettyField ()) ())
-> (SourceRepositoryPackage Maybe
    -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ \SourceRepositoryPackage Maybe
repo ->
                PrettyField () -> ListBuilder (PrettyField ()) ()
forall x. x -> ListBuilder x ()
item (PrettyField () -> ListBuilder (PrettyField ()) ())
-> PrettyField () -> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ () -> FieldName -> [Doc] -> [PrettyField ()] -> PrettyField ()
forall ann.
ann -> FieldName -> [Doc] -> [PrettyField ann] -> PrettyField ann
C.PrettySection () FieldName
"source-repository-package" [] ([PrettyField ()] -> PrettyField ())
-> [PrettyField ()] -> PrettyField ()
forall a b. (a -> b) -> a -> b
$
                    CabalSpecVersion
-> PrettyFieldGrammar SourceRepoList SourceRepoList
-> SourceRepoList
-> [PrettyField ()]
forall s a.
CabalSpecVersion -> PrettyFieldGrammar s a -> s -> [PrettyField ()]
C.prettyFieldGrammar CabalSpecVersion
C.cabalSpecLatest PrettyFieldGrammar SourceRepoList SourceRepoList
forall (c :: * -> Constraint) (g :: * -> * -> *).
(FieldGrammar c g, Applicative (g SourceRepoList),
 c (List NoCommaFSep FilePathNT [Char]), c (Identity RepoType)) =>
g SourceRepoList SourceRepoList
sourceRepositoryPackageGrammar ((forall x. Maybe x -> [x])
-> SourceRepositoryPackage Maybe -> SourceRepoList
forall (f :: * -> *) (g :: * -> *).
(forall x. f x -> g x)
-> SourceRepositoryPackage f -> SourceRepositoryPackage g
srpHoist Maybe x -> [x]
forall x. Maybe x -> [x]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList SourceRepositoryPackage Maybe
repo)

    -- GHC versions which need head.hackage
    headGhcVers :: Set CompilerVersion
    headGhcVers :: Set CompilerVersion
headGhcVers = (CompilerVersion -> Bool)
-> Set CompilerVersion -> Set CompilerVersion
forall a. (a -> Bool) -> Set a -> Set a
S.filter (VersionRange -> CompilerVersion -> Bool
usesHeadHackage VersionRange
cfgHeadHackage) Set CompilerVersion
allVersions

    anyJobUsesHeadHackage :: Bool
    anyJobUsesHeadHackage :: Bool
anyJobUsesHeadHackage = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Set CompilerVersion -> Bool
forall a. Set a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Set CompilerVersion
headGhcVers

    anyJobUsesPreviewGHC :: Bool
    anyJobUsesPreviewGHC :: Bool
anyJobUsesPreviewGHC = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ Set CompilerVersion -> Bool
forall a. Set a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (Set CompilerVersion -> Bool) -> Set CompilerVersion -> Bool
forall a b. (a -> b) -> a -> b
$ (CompilerVersion -> Bool)
-> Set CompilerVersion -> Set CompilerVersion
forall a. (a -> Bool) -> Set a -> Set a
S.filter CompilerVersion -> Bool
isPreviewGHC Set CompilerVersion
allVersions

pkgNameDirVariable' :: String -> String
pkgNameDirVariable' :: [Char] -> [Char]
pkgNameDirVariable' [Char]
n = [Char]
"PKGDIR_" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ (Char -> Char) -> [Char] -> [Char]
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
f [Char]
n where
    f :: Char -> Char
f Char
'-' = Char
'_'
    f Char
c   = Char
c

pkgNameDirVariable :: String -> String
pkgNameDirVariable :: [Char] -> [Char]
pkgNameDirVariable [Char]
n = [Char]
"${" [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char] -> [Char]
pkgNameDirVariable' [Char]
n [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ [Char]
"}"