{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ViewPatterns #-}
module Summoner.Template.GitHub
( gitHubFiles
) where
import Data.List ((\\))
import NeatInterpolation (text)
import Summoner.Default (defaultGHC)
import Summoner.GhcVer (GhcVer (..), oldGhcs, showGhcVer)
import Summoner.Settings (Settings (..))
import Summoner.Text (tconcatMap)
import Summoner.Tree (TreeFs (..))
gitHubFiles :: Settings -> [TreeFs]
gitHubFiles Settings{..} =
[File ".gitignore" (gitignoreDefault <> gitignoreCustom) | settingsGitHub]
++ [File ".travis.yml" travisYml | settingsTravis]
++ [File "appveyor.yml" appVeyorYml | settingsAppVeyor]
where
gitignoreDefault :: Text
gitignoreDefault =
[text|
### Haskell
dist
dist-*
cabal-dev
*.o
*.hi
*.chi
*.chs.h
*.dyn_o
*.dyn_hi
*.prof
*.aux
*.hp
*.eventlog
.virtualenv
.hsenv
.hpc
.cabal-sandbox/
cabal.sandbox.config
cabal.config
cabal.project.local
.ghc.environment.*
.HTF/
# Stack
.stack-work/
### IDE/support
# Vim
[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-v][a-z]
[._]sw[a-p]
*~
tags
# IntellijIDEA
.idea/
.ideaHaskellLib/
*.iml
# Atom
.haskell-ghc-mod.json
# VS
.vscode/
# Emacs
*#
.dir-locals.el
TAGS
# other
.DS_Store
|]
gitignoreCustom :: Text
gitignoreCustom = if null settingsGitignore
then ""
else unlines ("\n# User specific" : settingsGitignore)
travisYml :: Text
travisYml =
[text|
sudo: true
language: haskell
git:
depth: 5
cabal: "2.4"
cache:
directories:
$travisCabalCache
$travisStackCache
matrix:
include:
$travisCabalMtr
$travisStackMtr
$installAndScript
notifications:
email: false
|]
travisCabalCache, travisStackCache :: Text
travisCabalCache = memptyIfFalse settingsCabal "- \"$HOME/.cabal/store\""
travisStackCache = memptyIfFalse settingsStack
[text|
- "$$HOME/.stack"
- "$$TRAVIS_BUILD_DIR/.stack-work"
|]
cabalTest :: Text
cabalTest = if settingsTest
then "cabal new-test --enable-tests"
else "echo 'No tests'"
travisCabalMtr :: Text
travisCabalMtr = memptyIfFalse settingsCabal $
tconcatMap travisCabalMatrixItem settingsTestedVersions
travisCabalMatrixItem :: GhcVer -> Text
travisCabalMatrixItem (showGhcVer -> ghcV) = [text|- ghc: $ghcV|]
travisStackMtr :: Text
travisStackMtr = memptyIfFalse settingsStack $ tconcatMap
travisStackMatrixItem (settingsTestedVersions \\ (defaultGHC:oldGhcs))
<> travisStackMatrixDefaultItem
travisStackMatrixItem :: GhcVer -> Text
travisStackMatrixItem (showGhcVer -> ghcV) =
[text|
$endLine
- ghc: ${ghcV}
env: STACK_YAML="$$TRAVIS_BUILD_DIR/stack-$ghcV.yaml"
|]
travisStackMatrixDefaultItem :: Text
travisStackMatrixDefaultItem = let defGhc = showGhcVer defaultGHC in
[text|
$endLine
- ghc: ${defGhc}
env: STACK_YAML="$$TRAVIS_BUILD_DIR/stack.yaml"
|]
installAndScript :: Text
installAndScript =
if settingsCabal
then if settingsStack
then installScriptBoth
else installScriptCabal
else installScriptStack
installScriptBoth :: Text
installScriptBoth =
[text|
install:
- |
if [ -z "$$STACK_YAML" ]; then
ghc --version
cabal --version
cabal new-update
cabal new-build --enable-tests --enable-benchmarks
else
curl -sSL https://get.haskellstack.org/ | sh
stack --version
stack build --system-ghc --test --bench --no-run-tests --no-run-benchmarks --ghc-options=-Werror
fi
script:
- |
if [ -z "$$STACK_YAML" ]; then
${cabalTest}
else
stack test --system-ghc
fi
# HLint check
- curl -sSL https://raw.github.com/ndmitchell/neil/master/misc/travis.sh | sh -s -- hlint .
|]
installScriptCabal :: Text
installScriptCabal =
[text|
install:
- cabal new-update
- cabal new-build --enable-tests --enable-benchmarks
script:
- ${cabalTest}
|]
installScriptStack :: Text
installScriptStack =
[text|
install:
- curl -sSL https://get.haskellstack.org/ | sh
- stack --version
- stack build --system-ghc --test --bench --no-run-tests --no-run-benchmarks --ghc-options=-Werror
script:
- stack test --system-ghc
|]
appVeyorYml :: Text
appVeyorYml =
if settingsCabal
then appVeyorYmlCabal
else appVeyorYmlStack
appVeyorYmlCabal :: Text
appVeyorYmlCabal =
[text|
install:
# Using '-y' and 'refreshenv' as a workaround to:
# https://github.com/haskell/cabal/issues/3687
- choco source add -n mistuke -s https://www.myget.org/F/mistuke/api/v2
- choco install -y ghc --ignore-dependencies
- choco install -y cabal-head -pre
- refreshenv
# See http://help.appveyor.com/discussions/problems/6312-curl-command-not-found#comment_42195491
# NB: Do this after refreshenv, otherwise it will be clobbered!
- set PATH=%APPDATA%\cabal\bin;C:\Program Files\Git\cmd;C:\Program Files\Git\mingw64\bin;C:\msys64\usr\bin;%PATH%
- cabal --version
- cabal %CABOPTS% new-update
environment:
global:
CABOPTS: "--store-dir=C:\\SR"
cache:
- dist-newstyle
- "C:\\SR"
build_script:
- cabal %CABOPTS% new-build --enable-tests --enable-benchmarks
- cabal %CABOPTS% new-test --enable-tests
|]
appVeyorYmlStack :: Text
appVeyorYmlStack =
[text|
build: off
before_test:
# http://help.appveyor.com/discussions/problems/6312-curl-command-not-found
- set PATH=C:\Program Files\Git\mingw64\bin;%PATH%
- curl -sS -ostack.zip -L --insecure http://www.stackage.org/stack/windows-x86_64
- 7z x stack.zip stack.exe
clone_folder: "c:\\stack"
environment:
global:
STACK_ROOT: "c:\\sr"
test_script:
- stack setup > nul
# The ugly echo "" hack is to avoid complaints about 0 being an invalid file
# descriptor
- echo "" | stack --arch x86_64 --no-terminal build --bench --no-run-benchmarks --test
|]