{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}
{-# OPTIONS_GHC -Wno-unused-matches #-}
module HaskellCI.Bash (
makeBash
) where
import HaskellCI.Prelude
import qualified Data.Set as S
import qualified Distribution.Fields.Pretty as C
import qualified Distribution.Package as C
import qualified Distribution.Types.VersionRange as C
import qualified Distribution.Version as C
import Cabal.Project
import HaskellCI.Auxiliary
import HaskellCI.Bash.Template
import HaskellCI.Compiler
import HaskellCI.Config
import HaskellCI.Config.ConstraintSet
import HaskellCI.Config.Doctest
import HaskellCI.Config.Installed
import HaskellCI.Config.PackageScope
import HaskellCI.Config.Validity
import HaskellCI.Jobs
import HaskellCI.List
import HaskellCI.Package
import HaskellCI.Sh
import HaskellCI.ShVersionRange
import HaskellCI.Tools
makeBash
:: [String]
-> Config
-> Project URI Void Package
-> JobVersions
-> Either HsCiError Z
makeBash :: [String]
-> Config
-> Project URI Void Package
-> JobVersions
-> Either HsCiError Z
makeBash [String]
_argv config :: Config
config@Config {Bool
Natural
String
[String]
[PrettyField ()]
[PackageName]
[Installed]
[ConstraintSet]
Maybe String
Maybe Version
Maybe Jobs
Set String
Set Fold
Map Version String
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 :: [String]
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 :: [String]
cfgIrcChannels :: [String]
cfgIrcNickname :: Maybe String
cfgIrcPassword :: Maybe String
cfgIrcIfInOriginRepo :: Bool
cfgEmailNotifications :: Bool
cfgProjectName :: Maybe String
cfgFolds :: Set Fold
cfgGhcHead :: Bool
cfgPostgres :: Bool
cfgGoogleChrome :: Bool
cfgEnv :: Map Version String
cfgAllowFailures :: VersionRange
cfgLastInSeries :: Bool
cfgLinuxJobs :: VersionRange
cfgMacosJobs :: VersionRange
cfgGhcupCabal :: Bool
cfgGhcupJobs :: VersionRange
cfgGhcupVersion :: Version
cfgApt :: Set String
cfgTravisPatches :: [String]
cfgGitHubPatches :: [String]
cfgInsertVersion :: Bool
cfgErrorMissingMethods :: PackageScope
cfgDoctest :: DoctestConfig
cfgDocspec :: DocspecConfig
cfgHLint :: HLintConfig
cfgConstraintSets :: [ConstraintSet]
cfgRawProject :: [PrettyField ()]
cfgRawTravis :: String
cfgGitHubActionName :: Maybe String
cfgTimeoutMinutes :: Natural
cfgCabalInstallVersion :: Config -> Maybe Version
cfgJobs :: Config -> Maybe Jobs
cfgUbuntu :: Config -> Ubuntu
cfgTestedWith :: Config -> TestedWithJobs
cfgEnabledJobs :: Config -> VersionRange
cfgCopyFields :: Config -> CopyFields
cfgLocalGhcOptions :: Config -> [String]
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 -> [String]
cfgIrcChannels :: Config -> [String]
cfgIrcNickname :: Config -> Maybe String
cfgIrcPassword :: Config -> Maybe String
cfgIrcIfInOriginRepo :: Config -> Bool
cfgEmailNotifications :: Config -> Bool
cfgProjectName :: Config -> Maybe String
cfgFolds :: Config -> Set Fold
cfgGhcHead :: Config -> Bool
cfgPostgres :: Config -> Bool
cfgGoogleChrome :: Config -> Bool
cfgEnv :: Config -> Map Version String
cfgAllowFailures :: Config -> VersionRange
cfgLastInSeries :: Config -> Bool
cfgLinuxJobs :: Config -> VersionRange
cfgMacosJobs :: Config -> VersionRange
cfgGhcupCabal :: Config -> Bool
cfgGhcupJobs :: Config -> VersionRange
cfgGhcupVersion :: Config -> Version
cfgApt :: Config -> Set String
cfgTravisPatches :: Config -> [String]
cfgGitHubPatches :: Config -> [String]
cfgInsertVersion :: Config -> Bool
cfgErrorMissingMethods :: Config -> PackageScope
cfgDoctest :: Config -> DoctestConfig
cfgDocspec :: Config -> DocspecConfig
cfgHLint :: Config -> HLintConfig
cfgConstraintSets :: Config -> [ConstraintSet]
cfgRawProject :: Config -> [PrettyField ()]
cfgRawTravis :: Config -> String
cfgGitHubActionName :: Config -> Maybe String
cfgTimeoutMinutes :: Config -> Natural
..} Project URI Void Package
prj jobs :: JobVersions
jobs@JobVersions {Set CompilerVersion
allVersions :: Set CompilerVersion
linuxVersions :: Set CompilerVersion
macosVersions :: Set CompilerVersion
allVersions :: JobVersions -> Set CompilerVersion
linuxVersions :: JobVersions -> Set CompilerVersion
macosVersions :: JobVersions -> Set CompilerVersion
..} = do
Config -> JobVersions -> Either HsCiError ()
forall (m :: * -> *).
MonadErr HsCiError m =>
Config -> JobVersions -> m ()
checkConfigValidity Config
config JobVersions
jobs
[String]
blocks <- (Either HsCiError [Sh] -> Either HsCiError String)
-> [Either HsCiError [Sh]] -> Either HsCiError [String]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse (([Sh] -> String)
-> Either HsCiError [Sh] -> Either HsCiError String
forall a b. (a -> b) -> Either HsCiError a -> Either HsCiError b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [Sh] -> String
shsToList) ([Either HsCiError [Sh]] -> Either HsCiError [String])
-> [Either HsCiError [Sh]] -> Either HsCiError [String]
forall a b. (a -> b) -> a -> b
$ ListBuilder (Either HsCiError [Sh]) () -> [Either HsCiError [Sh]]
forall x. ListBuilder x () -> [x]
buildList (ListBuilder (Either HsCiError [Sh]) () -> [Either HsCiError [Sh]])
-> ListBuilder (Either HsCiError [Sh]) ()
-> [Either HsCiError [Sh]]
forall a b. (a -> b) -> a -> b
$ do
Bool
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
doctestEnabled (ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ())
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"install doctest" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
let range :: CompilerRange
range = VersionRange -> CompilerRange
Range (DoctestConfig -> VersionRange
cfgDoctestEnabled DoctestConfig
cfgDoctest) CompilerRange -> CompilerRange -> CompilerRange
forall a. Lattice a => a -> a -> a
/\ CompilerRange
doctestJobVersionRange
String -> ShM ()
forall (m :: * -> *). MonadSh m => String -> m ()
comment String
"install doctest"
CompilerRange -> String -> ShM ()
run_cmd_if CompilerRange
range String
"$CABAL v2-install $ARG_COMPILER --ignore-project -j doctest --constraint='doctest ^>=0.20'"
CompilerRange -> String -> ShM ()
run_cmd_if CompilerRange
range String
"doctest --version"
String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"initial cabal.project for sdist" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
String -> ShM ()
change_dir String
"$BUILDDIR"
String -> ShM ()
run_cmd String
"touch cabal.project"
[Package] -> (Package -> ShM ()) -> ShM ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [Package]
pkgs ((Package -> ShM ()) -> ShM ()) -> (Package -> ShM ()) -> ShM ()
forall a b. (a -> b) -> a -> b
$ \Package
pkg ->
CompilerRange -> String -> String -> ShM ()
echo_if_to (Set CompilerVersion -> CompilerRange
RangePoints (Set CompilerVersion -> CompilerRange)
-> Set CompilerVersion -> CompilerRange
forall a b. (a -> b) -> a -> b
$ Package -> Set CompilerVersion
pkgJobs Package
pkg) String
"cabal.project" (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
"packages: $SRCDIR/" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Package -> String
pkgDir Package
pkg
String -> ShM ()
run_cmd String
"cat cabal.project"
String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"sdist" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
String -> ShM ()
run_cmd String
"mkdir -p \"$BUILDDIR/sdist\""
String -> ShM ()
run_cmd String
"$CABAL sdist all --output-dir \"$BUILDDIR/sdist\""
String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"unpack" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
String -> ShM ()
change_dir String
"$BUILDDIR"
String -> ShM ()
run_cmd String
"mkdir -p \"$BUILDDIR/unpacked\""
String -> ShM ()
run_cmd String
"find \"$BUILDDIR/sdist\" -maxdepth 1 -type f -name '*.tar.gz' -exec tar -C \"$BUILDDIR/unpacked\" -xzvf {} \\;"
String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"generate cabal.project" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
[Package] -> (Package -> ShM ()) -> ShM ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [Package]
pkgs ((Package -> ShM ()) -> ShM ()) -> (Package -> ShM ()) -> ShM ()
forall a b. (a -> b) -> a -> b
$ \Pkg{String
pkgName :: String
pkgName :: Package -> String
pkgName} -> do
String -> ShM ()
forall (m :: * -> *). MonadSh m => String -> m ()
sh (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String -> String
pkgNameDirVariable' String
pkgName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"=\"$(find \"$BUILDDIR/unpacked\" -maxdepth 1 -type d -regex '.*/" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
pkgName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"-[0-9.]*')\""
String -> ShM ()
run_cmd String
"touch cabal.project"
String -> ShM ()
run_cmd String
"touch cabal.project.local"
[Package] -> (Package -> ShM ()) -> ShM ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [Package]
pkgs ((Package -> ShM ()) -> ShM ()) -> (Package -> ShM ()) -> ShM ()
forall a b. (a -> b) -> a -> b
$ \Package
pkg ->
CompilerRange -> String -> String -> ShM ()
echo_if_to (Set CompilerVersion -> CompilerRange
RangePoints (Set CompilerVersion -> CompilerRange)
-> Set CompilerVersion -> CompilerRange
forall a b. (a -> b) -> a -> b
$ Package -> Set CompilerVersion
pkgJobs Package
pkg) String
"cabal.project" (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
"packages: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
pkgNameDirVariable (Package -> String
pkgName Package
pkg)
case PackageScope
cfgErrorMissingMethods of
PackageScope
PackageScopeNone -> () -> ShM ()
forall a. a -> ShM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
PackageScope
PackageScopeLocal -> [Package] -> (Package -> ShM ()) -> ShM ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [Package]
pkgs ((Package -> ShM ()) -> ShM ()) -> (Package -> ShM ()) -> ShM ()
forall a b. (a -> b) -> a -> b
$ \Pkg{String
pkgName :: Package -> String
pkgName :: String
pkgName,Set CompilerVersion
pkgJobs :: Package -> Set CompilerVersion
pkgJobs :: Set CompilerVersion
pkgJobs} -> do
let range :: CompilerRange
range = VersionRange -> CompilerRange
Range (Version -> VersionRange
C.orLaterVersion ([Int] -> Version
C.mkVersion [Int
8,Int
2])) CompilerRange -> CompilerRange -> CompilerRange
forall a. Lattice a => a -> a -> a
/\ Set CompilerVersion -> CompilerRange
RangePoints Set CompilerVersion
pkgJobs
CompilerRange -> String -> String -> ShM ()
echo_if_to CompilerRange
range String
"cabal.project" (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
"package " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
pkgName
CompilerRange -> String -> String -> ShM ()
echo_if_to CompilerRange
range String
"cabal.project" (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
" ghc-options: -Werror=missing-methods"
PackageScope
PackageScopeAll -> String -> String -> ShM ()
cat String
"cabal.project" (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
unlines
[ String
"package *"
, String
" ghc-options: -Werror=missing-methods"
]
String -> String -> ShM ()
cat String
"cabal.project" (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ (() -> CommentPosition)
-> (() -> [String] -> [String])
-> Int
-> [PrettyField ()]
-> String
forall ann.
(ann -> CommentPosition)
-> (ann -> [String] -> [String])
-> Int
-> [PrettyField ann]
-> String
C.showFields' (CommentPosition -> () -> CommentPosition
forall a b. a -> b -> a
const CommentPosition
C.NoComment) (([String] -> [String]) -> () -> [String] -> [String]
forall a b. a -> b -> a
const [String] -> [String]
forall a. a -> a
id) Int
2 ([PrettyField ()] -> String) -> [PrettyField ()] -> String
forall a b. (a -> b) -> a -> b
$ String -> [PrettyField ()]
extraCabalProjectFields String
""
case [Installed] -> InstalledNormalised
normaliseInstalled [Installed]
cfgInstalled of
InstalledDiff Set PackageName
pns -> String -> ShM ()
forall (m :: * -> *). MonadSh m => String -> m ()
sh (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords
[ String
"$HCPKG list --simple-output --names-only"
, String
"| perl -ne 'for (split /\\s+/) { print \"constraints: $_ installed\\n\" unless /" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
re String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"/; }'"
, String
">> cabal.project.local"
]
where
pns' :: Set String
pns' = (PackageName -> String) -> Set PackageName -> Set String
forall b a. Ord b => (a -> b) -> Set a -> Set b
S.map PackageName -> String
C.unPackageName Set PackageName
pns Set String -> Set String -> Set String
forall a. Ord a => Set a -> Set a -> Set a
`S.union` (Package -> Set String) -> [Package] -> Set String
forall m a. Monoid m => (a -> m) -> [a] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (String -> Set String
forall a. a -> Set a
S.singleton (String -> Set String)
-> (Package -> String) -> Package -> Set String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Package -> String
pkgName) [Package]
pkgs
re :: String
re = String
"^(" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"|" (Set String -> [String]
forall a. Set a -> [a]
S.toList Set String
pns') String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")$"
InstalledOnly Set PackageName
pns | Bool -> Bool
not (Set String -> Bool
forall a. Set a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Set String
pns') -> String -> String -> ShM ()
cat String
"cabal.project.local" (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
unlines
[ String
"constraints: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
pkg String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" installed"
| String
pkg <- Set String -> [String]
forall a. Set a -> [a]
S.toList Set String
pns'
]
where
pns' :: Set String
pns' = (PackageName -> String) -> Set PackageName -> Set String
forall b a. Ord b => (a -> b) -> Set a -> Set b
S.map PackageName -> String
C.unPackageName Set PackageName
pns Set String -> Set String -> Set String
forall a. Ord a => Set a -> Set a -> Set a
`S.difference` (Package -> Set String) -> [Package] -> Set String
forall m a. Monoid m => (a -> m) -> [a] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (String -> Set String
forall a. a -> Set a
S.singleton (String -> Set String)
-> (Package -> String) -> Package -> Set String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Package -> String
pkgName) [Package]
pkgs
InstalledNormalised
_ -> () -> ShM ()
forall a. a -> ShM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
String -> ShM ()
run_cmd String
"cat cabal.project"
String -> ShM ()
run_cmd String
"cat cabal.project.local"
String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"dump install plan" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
String -> ShM ()
run_cmd String
"$CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all"
String -> ShM ()
run_cmd String
"cabal-plan"
Bool
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
cfgInstallDeps (ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ())
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"install dependencies" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
String -> ShM ()
run_cmd String
"$CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j all"
String -> ShM ()
run_cmd String
"$CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dependencies-only -j all"
Bool
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (VersionRange -> VersionRange -> Bool
equivVersionRanges VersionRange
C.noVersion VersionRange
cfgNoTestsNoBench) (ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ())
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"build w/o tests" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
String -> ShM ()
run_cmd String
"$CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all"
String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"build" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
String -> ShM ()
run_cmd String
"$CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH all"
String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"tests" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
let range :: CompilerRange
range = CompilerRange
RangeGHC CompilerRange -> CompilerRange -> CompilerRange
forall a. Lattice a => a -> a -> a
/\ VersionRange -> CompilerRange
Range (VersionRange
cfgTests VersionRange -> VersionRange -> VersionRange
forall a. Lattice a => a -> a -> a
/\ VersionRange
cfgRunTests) CompilerRange -> CompilerRange -> CompilerRange
forall a. Lattice a => a -> a -> a
/\ CompilerRange
hasTests
CompilerRange -> String -> ShM ()
run_cmd_if CompilerRange
range (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
"$CABAL v2-test $ARG_COMPILER $ARG_TESTS $ARG_BENCH all" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
testShowDetails
Bool
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
doctestEnabled (ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ())
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"doctest" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
let doctestOptions :: String
doctestOptions = [String] -> String
unwords ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ DoctestConfig -> [String]
cfgDoctestOptions DoctestConfig
cfgDoctest
Bool -> ShM () -> ShM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ([PackageName] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([PackageName] -> Bool) -> [PackageName] -> Bool
forall a b. (a -> b) -> a -> b
$ DoctestConfig -> [PackageName]
cfgDoctestFilterEnvPkgs DoctestConfig
cfgDoctest) (ShM () -> ShM ()) -> ShM () -> ShM ()
forall a b. (a -> b) -> a -> b
$ do
let manglePkgNames :: String -> [String]
manglePkgNames :: String -> [String]
manglePkgNames String
n
| Set CompilerVersion -> Bool
forall a. Set a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null Set CompilerVersion
macosVersions = [String
n]
| Bool
otherwise = [String
n, (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
filter Char -> Bool
notVowel String
n]
where
notVowel :: Char -> Bool
notVowel Char
c = Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
notElem Char
c (String
"aeiou" :: String)
let filterPkgs :: String
filterPkgs = String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"|" ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ (PackageName -> [String]) -> [PackageName] -> [String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (String -> [String]
manglePkgNames (String -> [String])
-> (PackageName -> String) -> PackageName -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageName -> String
C.unPackageName) ([PackageName] -> [String]) -> [PackageName] -> [String]
forall a b. (a -> b) -> a -> b
$ DoctestConfig -> [PackageName]
cfgDoctestFilterEnvPkgs DoctestConfig
cfgDoctest
String -> ShM ()
run_cmd (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
"perl -i -e 'while (<ARGV>) { print unless /package-id\\s+(" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
filterPkgs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")-\\d+(\\.\\d+)*/; }' .ghc.environment.*"
[Package] -> (Package -> ShM ()) -> ShM ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [Package]
pkgs ((Package -> ShM ()) -> ShM ()) -> (Package -> ShM ()) -> ShM ()
forall a b. (a -> b) -> a -> b
$ \Pkg{String
pkgName :: Package -> String
pkgName :: String
pkgName,GenericPackageDescription
pkgGpd :: GenericPackageDescription
pkgGpd :: Package -> GenericPackageDescription
pkgGpd,Set CompilerVersion
pkgJobs :: Package -> Set CompilerVersion
pkgJobs :: Set CompilerVersion
pkgJobs} ->
Bool -> ShM () -> ShM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (String -> PackageName
C.mkPackageName String
pkgName PackageName -> [PackageName] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` DoctestConfig -> [PackageName]
cfgDoctestFilterSrcPkgs DoctestConfig
cfgDoctest) (ShM () -> ShM ()) -> ShM () -> ShM ()
forall a b. (a -> b) -> a -> b
$ do
[[String]] -> ([String] -> ShM ()) -> ShM ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ (GenericPackageDescription -> [[String]]
doctestArgs GenericPackageDescription
pkgGpd) (([String] -> ShM ()) -> ShM ()) -> ([String] -> ShM ()) -> ShM ()
forall a b. (a -> b) -> a -> b
$ \[String]
args -> do
let args' :: String
args' = [String] -> String
unwords [String]
args
let vr :: CompilerRange
vr = VersionRange -> CompilerRange
Range (DoctestConfig -> VersionRange
cfgDoctestEnabled DoctestConfig
cfgDoctest)
CompilerRange -> CompilerRange -> CompilerRange
forall a. Lattice a => a -> a -> a
/\ CompilerRange
doctestJobVersionRange
CompilerRange -> CompilerRange -> CompilerRange
forall a. Lattice a => a -> a -> a
/\ Set CompilerVersion -> CompilerRange
RangePoints Set CompilerVersion
pkgJobs
Bool -> ShM () -> ShM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ([String] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String]
args) (ShM () -> ShM ()) -> ShM () -> ShM ()
forall a b. (a -> b) -> a -> b
$ do
CompilerRange -> String -> ShM ()
change_dir_if CompilerRange
vr (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String -> String
pkgNameDirVariable String
pkgName
CompilerRange -> String -> ShM ()
run_cmd_if CompilerRange
vr (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
"doctest " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
doctestOptions String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
args'
Bool
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
cfgCheck (ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ())
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"cabal check" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
[Package] -> (Package -> ShM ()) -> ShM ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [Package]
pkgs ((Package -> ShM ()) -> ShM ()) -> (Package -> ShM ()) -> ShM ()
forall a b. (a -> b) -> a -> b
$ \Pkg{String
pkgName :: Package -> String
pkgName :: String
pkgName,Set CompilerVersion
pkgJobs :: Package -> Set CompilerVersion
pkgJobs :: Set CompilerVersion
pkgJobs} -> do
let range :: CompilerRange
range = Set CompilerVersion -> CompilerRange
RangePoints Set CompilerVersion
pkgJobs
CompilerRange -> String -> ShM ()
change_dir_if CompilerRange
range (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String -> String
pkgNameDirVariable String
pkgName
CompilerRange -> String -> ShM ()
run_cmd_if CompilerRange
range String
"${CABAL} -vnormal check"
String -> ShM ()
change_dir String
"$BUILDDIR"
Bool
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (VersionRange -> VersionRange -> Bool
equivVersionRanges VersionRange
C.noVersion VersionRange
cfgHaddock) (ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ())
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"haddock" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
let range :: CompilerRange
range = CompilerRange
RangeGHC CompilerRange -> CompilerRange -> CompilerRange
forall a. Lattice a => a -> a -> a
/\ VersionRange -> CompilerRange
Range VersionRange
cfgHaddock
CompilerRange -> String -> ShM ()
run_cmd_if CompilerRange
range String
"$CABAL v2-haddock --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all"
Bool
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless (VersionRange -> VersionRange -> Bool
equivVersionRanges VersionRange
C.noVersion VersionRange
cfgUnconstrainted) (ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ())
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"unconstrained build" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
let range :: CompilerRange
range = VersionRange -> CompilerRange
Range VersionRange
cfgUnconstrainted
CompilerRange -> String -> ShM ()
run_cmd_if CompilerRange
range String
"rm -f cabal.project.local"
CompilerRange -> String -> ShM ()
run_cmd_if CompilerRange
range String
"$CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all"
Bool
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless ([ConstraintSet] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [ConstraintSet]
cfgConstraintSets) (ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ())
-> ListBuilder (Either HsCiError [Sh]) ()
-> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
"constraint sets" (ShM () -> ListBuilder (Either HsCiError [Sh]) ())
-> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ do
String -> ShM ()
run_cmd String
"rm -f cabal.project.local"
[ConstraintSet] -> (ConstraintSet -> ShM ()) -> ShM ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ [ConstraintSet]
cfgConstraintSets ((ConstraintSet -> ShM ()) -> ShM ())
-> (ConstraintSet -> ShM ()) -> ShM ()
forall a b. (a -> b) -> a -> b
$ \ConstraintSet
cs -> do
let name :: String
name = ConstraintSet -> String
csName ConstraintSet
cs
let run_cmd_cs :: String -> ShM ()
run_cmd_cs = CompilerRange -> String -> ShM ()
run_cmd_if (VersionRange -> CompilerRange
Range (ConstraintSet -> VersionRange
csGhcVersions ConstraintSet
cs))
let run_cmd_cs' :: CompilerRange -> String -> ShM ()
run_cmd_cs' CompilerRange
r = CompilerRange -> String -> ShM ()
run_cmd_if (VersionRange -> CompilerRange
Range (ConstraintSet -> VersionRange
csGhcVersions ConstraintSet
cs) CompilerRange -> CompilerRange -> CompilerRange
forall a. Lattice a => a -> a -> a
/\ CompilerRange
r)
let testFlag :: String
testFlag = if ConstraintSet -> Bool
csTests ConstraintSet
cs then String
"--enable-tests" else String
"--disable-tests"
let benchFlag :: String
benchFlag = if ConstraintSet -> Bool
csBenchmarks ConstraintSet
cs then String
"--enable-benchmarks" else String
"--disable-benchmarks"
let constraintFlags :: [String]
constraintFlags = (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (\String
x -> String
"--constraint='" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"'") (ConstraintSet -> [String]
csConstraints ConstraintSet
cs)
let allFlags :: String
allFlags = [String] -> String
unwords (String
testFlag String -> [String] -> [String]
forall a. a -> [a] -> [a]
: String
benchFlag String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String]
constraintFlags)
String -> ShM ()
put_info (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
"constraint set " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
name
String -> ShM ()
run_cmd_cs (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
"$CABAL v2-build $ARG_COMPILER " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
allFlags String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" --dependencies-only -j all"
String -> ShM ()
run_cmd_cs (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
"$CABAL v2-build $ARG_COMPILER " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
allFlags String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" all"
Bool -> ShM () -> ShM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ConstraintSet -> Bool
csRunTests ConstraintSet
cs) (ShM () -> ShM ()) -> ShM () -> ShM ()
forall a b. (a -> b) -> a -> b
$
CompilerRange -> String -> ShM ()
run_cmd_cs' CompilerRange
hasTests (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
"$CABAL v2-test $ARG_COMPILER " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
allFlags String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" all"
Bool -> ShM () -> ShM ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (ConstraintSet -> Bool
csHaddock ConstraintSet
cs) (ShM () -> ShM ()) -> ShM () -> ShM ()
forall a b. (a -> b) -> a -> b
$
String -> ShM ()
run_cmd_cs (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
"$CABAL v2-haddock --haddock-all $ARG_COMPILER " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
withHaddock String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
allFlags String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" all"
Z -> Either HsCiError Z
forall a. a -> Either HsCiError a
forall (m :: * -> *) a. Monad m => a -> m a
return Z
defaultZ
{ zJobs =
[ prettyShow v
| GHC v <- reverse $ toList linuxVersions
]
, zBlocks = blocks
, zApt = S.toList cfgApt
, zTestsCond = compilerVersionArithPredicate linuxVersions $ Range cfgTests
, zBenchCond = compilerVersionArithPredicate linuxVersions $ Range cfgBenchmarks
}
where
Auxiliary {Bool
String
[URI]
[Package]
CompilerRange
String -> [PrettyField ()]
doctestEnabled :: Bool
pkgs :: [Package]
extraCabalProjectFields :: String -> [PrettyField ()]
hasTests :: CompilerRange
testShowDetails :: String
uris :: [URI]
projectName :: String
docspecEnabled :: Bool
hasLibrary :: Bool
anyJobUsesHeadHackage :: Bool
anyJobUsesPreviewGHC :: Bool
runHaddock :: Bool
haddockFlags :: String
pkgs :: Auxiliary -> [Package]
uris :: Auxiliary -> [URI]
projectName :: Auxiliary -> String
doctestEnabled :: Auxiliary -> Bool
docspecEnabled :: Auxiliary -> Bool
hasTests :: Auxiliary -> CompilerRange
hasLibrary :: Auxiliary -> Bool
extraCabalProjectFields :: Auxiliary -> String -> [PrettyField ()]
testShowDetails :: Auxiliary -> String
anyJobUsesHeadHackage :: Auxiliary -> Bool
anyJobUsesPreviewGHC :: Auxiliary -> Bool
runHaddock :: Auxiliary -> Bool
haddockFlags :: Auxiliary -> String
..} = Config -> Project URI Void Package -> JobVersions -> Auxiliary
auxiliary Config
config Project URI Void Package
prj JobVersions
jobs
step :: String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step :: String -> ShM () -> ListBuilder (Either HsCiError [Sh]) ()
step String
name ShM ()
action = Either HsCiError [Sh] -> ListBuilder (Either HsCiError [Sh]) ()
forall x. x -> ListBuilder x ()
item (Either HsCiError [Sh] -> ListBuilder (Either HsCiError [Sh]) ())
-> Either HsCiError [Sh] -> ListBuilder (Either HsCiError [Sh]) ()
forall a b. (a -> b) -> a -> b
$ ShM () -> Either HsCiError [Sh]
forall e (m :: * -> *).
(MonadErr e m, FromHsCiError e) =>
ShM () -> m [Sh]
runSh (ShM () -> Either HsCiError [Sh])
-> ShM () -> Either HsCiError [Sh]
forall a b. (a -> b) -> a -> b
$ do
String -> ShM ()
forall (m :: * -> *). MonadSh m => String -> m ()
comment String
name
String -> ShM ()
put_info String
name
ShM ()
action
put_info :: String -> ShM ()
put_info :: String -> ShM ()
put_info String
s = String -> ShM ()
forall (m :: * -> *). MonadSh m => String -> m ()
sh (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
"put_info " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
s
change_dir :: String -> ShM ()
change_dir :: String -> ShM ()
change_dir String
dir = String -> ShM ()
forall (m :: * -> *). MonadSh m => String -> m ()
sh (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ String
"change_dir " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
forall a. Show a => a -> String
show String
dir
change_dir_if :: CompilerRange -> String -> ShM ()
change_dir_if :: CompilerRange -> String -> ShM ()
change_dir_if CompilerRange
vr String
dir
| (CompilerVersion -> Bool) -> Set CompilerVersion -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CompilerVersion -> CompilerRange -> Bool
`compilerWithinRange` CompilerRange
vr) Set CompilerVersion
linuxVersions = String -> ShM ()
change_dir String
dir
| Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ (CompilerVersion -> Bool) -> Set CompilerVersion -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (CompilerVersion -> CompilerRange -> Bool
`compilerWithinRange` CompilerRange
vr) Set CompilerVersion
linuxVersions = () -> ShM ()
forall a. a -> ShM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
| Bool
otherwise = String -> ShM ()
forall (m :: * -> *). MonadSh m => String -> m ()
sh (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords
[ String
"change_dir_if"
, Set CompilerVersion -> CompilerRange -> String
compilerVersionArithPredicate Set CompilerVersion
linuxVersions CompilerRange
vr
, String
dir
]
run_cmd :: String -> ShM ()
run_cmd :: String -> ShM ()
run_cmd String
cmd = String -> ShM ()
forall (m :: * -> *). MonadSh m => String -> m ()
sh (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords
[ String
"run_cmd"
, String
cmd
]
run_cmd_if :: CompilerRange -> String -> ShM ()
run_cmd_if :: CompilerRange -> String -> ShM ()
run_cmd_if CompilerRange
vr String
cmd
| (CompilerVersion -> Bool) -> Set CompilerVersion -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CompilerVersion -> CompilerRange -> Bool
`compilerWithinRange` CompilerRange
vr) Set CompilerVersion
linuxVersions = String -> ShM ()
run_cmd String
cmd
| Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ (CompilerVersion -> Bool) -> Set CompilerVersion -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (CompilerVersion -> CompilerRange -> Bool
`compilerWithinRange` CompilerRange
vr) Set CompilerVersion
linuxVersions = () -> ShM ()
forall a. a -> ShM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
| Bool
otherwise = String -> ShM ()
forall (m :: * -> *). MonadSh m => String -> m ()
sh (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords
[ String
"run_cmd_if"
, Set CompilerVersion -> CompilerRange -> String
compilerVersionArithPredicate Set CompilerVersion
linuxVersions CompilerRange
vr
, String
cmd
]
echo_if_to :: CompilerRange -> FilePath -> String -> ShM ()
echo_if_to :: CompilerRange -> String -> String -> ShM ()
echo_if_to CompilerRange
vr String
path String
contents
| (CompilerVersion -> Bool) -> Set CompilerVersion -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CompilerVersion -> CompilerRange -> Bool
`compilerWithinRange` CompilerRange
vr) Set CompilerVersion
linuxVersions = String -> ShM ()
forall (m :: * -> *). MonadSh m => String -> m ()
sh (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords
[ String
"echo_to"
, String
path
, String -> String
forall a. Show a => a -> String
show String
contents
]
| Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ (CompilerVersion -> Bool) -> Set CompilerVersion -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (CompilerVersion -> CompilerRange -> Bool
`compilerWithinRange` CompilerRange
vr) Set CompilerVersion
linuxVersions = () -> ShM ()
forall a. a -> ShM a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
| Bool
otherwise = String -> ShM ()
forall (m :: * -> *). MonadSh m => String -> m ()
sh (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
unwords
[ String
"echo_if_to"
, Set CompilerVersion -> CompilerRange -> String
compilerVersionArithPredicate Set CompilerVersion
linuxVersions CompilerRange
vr
, String
path
, String -> String
forall a. Show a => a -> String
show String
contents
]
withHaddock :: String
withHaddock :: String
withHaddock = String
"--with-haddock $HADDOCK"
shsToList :: [Sh] -> String
shsToList :: [Sh] -> String
shsToList = [String] -> String
unlines ([String] -> String) -> ([Sh] -> [String]) -> [Sh] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sh -> String) -> [Sh] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map Sh -> String
f where
f :: Sh -> String
f (Sh String
x) = String
x
f (Comment String
c) = String
"# " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
c
cat :: FilePath -> String -> ShM ()
cat :: String -> String -> ShM ()
cat String
path String
contents = String -> ShM ()
forall (m :: * -> *). MonadSh m => String -> m ()
sh (String -> ShM ()) -> String -> ShM ()
forall a b. (a -> b) -> a -> b
$ [String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
[ String
"cat >> " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
path String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" <<EOF\n"
, String
contents
, String
"EOF"
]