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

import HaskellCI.Prelude
import Prelude           (head)

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 Text.PrettyPrint                             as PP

import Cabal.Optimization
import Cabal.Project
import Cabal.SourceRepo
import HaskellCI.Compiler
import HaskellCI.Config
import HaskellCI.Config.CopyFields
import HaskellCI.Config.Doctest
import HaskellCI.Config.Docspec
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 -> String
projectName             :: String
    , Auxiliary -> Bool
doctestEnabled          :: Bool
    , Auxiliary -> Bool
docspecEnabled          :: Bool
    , Auxiliary -> CompilerRange
hasTests                :: CompilerRange
    , Auxiliary -> Bool
hasLibrary              :: Bool
    , Auxiliary -> [PrettyField ()]
extraCabalProjectFields :: [C.PrettyField ()]
    , Auxiliary -> String
testShowDetails         :: String
    }

auxiliary :: Config -> Project URI Void Package -> JobVersions -> Auxiliary
auxiliary :: Config -> Project URI Void Package -> JobVersions -> Auxiliary
auxiliary Config {Bool
String
[String]
[PrettyField ()]
[PackageName]
[Installed]
[ConstraintSet]
Maybe String
Maybe Version
Maybe Jobs
VersionRange
Set String
Set Version
Set Fold
Map Version String
Ubuntu
PackageScope
HLintConfig
DoctestConfig
DocspecConfig
CopyFields
TestedWithJobs
cfgGitHubActionName :: Config -> Maybe String
cfgRawTravis :: Config -> String
cfgRawProject :: Config -> [PrettyField ()]
cfgConstraintSets :: Config -> [ConstraintSet]
cfgHLint :: Config -> HLintConfig
cfgDocspec :: Config -> DocspecConfig
cfgDoctest :: Config -> DoctestConfig
cfgErrorMissingMethods :: Config -> PackageScope
cfgInsertVersion :: Config -> Bool
cfgGitHubPatches :: Config -> [String]
cfgTravisPatches :: Config -> [String]
cfgApt :: Config -> Set String
cfgOsx :: Config -> Set Version
cfgLastInSeries :: Config -> Bool
cfgAllowFailures :: Config -> VersionRange
cfgEnv :: Config -> Map Version String
cfgGoogleChrome :: Config -> Bool
cfgPostgres :: Config -> Bool
cfgGhcHead :: Config -> Bool
cfgFolds :: Config -> Set Fold
cfgProjectName :: Config -> Maybe String
cfgEmailNotifications :: Config -> Bool
cfgIrcIfInOriginRepo :: Config -> Bool
cfgIrcChannels :: Config -> [String]
cfgOnlyBranches :: Config -> [String]
cfgCheck :: Config -> Bool
cfgTestOutputDirect :: Config -> Bool
cfgGhcjsTools :: Config -> [PackageName]
cfgGhcjsTests :: Config -> Bool
cfgHeadHackage :: Config -> VersionRange
cfgUnconstrainted :: Config -> VersionRange
cfgNoTestsNoBench :: Config -> VersionRange
cfgHaddock :: Config -> VersionRange
cfgBenchmarks :: Config -> VersionRange
cfgRunTests :: Config -> VersionRange
cfgTests :: Config -> VersionRange
cfgInstalled :: Config -> [Installed]
cfgInstallDeps :: Config -> Bool
cfgCache :: Config -> Bool
cfgSubmodules :: Config -> Bool
cfgLocalGhcOptions :: Config -> [String]
cfgCopyFields :: Config -> CopyFields
cfgTestedWith :: Config -> TestedWithJobs
cfgUbuntu :: Config -> Ubuntu
cfgJobs :: Config -> Maybe Jobs
cfgCabalInstallVersion :: Config -> Maybe Version
cfgGitHubActionName :: Maybe String
cfgRawTravis :: String
cfgRawProject :: [PrettyField ()]
cfgConstraintSets :: [ConstraintSet]
cfgHLint :: HLintConfig
cfgDocspec :: DocspecConfig
cfgDoctest :: DoctestConfig
cfgErrorMissingMethods :: PackageScope
cfgInsertVersion :: Bool
cfgGitHubPatches :: [String]
cfgTravisPatches :: [String]
cfgApt :: Set String
cfgOsx :: Set Version
cfgLastInSeries :: Bool
cfgAllowFailures :: VersionRange
cfgEnv :: Map Version String
cfgGoogleChrome :: Bool
cfgPostgres :: Bool
cfgGhcHead :: Bool
cfgFolds :: Set Fold
cfgProjectName :: Maybe String
cfgEmailNotifications :: Bool
cfgIrcIfInOriginRepo :: Bool
cfgIrcChannels :: [String]
cfgOnlyBranches :: [String]
cfgCheck :: Bool
cfgTestOutputDirect :: Bool
cfgGhcjsTools :: [PackageName]
cfgGhcjsTests :: Bool
cfgHeadHackage :: VersionRange
cfgUnconstrainted :: VersionRange
cfgNoTestsNoBench :: VersionRange
cfgHaddock :: VersionRange
cfgBenchmarks :: VersionRange
cfgRunTests :: VersionRange
cfgTests :: VersionRange
cfgInstalled :: [Installed]
cfgInstallDeps :: Bool
cfgCache :: Bool
cfgSubmodules :: Bool
cfgLocalGhcOptions :: [String]
cfgCopyFields :: CopyFields
cfgTestedWith :: TestedWithJobs
cfgUbuntu :: Ubuntu
cfgJobs :: Maybe Jobs
cfgCabalInstallVersion :: Maybe Version
..} Project URI Void Package
prj JobVersions {Set Version
Set CompilerVersion
omittedOsxVersions :: JobVersions -> Set Version
osxVersions :: JobVersions -> Set Version
versions :: JobVersions -> Set CompilerVersion
omittedOsxVersions :: Set Version
osxVersions :: Set Version
versions :: Set CompilerVersion
..} = Auxiliary :: [Package]
-> [URI]
-> String
-> Bool
-> Bool
-> CompilerRange
-> Bool
-> [PrettyField ()]
-> String
-> Auxiliary
Auxiliary {Bool
String
[PrettyField ()]
[URI]
[Package]
CompilerRange
extraCabalProjectFields :: [PrettyField ()]
hasLibrary :: Bool
hasTests :: CompilerRange
testShowDetails :: String
docspecEnabled :: Bool
doctestEnabled :: Bool
projectName :: String
uris :: [URI]
pkgs :: [Package]
testShowDetails :: String
extraCabalProjectFields :: [PrettyField ()]
hasLibrary :: Bool
hasTests :: CompilerRange
docspecEnabled :: Bool
doctestEnabled :: Bool
projectName :: String
uris :: [URI]
pkgs :: [Package]
..}
  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 :: String
