on master help sign in
.github/workflows/haskell-ci-bench.yml+107−43
since splitsnapshots
unifiedsplit
@@ -8,9 +8,9 @@
8#
8#
9# For more information, see https://github.com/haskell-CI/haskell-ci
9# For more information, see https://github.com/haskell-CI/haskell-ci
10#
10#
11−# version: 0.11.20210214
11+# version: 0.19.20240702
12#
12#
13−# REGENDATA ("0.11.20210214",["github","--project","cabal.bench.project","-o",".github/workflows/haskell-ci-bench.yml","--github-action-name","Benchmarks"])
13+# REGENDATA ("0.19.20240702",["github","--project","cabal.bench.project","-o",".github/workflows/haskell-ci-bench.yml","--github-action-name","Benchmarks"])
14#
14#
15name: Benchmarks
15name: Benchmarks
16on:
16on:
@@ -22,57 +22,101 @@ on:
22 - master
22 - master
23jobs:
23jobs:
24 linux:
24 linux:
25− name: Benchmarks - Linux - GHC ${{ matrix.ghc }}
25+ name: Benchmarks - Linux - ${{ matrix.compiler }}
26− runs-on: ubuntu-18.04
26+ runs-on: ubuntu-20.04
27+ timeout-minutes:
28+ 60
27 container:
29 container:
28− image: buildpack-deps:bionic
30+ image: buildpack-deps:jammy
29 continue-on-error: ${{ matrix.allow-failure }}
31 continue-on-error: ${{ matrix.allow-failure }}
30 strategy:
32 strategy:
31 matrix:
33 matrix:
32 include:
34 include:
33− - ghc: 8.10.3
35+ - compiler: ghc-9.10.1
36+ compilerKind: ghc
37+ compilerVersion: 9.10.1
38+ setup-method: ghcup
34 allow-failure: false
39 allow-failure: false
35− - ghc: 8.8.4
40+ - compiler: ghc-9.8.2
41+ compilerKind: ghc
42+ compilerVersion: 9.8.2
43+ setup-method: ghcup
36 allow-failure: false
44 allow-failure: false
37− - ghc: 8.6.4
45+ - compiler: ghc-9.6.6
46+ compilerKind: ghc
47+ compilerVersion: 9.6.6
48+ setup-method: ghcup
38 allow-failure: false
49 allow-failure: false
39− - ghc: 8.4.4
50+ - compiler: ghc-9.4.8
51+ compilerKind: ghc
52+ compilerVersion: 9.4.8
53+ setup-method: ghcup
40 allow-failure: false
54 allow-failure: false
41− - ghc: 8.2.2
55+ - compiler: ghc-9.2.8
56+ compilerKind: ghc
57+ compilerVersion: 9.2.8
58+ setup-method: ghcup
42 allow-failure: false
59 allow-failure: false
43− - ghc: 8.0.2
60+ - compiler: ghc-9.0.2
61+ compilerKind: ghc
62+ compilerVersion: 9.0.2
63+ setup-method: ghcup
64+ allow-failure: false
65+ - compiler: ghc-8.10.7
66+ compilerKind: ghc
67+ compilerVersion: 8.10.7
68+ setup-method: ghcup
69+ allow-failure: false
70+ - compiler: ghc-8.8.4
71+ compilerKind: ghc
72+ compilerVersion: 8.8.4
73+ setup-method: ghcup
74+ allow-failure: false
75+ - compiler: ghc-8.6.5
76+ compilerKind: ghc
77+ compilerVersion: 8.6.5
78+ setup-method: ghcup
44 allow-failure: false
79 allow-failure: false
45 fail-fast: false
80 fail-fast: false
46 steps:
81 steps:
47 - name: apt
82 - name: apt
48 run: |
83 run: |
49 apt-get update
84 apt-get update
50− apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common
85+ apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5
51− apt-add-repository -y 'ppa:hvr/ghc'
86+ mkdir -p "$HOME/.ghcup/bin"
52− apt-get update
87+ curl -sL https://downloads.haskell.org/ghcup/0.1.20.0/x86_64-linux-ghcup-0.1.20.0 > "$HOME/.ghcup/bin/ghcup"
53− apt-get install -y ghc-$GHC_VERSION cabal-install-3.2
88+ chmod a+x "$HOME/.ghcup/bin/ghcup"
89+ "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false)
90+ "$HOME/.ghcup/bin/ghcup" install cabal 3.12.1.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
54 env:
91 env:
55− GHC_VERSION: ${{ matrix.ghc }}
92+ HCKIND: ${{ matrix.compilerKind }}
93+ HCNAME: ${{ matrix.compiler }}
94+ HCVER: ${{ matrix.compilerVersion }}
56 - name: Set PATH and environment variables
95 - name: Set PATH and environment variables
57 run: |
96 run: |
58 echo "$HOME/.cabal/bin" >> $GITHUB_PATH
97 echo "$HOME/.cabal/bin" >> $GITHUB_PATH
59− echo "LANG=C.UTF-8" >> $GITHUB_ENV
98+ echo "LANG=C.UTF-8" >> "$GITHUB_ENV"
60− echo "CABAL_DIR=$HOME/.cabal" >> $GITHUB_ENV
99+ echo "CABAL_DIR=$HOME/.cabal" >> "$GITHUB_ENV"
61− echo "CABAL_CONFIG=$HOME/.cabal/config" >> $GITHUB_ENV
100+ echo "CABAL_CONFIG=$HOME/.cabal/config" >> "$GITHUB_ENV"
62− HC=/opt/ghc/$GHC_VERSION/bin/ghc
101+ HCDIR=/opt/$HCKIND/$HCVER
63− echo "HC=$HC" >> $GITHUB_ENV
102+ HC=$("$HOME/.ghcup/bin/ghcup" whereis ghc "$HCVER")
64− echo "HCPKG=/opt/ghc/$GHC_VERSION/bin/ghc-pkg" >> $GITHUB_ENV
103+ HCPKG=$(echo "$HC" | sed 's#ghc$#ghc-pkg#')
65− echo "HADDOCK=/opt/ghc/$GHC_VERSION/bin/haddock" >> $GITHUB_ENV
104+ HADDOCK=$(echo "$HC" | sed 's#ghc$#haddock#')
105+ echo "HC=$HC" >> "$GITHUB_ENV"
106+ echo "HCPKG=$HCPKG" >> "$GITHUB_ENV"
107+ echo "HADDOCK=$HADDOCK" >> "$GITHUB_ENV"
66− echo "CABAL=/opt/cabal/3.2/bin/cabal -vnormal+nowrap" >> $GITHUB_ENV
108+ echo "CABAL=$HOME/.ghcup/bin/cabal-3.12.1.0 -vnormal+nowrap" >> "$GITHUB_ENV"
67 HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
109 HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
68− echo "HCNUMVER=$HCNUMVER" >> $GITHUB_ENV
110+ echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV"
69− echo "ARG_TESTS=--enable-tests" >> $GITHUB_ENV
111+ echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV"
70− echo "ARG_BENCH=--enable-benchmarks" >> $GITHUB_ENV
112+ echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV"
71− echo "HEADHACKAGE=false" >> $GITHUB_ENV
113+ echo "HEADHACKAGE=false" >> "$GITHUB_ENV"
72− echo "ARG_COMPILER=--ghc --with-compiler=/opt/ghc/$GHC_VERSION/bin/ghc" >> $GITHUB_ENV
114+ echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV"
73− echo "GHCJSARITH=0" >> $GITHUB_ENV
115+ echo "GHCJSARITH=0" >> "$GITHUB_ENV"
74 env:
116 env:
75− GHC_VERSION: ${{ matrix.ghc }}
117+ HCKIND: ${{ matrix.compilerKind }}
118+ HCNAME: ${{ matrix.compiler }}
119+ HCVER: ${{ matrix.compilerVersion }}
76 - name: env
120 - name: env
77 run: |
121 run: |
78 env
122 env
@@ -95,6 +139,10 @@ jobs:
95 repository hackage.haskell.org
139 repository hackage.haskell.org
96 url: http://hackage.haskell.org/
140 url: http://hackage.haskell.org/
97 EOF
141 EOF
142+ cat >> $CABAL_CONFIG <<EOF
143+ program-default-options
144+ ghc-options: $GHCJOBS +RTS -M3G -RTS
145+ EOF
98 cat $CABAL_CONFIG
146 cat $CABAL_CONFIG
99 - name: versions
147 - name: versions
100 run: |
148 run: |
@@ -107,14 +155,14 @@ jobs:
107 - name: install cabal-plan
155 - name: install cabal-plan
108 run: |
156 run: |
109 mkdir -p $HOME/.cabal/bin
157 mkdir -p $HOME/.cabal/bin
110− 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
158+ curl -sL https://github.com/haskell-hvr/cabal-plan/releases/download/v0.7.3.0/cabal-plan-0.7.3.0-x86_64-linux.xz > cabal-plan.xz
111− echo 'de73600b1836d3f55e32d80385acc055fd97f60eaa0ab68a755302685f5d81bc cabal-plan.xz' | sha256sum -c -
159+ echo 'f62ccb2971567a5f638f2005ad3173dba14693a45154c1508645c52289714cb2 cabal-plan.xz' | sha256sum -c -
112 xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan
160 xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan
113 rm -f cabal-plan.xz
161 rm -f cabal-plan.xz
114 chmod a+x $HOME/.cabal/bin/cabal-plan
162 chmod a+x $HOME/.cabal/bin/cabal-plan
115 cabal-plan --version
163 cabal-plan --version
116 - name: checkout
164 - name: checkout
117− uses: actions/checkout@v2
165+ uses: actions/checkout@v4
118 with:
166 with:
119 path: source
167 path: source
120 - name: initial cabal.project for sdist
168 - name: initial cabal.project for sdist
@@ -133,27 +181,28 @@ jobs:
133 - name: generate cabal.project
181 - name: generate cabal.project
134 run: |
182 run: |
135 PKGDIR_uuid_bench="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/uuid-bench-[0-9.]*')"
183 PKGDIR_uuid_bench="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/uuid-bench-[0-9.]*')"
136− echo "PKGDIR_uuid_bench=${PKGDIR_uuid_bench}" >> $GITHUB_ENV
184+ echo "PKGDIR_uuid_bench=${PKGDIR_uuid_bench}" >> "$GITHUB_ENV"
185+ rm -f cabal.project cabal.project.local
137 touch cabal.project
186 touch cabal.project
138 touch cabal.project.local
187 touch cabal.project.local
139 echo "packages: ${PKGDIR_uuid_bench}" >> cabal.project
188 echo "packages: ${PKGDIR_uuid_bench}" >> cabal.project
140− if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package uuid-bench" >> cabal.project ; fi
189+ echo "package uuid-bench" >> cabal.project
141− if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
190+ echo " ghc-options: -Werror=missing-methods" >> cabal.project
142 cat >> cabal.project <<EOF
191 cat >> cabal.project <<EOF
143 EOF
192 EOF
144− $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(uuid-bench)$/; }' >> cabal.project.local
193+ $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: any.$_ installed\n" unless /^(uuid-bench)$/; }' >> cabal.project.local
145 cat cabal.project
194 cat cabal.project
146 cat cabal.project.local
195 cat cabal.project.local
147 - name: dump install plan
196 - name: dump install plan
148 run: |
197 run: |
149 $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
198 $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
150 cabal-plan
199 cabal-plan
151− - name: cache
200+ - name: restore cache
152− uses: actions/cache@v2
201+ uses: actions/cache/restore@v4
153 with:
202 with:
154− key: ${{ runner.os }}-${{ matrix.ghc }}-${{ github.sha }}
203+ key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
155 path: ~/.cabal/store
204 path: ~/.cabal/store
156− restore-keys: ${{ runner.os }}-${{ matrix.ghc }}-
205+ restore-keys: ${{ runner.os }}-${{ matrix.compiler }}-
157 - name: install dependencies
206 - name: install dependencies
158 run: |
207 run: |
159 $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all
208 $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all
@@ -170,8 +219,23 @@ jobs:
170 ${CABAL} -vnormal check
219 ${CABAL} -vnormal check
171 - name: haddock
220 - name: haddock
172 run: |
221 run: |
173− $CABAL v2-haddock $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
222+ $CABAL v2-haddock --disable-documentation --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
174 - name: unconstrained build
223 - name: unconstrained build
175 run: |
224 run: |
176 rm -f cabal.project.local
225 rm -f cabal.project.local
177 $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
226 $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
227+ - name: prepare for constraint sets
228+ run: |
229+ rm -f cabal.project.local
230+ - name: constraint set random-1.2
231+ run: |
232+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='random==1.2.*' all --dry-run
233+ cabal-plan topo | sort
234+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='random==1.2.*' --dependencies-only -j2 all
235+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='random==1.2.*' all
236+ - name: save cache
237+ uses: actions/cache/save@v4
238+ if: always()
239+ with:
240+ key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
241+ path: ~/.cabal/store
.github/workflows/haskell-ci.yml+117−51
@@ -8,9 +8,9 @@
8#
8#
9# For more information, see https://github.com/haskell-CI/haskell-ci
9# For more information, see https://github.com/haskell-CI/haskell-ci
10#
10#
11−# version: 0.11.20210214
11+# version: 0.19.20241223
12#
12#
13−# REGENDATA ("0.11.20210214",["github","cabal.project"])
13+# REGENDATA ("0.19.20241223",["github","cabal.project"])
14#
14#
15name: Haskell-CI
15name: Haskell-CI
16on:
16on:
@@ -22,65 +22,111 @@ on:
22 - master
22 - master
23jobs:
23jobs:
24 linux:
24 linux:
25− name: Haskell-CI - Linux - GHC ${{ matrix.ghc }}
25+ name: Haskell-CI - Linux - ${{ matrix.compiler }}
26− runs-on: ubuntu-18.04
26+ runs-on: ubuntu-20.04
27+ timeout-minutes:
28+ 60
27 container:
29 container:
28− image: buildpack-deps:bionic
30+ image: buildpack-deps:jammy
29 continue-on-error: ${{ matrix.allow-failure }}
31 continue-on-error: ${{ matrix.allow-failure }}
30 strategy:
32 strategy:
31 matrix:
33 matrix:
32 include:
34 include:
33− - ghc: 8.10.3
35+ - compiler: ghc-9.12.1
36+ compilerKind: ghc
37+ compilerVersion: 9.12.1
38+ setup-method: ghcup
34 allow-failure: false
39 allow-failure: false
35− - ghc: 8.8.4
40+ - compiler: ghc-9.10.1
41+ compilerKind: ghc
42+ compilerVersion: 9.10.1
43+ setup-method: ghcup
36 allow-failure: false
44 allow-failure: false
37− - ghc: 8.6.4
45+ - compiler: ghc-9.8.4
46+ compilerKind: ghc
47+ compilerVersion: 9.8.4
48+ setup-method: ghcup
38 allow-failure: false
49 allow-failure: false
39− - ghc: 8.4.4
50+ - compiler: ghc-9.6.6
51+ compilerKind: ghc
52+ compilerVersion: 9.6.6
53+ setup-method: ghcup
40 allow-failure: false
54 allow-failure: false
41− - ghc: 8.2.2
55+ - compiler: ghc-9.4.8
56+ compilerKind: ghc
57+ compilerVersion: 9.4.8
58+ setup-method: ghcup
42 allow-failure: false
59 allow-failure: false
43− - ghc: 8.0.2
60+ - compiler: ghc-9.2.8
61+ compilerKind: ghc
62+ compilerVersion: 9.2.8
63+ setup-method: ghcup
44 allow-failure: false
64 allow-failure: false
45− - ghc: 7.10.3
65+ - compiler: ghc-9.0.2
66+ compilerKind: ghc
67+ compilerVersion: 9.0.2
68+ setup-method: ghcup
46 allow-failure: false
69 allow-failure: false
47− - ghc: 7.8.4
70+ - compiler: ghc-8.10.7
71+ compilerKind: ghc
72+ compilerVersion: 8.10.7
73+ setup-method: ghcup
48 allow-failure: false
74 allow-failure: false
49− - ghc: 7.6.3
75+ - compiler: ghc-8.8.4
76+ compilerKind: ghc
77+ compilerVersion: 8.8.4
78+ setup-method: ghcup
50 allow-failure: false
79 allow-failure: false
51− - ghc: 7.4.2
80+ - compiler: ghc-8.6.5
81+ compilerKind: ghc
82+ compilerVersion: 8.6.5
83+ setup-method: ghcup
52 allow-failure: false
84 allow-failure: false
53 fail-fast: false
85 fail-fast: false
54 steps:
86 steps:
55− - name: apt
87+ - name: apt-get install
56 run: |
88 run: |
57 apt-get update
89 apt-get update
58− apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common
90+ apt-get install -y --no-install-recommends gnupg ca-certificates dirmngr curl git software-properties-common libtinfo5
59− apt-add-repository -y 'ppa:hvr/ghc'
91+ - name: Install GHCup
60− apt-get update
92+ run: |
61− apt-get install -y ghc-$GHC_VERSION cabal-install-3.2
93+ mkdir -p "$HOME/.ghcup/bin"
94+ curl -sL https://downloads.haskell.org/ghcup/0.1.30.0/x86_64-linux-ghcup-0.1.30.0 > "$HOME/.ghcup/bin/ghcup"
95+ chmod a+x "$HOME/.ghcup/bin/ghcup"
96+ - name: Install cabal-install
97+ run: |
98+ "$HOME/.ghcup/bin/ghcup" install cabal 3.14.1.0 || (cat "$HOME"/.ghcup/logs/*.* && false)
99+ echo "CABAL=$HOME/.ghcup/bin/cabal-3.14.1.0 -vnormal+nowrap" >> "$GITHUB_ENV"
100+ - name: Install GHC (GHCup)
101+ if: matrix.setup-method == 'ghcup'
102+ run: |
103+ "$HOME/.ghcup/bin/ghcup" install ghc "$HCVER" || (cat "$HOME"/.ghcup/logs/*.* && false)
104+ HC=$("$HOME/.ghcup/bin/ghcup" whereis ghc "$HCVER")
105+ HCPKG=$(echo "$HC" | sed 's#ghc$#ghc-pkg#')
106+ HADDOCK=$(echo "$HC" | sed 's#ghc$#haddock#')
107+ echo "HC=$HC" >> "$GITHUB_ENV"
108+ echo "HCPKG=$HCPKG" >> "$GITHUB_ENV"
109+ echo "HADDOCK=$HADDOCK" >> "$GITHUB_ENV"
62 env:
110 env:
63− GHC_VERSION: ${{ matrix.ghc }}
111+ HCKIND: ${{ matrix.compilerKind }}
112+ HCNAME: ${{ matrix.compiler }}
113+ HCVER: ${{ matrix.compilerVersion }}
64 - name: Set PATH and environment variables
114 - name: Set PATH and environment variables
65 run: |
115 run: |
66 echo "$HOME/.cabal/bin" >> $GITHUB_PATH
116 echo "$HOME/.cabal/bin" >> $GITHUB_PATH
67− echo "LANG=C.UTF-8" >> $GITHUB_ENV
117+ echo "LANG=C.UTF-8" >> "$GITHUB_ENV"
68− echo "CABAL_DIR=$HOME/.cabal" >> $GITHUB_ENV
118+ echo "CABAL_DIR=$HOME/.cabal" >> "$GITHUB_ENV"
69− echo "CABAL_CONFIG=$HOME/.cabal/config" >> $GITHUB_ENV
119+ echo "CABAL_CONFIG=$HOME/.cabal/config" >> "$GITHUB_ENV"
70− HC=/opt/ghc/$GHC_VERSION/bin/ghc
71− echo "HC=$HC" >> $GITHUB_ENV
72− echo "HCPKG=/opt/ghc/$GHC_VERSION/bin/ghc-pkg" >> $GITHUB_ENV
73− echo "HADDOCK=/opt/ghc/$GHC_VERSION/bin/haddock" >> $GITHUB_ENV
74− echo "CABAL=/opt/cabal/3.2/bin/cabal -vnormal+nowrap" >> $GITHUB_ENV
75 HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
120 HCNUMVER=$(${HC} --numeric-version|perl -ne '/^(\d+)\.(\d+)\.(\d+)(\.(\d+))?$/; print(10000 * $1 + 100 * $2 + ($3 == 0 ? $5 != 1 : $3))')
76− echo "HCNUMVER=$HCNUMVER" >> $GITHUB_ENV
121+ echo "HCNUMVER=$HCNUMVER" >> "$GITHUB_ENV"
77− echo "ARG_TESTS=--enable-tests" >> $GITHUB_ENV
122+ echo "ARG_TESTS=--enable-tests" >> "$GITHUB_ENV"
78− echo "ARG_BENCH=--enable-benchmarks" >> $GITHUB_ENV
123+ echo "ARG_BENCH=--enable-benchmarks" >> "$GITHUB_ENV"
79− echo "HEADHACKAGE=false" >> $GITHUB_ENV
124+ echo "HEADHACKAGE=false" >> "$GITHUB_ENV"
80− echo "ARG_COMPILER=--ghc --with-compiler=/opt/ghc/$GHC_VERSION/bin/ghc" >> $GITHUB_ENV
125+ echo "ARG_COMPILER=--$HCKIND --with-compiler=$HC" >> "$GITHUB_ENV"
81− echo "GHCJSARITH=0" >> $GITHUB_ENV
82 env:
126 env:
83− GHC_VERSION: ${{ matrix.ghc }}
127+ HCKIND: ${{ matrix.compilerKind }}
128+ HCNAME: ${{ matrix.compiler }}
129+ HCVER: ${{ matrix.compilerVersion }}
84 - name: env
130 - name: env
85 run: |
131 run: |
86 env
132 env
@@ -103,6 +149,10 @@ jobs:
103 repository hackage.haskell.org
149 repository hackage.haskell.org
104 url: http://hackage.haskell.org/
150 url: http://hackage.haskell.org/
105 EOF
151 EOF
152+ cat >> $CABAL_CONFIG <<EOF
153+ program-default-options
154+ ghc-options: $GHCJOBS +RTS -M3G -RTS
155+ EOF
106 cat $CABAL_CONFIG
156 cat $CABAL_CONFIG
107 - name: versions
157 - name: versions
108 run: |
158 run: |
@@ -115,14 +165,14 @@ jobs:
115 - name: install cabal-plan
165 - name: install cabal-plan
116 run: |
166 run: |
117 mkdir -p $HOME/.cabal/bin
167 mkdir -p $HOME/.cabal/bin
118− 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
168+ curl -sL https://github.com/haskell-hvr/cabal-plan/releases/download/v0.7.3.0/cabal-plan-0.7.3.0-x86_64-linux.xz > cabal-plan.xz
119− echo 'de73600b1836d3f55e32d80385acc055fd97f60eaa0ab68a755302685f5d81bc cabal-plan.xz' | sha256sum -c -
169+ echo 'f62ccb2971567a5f638f2005ad3173dba14693a45154c1508645c52289714cb2 cabal-plan.xz' | sha256sum -c -
120 xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan
170 xz -d < cabal-plan.xz > $HOME/.cabal/bin/cabal-plan
121 rm -f cabal-plan.xz
171 rm -f cabal-plan.xz
122 chmod a+x $HOME/.cabal/bin/cabal-plan
172 chmod a+x $HOME/.cabal/bin/cabal-plan
123 cabal-plan --version
173 cabal-plan --version
124 - name: checkout
174 - name: checkout
125− uses: actions/checkout@v2
175+ uses: actions/checkout@v4
126 with:
176 with:
127 path: source
177 path: source
128 - name: initial cabal.project for sdist
178 - name: initial cabal.project for sdist
@@ -142,32 +192,33 @@ jobs:
142 - name: generate cabal.project
192 - name: generate cabal.project
143 run: |
193 run: |
144 PKGDIR_uuid_types="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/uuid-types-[0-9.]*')"
194 PKGDIR_uuid_types="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/uuid-types-[0-9.]*')"
145− echo "PKGDIR_uuid_types=${PKGDIR_uuid_types}" >> $GITHUB_ENV
195+ echo "PKGDIR_uuid_types=${PKGDIR_uuid_types}" >> "$GITHUB_ENV"
146 PKGDIR_uuid="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/uuid-[0-9.]*')"
196 PKGDIR_uuid="$(find "$GITHUB_WORKSPACE/unpacked" -maxdepth 1 -type d -regex '.*/uuid-[0-9.]*')"
147− echo "PKGDIR_uuid=${PKGDIR_uuid}" >> $GITHUB_ENV
197+ echo "PKGDIR_uuid=${PKGDIR_uuid}" >> "$GITHUB_ENV"
198+ rm -f cabal.project cabal.project.local
148 touch cabal.project
199 touch cabal.project
149 touch cabal.project.local
200 touch cabal.project.local
150 echo "packages: ${PKGDIR_uuid_types}" >> cabal.project
201 echo "packages: ${PKGDIR_uuid_types}" >> cabal.project
151 echo "packages: ${PKGDIR_uuid}" >> cabal.project
202 echo "packages: ${PKGDIR_uuid}" >> cabal.project
152− if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package uuid-types" >> cabal.project ; fi
203+ echo "package uuid-types" >> cabal.project
153− if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
204+ echo " ghc-options: -Werror=missing-methods" >> cabal.project
154− if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo "package uuid" >> cabal.project ; fi
205+ echo "package uuid" >> cabal.project
155− if [ $((HCNUMVER >= 80200)) -ne 0 ] ; then echo " ghc-options: -Werror=missing-methods" >> cabal.project ; fi
206+ echo " ghc-options: -Werror=missing-methods" >> cabal.project
156 cat >> cabal.project <<EOF
207 cat >> cabal.project <<EOF
157 EOF
208 EOF
158− $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: $_ installed\n" unless /^(uuid|uuid-types)$/; }' >> cabal.project.local
209+ $HCPKG list --simple-output --names-only | perl -ne 'for (split /\s+/) { print "constraints: any.$_ installed\n" unless /^(uuid|uuid-types)$/; }' >> cabal.project.local
159 cat cabal.project
210 cat cabal.project
160 cat cabal.project.local
211 cat cabal.project.local
161 - name: dump install plan
212 - name: dump install plan
162 run: |
213 run: |
163 $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
214 $CABAL v2-build $ARG_COMPILER $ARG_TESTS $ARG_BENCH --dry-run all
164 cabal-plan
215 cabal-plan
165− - name: cache
216+ - name: restore cache
166− uses: actions/cache@v2
217+ uses: actions/cache/restore@v4
167 with:
218 with:
168− key: ${{ runner.os }}-${{ matrix.ghc }}-${{ github.sha }}
219+ key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
169 path: ~/.cabal/store
220 path: ~/.cabal/store
170− restore-keys: ${{ runner.os }}-${{ matrix.ghc }}-
221+ restore-keys: ${{ runner.os }}-${{ matrix.compiler }}-
171 - name: install dependencies
222 - name: install dependencies
172 run: |
223 run: |
173 $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all
224 $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --dependencies-only -j2 all
@@ -189,8 +240,23 @@ jobs:
189 ${CABAL} -vnormal check
240 ${CABAL} -vnormal check
190 - name: haddock
241 - name: haddock
191 run: |
242 run: |
192− $CABAL v2-haddock $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
243+ $CABAL v2-haddock --disable-documentation --haddock-all $ARG_COMPILER --with-haddock $HADDOCK $ARG_TESTS $ARG_BENCH all
193 - name: unconstrained build
244 - name: unconstrained build
194 run: |
245 run: |
195 rm -f cabal.project.local
246 rm -f cabal.project.local
196 $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
247 $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks all
248+ - name: prepare for constraint sets
249+ run: |
250+ rm -f cabal.project.local
251+ - name: constraint set random-1.2
252+ run: |
253+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='random==1.2.*' all --dry-run
254+ cabal-plan topo | sort
255+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='random==1.2.*' --dependencies-only -j2 all
256+ $CABAL v2-build $ARG_COMPILER --disable-tests --disable-benchmarks --constraint='random==1.2.*' all
257+ - name: save cache
258+ if: always()
259+ uses: actions/cache/save@v4
260+ with:
261+ key: ${{ runner.os }}-${{ matrix.compiler }}-${{ github.sha }}
262+ path: ~/.cabal/store
cabal.haskell-ci+6
@@ -1 +1,7 @@
1branches: master
1branches: master
2+-- jobs-selection: any
3+head-hackage: False
4+
5+constraint-set random-1.2
6+ ghc: >=7.10
7+ constraints: random==1.2.*
cabal.project+1−1
@@ -2,7 +2,7 @@
2-- for more details
2-- for more details
3
3
4packages: uuid-types/
4packages: uuid-types/
5− uuid/
5+packages: uuid/
6
6
7package uuid-types
7package uuid-types
8 tests: True
8 tests: True
haskell-ci.sh → gen-ci.shrenamed

The content is the same.

uuid-bench/bench/uuid-benchmark.hs−1
@@ -3,7 +3,6 @@ import Data.Char (ord)
3import Data.IORef
3import Data.IORef
4import Data.Word
4import Data.Word
5import qualified Data.UUID as U
5import qualified Data.UUID as U
6−import qualified Data.UUID.V1 as U
7import qualified Data.UUID.V4 as U
6import qualified Data.UUID.V4 as U
8import qualified Data.UUID.V3 as U3
7import qualified Data.UUID.V3 as U3
9import qualified Data.UUID.V5 as U5
8import qualified Data.UUID.V5 as U5
uuid-bench/uuid-bench.cabal+27−20
@@ -14,7 +14,15 @@ build-type: Simple
14
14
15-- Benchmarking with older GHCs is not meaningful
15-- Benchmarking with older GHCs is not meaningful
16tested-with:
16tested-with:
17− GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.4 || ==8.8.4 || ==8.10.3
17+ GHC ==8.6.5
18+ || ==8.8.4
19+ || ==8.10.7
20+ || ==9.0.2
21+ || ==9.2.8
22+ || ==9.4.8
23+ || ==9.6.6
24+ || ==9.8.2
25+ || ==9.10.1
18
26
19synopsis: UUID benchmarks
27synopsis: UUID benchmarks
20description:
28description:
@@ -32,25 +40,24 @@ source-repository head
32
40
33library
41library
34 build-depends:
42 build-depends:
35− base >=4.9 && <5
43+ base >=4.12.0.0 && <5
36− , binary >=0.4 && <0.9
44+ , binary >=0.8.6.0 && <0.9
37− , bytestring >=0.9 && <0.11
45+ , bytestring >=0.10.8.2 && <0.13
38− , cryptohash-md5 >=0.11.100 && <0.12
46+ , cryptohash-md5 >=0.11.100 && <0.12
39− , cryptohash-sha1 >=0.11.100 && <0.12
47+ , cryptohash-sha1 >=0.11.100 && <0.12
40− , deepseq >=1.3 && <1.5
48+ , deepseq >=1.4.4.0 && <1.6
41− , entropy >=0.3.7 && <0.5
49+ , entropy >=0.3.7 && <0.5
42− , hashable >=1.2.7.0 && <1.4
50+ , hashable >=1.4.4.0 && <1.6
43− , network-info >=0.2 && <0.3
51+ , network-info >=0.2 && <0.3
44− , random >=1.0.1 && <1.2
52+ , random >=1.2.1.2 && <1.3
53+ , template-haskell >=2.14.0.0 && <2.23
45− , text >=1.2.3 && <1.3
54+ , text >=1.2.3.0 && <1.3 || >=2.0 && <2.2
46− , time >=1.1 && <1.12
55+ , time >=1.4 && <1.13
47− , uuid-types >=1.0.2 && <2
48
56
49 -- uuid modules
57 -- uuid modules
50 exposed-modules:
58 exposed-modules:
51 Data.UUID
59 Data.UUID
52 Data.UUID.Util
60 Data.UUID.Util
53− Data.UUID.V1
54 Data.UUID.V3
61 Data.UUID.V3
55 Data.UUID.V4
62 Data.UUID.V4
56 Data.UUID.V5
63 Data.UUID.V5
@@ -92,13 +99,13 @@ benchmark uuid-types-benchmark
92
99
93 -- deps w/o inherited constraints
100 -- deps w/o inherited constraints
94 build-depends:
101 build-depends:
95− containers >=0.5 && <0.7
102+ containers >=0.5 && <0.8
96− , criterion >=1.5 && <1.6
103+ , criterion >=1.5 && <1.7
97 , unordered-containers >=0.2.7 && <0.3
104 , unordered-containers >=0.2.7 && <0.3
98
105
99benchmark uuid-benchmark
106benchmark uuid-benchmark
100 type: exitcode-stdio-1.0
107 type: exitcode-stdio-1.0
101− main-is: uuid-benchmark.hs
108+ main-is: uuid-benchmark.hs
102 hs-source-dirs: bench
109 hs-source-dirs: bench
103 default-language: Haskell2010
110 default-language: Haskell2010
104 default-extensions:
111 default-extensions:
@@ -111,9 +118,9 @@ benchmark uuid-benchmark
111 build-depends:
118 build-depends:
112 base
119 base
113 , random
120 , random
114− , uuid
121+ , uuid-bench
115
122
116 -- deps w/o inherited constraints
123 -- deps w/o inherited constraints
117 build-depends:
124 build-depends:
118− criterion >=1.5 && <1.6
125+ criterion >=1.5 && <1.7
119 , mersenne-random-pure64 >=0.2 && <0.3
126 , mersenne-random-pure64 >=0.2 && <0.3
uuid-types/ChangeLog.md+9
@@ -1,9 +1,18 @@
1+## 1.0.6 (2023-04-16)
2+
3+- Support GHC-8.6.5..GHC-9.10.1
4+
5+## 1.0.5 (2021-05-03)
6+
7+- Add (Template Haskell) `Lift UUID` instance
8+
1## 1.0.4.0
9## 1.0.4.0
2
10
3- Declare `Data.UUID.Types` module "`Trustworthy`" with respect to SafeHaskell.
11- Declare `Data.UUID.Types` module "`Trustworthy`" with respect to SafeHaskell.
4- Use more compact heap object representation which saves 16 bytes on 64bit platforms.
12- Use more compact heap object representation which saves 16 bytes on 64bit platforms.
5- Add `toWords64`/`fromWords64` functions
13- Add `toWords64`/`fromWords64` functions
6- Drop support for GHC < 7.
14- Drop support for GHC < 7.
15+- Add support for `random-1.2`, i.e. idiomatic `Random` and added `Uniform` instances.
7
16
8## 1.0.3
17## 1.0.3
9
18
uuid-types/src/Data/UUID/Types.hs−4
@@ -1,8 +1,4 @@
1−{-# LANGUAGE CPP #-}
2−
3−#if __GLASGOW_HASKELL__ >= 702
4{-# LANGUAGE Trustworthy #-}
1{-# LANGUAGE Trustworthy #-}
5−#endif
6
2
7{- |
3{- |
8Module : Data.UUID.Types
4Module : Data.UUID.Types
uuid-types/src/Data/UUID/Types/Internal.hs+15−43
@@ -2,10 +2,9 @@
2{-# LANGUAGE DeriveDataTypeable #-}
2{-# LANGUAGE DeriveDataTypeable #-}
3{-# LANGUAGE TypeFamilies #-}
3{-# LANGUAGE TypeFamilies #-}
4{-# LANGUAGE ViewPatterns #-}
4{-# LANGUAGE ViewPatterns #-}
5−#if __GLASGOW_HASKELL__ >= 704
6{-# LANGUAGE Unsafe #-}
5{-# LANGUAGE Unsafe #-}
7−#endif
6+{-# LANGUAGE DeriveLift #-}
8−
7+{-# LANGUAGE StandaloneDeriving #-}
9{-# OPTIONS_HADDOCK hide #-}
8{-# OPTIONS_HADDOCK hide #-}
10
9
11-- |
10-- |
@@ -47,13 +46,11 @@ module Data.UUID.Types.Internal
47
46
48import Prelude hiding (null)
47import Prelude hiding (null)
49
48
50−import Control.Applicative ((<*>))
51import Control.DeepSeq (NFData (..))
49import Control.DeepSeq (NFData (..))
52import Control.Monad (guard, liftM2)
50import Control.Monad (guard, liftM2)
53import Data.Bits
51import Data.Bits
54import Data.Char
52import Data.Char
55import Data.Data
53import Data.Data
56−import Data.Functor ((<$>))
57import Data.Hashable
54import Data.Hashable
58import Data.List (elemIndices)
55import Data.List (elemIndices)
59import Foreign.Ptr (Ptr)
56import Foreign.Ptr (Ptr)
@@ -72,13 +69,15 @@ import qualified Data.Text.Encoding as T
72
69
73import Data.UUID.Types.Internal.Builder
70import Data.UUID.Types.Internal.Builder
74
71
75−import System.Random
72+import System.Random (Random (..), uniform)
73+import System.Random.Stateful (Uniform (..), uniformWord64)
76
74
75+import Language.Haskell.TH.Syntax (Lift)
77
76
78-- | Type representing <https://en.wikipedia.org/wiki/UUID Universally Unique Identifiers (UUID)> as specified in
77-- | Type representing <https://en.wikipedia.org/wiki/UUID Universally Unique Identifiers (UUID)> as specified in
79-- <http://tools.ietf.org/html/rfc4122 RFC 4122>.
78-- <http://tools.ietf.org/html/rfc4122 RFC 4122>.
80data UUID = UUID {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64
79data UUID = UUID {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64
81− deriving (Eq, Ord, Typeable)
80+ deriving (Eq, Ord)
82{-
81{-
83 Prior to uuid-types-1.0.4:
82 Prior to uuid-types-1.0.4:
84 !Word32 !Word32 !Word32 !Word32
83 !Word32 !Word32 !Word32 !Word32
@@ -456,23 +455,13 @@ fromASCIIBytes bs = do
456-- | Similar to `toASCIIBytes` except we produce a lazy `BL.ByteString`.
455-- | Similar to `toASCIIBytes` except we produce a lazy `BL.ByteString`.
457toLazyASCIIBytes :: UUID -> BL.ByteString
456toLazyASCIIBytes :: UUID -> BL.ByteString
458toLazyASCIIBytes =
457toLazyASCIIBytes =
459−#if MIN_VERSION_bytestring(0,10,0)
460 BL.fromStrict
458 BL.fromStrict
461−#else
462− BL.fromChunks . return
463−#endif
464 . toASCIIBytes
459 . toASCIIBytes
465
460
466-- | Similar to `fromASCIIBytes` except parses from a lazy `BL.ByteString`.
461-- | Similar to `fromASCIIBytes` except parses from a lazy `BL.ByteString`.
467fromLazyASCIIBytes :: BL.ByteString -> Maybe UUID
462fromLazyASCIIBytes :: BL.ByteString -> Maybe UUID
468fromLazyASCIIBytes bs =
463fromLazyASCIIBytes bs =
469− if BL.length bs == 36 then fromASCIIBytes (
464+ if BL.length bs == 36 then fromASCIIBytes (BL.toStrict bs) else Nothing
470−#if MIN_VERSION_bytestring(0,10,0)
471− BL.toStrict bs
472−#else
473− B.concat $ BL.toChunks bs
474−#endif
475− ) else Nothing
476
465
477--
466--
478-- Class Instances
467-- Class Instances
@@ -481,26 +470,15 @@ fromLazyASCIIBytes bs =
481-- | This 'Random' instance produces __insecure__ version 4 UUIDs as
470-- | This 'Random' instance produces __insecure__ version 4 UUIDs as
482-- specified in <http://tools.ietf.org/html/rfc4122 RFC 4122>.
471-- specified in <http://tools.ietf.org/html/rfc4122 RFC 4122>.
483instance Random UUID where
472instance Random UUID where
484− random g = (fromGenNext w0 w1 w2 w3 w4, g4)
473+ random = uniform
485− where (w0, g0) = next g
486− (w1, g1) = next g0
487− (w2, g2) = next g1
488− (w3, g3) = next g2
489− (w4, g4) = next g3
490 randomR _ = random -- range is ignored
474 randomR _ = random -- range is ignored
491
475
492−-- |Build a UUID from the results of five calls to next on a StdGen.
476+-- @since 1.0.4
493−-- While next on StdGet returns an Int, it doesn't provide 32 bits of
477+instance Uniform UUID where
494−-- randomness. This code relies on at last 28 bits of randomness in the
478+ uniformM gen = do
495−-- and optimizes its use so as to make only five random values, not six.
479+ w0 <- uniformWord64 gen
496−fromGenNext :: Int -> Int -> Int -> Int -> Int -> UUID
480+ w1 <- uniformWord64 gen
497−fromGenNext w0 w1 w2 w3 w4 =
498− buildFromBytes 4 /-/ (ThreeByte w0)
481+ pure $ buildFromBytes 4 /-/ w0 /-/ w1
499− /-/ (ThreeByte w1)
500− /-/ w2 -- use all 4 bytes because we know the version
501− -- field will "cover" the upper, non-random bits
502− /-/ (ThreeByte w3)
503− /-/ (ThreeByte w4)
504
482
505-- |A ByteSource to extract only three bytes from an Int, since next on StdGet
483-- |A ByteSource to extract only three bytes from an Int, since next on StdGet
506-- only returns 31 bits of randomness.
484-- only returns 31 bits of randomness.
@@ -594,10 +572,4 @@ instance Data UUID where
594uuidType :: DataType
572uuidType :: DataType
595uuidType = mkNoRepType "Data.UUID.Types.UUID"
573uuidType = mkNoRepType "Data.UUID.Types.UUID"
596
574
597−#if !MIN_VERSION_base(4,5,0)
575+deriving instance Lift UUID
598−unsafeShiftR, unsafeShiftL :: Bits w => w -> Int -> w
599−{-# INLINE unsafeShiftR #-}
600−unsafeShiftR = shiftR
601−{-# INLINE unsafeShiftL #-}
602−unsafeShiftL = shiftL
603−#endif
uuid-types/src/Data/UUID/Types/Internal/Builder.hs−3
@@ -1,8 +1,5 @@
1−{-# LANGUAGE CPP #-}
2{-# LANGUAGE TypeFamilies #-}
1{-# LANGUAGE TypeFamilies #-}
3−#if __GLASGOW_HASKELL__ >= 704
4{-# LANGUAGE Unsafe #-}
2{-# LANGUAGE Unsafe #-}
5−#endif
6
3
7{-# OPTIONS_HADDOCK hide #-}
4{-# OPTIONS_HADDOCK hide #-}
8
5
uuid-types/tests/TestUUID.hs+7
@@ -1,4 +1,5 @@
1{-# LANGUAGE ViewPatterns #-}
1{-# LANGUAGE ViewPatterns #-}
2+{-# LANGUAGE TemplateHaskell #-}
2
3
3{-# OPTIONS_GHC -fno-warn-orphans #-}
4{-# OPTIONS_GHC -fno-warn-orphans #-}
4
5
@@ -40,6 +41,11 @@ test_nil = testGroup "nil" [
40 testCase "nil bytes" $ U.toByteString U.nil @?= BL.pack (replicate 16 0)
41 testCase "nil bytes" $ U.toByteString U.nil @?= BL.pack (replicate 16 0)
41 ]
42 ]
42
43
44+test_lift :: Test
45+test_lift = testCase "TH.Lift" $ do
46+ let uuid = U.fromWords64 123456789 987654321
47+ uuid @?= $( [| uuid |] )
48+
43test_conv :: Test
49test_conv :: Test
44test_conv = testGroup "conversions" [
50test_conv = testGroup "conversions" [
45 testCase "conv bytes to string" $
51 testCase "conv bytes to string" $
@@ -176,6 +182,7 @@ main = do
176 [ [
182 [ [
177 test_null,
183 test_null,
178 test_nil,
184 test_nil,
185+ test_lift,
179 test_conv,
186 test_conv,
180 test_fromByteString,
187 test_fromByteString,
181 test_fromWords,
188 test_fromWords,
uuid-types/uuid-types.cabal+28−21
@@ -1,6 +1,7 @@
1cabal-version: 1.12
1cabal-version: 1.12
2name: uuid-types
2name: uuid-types
3−version: 1.0.4.0
3+version: 1.0.6
4+x-revision: 2
4copyright:
5copyright:
5 (c) 2017-2018 Herbert Valerio Riedel
6 (c) 2017-2018 Herbert Valerio Riedel
6 (c) 2008-2014 Antoine Latter
7 (c) 2008-2014 Antoine Latter
@@ -12,16 +13,16 @@ license-file: LICENSE
12category: Data
13category: Data
13build-type: Simple
14build-type: Simple
14tested-with:
15tested-with:
15− GHC ==7.4.2
16+ GHC ==8.6.5
16− || ==7.6.3
17− || ==7.8.4
18− || ==7.10.3
19− || ==8.0.2
20− || ==8.2.2
21− || ==8.4.4
22− || ==8.6.4
23 || ==8.8.4
17 || ==8.8.4
24− || ==8.10.3
18+ || ==8.10.7
19+ || ==9.0.2
20+ || ==9.2.8
21+ || ==9.4.8
22+ || ==9.6.6
23+ || ==9.8.4
24+ || ==9.10.1
25+ || ==9.12.1
25
26
26synopsis: Type definitions for Universally Unique Identifiers
27synopsis: Type definitions for Universally Unique Identifiers
27description:
28description:
@@ -45,13 +46,14 @@ source-repository head
45
46
46library
47library
47 build-depends:
48 build-depends:
48− base >=4.3 && <5
49+ base >=4.12.0.0 && <5
49− , binary >=0.4 && <0.9
50+ , binary >=0.8.6.0 && <0.9
50− , bytestring >=0.9 && <0.11
51+ , bytestring >=0.10.8.2 && <0.13
51− , deepseq >=1.3 && <1.5
52+ , deepseq >=1.4.4.0 && <1.6
52− , hashable >=1.2.7.0 && <1.4
53+ , hashable >=1.4.4.0 && <1.6
53− , random >=1.1 && <1.2
54+ , random >=1.2.1.2 && <1.3
55+ , template-haskell >=2.14.0.0 && <2.24
54− , text >=1.2.3 && <1.3
56+ , text >=1.2.3.0 && <1.3 || >=2.0 && <2.2
55
57
56 exposed-modules: Data.UUID.Types
58 exposed-modules: Data.UUID.Types
57
59
@@ -75,18 +77,23 @@ test-suite testuuid
75 default-language: Haskell2010
77 default-language: Haskell2010
76 other-extensions: ViewPatterns
78 other-extensions: ViewPatterns
77 ghc-options: -Wall
79 ghc-options: -Wall
80+ if impl(ghc >= 8.10)
81+ ghc-options: -Wunused-packages
78
82
79 -- inherited constraints
83 -- inherited constraints
80 build-depends:
84 build-depends:
81 base
85 base
82 , binary
86 , binary
83 , bytestring
87 , bytestring
88+ , template-haskell
84 , uuid-types
89 , uuid-types
85
90
86 -- deps w/o inherited constraints
91 -- deps w/o inherited constraints
87 build-depends:
92 build-depends:
88− ghc-byteorder >=4.11 && <4.12
89− , QuickCheck >=2.14.2 && <2.15
93+ QuickCheck >=2.14.2 && <2.16
90− , tasty >=1.4.0.1 && <1.5
94+ , tasty >=1.4.0.1 && <1.6
91 , tasty-hunit >=0.10 && <0.11
95 , tasty-hunit >=0.10 && <0.11
92− , tasty-quickcheck >=0.10 && <0.11
96+ , tasty-quickcheck >=0.10 && <0.12
97+
98+ if !impl(ghc >=8.4)
99+ build-depends: ghc-byteorder >=4.11 && <4.12
uuid/CHANGES.md+13
@@ -1,3 +1,16 @@
1+1.3.16
2+
3+- Support GHC-8.6.5...9.10.1
4+
5+1.3.15
6+
7+- Add (Template Haskell) `Lift UUID` instance
8+
9+1.3.14
10+
11+- Use more compact heap object representation which saves 16 bytes on 64bit platforms.
12+- Add `toWords64`/`fromWords64` functions
13+
11.3.13
141.3.13
2
15
3- Optimize `V4.nextRandom` (~3x speed increase)
16- Optimize `V4.nextRandom` (~3x speed increase)
uuid/src/Data/UUID.hs+2−3
@@ -18,9 +18,6 @@ See <http://tools.ietf.org/html/rfc4122> for the specification.
18favorite instance of 'System.Random.Random' for faster but insecure
18favorite instance of 'System.Random.Random' for faster but insecure
19generation of UUIDs.
19generation of UUIDs.
20
20
21−* We have an implementation of generating a UUID from the hardware
22−MAC address and current system time in "Data.UUID.V1".
23−
24* For name-based generation of UUIDs using SHA-1 hashing see
21* For name-based generation of UUIDs using SHA-1 hashing see
25"Data.UUID.V5".
22"Data.UUID.V5".
26-}
23-}
@@ -37,6 +34,8 @@ module Data.UUID(UUID
37 ,fromByteString
34 ,fromByteString
38 ,toWords
35 ,toWords
39 ,fromWords
36 ,fromWords
37+ ,toWords64
38+ ,fromWords64
40 ,null
39 ,null
41 ,nil
40 ,nil
42 ) where
41 ) where
uuid/src/Data/UUID/Util.hs−11
@@ -3,7 +3,6 @@ module Data.UUID.Util (
3 UnpackedUUID(..)
3 UnpackedUUID(..)
4 , unpack, pack
4 , unpack, pack
5 , version
5 , version
6− , extractMac
7 , extractTime
6 , extractTime
8 , setTime
7 , setTime
9 ) where
8 ) where
@@ -13,7 +12,6 @@ import Data.Word
13import Data.Word.Util
12import Data.Word.Util
14import Data.Bits
13import Data.Bits
15import Data.UUID.Types.Internal
14import Data.UUID.Types.Internal
16−import Network.Info
17import Data.Int (Int64)
15import Data.Int (Int64)
18
16
19version :: UUID -> Int
17version :: UUID -> Int
@@ -42,12 +40,3 @@ extractTime uuid =
42
40
43timeAndVersionToTime :: Word16 -> Word16
41timeAndVersionToTime :: Word16 -> Word16
44timeAndVersionToTime tv = tv .&. 0x0FFF
42timeAndVersionToTime tv = tv .&. 0x0FFF
45−
46−extractMac :: UUID -> Maybe MAC
47−extractMac uuid =
48− if version uuid == 1
49− then Just $
50− MAC (node_0 unpacked) (node_1 unpacked) (node_2 unpacked) (node_3 unpacked) (node_4 unpacked) (node_5 unpacked)
51− else Nothing
52− where
53− unpacked = unpack uuid
uuid/src/Data/UUID/V1.hsdeleted−135
@@ -1,135 +0,0 @@
1−{-# OPTIONS_GHC -fno-cse #-}
2−{-# LANGUAGE TypeFamilies #-}
3−
4−{- |
5−Module : Data.UUID.V1
6−Copyright : (c) 2008 Jason Dusek
7− (c) 2009 Mark Lentczner
8− (c) 2009-2010,2012 Antoine Latter
9−
10−License : BSD-style
11−
12−Maintainer : aslatter@gmail.com
13−Stability : experimental
14−Portability : portable
15−
16−RFC 4122 Version 1 UUID state machine.
17−
18−The generated UUID is based on the hardware MAC
19−address and the system clock.
20−
21−If we cannot lookup the MAC address we seed the
22−generator with a psuedo-random number.
23−-}
24−
25−module Data.UUID.V1(nextUUID)
26−where
27−
28−
29−import Data.Bits
30−import Data.Maybe
31−import Data.Time
32−import Data.Word
33−
34−import Control.Applicative ((<$>),(<*>))
35−import Control.Concurrent.MVar
36−import System.IO.Unsafe
37−
38−import qualified System.Random as R
39−
40−import Network.Info
41−
42−import Data.UUID.Types.Internal.Builder
43−import Data.UUID.Types.Internal
44−
45−-- | Returns a new UUID derived from the local hardware MAC
46−-- address and the current system time.
47−-- Is generated according to the Version 1 UUID specified in
48−-- RFC 4122.
49−--
50−-- Returns 'Nothing' if you request UUIDs too quickly.
51−nextUUID :: IO (Maybe UUID)
52−nextUUID = do
53− res <- stepTime
54− case res of
55− Just (mac', c, t) -> return $ Just $ makeUUID t c mac'
56− _ -> return Nothing
57−
58−
59−makeUUID :: Word64 -> Word16 -> MAC -> UUID
60−makeUUID time clock mac' =
61− buildFromBytes 1 /-/ tLow /-/ tMid /-/ tHigh /-/ clock /-/ (MACSource mac')
62− where tLow = (fromIntegral time) :: Word32
63− tMid = (fromIntegral (time `shiftR` 32)) :: Word16
64− tHigh = (fromIntegral (time `shiftR` 48)) :: Word16
65−
66−newtype MACSource = MACSource MAC
67−instance ByteSource MACSource where
68− z /-/ (MACSource (MAC a b c d e f)) = z a b c d e f
69−type instance ByteSink MACSource g = Takes3Bytes (Takes3Bytes g)
70−
71−
72−-- |Approximates the clock algorithm in RFC 4122, section 4.2
73−-- Isn't system wide or thread safe, nor does it properly randomize
74−-- the clock value on initialization.
75−stepTime :: IO (Maybe (MAC, Word16, Word64))
76−stepTime = do
77− h1 <- fmap hundredsOfNanosSinceGregorianReform getCurrentTime
78− modifyMVar state $ \s@(State mac' c0 h0) ->
79− if h1 > h0
80− then
81− return (State mac' c0 h1, Just (mac', c0, h1))
82− else
83− let
84− c1 = succ c0
85− in if c1 <= 0x3fff -- when clock is initially randomized,
86− -- then this test will need to change
87− then
88− return (State mac' c1 h1, Just (mac', c1, h1))
89− else
90− return (s, Nothing)
91−
92−
93−{-# NOINLINE state #-}
94−state :: MVar State
95−state = unsafePerformIO $ do
96− h0 <- fmap hundredsOfNanosSinceGregorianReform getCurrentTime
97− mac' <- getMac
98− newMVar $ State mac' 0 h0 -- the 0 should be a random number
99−
100−-- SysMAC.mac can fail on some machines.
101−-- In those cases we fake it with a random
102−-- 6 bytes seed.
103−getMac :: IO MAC
104−getMac =
105− getNetworkInterfaces >>=
106− return . listToMaybe . filter (minBound /=) . map mac >>=
107− \macM -> case macM of
108− Just m -> return m
109− Nothing -> randomMac
110−
111−randomMac :: IO MAC
112−randomMac =
113− -- I'm too lazy to thread through
114− -- the random state ...
115− MAC
116− <$> (R.randomIO >>= return . (1 .|.)) -- We must set the multicast bit to True. See section 4.5 of the RFC.
117− <*> R.randomIO
118− <*> R.randomIO
119− <*> R.randomIO
120− <*> R.randomIO
121− <*> R.randomIO
122−
123−data State = State
124− {-# UNPACK #-} !MAC
125− {-# UNPACK #-} !Word16
126− {-# UNPACK #-} !Word64
127− deriving (Show)
128−
129−
130−
131−hundredsOfNanosSinceGregorianReform :: UTCTime -> Word64
132−hundredsOfNanosSinceGregorianReform t = floor $ 10000000 * dt
133− where
134− gregorianReform = UTCTime (fromGregorian 1582 10 15) 0
135− dt = t `diffUTCTime` gregorianReform
uuid/src/Data/UUID/V3.hs+1−1
@@ -8,7 +8,7 @@ Maintainer : aslatter@gmail.com
8Stability : experimental
8Stability : experimental
9Portability : portable
9Portability : portable
10
10
11−NOTE: This module uses MD5 hashing. Unless you know
11+NOTE\: This module uses MD5 hashing. Unless you know
12you need to use this module, you should probably be
12you need to use this module, you should probably be
13using "Data.UUID.V5", which offers the same sort of
13using "Data.UUID.V5", which offers the same sort of
14functionality as this module except implemented with
14functionality as this module except implemented with
uuid/src/Data/UUID/V4.hs+5−4
@@ -11,8 +11,8 @@
11 This module implements Version 4 UUIDs as specified
11 This module implements Version 4 UUIDs as specified
12 in RFC 4122.
12 in RFC 4122.
13
13
14− These UUIDs are generated from a pseddo-random generator.
14+ These UUIDs are generated from a pseudo-random generator.
15− We use 'getEntropy' method from <https://hackage.haskell.org/package/entropy entropy> package,
15+ We use the 'getEntropy' method from the <https://hackage.haskell.org/package/entropy entropy> package,
16 which should provide cryptographically secure random data.
16 which should provide cryptographically secure random data.
17-}
17-}
18module Data.UUID.V4 (nextRandom) where
18module Data.UUID.V4 (nextRandom) where
@@ -23,8 +23,9 @@ import Data.UUID.Types.Internal ( buildFromBytes )
23import System.Entropy ( getEntropy )
23import System.Entropy ( getEntropy )
24import Data.ByteString ( unpack )
24import Data.ByteString ( unpack )
25
25
26−-- | Generate a crytographically secure, random UUID. Introduced in version
26+-- | Generate a crytographically secure, random UUID.
27+--
27−-- 1.2.6.
28+-- @since 1.2.6
28nextRandom :: IO UUID
29nextRandom :: IO UUID
29nextRandom = do
30nextRandom = do
30 [b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf]
31 [b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf]
uuid/tests/TestUUID.hs+4−20
@@ -1,18 +1,15 @@
1{-# LANGUAGE ViewPatterns #-}
1{-# LANGUAGE ViewPatterns #-}
2
2
3−import Control.Monad (replicateM)
4import Data.Bits
3import Data.Bits
5import qualified Data.ByteString.Lazy as BL
4import qualified Data.ByteString.Lazy as BL
6import Data.Char (ord)
5import Data.Char (ord)
7−import Data.List (nub, (\\))
8import Data.Maybe
6import Data.Maybe
9import Data.Word
7import Data.Word
10import qualified Data.UUID as U
8import qualified Data.UUID as U
11−import qualified Data.UUID.V1 as U
12import qualified Data.UUID.V3 as U3
9import qualified Data.UUID.V3 as U3
13import qualified Data.UUID.V5 as U5
10import qualified Data.UUID.V5 as U5
14
11
15−import Test.QuickCheck ( Arbitrary(arbitrary), choose )
12+import Test.QuickCheck ( Arbitrary(arbitrary) )
16import Test.Tasty ( TestTree, testGroup, defaultMain )
13import Test.Tasty ( TestTree, testGroup, defaultMain )
17import Test.Tasty.HUnit
14import Test.Tasty.HUnit
18 ( assertBool, (@?=), testCase )
15 ( assertBool, (@?=), testCase )
@@ -24,13 +21,13 @@ isValidVersion :: Int -> U.UUID -> Bool
24isValidVersion v u = lenOK && variantOK && versionOK
21isValidVersion v u = lenOK && variantOK && versionOK
25 where bs = U.toByteString u
22 where bs = U.toByteString u
26 lenOK = BL.length bs == 16
23 lenOK = BL.length bs == 16
27− variantOK = (BL.index bs 8) .&. 0xc0 == 0x80
24+ variantOK = BL.index bs 8 .&. 0xc0 == 0x80
28− versionOK = (BL.index bs 6) .&. 0xf0 == fromIntegral (v `shiftL` 4)
25+ versionOK = BL.index bs 6 .&. 0xf0 == fromIntegral (v `shiftL` 4)
29
26
30
27
31instance Arbitrary U.UUID where
28instance Arbitrary U.UUID where
32 -- the UUID random instance ignores bounds
29 -- the UUID random instance ignores bounds
33− arbitrary = choose (U.nil, U.nil)
30+ arbitrary = pure U.nil
34
31
35
32
36test_null :: Test
33test_null :: Test
@@ -38,17 +35,6 @@ test_null =
38 testCase "namespaceDNS is not null" $
35 testCase "namespaceDNS is not null" $
39 assertBool "" (not $ U.null U3.namespaceDNS)
36 assertBool "" (not $ U.null U3.namespaceDNS)
40
37
41−test_v1 :: [Maybe U.UUID] -> Test
42−test_v1 v1s = testGroup "version 1" [
43− testCase "V1 unique" $ nub (v1s \\ nub v1s) @?= [],
44− testGroup "V1 not null" $ map (testUUID (not . U.null)) v1s,
45− testGroup "V1 valid" $ map (testUUID (isValidVersion 1)) v1s
46− ]
47− where testUUID :: (U.UUID -> Bool) -> Maybe U.UUID -> Test
48− testUUID p u =
49− testCase (show u) $
50− assertBool "" $ maybe False p u
51−
52test_v3 :: Test
38test_v3 :: Test
53test_v3 =
39test_v3 =
54 testCase "V3 computation" $
40 testCase "V3 computation" $
@@ -93,13 +79,11 @@ prop_v5Valid = testProperty "V5 valid" v5Valid
93
79
94main :: IO ()
80main :: IO ()
95main = do
81main = do
96− v1s <- replicateM 100 U.nextUUID
97 defaultMain $
82 defaultMain $
98 testGroup "tests" $
83 testGroup "tests" $
99 concat $
84 concat $
100 [ [
85 [ [
101 test_null,
86 test_null,
102− test_v1 v1s,
103 test_v3,
87 test_v3,
104 test_v5
88 test_v5
105 ]
89 ]
uuid/uuid.cabal+24−23
@@ -1,6 +1,7 @@
1cabal-version: 1.12
1cabal-version: 1.12
2name: uuid
2name: uuid
3−version: 1.3.13
3+version: 1.3.16
4+x-revision: 2
4copyright: (c) 2008-2014 Antoine Latter
5copyright: (c) 2008-2014 Antoine Latter
5author: Antoine Latter
6author: Antoine Latter
6maintainer: Oleg Grenrus <oleg.grenrus@iki.fi>
7maintainer: Oleg Grenrus <oleg.grenrus@iki.fi>
@@ -9,16 +10,16 @@ license-file: LICENSE
9category: Data
10category: Data
10build-type: Simple
11build-type: Simple
11tested-with:
12tested-with:
12− GHC ==7.4.2
13+ GHC ==8.6.5
13− || ==7.6.3
14− || ==7.8.4
15− || ==7.10.3
16− || ==8.0.2
17− || ==8.2.2
18− || ==8.4.4
19− || ==8.6.4
20 || ==8.8.4
14 || ==8.8.4
21− || ==8.10.3
15+ || ==8.10.7
16+ || ==9.0.2
17+ || ==9.2.8
18+ || ==9.4.8
19+ || ==9.6.6
20+ || ==9.8.4
21+ || ==9.10.1
22+ || ==9.12.1
22
23
23synopsis:
24synopsis:
24 For creating, comparing, parsing and printing Universally Unique Identifiers
25 For creating, comparing, parsing and printing Universally Unique Identifiers
@@ -40,22 +41,19 @@ source-repository head
40
41
41library
42library
42 build-depends:
43 build-depends:
43− base >=4.3 && <5
44+ base >=4.12 && <5
44− , binary >=0.4 && <0.9
45+ , binary >=0.8.6.0 && <0.9
45− , bytestring >=0.9 && <0.11
46+ , bytestring >=0.10.8.2 && <0.13
46 , cryptohash-md5 >=0.11.100 && <0.12
47 , cryptohash-md5 >=0.11.100 && <0.12
47 , cryptohash-sha1 >=0.11.100 && <0.12
48 , cryptohash-sha1 >=0.11.100 && <0.12
48 , entropy >=0.3.7 && <0.5
49 , entropy >=0.3.7 && <0.5
49− , network-info >=0.2 && <0.3
50− , random >=1.1 && <1.2
51− , text >=1.2.3 && <1.3
52− , time >=1.1 && <1.12
53− , uuid-types >=1.0.2 && <2
54
50
51+ -- strict dependency on uuid-types,
52+ -- as we re-rexport datatype, thus leak instances etc.
53+ build-depends: uuid-types >=1.0.6 && <1.0.7
55 exposed-modules:
54 exposed-modules:
56 Data.UUID
55 Data.UUID
57 Data.UUID.Util
56 Data.UUID.Util
58− Data.UUID.V1
59 Data.UUID.V3
57 Data.UUID.V3
60 Data.UUID.V4
58 Data.UUID.V4
61 Data.UUID.V5
59 Data.UUID.V5
@@ -68,6 +66,8 @@ library
68 default-extensions: DeriveDataTypeable
66 default-extensions: DeriveDataTypeable
69 other-extensions: TypeFamilies
67 other-extensions: TypeFamilies
70 ghc-options: -Wall
68 ghc-options: -Wall
69+ if impl(ghc >= 8.10)
70+ ghc-options: -Wunused-packages
71 hs-source-dirs: src
71 hs-source-dirs: src
72
72
73test-suite testuuid
73test-suite testuuid
@@ -78,17 +78,18 @@ test-suite testuuid
78 default-extensions: DeriveDataTypeable
78 default-extensions: DeriveDataTypeable
79 other-extensions: ViewPatterns
79 other-extensions: ViewPatterns
80 ghc-options: -Wall -fno-warn-orphans
80 ghc-options: -Wall -fno-warn-orphans
81+ if impl(ghc >= 8.10)
82+ ghc-options: -Wunused-packages
81
83
82 -- inherited constraints
84 -- inherited constraints
83 build-depends:
85 build-depends:
84 base
86 base
85 , bytestring
87 , bytestring
86− , random
87 , uuid
88 , uuid
88
89
89 -- deps w/o inherited constraints
90 -- deps w/o inherited constraints
90 build-depends:
91 build-depends:
91− QuickCheck >=2.14.2 && <2.15
92+ QuickCheck >=2.14.2 && <2.16
92− , tasty >=1.4.0.1 && <1.5
93+ , tasty >=1.4.0.1 && <1.6
93 , tasty-hunit >=0.10 && <0.11
94 , tasty-hunit >=0.10 && <0.11
94− , tasty-quickcheck >=0.10 && <0.11
95+ , tasty-quickcheck >=0.10 && <0.12