git.iko.soy/typeable/postgresql-simple
on master help sign in
Use GHA
commit5caa9625acfa34dabc00ca1983094ec2e2bea0f4 authorOleg Grenrus <oleg.grenrus@iki.fi> dateFri 1 Jan 2021, 19:47 (6 years ago) parent227fcb3
5 files changed+207−192
.github/workflows/haskell-ci.yml+187 .travis.yml−177 cabal.haskell-ci−10 postgresql-simple.cabal+1−1 test/Main.hs+19−4
.github/workflows/haskell-ci.ymlnew file+187
@@ -0,0 +1,187 @@
1+# This GitHub workflow config has been generated by a script via
2+#
3+# haskell-ci 'github' 'postgresql-simple.cabal'
4+#
5+# To regenerate the script (for example after adjusting tested-with) run
6+#
7+# haskell-ci regenerate
8+#
9+# For more information, see https://github.com/haskell-CI/haskell-ci
10+#
11+# version: 0.11.20210101
12+#
13+# REGENDATA ("0.11.20210101",["github","postgresql-simple.cabal"])
14+#
15+name: Haskell-CI
16+on:
17+ push:
18+ branches:
19+ - master
20+ pull_request:
21+ branches:
22+ - master
23+jobs:
24+ linux:
25+ name: Haskell-CI Linux - GHC ${{ matrix.ghc }}
26+ runs-on: ubuntu-18.04
27+ container:
28+ image: buildpack-deps:bionic
29+ services:
30+ postgres:
31+ image: postgres:10
32+ env:
33+ POSTGRES_PASSWORD: postgres
34+ options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
35+ continue-on-error: ${{ matrix.allow-failure }}
36+ strategy:
37+ matrix:
38+ include:
39+ - ghc: 8.10.3
40+ allow-failure: false
41+ - ghc: 8.8.4
42+ allow-failure: false
43+ - ghc: 8.6.5
44+ allow-failure: false
45+ - ghc: 8.4.4
46+ allow-failure: false
47+ - ghc: 8.2.2
48+ allow-failure: false
49+ - ghc: 8.0.2
50+ allow-failure: false
51+ - ghc: 7.10.3
52+ allow-failure: false
53+ - ghc: 7.8.4
54+ allow-failure: false
55+ - ghc: 7.6.3
56+ allow-failure: false
57+ fail-fast: false
58+ steps:
59+ - name: apt
60+ run: |
61+ apt-get update
62+ apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common
63+ apt-add-repository -y 'ppa:hvr/ghc'
64+ apt-get update
65+ apt-get install -y ghc-$GHC_VERSION cabal-install-3.2
66+ env:
67+ GHC_VERSION: ${{ matrix.ghc }}
68+ - name: Set PATH and environment variables
69+ run: |
70+ echo "$HOME/.cabal/bin" >> $GITHUB_PATH
71+ echo "LANG=C.UTF-8" >> $GITHUB_ENV
72+ echo "CABAL_DIR=$HOME/.cabal" >> $GITHUB_ENV
73+ echo "CABAL_CONFIG=$HOME/.cabal/config" >> $GITHUB_ENV
74+ HC=/opt/ghc/$GHC_VERSION/bin/ghc
75+ echo "HC=$HC" >> $GITHUB_ENV
76+ echo "HCPKG=/opt/ghc/$GHC_VERSION/bin/ghc-pkg" >> $GITHUB_ENV
77+ echo "HADDOCK=/opt/ghc/$GHC_VERSION/bin/haddock" >> $GITHUB_ENV
78+ echo "CABAL=/opt/cabal/3.2/bin/cabal -vnormal+nowrap" >> $GITHUB_ENV
79+ HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
80+ echo "HCNUMVER=$HCNUMVER" >> $GITHUB_ENV
81+ echo "ARG_TESTS=--enable-tests" >> $GITHUB_ENV
82+ echo "ARG_BENCH=--enable-benchmarks" >> $GITHUB_ENV
83+ echo "ARG_COMPILER=--ghc --with-compiler=/opt/ghc/$GHC_VERSION/bin/ghc" >> $GITHUB_ENV
84+ echo "GHCJSARITH=0" >> $GITHUB_ENV
85+ env:
86+ GHC_VERSION: ${{ matrix.ghc }}
87+ - name: env
88+ run: |
89+ env
90+ - name: write cabal config
91+ run: |
92+ mkdir -p $CABAL_DIR
93+ cat >> $CABAL_CONFIG <<EOF
94+ remote-build-reporting: anonymous
95+ write-ghc-environment-files: never
96+ remote-repo-cache: $CABAL_DIR/packages
97+ logs-dir: $CABAL_DIR/logs
98+ world-file: $CABAL_DIR/world
99+ extra-prog-path: $CABAL_DIR/bin
100+ symlink-bindir: $CABAL_DIR/bin
101+ installdir: $CABAL_DIR/bin
102+ build-summary: $CABAL_DIR/logs/build.log
103+ store-dir: $CABAL_DIR/store
104+ install-dirs user
105+ prefix: $CABAL_DIR
106+ repository hackage.haskell.org
107+ url: http://hackage.haskell.org/
108+ EOF
109+ cat $CABAL_CONFIG
110+ - name: versions
111+ run: |
112+ $HC --version || true
113+ $HC --print-project-git-commit-id || true
114+ $CABAL --version || true
115+ - name: update cabal index
116+ run: |
117+ $CABAL v2-update -v
118+ - name: install cabal-plan
119+ run: |
120+ mkdir -p $HOME/.cabal/bin
121+ curl -sL https://github.com/haskell-hvr/cabal-plan/releases/download/v0.6.2.0/cabal-plan-0.6.2.0-x86_64-linux.xz > cabal-plan.xz
122+ echo 'de73600b1836d3f55e32d80385acc055fd97f60eaa0ab68a755302685f5d81bc cabal-plan.xz' | sha256sum -c -
123+ xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan
124+ rm -f cabal-plan.xz
125+ chmod a+x $HOME/.cabal/bin/cabal-plan
126+ cabal-plan --version
127+ - name: checkout
128+ uses: actions/checkout@v2
129+ with:
130+ path: source
131+ - name: sdist
132+ run: |
133+ mkdir -p sdist
134+ cd source || false
135+ $CABAL sdist all --output-dir $GITHUB_WORKSPACE/sdist
136+ - name: unpack
137+ run: |
138+ mkdir -p unpacked
139+ find sdist -maxdepth 1 -type f -name '*.tar.gz' -exec tar -C $GITHUB_WORKSPACE/unpacked -xzvf {} \;
140+ - name: generate cabal.project
141+ run: |
142+ PKGDIR_postgresql_simple="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/postgresql-simple-[0-9.]*')"
143+ echo "PKGDIR_postgresql_simple=${PKGDIR_postgresql_simple}" >> $GITHUB_ENV
144+ touch cabal.project
145+ touch cabal.project.local
146+ echo "packages: ${PKGDIR_postgresql_simple}" >> cabal.project
147+ if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package postgresql-simple" >> cabal.project ; fi
148+ if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
149+ cat >> cabal.project <<EOF
150+ EOF
151+ $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(postgresql-simple)$/; }' >> cabal.project.local
152+ cat cabal.project
153+ cat cabal.project.local
154+ - name: dump install plan
155+ run: |
156+ $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
157+ cabal-plan
158+ - name: cache
159+ uses: actions/cache@v2
160+ with:
161+ key: ${{ runner.os }}-${{ matrix.ghc }}-${{ github.sha }}
162+ path: ~/.cabal/store
163+ restore-keys: ${{ runner.os }}-${{ matrix.ghc }}-
164+ - name: install dependencies
165+ run: |
166+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all
167+ $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dependencies-only -j2 all
168+ - name: build w/o tests
169+ run: |
170+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
171+ - name: build
172+ run: |
173+ $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --write-ghc-environment-files=always
174+ - name: tests
175+ run: |
176+ $CABAL v2-test $ARG_COMPILER $ARG_TESTS $ARG_BENCH all --test-show-details=direct
177+ - name: cabal check
178+ run: |
179+ cd ${PKGDIR_postgresql_simple} || false
180+ ${CABAL} -vnormal check
181+ - name: haddock
182+ run: |
183+ $CABAL v2-haddock $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
184+ - name: unconstrained build
185+ run: |
186+ rm -f cabal.project.local
187+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
.travis.ymldeleted−177
@@ -1,177 +0,0 @@
1−# This Travis job script has been generated by a script via
2−#
3−# haskell-ci '--config' 'cabal.haskell-ci' '--output' '.travis.yml' 'postgresql-simple.cabal'
4−#
5−# To regenerate the script (for example after adjusting tested-with) run
6−#
7−# haskell-ci regenerate
8−#
9−# For more information, see https://github.com/haskell-CI/haskell-ci
10−#
11−# version: 0.11.20200918
12−#
13−version: ~> 1.0
14−language: c
15−os: linux
16−dist: xenial
17−git:
18− # whether to recursively clone submodules
19− submodules: false
20−branches:
21− only:
22− - master
23−services:
24− - postgresql
25−addons:
26− postgresql: "10"
27−cache:
28− directories:
29− - $HOME/.cabal/packages
30− - $HOME/.cabal/store
31− - $HOME/.hlint
32−before_cache:
33− - rm -fv $CABALHOME/packages/hackage.haskell.org/build-reports.log
34− # remove files that are regenerated by 'cabal update'
35− - rm -fv $CABALHOME/packages/hackage.haskell.org/00-index.*
36− - rm -fv $CABALHOME/packages/hackage.haskell.org/*.json
37− - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.cache
38− - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar
39− - rm -fv $CABALHOME/packages/hackage.haskell.org/01-index.tar.idx
40− - rm -rfv $CABALHOME/packages/head.hackage
41−jobs:
42− include:
43− - compiler: ghc-8.10.2
44− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.10.2","cabal-install-3.4"]}}
45− env: DATABASE_CONNSTRING=travis
46− os: linux
47− - compiler: ghc-8.8.4
48− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.8.4","cabal-install-3.4"]}}
49− env: DATABASE_CONNSTRING=travis
50− os: linux
51− - compiler: ghc-8.6.5
52− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.6.5","cabal-install-3.4"]}}
53− env: DATABASE_CONNSTRING=travis
54− os: linux
55− - compiler: ghc-8.4.4
56− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.4.4","cabal-install-3.4"]}}
57− env: DATABASE_CONNSTRING=travis
58− os: linux
59− - compiler: ghc-8.2.2
60− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.2.2","cabal-install-3.4"]}}
61− env: DATABASE_CONNSTRING=travis
62− os: linux
63− - compiler: ghc-8.0.2
64− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-8.0.2","cabal-install-3.4"]}}
65− env: DATABASE_CONNSTRING=travis
66− os: linux
67− - compiler: ghc-7.10.3
68− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.10.3","cabal-install-3.4"]}}
69− env: DATABASE_CONNSTRING=travis
70− os: linux
71− - compiler: ghc-7.8.4
72− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.8.4","cabal-install-3.4"]}}
73− env: DATABASE_CONNSTRING=travis
74− os: linux
75− - compiler: ghc-7.6.3
76− addons: {"apt":{"sources":[{"sourceline":"deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main","key_url":"https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x063dab2bdc0b3f9fcebc378bff3aeacef6f88286"}],"packages":["ghc-7.6.3","cabal-install-3.4"]}}
77− env: DATABASE_CONNSTRING=travis
78− os: linux
79−before_install:
80− - HC=$(echo "/opt/$CC/bin/ghc" | sed 's/-/\//')
81− - WITHCOMPILER="-w $HC"
82− - HADDOCK=$(echo "/opt/$CC/bin/haddock" | sed 's/-/\//')
83− - HCPKG="$HC-pkg"
84− - unset CC
85− - CABAL=/opt/ghc/bin/cabal
86− - CABALHOME=$HOME/.cabal
87− - export PATH="$CABALHOME/bin:$PATH"
88− - TOP=$(pwd)
89− - "HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\\d+)\\.(\\d+)\\.(\\d+)(\\.(\\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')"
90− - echo $HCNUMVER
91− - CABAL="$CABAL -vnormal+nowrap"
92− - set -o pipefail
93− - TEST=--enable-tests
94− - BENCH=--enable-benchmarks
95− - HEADHACKAGE=false
96− - rm -f $CABALHOME/config
97− - |
98− echo "verbose: normal +nowrap +markoutput" >> $CABALHOME/config
99− echo "remote-build-reporting: anonymous" >> $CABALHOME/config
100− echo "write-ghc-environment-files: always" >> $CABALHOME/config
101− echo "remote-repo-cache: $CABALHOME/packages" >> $CABALHOME/config
102− echo "logs-dir: $CABALHOME/logs" >> $CABALHOME/config
103− echo "world-file: $CABALHOME/world" >> $CABALHOME/config
104− echo "extra-prog-path: $CABALHOME/bin" >> $CABALHOME/config
105− echo "symlink-bindir: $CABALHOME/bin" >> $CABALHOME/config
106− echo "installdir: $CABALHOME/bin" >> $CABALHOME/config
107− echo "build-summary: $CABALHOME/logs/build.log" >> $CABALHOME/config
108− echo "store-dir: $CABALHOME/store" >> $CABALHOME/config
109− echo "install-dirs user" >> $CABALHOME/config
110− echo " prefix: $CABALHOME" >> $CABALHOME/config
111− echo "repository hackage.haskell.org" >> $CABALHOME/config
112− echo " url: http://hackage.haskell.org/" >> $CABALHOME/config
113−install:
114− - ${CABAL} --version
115− - echo "$(${HC} --version) [$(${HC} --print-project-git-commit-id 2> /dev/null || echo '?')]"
116− - |
117− echo "program-default-options" >> $CABALHOME/config
118− echo " ghc-options: $GHCJOBS +RTS -M6G -RTS" >> $CABALHOME/config
119− - cat $CABALHOME/config
120− - rm -fv cabal.project cabal.project.local cabal.project.freeze
121− - travis_retry ${CABAL} v2-update -v
122− # Generate cabal.project
123− - rm -rf cabal.project cabal.project.local cabal.project.freeze
124− - touch cabal.project
125− - |
126− echo "packages: ." >> cabal.project
127− - if [ $HCNUMVER -ge 80200 ] ; then echo 'package postgresql-simple' >> cabal.project ; fi
128− - "if [ $HCNUMVER -ge 80200 ] ; then echo ' ghc-options: -Werror=missing-methods' >> cabal.project ; fi"
129− - |
130− - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(postgresql-simple)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
131− - cat cabal.project || true
132− - cat cabal.project.local || true
133− - if [ -f "./configure.ac" ]; then (cd "." && autoreconf -i); fi
134− - ${CABAL} v2-freeze $WITHCOMPILER ${TEST} ${BENCH}
135− - "cat cabal.project.freeze | sed -E 's/^(constraints: *| *)//' | sed 's/any.//'"
136− - rm cabal.project.freeze
137− - travis_wait 40 ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} --dep -j2 all
138− - travis_wait 40 ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks --dep -j2 all
139−script:
140− - DISTDIR=$(mktemp -d /tmp/dist-test.XXXX)
141− # Packaging...
142− - ${CABAL} v2-sdist all
143− # Unpacking...
144− - mv dist-newstyle/sdist/*.tar.gz ${DISTDIR}/
145− - cd ${DISTDIR} || false
146− - find . -maxdepth 1 -type f -name '*.tar.gz' -exec tar -xvf '{}' \;
147− - find . -maxdepth 1 -type f -name '*.tar.gz' -exec rm '{}' \;
148− - PKGDIR_postgresql_simple="$(find . -maxdepth 1 -type d -regex '.*/postgresql-simple-[0-9.]*')"
149− # Generate cabal.project
150− - rm -rf cabal.project cabal.project.local cabal.project.freeze
151− - touch cabal.project
152− - |
153− echo "packages: ${PKGDIR_postgresql_simple}" >> cabal.project
154− - if [ $HCNUMVER -ge 80200 ] ; then echo 'package postgresql-simple' >> cabal.project ; fi
155− - "if [ $HCNUMVER -ge 80200 ] ; then echo ' ghc-options: -Werror=missing-methods' >> cabal.project ; fi"
156− - |
157− - "for pkg in $($HCPKG list --simple-output); do echo $pkg | sed 's/-[^-]*$//' | (grep -vE -- '^(postgresql-simple)$' || true) | sed 's/^/constraints: /' | sed 's/$/ installed/' >> cabal.project.local; done"
158− - cat cabal.project || true
159− - cat cabal.project.local || true
160− # Building...
161− # this builds all libraries and executables (without tests/benchmarks)
162− - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all
163− # Building with tests and benchmarks...
164− # build & run tests, build benchmarks
165− - ${CABAL} v2-build $WITHCOMPILER ${TEST} ${BENCH} all
166− # Testing...
167− - ${CABAL} v2-test $WITHCOMPILER ${TEST} ${BENCH} all
168− # cabal check...
169− - (cd ${PKGDIR_postgresql_simple} && ${CABAL} -vnormal check)
170− # haddock...
171− - ${CABAL} v2-haddock $WITHCOMPILER --with-haddock $HADDOCK ${TEST} ${BENCH} all
172− # Building without installed constraints for packages in global-db...
173− - rm -f cabal.project.local
174− - ${CABAL} v2-build $WITHCOMPILER --disable-tests --disable-benchmarks all
175−
176−# REGENDATA ("0.11.20200918",["--config","cabal.haskell-ci","--output",".travis.yml","postgresql-simple.cabal"])
177−# EOF
cabal.haskell-ci−10
@@ -3,13 +3,3 @@ postgresql: True
33
44-- services aren't supported on Travis on macOS
55-- osx: 8.4.4
6−
7−env: 7.6.3:DATABASE_CONNSTRING=travis
8−env: 7.8.4:DATABASE_CONNSTRING=travis
9−env: 7.10.3:DATABASE_CONNSTRING=travis
10−env: 8.0.2:DATABASE_CONNSTRING=travis
11−env: 8.2.2:DATABASE_CONNSTRING=travis
12−env: 8.4.4:DATABASE_CONNSTRING=travis
13−env: 8.6.5:DATABASE_CONNSTRING=travis
14−env: 8.8.4:DATABASE_CONNSTRING=travis
15−env: 8.10.2:DATABASE_CONNSTRING=travis
postgresql-simple.cabal+1−1
@@ -31,7 +31,7 @@ tested-with:
3131 || ==8.4.4
3232 || ==8.6.5
3333 || ==8.8.4
34− || ==8.10.2
34+ || ==8.10.3
3535
3636library
3737 default-language: Haskell2010
test/Main.hs+19−4
@@ -24,6 +24,7 @@ import Control.Applicative
2424import Control.Exception as E
2525import Control.Monad
2626import Data.Char
27+import Data.Foldable (toList)
2728import Data.List (concat, sort)
2829import Data.IORef
2930import Data.Monoid ((<>))
@@ -612,13 +613,27 @@ withTestEnv connstr cb =
612613 withConn = bracket (connectPostgreSQL connstr) close
613614
614615main :: IO ()
615−main = do
616+main = withConnstring $ \connstring -> do
617+ withTestEnv connstring (defaultMain . tests)
618+
619+withConnstring :: (BS8.ByteString -> IO ()) -> IO ()
620+withConnstring kont = do
616621 env <- getEnvironment
617622 case lookup "DATABASE_CONNSTRING" env of
618− Nothing -> putStrLn "Set DATABASE_CONNSTRING environment variable"
619− Just s -> withTestEnv (BS8.pack (special s)) (defaultMain . tests)
620− where
623+ Just s -> kont (BS8.pack (special s))
624+ Nothing -> case lookup "GITHUB_ACTIONS" env of
625+ Just "true" -> kont (BS8.pack gha)
626+ _ -> putStrLn "Set DATABASE_CONNSTRING environment variable"
627+ where
621628 -- https://www.appveyor.com/docs/services-databases/
622629 special "appveyor" = "dbname='TestDb' user='postgres' password='Password12!'"
623630 special "travis" = ""
624631 special s = s
632+
633+ gha = unwords
634+ [ "dbname='postgres'"
635+ , "user='postgres'"
636+ , "password='postgres'"
637+ , "host='postgres'"
638+ , "port=5432"
639+ ]