projectName = String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe (Package -> String
pkgName (Package -> String) -> Package -> String
forall a b. (a -> b) -> a -> b
$ [Package] -> Package
forall a. [a] -> a
Prelude.head [Package]
pkgs) Maybe String
cfgProjectName

    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
versions
    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
versions

    testShowDetails :: String
testShowDetails
        | Bool
cfgTestOutputDirect = String
" --test-show-details=direct"
        | Bool
otherwise           = String
""

    -- 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 :: Package -> GenericPackageDescription
pkgGpd :: GenericPackageDescription
pkgGpd,Set CompilerVersion
pkgJobs :: Package -> Set CompilerVersion
pkgJobs :: 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 (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 :: GenericPackageDescription
pkgGpd :: Package -> 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

    extraCabalProjectFields :: [C.PrettyField ()]
    extraCabalProjectFields :: [PrettyField ()]
extraCabalProjectFields = 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
$ String -> Doc
PP.text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ (String -> String) -> URI -> String -> String
uriToString String -> String
forall a. a -> a
id URI
uri String
""

        -- copy fields from original cabal.project
        case CopyFields
cfgCopyFields of
            CopyFields
CopyFieldsNone -> () -> ListBuilder (PrettyField ()) ()
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 (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 ([String] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
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{String
pkgName :: String
pkgName :: Package -> String
pkgName} -> do
            let s :: String
s = [String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (Doc -> String
forall a. Show a => a -> String
show (Doc -> String) -> (String -> Doc) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Doc
C.showToken) [String]
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" [String -> Doc
PP.text String
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
$ String -> Doc
PP.text String
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
            [String]
-> (String -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (Project URI Void Package -> [String]
forall uri opt pkg. Project uri opt pkg -> [String]
prjConstraints Project URI Void Package
prj) ((String -> ListBuilder (PrettyField ()) ())
 -> ListBuilder (PrettyField ()) ())
-> (String -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ \String
xs -> do
                let s :: String
s = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (String -> [String]
lines String
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
$ String -> Doc
PP.text String
s

            [String]
-> (String -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (Project URI Void Package -> [String]
forall uri opt pkg. Project uri opt pkg -> [String]
prjAllowNewer Project URI Void Package
prj) ((String -> ListBuilder (PrettyField ()) ())
 -> ListBuilder (PrettyField ()) ())
-> (String -> ListBuilder (PrettyField ()) ())
-> ListBuilder (PrettyField ()) ()
forall a b. (a -> b) -> a -> b
$ \String
xs -> do
                let s :: String
s = [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (String -> [String]
lines String
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
$ String -> Doc
PP.text String
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
$ String -> Doc
PP.text String
"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
$ String -> Doc
PP.text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
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 (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
$ String -> Doc
PP.text String
"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
$ String -> Doc
PP.text (String -> Doc) -> String -> Doc
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
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 String), 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 forall x. Maybe x -> [x]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList SourceRepositoryPackage Maybe
repo)

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

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