haskell-ci 0.12 → 0.12.1
raw patch · 18 files changed
+112/−58 lines, 18 filesdep ~ShellCheckdep ~aesondep ~tastyPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: ShellCheck, aeson, tasty
API changes (from Hackage documentation)
- HaskellCI.Sh: ShError :: String -> ShError
- HaskellCI.Sh: class FromShError e
- HaskellCI.Sh: data ShError
- HaskellCI.Sh: fromShError :: FromShError e => ShError -> e
- HaskellCI.Sh: instance GHC.Exception.Type.Exception HaskellCI.Sh.ShError
- HaskellCI.Sh: instance GHC.Show.Show HaskellCI.Sh.ShError
- HaskellCI.Sh: instance HaskellCI.MonadErr.MonadErr HaskellCI.Sh.ShError HaskellCI.Sh.ShM
- HaskellCI.Sh: instance HaskellCI.Sh.FromShError HaskellCI.Sh.ShError
+ HaskellCI.Config.Validity: checkConfigValidity :: MonadErr HsCiError m => Config -> JobVersions -> m ()
+ HaskellCI.Error: FailError :: String -> HsCiError
+ HaskellCI.Error: ShellCheckError :: String -> HsCiError
+ HaskellCI.Error: ValidationError :: String -> HsCiError
+ HaskellCI.Error: class FromHsCiError e
+ HaskellCI.Error: data HsCiError
+ HaskellCI.Error: fromHsCiError :: FromHsCiError e => HsCiError -> e
+ HaskellCI.Error: instance GHC.Exception.Type.Exception HaskellCI.Error.HsCiError
+ HaskellCI.Error: instance GHC.Show.Show HaskellCI.Error.HsCiError
+ HaskellCI.Error: instance HaskellCI.Error.FromHsCiError HaskellCI.Error.HsCiError
+ HaskellCI.Sh: FailError :: String -> HsCiError
+ HaskellCI.Sh: ValidationError :: String -> HsCiError
+ HaskellCI.Sh: class FromHsCiError e
+ HaskellCI.Sh: data HsCiError
+ HaskellCI.Sh: fromHsCiError :: FromHsCiError e => HsCiError -> e
+ HaskellCI.Sh: instance HaskellCI.MonadErr.MonadErr HaskellCI.Error.HsCiError HaskellCI.Sh.ShM
- HaskellCI.Bash: makeBash :: [String] -> Config -> Project URI Void Package -> JobVersions -> Either ShError Z
+ HaskellCI.Bash: makeBash :: [String] -> Config -> Project URI Void Package -> JobVersions -> Either HsCiError Z
- HaskellCI.GitHub: makeGitHub :: [String] -> Config -> GitConfig -> Project URI Void Package -> JobVersions -> Either ShError GitHub
+ HaskellCI.GitHub: makeGitHub :: [String] -> Config -> GitConfig -> Project URI Void Package -> JobVersions -> Either HsCiError GitHub
- HaskellCI.Sh: ShM :: (([Sh] -> [Sh]) -> Either ShError ([Sh] -> [Sh], a)) -> ShM a
+ HaskellCI.Sh: ShM :: (([Sh] -> [Sh]) -> Either HsCiError ([Sh] -> [Sh], a)) -> ShM a
- HaskellCI.Sh: ShellCheckError :: String -> ShError
+ HaskellCI.Sh: ShellCheckError :: String -> HsCiError
- HaskellCI.Sh: [unShM] :: ShM a -> ([Sh] -> [Sh]) -> Either ShError ([Sh] -> [Sh], a)
+ HaskellCI.Sh: [unShM] :: ShM a -> ([Sh] -> [Sh]) -> Either HsCiError ([Sh] -> [Sh], a)
- HaskellCI.Sh: runSh :: (MonadErr e m, FromShError e) => ShM () -> m [Sh]
+ HaskellCI.Sh: runSh :: (MonadErr e m, FromHsCiError e) => ShM () -> m [Sh]
- HaskellCI.Travis: makeTravis :: [String] -> Config -> Project URI Void Package -> JobVersions -> Either ShError Travis
+ HaskellCI.Travis: makeTravis :: [String] -> Config -> Project URI Void Package -> JobVersions -> Either HsCiError Travis
Files
- CHANGELOG.md +5/−0
- fixtures/all-versions.github +2/−2
- fixtures/copy-fields-all.github +1/−1
- fixtures/copy-fields-none.github +1/−1
- fixtures/copy-fields-some.github +1/−1
- fixtures/empty-line.github +1/−1
- fixtures/irc-channels.github +1/−1
- fixtures/messy.github +1/−1
- fixtures/psql.github +1/−1
- fixtures/travis-patch.github +1/−1
- haskell-ci.cabal +7/−5
- src/HaskellCI/Bash.hs +6/−2
- src/HaskellCI/Config/HLint.hs +1/−1
- src/HaskellCI/Config/Validity.hs +20/−0
- src/HaskellCI/Error.hs +23/−0
- src/HaskellCI/GitHub.hs +26/−12
- src/HaskellCI/Sh.hs +9/−27
- src/HaskellCI/Travis.hs +5/−1
CHANGELOG.md view
@@ -1,3 +1,8 @@+## 0.12.1 - 2021-03-20++- Use HLint-3.3+- GHA: Support --distribution and --submodules (thanks to Ryan Scott)+ ## 0.12 - 2021-03-13 - Use `cabal-install-3.4`
fixtures/all-versions.github view
@@ -21,7 +21,7 @@ name: Haskell-CI - Linux - ${{ matrix.compiler }} runs-on: ubuntu-18.04 container:- image: buildpack-deps:bionic+ image: buildpack-deps:xenial continue-on-error: ${{ matrix.allow-failure }} strategy: matrix:@@ -128,7 +128,7 @@ apt-add-repository -y 'ppa:hvr/ghc' if [ $((GHCJSARITH)) -ne 0 ] ; then apt-add-repository -y 'ppa:hvr/ghcjs' ; fi if [ $((GHCJSARITH)) -ne 0 ] ; then curl -sSL "https://deb.nodesource.com/gpgkey/nodesource.gpg.key" | apt-key add - ; fi- if [ $((GHCJSARITH)) -ne 0 ] ; then apt-add-repository -y 'deb https://deb.nodesource.com/node_10.x bionic main' ; fi+ if [ $((GHCJSARITH)) -ne 0 ] ; then apt-add-repository -y 'deb https://deb.nodesource.com/node_10.x xenial main' ; fi apt-get update if [ $((GHCJSARITH)) -ne 0 ] ; then apt-get install -y $CC cabal-install-3.4 ghc-8.4.4 nodejs ; else apt-get install -y $CC cabal-install-3.4 ; fi env:
fixtures/copy-fields-all.github view
@@ -21,7 +21,7 @@ name: Haskell-CI - Linux - ${{ matrix.compiler }} runs-on: ubuntu-18.04 container:- image: buildpack-deps:bionic+ image: buildpack-deps:xenial continue-on-error: ${{ matrix.allow-failure }} strategy: matrix:
fixtures/copy-fields-none.github view
@@ -21,7 +21,7 @@ name: Haskell-CI - Linux - ${{ matrix.compiler }} runs-on: ubuntu-18.04 container:- image: buildpack-deps:bionic+ image: buildpack-deps:xenial continue-on-error: ${{ matrix.allow-failure }} strategy: matrix:
fixtures/copy-fields-some.github view
@@ -21,7 +21,7 @@ name: Haskell-CI - Linux - ${{ matrix.compiler }} runs-on: ubuntu-18.04 container:- image: buildpack-deps:bionic+ image: buildpack-deps:xenial continue-on-error: ${{ matrix.allow-failure }} strategy: matrix:
fixtures/empty-line.github view
@@ -21,7 +21,7 @@ name: Haskell-CI - Linux - ${{ matrix.compiler }} runs-on: ubuntu-18.04 container:- image: buildpack-deps:bionic+ image: buildpack-deps:xenial continue-on-error: ${{ matrix.allow-failure }} strategy: matrix:
fixtures/irc-channels.github view
@@ -46,7 +46,7 @@ name: Haskell-CI - Linux - ${{ matrix.compiler }} runs-on: ubuntu-18.04 container:- image: buildpack-deps:bionic+ image: buildpack-deps:xenial continue-on-error: ${{ matrix.allow-failure }} strategy: matrix:
fixtures/messy.github view
@@ -21,7 +21,7 @@ name: Haskell-CI - Linux - ${{ matrix.compiler }} runs-on: ubuntu-18.04 container:- image: buildpack-deps:bionic+ image: buildpack-deps:xenial continue-on-error: ${{ matrix.allow-failure }} strategy: matrix:
fixtures/psql.github view
@@ -21,7 +21,7 @@ name: Haskell-CI - Linux - ${{ matrix.compiler }} runs-on: ubuntu-18.04 container:- image: buildpack-deps:bionic+ image: buildpack-deps:xenial services: postgres: image: postgres:10
fixtures/travis-patch.github view
@@ -21,7 +21,7 @@ name: Haskell-CI - Linux - ${{ matrix.compiler }} runs-on: ubuntu-18.04 container:- image: buildpack-deps:bionic+ image: buildpack-deps:xenial continue-on-error: ${{ matrix.allow-failure }} strategy: matrix:
haskell-ci.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.2 name: haskell-ci-version: 0.12+version: 0.12.1 synopsis: Cabal package script generator for Travis-CI description: Script generator (@haskell-ci@) for@@ -88,7 +88,9 @@ HaskellCI.Config.Jobs HaskellCI.Config.PackageScope HaskellCI.Config.Ubuntu+ HaskellCI.Config.Validity HaskellCI.Diagnostics+ HaskellCI.Error HaskellCI.GitConfig HaskellCI.GitHub HaskellCI.GitHub.Yaml@@ -150,7 +152,7 @@ -- other dependencies build-depends:- , aeson ^>=1.4.2.0 || ^>=1.5.0.0+ , aeson ^>=1.5.6.0 , attoparsec ^>=0.13.2.4 , base-compat ^>=0.11 , base16-bytestring ^>=1.0.1.0@@ -170,8 +172,8 @@ , zinza ^>=0.2 -- ShellCheck. Would need newer transformers for older GHC- if (flag(shellcheck) && impl(ghc >=7.10 && <8.11))- build-depends: ShellCheck ==0.7.0 || ==0.7.1+ if flag(shellcheck)+ build-depends: ShellCheck ==0.7.1 executable haskell-ci main-is: Main.hs@@ -203,5 +205,5 @@ build-depends: , ansi-terminal >=0.10 && <0.12 , Diff ^>=0.4.0- , tasty >=1.0 && <1.5+ , tasty ^>=1.4.1 , tasty-golden ^>=2.3.1.1
src/HaskellCI/Bash.hs view
@@ -22,6 +22,7 @@ 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@@ -41,8 +42,11 @@ -> Config -> Project URI Void Package -> JobVersions- -> Either ShError Z -- TODO: writer+ -> Either HsCiError Z -- TODO: writer makeBash _argv config@Config {..} prj jobs@JobVersions {..} = do+ -- Validity checks+ checkConfigValidity config jobs+ blocks <- traverse (fmap shsToList) $ buildList $ do -- install doctest when doctestEnabled $ step "install doctest" $ do@@ -238,7 +242,7 @@ Auxiliary {..} = auxiliary config prj jobs -- TODO: this can be smart and do nothing is there are only comments in [Sh]- step :: String -> ShM () -> ListBuilder (Either ShError [Sh]) ()+ step :: String -> ShM () -> ListBuilder (Either HsCiError [Sh]) () step name action = item $ runSh $ do comment name put_info name
src/HaskellCI/Config/HLint.hs view
@@ -31,7 +31,7 @@ ------------------------------------------------------------------------------- defaultHLintVersion :: VersionRange-defaultHLintVersion = withinVersion (mkVersion [3,2])+defaultHLintVersion = withinVersion (mkVersion [3,3]) defaultHLintConfig :: HLintConfig defaultHLintConfig = HLintConfig
+ src/HaskellCI/Config/Validity.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE RecordWildCards #-}+module HaskellCI.Config.Validity where++import HaskellCI.Prelude++import HaskellCI.Compiler+import HaskellCI.Config+import HaskellCI.Config.Ubuntu+import HaskellCI.Error+import HaskellCI.Jobs+import HaskellCI.MonadErr++-- Validity checks shared in common among all backends.+checkConfigValidity :: MonadErr HsCiError m => Config -> JobVersions -> m ()+checkConfigValidity Config {..} JobVersions {..} = do+ when (anyGHCJS && cfgUbuntu > Bionic) $+ throwErr $ ValidationError $ "Using GHCJS requires Ubuntu 16.04 (Xenial) or 18.04 (Bionic)."+ where+ anyGHCJS = any isGHCJS versions
+ src/HaskellCI/Error.hs view
@@ -0,0 +1,23 @@+module HaskellCI.Error (+ HsCiError (..),+ FromHsCiError (..),+) where++import HaskellCI.Prelude++data HsCiError+ = ShellCheckError String -- ^ @ShellCheck@ disagrees.+ | ValidationError String -- ^ used by validations+ | FailError String -- ^ made by 'fail'.+ deriving (Show)++instance Exception HsCiError where+ displayException (ShellCheckError s) = s+ displayException (ValidationError s) = s+ displayException (FailError s) = "PANIC " ++ s++class FromHsCiError e where+ fromHsCiError :: HsCiError -> e++instance FromHsCiError HsCiError where+ fromHsCiError = id
src/HaskellCI/GitHub.hs view
@@ -35,11 +35,14 @@ import HaskellCI.Config.HLint import HaskellCI.Config.Installed import HaskellCI.Config.PackageScope+import HaskellCI.Config.Ubuntu+import HaskellCI.Config.Validity import HaskellCI.GitConfig import HaskellCI.GitHub.Yaml import HaskellCI.HeadHackage import HaskellCI.Jobs import HaskellCI.List+import HaskellCI.MonadErr import HaskellCI.Package import HaskellCI.Sh import HaskellCI.ShVersionRange@@ -92,12 +95,20 @@ -> GitConfig -> Project URI Void Package -> JobVersions- -> Either ShError GitHub+ -> Either HsCiError GitHub makeGitHub _argv config@Config {..} gitconfig prj jobs@JobVersions {..} = do let envEnv = Map.fromList [ ("CC", "${{ matrix.compiler }}") ] + -- Validity checks+ checkConfigValidity config jobs+ when (cfgSubmodules && cfgUbuntu < Focal) $+ throwErr $ ValidationError $ unwords+ [ "Using submodules on the GitHub Actions backend requires"+ , "Ubuntu 20.04 (Focal Fossa) or later."+ ]+ steps <- sequence $ buildList $ do -- This have to be first, since the packages we install depend on -- whether we need GHCJS or not.@@ -118,7 +129,7 @@ when anyGHCJS $ do sh_if RangeGHCJS "apt-add-repository -y 'ppa:hvr/ghcjs'" sh_if RangeGHCJS "curl -sSL \"https://deb.nodesource.com/gpgkey/nodesource.gpg.key\" | apt-key add -"- sh_if RangeGHCJS "apt-add-repository -y 'deb https://deb.nodesource.com/node_10.x bionic main'" -- TODO: Use cfgUbuntu+ sh_if RangeGHCJS $ "apt-add-repository -y 'deb https://deb.nodesource.com/node_10.x " ++ ubuntuVer ++ " main'" sh "apt-get update" let basePackages = ["$CC", "cabal-install-" ++ cabalVer] ++ S.toList cfgApt ghcjsPackages = ["ghc-8.4.4", "nodejs"]@@ -281,11 +292,12 @@ forHLint $ "$CABAL --store-dir=$HOME/.haskell-ci-tools/store v2-install $ARG_COMPILER --ignore-project -j2 hlint" ++ hlintVersionConstraint forHLint "hlint --version" - githubUses "checkout" "actions/checkout@v2"- [ ("path", "source")- ]+ githubUses "checkout" "actions/checkout@v2" $ buildList $ do+ item ("path", "source")+ when cfgSubmodules $+ item ("submodules", "true") - githubRun "initial cabal.project for sdist" $do+ githubRun "initial cabal.project for sdist" $ do sh "touch cabal.project" for_ pkgs $ \pkg -> echo_if_to (RangePoints $ pkgJobs pkg) "cabal.project" $ "packages: $GITHUB_WORKSPACE/source/" ++ pkgDir pkg@@ -515,11 +527,13 @@ , ghJobs = Map.fromList $ buildList $ do item (mainJobName, GitHubJob { ghjName = actionName ++ " - Linux - ${{ matrix.compiler }}"- , ghjRunsOn = "ubuntu-18.04" -- TODO: use cfgUbuntu+ -- NB: The Ubuntu version used in `runs-on` isn't+ -- particularly important since we use a Docker container.+ , ghjRunsOn = "ubuntu-18.04" , ghjNeeds = [] , ghjSteps = steps , ghjIf = Nothing- , ghjContainer = Just "buildpack-deps:bionic" -- use cfgUbuntu?+ , ghjContainer = Just $ "buildpack-deps:" ++ ubuntuVer , ghjContinueOnError = Just "${{ matrix.allow-failure }}" , ghjServices = mconcat [ Map.singleton "postgres" postgresService | cfgPostgres ]@@ -543,6 +557,7 @@ mainJobName = "linux" cabalVer = dispCabalVersion cfgCabalInstallVersion+ ubuntuVer = showUbuntu cfgUbuntu Auxiliary {..} = auxiliary config prj jobs @@ -553,16 +568,15 @@ headGhcVers = S.filter (previewGHC cfgHeadHackage) versions -- step primitives- githubRun' :: String -> Map.Map String String -> ShM () -> ListBuilder (Either ShError GitHubStep) ()+ githubRun' :: String -> Map.Map String String -> ShM () -> ListBuilder (Either HsCiError GitHubStep) () githubRun' name env shm = item $ do shs <- runSh shm return $ GitHubStep name $ Left $ GitHubRun shs env - githubRun :: String -> ShM () -> ListBuilder (Either ShError GitHubStep) ()+ githubRun :: String -> ShM () -> ListBuilder (Either HsCiError GitHubStep) () githubRun name = githubRun' name mempty -- githubUses :: String -> String -> [(String, String)] -> ListBuilder (Either ShError GitHubStep) ()+ githubUses :: String -> String -> [(String, String)] -> ListBuilder (Either HsCiError GitHubStep) () githubUses name action with = item $ return $ GitHubStep name $ Right $ GitHubUses action Nothing (Map.fromList with)
src/HaskellCI/Sh.hs view
@@ -8,17 +8,18 @@ sh, ShM (..), runSh,- ShError (..),- FromShError (..),+ HsCiError (..),+ FromHsCiError (..), ) where import HaskellCI.Prelude #ifdef MIN_VERSION_ShellCheck-import ShellCheck.Checker (checkScript)-import qualified ShellCheck.Interface as SC+import ShellCheck.Checker (checkScript)+import qualified ShellCheck.Interface as SC #endif +import HaskellCI.Error import HaskellCI.MonadErr -------------------------------------------------------------------------------@@ -61,34 +62,15 @@ ] ---------------------------------------------------------------------------------- Errors----------------------------------------------------------------------------------data ShError- = ShellCheckError String -- ^ @ShellCheck@ disagrees.- | ShError String -- ^ made by 'fail'.- deriving (Show)--instance Exception ShError where- displayException (ShellCheckError s) = s- displayException (ShError s) = "PANIC " ++ s--class FromShError e where- fromShError :: ShError -> e--instance FromShError ShError where- fromShError = id--------------------------------------------------------------------------------- -- implementation ------------------------------------------------------------------------------- -newtype ShM a = ShM { unShM :: ([Sh] -> [Sh]) -> Either ShError ([Sh] -> [Sh], a) }+newtype ShM a = ShM { unShM :: ([Sh] -> [Sh]) -> Either HsCiError ([Sh] -> [Sh], a) } deriving (Functor) -runSh :: (MonadErr e m, FromShError e) => ShM () -> m [Sh]+runSh :: (MonadErr e m, FromHsCiError e) => ShM () -> m [Sh] runSh (ShM f) = case f id of- Left err -> throwErr (fromShError err)+ Left err -> throwErr (fromHsCiError err) Right (g, ()) -> return (g []) instance Applicative ShM where@@ -103,7 +85,7 @@ (shs2, y) <- unShM (k x) shs1 return (shs2, y) -instance MonadErr ShError ShM where+instance MonadErr HsCiError ShM where throwErr err = ShM $ \_ -> Left err unsafeSh :: String -> ShM ()
src/HaskellCI/Travis.hs view
@@ -29,6 +29,7 @@ import HaskellCI.Config.Installed import HaskellCI.Config.Jobs import HaskellCI.Config.PackageScope+import HaskellCI.Config.Validity import HaskellCI.HeadHackage import HaskellCI.Jobs import HaskellCI.List@@ -78,7 +79,7 @@ -> Config -> Project URI Void Package -> JobVersions- -> Either ShError Travis -- TODO: writer+ -> Either HsCiError Travis -- TODO: writer makeTravis argv config@Config {..} prj jobs@JobVersions {..} = do -- before caching: clear some redundant stuff beforeCache <- runSh $ when cfgCache $ do@@ -93,6 +94,9 @@ -- before install: we set up the environment, install GHC/cabal on OSX beforeInstall <- runSh $ do+ -- Validity checks+ checkConfigValidity config jobs+ -- This have to be first when anyGHCJS $ sh $ unlines [ "if echo $CC | grep -q ghcjs; then"