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

The content is the same.

uuid-bench/bench/uuid-benchmark.hs+1
@@ -3,6 +3,7 @@ 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
6import qualified Data.UUID.V4 as U
7import qualified Data.UUID.V4 as U
7import qualified Data.UUID.V3 as U3
8import qualified Data.UUID.V3 as U3
8import qualified Data.UUID.V5 as U5
9import qualified Data.UUID.V5 as U5
uuid-bench/uuid-bench.cabal+19−27
@@ -14,15 +14,7 @@ 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.6.5
17+ GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.4 || ==8.8.4 || ==8.10.3
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
26
18
27synopsis: UUID benchmarks
19synopsis: UUID benchmarks
28description:
20description:
@@ -40,24 +32,24 @@ source-repository head
40
32
41library
33library
42 build-depends:
34 build-depends:
43− base >=4.12.0.0 && <5
35+ base >=4.9 && <5
44− , binary >=0.8.6.0 && <0.9
36+ , binary >=0.5.1.0 && <0.9
45− , bytestring >=0.10.8.2 && <0.13
37+ , bytestring >=0.9.2.1 && <0.12
46− , cryptohash-md5 >=0.11.100 && <0.12
38+ , cryptohash-md5 >=0.11.100 && <0.12
47− , cryptohash-sha1 >=0.11.100 && <0.12
39+ , cryptohash-sha1 >=0.11.100 && <0.12
48− , deepseq >=1.4.4.0 && <1.6
40+ , deepseq >=1.3.0.0 && <1.5
49− , entropy >=0.3.7 && <0.5
41+ , entropy >=0.3.7 && <0.5
50− , hashable >=1.4.4.0 && <1.6
42+ , hashable >=1.2.7.0 && <1.4
51− , network-info >=0.2 && <0.3
43+ , network-info >=0.2 && <0.3
52− , random >=1.2.1.2 && <1.3
44+ , random >=1.1 && <1.3
53− , template-haskell >=2.14.0.0 && <2.23
54− , text >=1.2.3.0 && <1.3 || >=2.0 && <2.2
45+ , text >=1.2.3.0 && <1.3
55− , time >=1.4 && <1.13
46+ , time >=1.4 && <1.12
56
47
57 -- uuid modules
48 -- uuid modules
58 exposed-modules:
49 exposed-modules:
59 Data.UUID
50 Data.UUID
60 Data.UUID.Util
51 Data.UUID.Util
52+ Data.UUID.V1
61 Data.UUID.V3
53 Data.UUID.V3
62 Data.UUID.V4
54 Data.UUID.V4
63 Data.UUID.V5
55 Data.UUID.V5
@@ -99,13 +91,13 @@ benchmark uuid-types-benchmark
99
91
100 -- deps w/o inherited constraints
92 -- deps w/o inherited constraints
101 build-depends:
93 build-depends:
102− containers >=0.5 && <0.8
94+ containers >=0.5 && <0.7
103− , criterion >=1.5 && <1.7
95+ , criterion >=1.5 && <1.6
104 , unordered-containers >=0.2.7 && <0.3
96 , unordered-containers >=0.2.7 && <0.3
105
97
106benchmark uuid-benchmark
98benchmark uuid-benchmark
107 type: exitcode-stdio-1.0
99 type: exitcode-stdio-1.0
108− main-is: uuid-benchmark.hs
100+ main-is: uuid-benchmark.hs
109 hs-source-dirs: bench
101 hs-source-dirs: bench
110 default-language: Haskell2010
102 default-language: Haskell2010
111 default-extensions:
103 default-extensions:
@@ -118,9 +110,9 @@ benchmark uuid-benchmark
118 build-depends:
110 build-depends:
119 base
111 base
120 , random
112 , random
121− , uuid-bench
113+ , uuid
122
114
123 -- deps w/o inherited constraints
115 -- deps w/o inherited constraints
124 build-depends:
116 build-depends:
125− criterion >=1.5 && <1.7
117+ criterion >=1.5 && <1.6
126 , mersenne-random-pure64 >=0.2 && <0.3
118 , mersenne-random-pure64 >=0.2 && <0.3
uuid-types/ChangeLog.md−8
@@ -1,11 +1,3 @@
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−
9## 1.0.4.0
1## 1.0.4.0
10
2
11- Declare `Data.UUID.Types` module "`Trustworthy`" with respect to SafeHaskell.
3- Declare `Data.UUID.Types` module "`Trustworthy`" with respect to SafeHaskell.
uuid-types/src/Data/UUID/Types.hs+4
@@ -1,4 +1,8 @@
1+{-# LANGUAGE CPP #-}
2+
3+#if __GLASGOW_HASKELL__ >= 702
1{-# LANGUAGE Trustworthy #-}
4{-# LANGUAGE Trustworthy #-}
5+#endif
2
6
3{- |
7{- |
4Module : Data.UUID.Types
8Module : Data.UUID.Types
uuid-types/src/Data/UUID/Types/Internal.hs+52−6
@@ -2,9 +2,10 @@
2{-# LANGUAGE DeriveDataTypeable #-}
2{-# LANGUAGE DeriveDataTypeable #-}
3{-# LANGUAGE TypeFamilies #-}
3{-# LANGUAGE TypeFamilies #-}
4{-# LANGUAGE ViewPatterns #-}
4{-# LANGUAGE ViewPatterns #-}
5+#if __GLASGOW_HASKELL__ >= 704
5{-# LANGUAGE Unsafe #-}
6{-# LANGUAGE Unsafe #-}
6−{-# LANGUAGE DeriveLift #-}
7+#endif
7−{-# LANGUAGE StandaloneDeriving #-}
8+
8{-# OPTIONS_HADDOCK hide #-}
9{-# OPTIONS_HADDOCK hide #-}
9
10
10-- |
11-- |
@@ -46,11 +47,13 @@ module Data.UUID.Types.Internal
46
47
47import Prelude hiding (null)
48import Prelude hiding (null)
48
49
50+import Control.Applicative ((<*>))
49import Control.DeepSeq (NFData (..))
51import Control.DeepSeq (NFData (..))
50import Control.Monad (guard, liftM2)
52import Control.Monad (guard, liftM2)
51import Data.Bits
53import Data.Bits
52import Data.Char
54import Data.Char
53import Data.Data
55import Data.Data
56+import Data.Functor ((<$>))
54import Data.Hashable
57import Data.Hashable
55import Data.List (elemIndices)
58import Data.List (elemIndices)
56import Foreign.Ptr (Ptr)
59import Foreign.Ptr (Ptr)
@@ -69,15 +72,18 @@ import qualified Data.Text.Encoding as T
69
72
70import Data.UUID.Types.Internal.Builder
73import Data.UUID.Types.Internal.Builder
71
74
75+#if MIN_VERSION_random(1,2,0)
72import System.Random (Random (..), uniform)
76import System.Random (Random (..), uniform)
73import System.Random.Stateful (Uniform (..), uniformWord64)
77import System.Random.Stateful (Uniform (..), uniformWord64)
78+#else
79+import System.Random (Random (..), next)
80+#endif
74
81
75−import Language.Haskell.TH.Syntax (Lift)
76
82
77-- | Type representing <https://en.wikipedia.org/wiki/UUID Universally Unique Identifiers (UUID)> as specified in
83-- | Type representing <https://en.wikipedia.org/wiki/UUID Universally Unique Identifiers (UUID)> as specified in
78-- <http://tools.ietf.org/html/rfc4122 RFC 4122>.
84-- <http://tools.ietf.org/html/rfc4122 RFC 4122>.
79data UUID = UUID {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64
85data UUID = UUID {-# UNPACK #-} !Word64 {-# UNPACK #-} !Word64
80− deriving (Eq, Ord)
86+ deriving (Eq, Ord, Typeable)
81{-
87{-
82 Prior to uuid-types-1.0.4:
88 Prior to uuid-types-1.0.4:
83 !Word32 !Word32 !Word32 !Word32
89 !Word32 !Word32 !Word32 !Word32
@@ -455,13 +461,23 @@ fromASCIIBytes bs = do
455-- | Similar to `toASCIIBytes` except we produce a lazy `BL.ByteString`.
461-- | Similar to `toASCIIBytes` except we produce a lazy `BL.ByteString`.
456toLazyASCIIBytes :: UUID -> BL.ByteString
462toLazyASCIIBytes :: UUID -> BL.ByteString
457toLazyASCIIBytes =
463toLazyASCIIBytes =
464+#if MIN_VERSION_bytestring(0,10,0)
458 BL.fromStrict
465 BL.fromStrict
466+#else
467+ BL.fromChunks . return
468+#endif
459 . toASCIIBytes
469 . toASCIIBytes
460
470
461-- | Similar to `fromASCIIBytes` except parses from a lazy `BL.ByteString`.
471-- | Similar to `fromASCIIBytes` except parses from a lazy `BL.ByteString`.
462fromLazyASCIIBytes :: BL.ByteString -> Maybe UUID
472fromLazyASCIIBytes :: BL.ByteString -> Maybe UUID
463fromLazyASCIIBytes bs =
473fromLazyASCIIBytes bs =
464− if BL.length bs == 36 then fromASCIIBytes (BL.toStrict bs) else Nothing
474+ if BL.length bs == 36 then fromASCIIBytes (
475+#if MIN_VERSION_bytestring(0,10,0)
476+ BL.toStrict bs
477+#else
478+ B.concat $ BL.toChunks bs
479+#endif
480+ ) else Nothing
465
481
466--
482--
467-- Class Instances
483-- Class Instances
@@ -469,6 +485,7 @@ fromLazyASCIIBytes bs =
469
485
470-- | This 'Random' instance produces __insecure__ version 4 UUIDs as
486-- | This 'Random' instance produces __insecure__ version 4 UUIDs as
471-- specified in <http://tools.ietf.org/html/rfc4122 RFC 4122>.
487-- specified in <http://tools.ietf.org/html/rfc4122 RFC 4122>.
488+#if MIN_VERSION_random(1,2,0)
472instance Random UUID where
489instance Random UUID where
473 random = uniform
490 random = uniform
474 randomR _ = random -- range is ignored
491 randomR _ = random -- range is ignored
@@ -479,6 +496,29 @@ instance Uniform UUID where
479 w0 <- uniformWord64 gen
496 w0 <- uniformWord64 gen
480 w1 <- uniformWord64 gen
497 w1 <- uniformWord64 gen
481 pure $ buildFromBytes 4 /-/ w0 /-/ w1
498 pure $ buildFromBytes 4 /-/ w0 /-/ w1
499+#else
500+instance Random UUID where
501+ random g = (fromGenNext w0 w1 w2 w3 w4, g4)
502+ where (w0, g0) = next g
503+ (w1, g1) = next g0
504+ (w2, g2) = next g1
505+ (w3, g3) = next g2
506+ (w4, g4) = next g3
507+ randomR _ = random -- range is ignored
508+
509+-- |Build a UUID from the results of five calls to next on a StdGen.
510+-- While next on StdGet returns an Int, it doesn't provide 32 bits of
511+-- randomness. This code relies on at last 28 bits of randomness in the
512+-- and optimizes its use so as to make only five random values, not six.
513+fromGenNext :: Int -> Int -> Int -> Int -> Int -> UUID
514+fromGenNext w0 w1 w2 w3 w4 =
515+ buildFromBytes 4 /-/ (ThreeByte w0)
516+ /-/ (ThreeByte w1)
517+ /-/ w2 -- use all 4 bytes because we know the version
518+ -- field will "cover" the upper, non-random bits
519+ /-/ (ThreeByte w3)
520+ /-/ (ThreeByte w4)
521+#endif
482
522
483-- |A ByteSource to extract only three bytes from an Int, since next on StdGet
523-- |A ByteSource to extract only three bytes from an Int, since next on StdGet
484-- only returns 31 bits of randomness.
524-- only returns 31 bits of randomness.
@@ -572,4 +612,10 @@ instance Data UUID where
572uuidType :: DataType
612uuidType :: DataType
573uuidType = mkNoRepType "Data.UUID.Types.UUID"
613uuidType = mkNoRepType "Data.UUID.Types.UUID"
574
614
575−deriving instance Lift UUID
615+#if !MIN_VERSION_base(4,5,0)
616+unsafeShiftR, unsafeShiftL :: Bits w => w -> Int -> w
617+{-# INLINE unsafeShiftR #-}
618+unsafeShiftR = shiftR
619+{-# INLINE unsafeShiftL #-}
620+unsafeShiftL = shiftL
621+#endif
uuid-types/src/Data/UUID/Types/Internal/Builder.hs+3
@@ -1,5 +1,8 @@
1+{-# LANGUAGE CPP #-}
1{-# LANGUAGE TypeFamilies #-}
2{-# LANGUAGE TypeFamilies #-}
3+#if __GLASGOW_HASKELL__ >= 704
2{-# LANGUAGE Unsafe #-}
4{-# LANGUAGE Unsafe #-}
5+#endif
3
6
4{-# OPTIONS_HADDOCK hide #-}
7{-# OPTIONS_HADDOCK hide #-}
5
8
uuid-types/tests/TestUUID.hs−7
@@ -1,5 +1,4 @@
1{-# LANGUAGE ViewPatterns #-}
1{-# LANGUAGE ViewPatterns #-}
2−{-# LANGUAGE TemplateHaskell #-}
3
2
4{-# OPTIONS_GHC -fno-warn-orphans #-}
3{-# OPTIONS_GHC -fno-warn-orphans #-}
5
4
@@ -41,11 +40,6 @@ test_nil = testGroup "nil" [
41 testCase "nil bytes" $ U.toByteString U.nil @?= BL.pack (replicate 16 0)
40 testCase "nil bytes" $ U.toByteString U.nil @?= BL.pack (replicate 16 0)
42 ]
41 ]
43
42
44−test_lift :: Test
45−test_lift = testCase "TH.Lift" $ do
46− let uuid = U.fromWords64 123456789 987654321
47− uuid @?= $( [| uuid |] )
48−
49test_conv :: Test
43test_conv :: Test
50test_conv = testGroup "conversions" [
44test_conv = testGroup "conversions" [
51 testCase "conv bytes to string" $
45 testCase "conv bytes to string" $
@@ -182,7 +176,6 @@ main = do
182 [ [
176 [ [
183 test_null,
177 test_null,
184 test_nil,
178 test_nil,
185− test_lift,
186 test_conv,
179 test_conv,
187 test_fromByteString,
180 test_fromByteString,
188 test_fromWords,
181 test_fromWords,
uuid-types/uuid-types.cabal+21−28
@@ -1,7 +1,6 @@
1cabal-version: 1.12
1cabal-version: 1.12
2name: uuid-types
2name: uuid-types
3−version: 1.0.6
3+version: 1.0.4
4−x-revision: 2
5copyright:
4copyright:
6 (c) 2017-2018 Herbert Valerio Riedel
5 (c) 2017-2018 Herbert Valerio Riedel
7 (c) 2008-2014 Antoine Latter
6 (c) 2008-2014 Antoine Latter
@@ -13,16 +12,16 @@ license-file: LICENSE
13category: Data
12category: Data
14build-type: Simple
13build-type: Simple
15tested-with:
14tested-with:
16− GHC ==8.6.5
15+ GHC ==7.4.2
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
17 || ==8.8.4
23 || ==8.8.4
18− || ==8.10.7
24+ || ==8.10.3
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
26
25
27synopsis: Type definitions for Universally Unique Identifiers
26synopsis: Type definitions for Universally Unique Identifiers
28description:
27description:
@@ -46,14 +45,13 @@ source-repository head
46
45
47library
46library
48 build-depends:
47 build-depends:
49− base >=4.12.0.0 && <5
48+ base >=4.5 && <5
50− , binary >=0.8.6.0 && <0.9
49+ , binary >=0.5.1.0 && <0.9
51− , bytestring >=0.10.8.2 && <0.13
50+ , bytestring >=0.9.2.1 && <0.12
52− , deepseq >=1.4.4.0 && <1.6
51+ , deepseq >=1.3.0.0 && <1.5
53− , hashable >=1.4.4.0 && <1.6
52+ , hashable >=1.2.7.0 && <1.4
54− , random >=1.2.1.2 && <1.3
53+ , random >=1.1 && <1.3
55− , template-haskell >=2.14.0.0 && <2.24
56− , text >=1.2.3.0 && <1.3 || >=2.0 && <2.2
54+ , text >=1.2.3.0 && <1.3
57
55
58 exposed-modules: Data.UUID.Types
56 exposed-modules: Data.UUID.Types
59
57
@@ -77,23 +75,18 @@ test-suite testuuid
77 default-language: Haskell2010
75 default-language: Haskell2010
78 other-extensions: ViewPatterns
76 other-extensions: ViewPatterns
79 ghc-options: -Wall
77 ghc-options: -Wall
80− if impl(ghc >= 8.10)
81− ghc-options: -Wunused-packages
82
78
83 -- inherited constraints
79 -- inherited constraints
84 build-depends:
80 build-depends:
85 base
81 base
86 , binary
82 , binary
87 , bytestring
83 , bytestring
88− , template-haskell
89 , uuid-types
84 , uuid-types
90
85
91 -- deps w/o inherited constraints
86 -- deps w/o inherited constraints
92 build-depends:
87 build-depends:
88+ ghc-byteorder >=4.11 && <4.12
93− QuickCheck >=2.14.2 && <2.16
89+ , QuickCheck >=2.14.2 && <2.15
94− , tasty >=1.4.0.1 && <1.6
90+ , tasty >=1.4.0.1 && <1.5
95 , tasty-hunit >=0.10 && <0.11
91 , tasty-hunit >=0.10 && <0.11
96− , tasty-quickcheck >=0.10 && <0.12
92+ , tasty-quickcheck >=0.10 && <0.11
97−
98− if !impl(ghc >=8.4)
99− build-depends: ghc-byteorder >=4.11 && <4.12
uuid/CHANGES.md−8
@@ -1,11 +1,3 @@
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−
91.3.14
11.3.14
10
2
11- Use more compact heap object representation which saves 16 bytes on 64bit platforms.
3- Use more compact heap object representation which saves 16 bytes on 64bit platforms.
uuid/src/Data/UUID.hs+3
@@ -18,6 +18,9 @@ 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+
21* For name-based generation of UUIDs using SHA-1 hashing see
24* For name-based generation of UUIDs using SHA-1 hashing see
22"Data.UUID.V5".
25"Data.UUID.V5".
23-}
26-}
uuid/src/Data/UUID/Util.hs+11
@@ -3,6 +3,7 @@ module Data.UUID.Util (
3 UnpackedUUID(..)
3 UnpackedUUID(..)
4 , unpack, pack
4 , unpack, pack
5 , version
5 , version
6+ , extractMac
6 , extractTime
7 , extractTime
7 , setTime
8 , setTime
8 ) where
9 ) where
@@ -12,6 +13,7 @@ import Data.Word
12import Data.Word.Util
13import Data.Word.Util
13import Data.Bits
14import Data.Bits
14import Data.UUID.Types.Internal
15import Data.UUID.Types.Internal
16+import Network.Info
15import Data.Int (Int64)
17import Data.Int (Int64)
16
18
17version :: UUID -> Int
19version :: UUID -> Int
@@ -40,3 +42,12 @@ extractTime uuid =
40
42
41timeAndVersionToTime :: Word16 -> Word16
43timeAndVersionToTime :: Word16 -> Word16
42timeAndVersionToTime tv = tv .&. 0x0FFF
44timeAndVersionToTime 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.hsnew file+135
@@ -0,0 +1,135 @@
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+4−5
@@ -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 pseudo-random generator.
14+ These UUIDs are generated from a pseddo-random generator.
15− We use the 'getEntropy' method from the <https://hackage.haskell.org/package/entropy entropy> package,
15+ We use 'getEntropy' method from <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,9 +23,8 @@ 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.
26+-- | Generate a crytographically secure, random UUID. Introduced in version
27−--
28−-- @since 1.2.6
27+-- 1.2.6.
29nextRandom :: IO UUID
28nextRandom :: IO UUID
30nextRandom = do
29nextRandom = do
31 [b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf]
30 [b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf]
uuid/tests/TestUUID.hs+20−4
@@ -1,15 +1,18 @@
1{-# LANGUAGE ViewPatterns #-}
1{-# LANGUAGE ViewPatterns #-}
2
2
3+import Control.Monad (replicateM)
3import Data.Bits
4import Data.Bits
4import qualified Data.ByteString.Lazy as BL
5import qualified Data.ByteString.Lazy as BL
5import Data.Char (ord)
6import Data.Char (ord)
7+import Data.List (nub, (\\))
6import Data.Maybe
8import Data.Maybe
7import Data.Word
9import Data.Word
8import qualified Data.UUID as U
10import qualified Data.UUID as U
11+import qualified Data.UUID.V1 as U
9import qualified Data.UUID.V3 as U3
12import qualified Data.UUID.V3 as U3
10import qualified Data.UUID.V5 as U5
13import qualified Data.UUID.V5 as U5
11
14
12−import Test.QuickCheck ( Arbitrary(arbitrary) )
15+import Test.QuickCheck ( Arbitrary(arbitrary), choose )
13import Test.Tasty ( TestTree, testGroup, defaultMain )
16import Test.Tasty ( TestTree, testGroup, defaultMain )
14import Test.Tasty.HUnit
17import Test.Tasty.HUnit
15 ( assertBool, (@?=), testCase )
18 ( assertBool, (@?=), testCase )
@@ -21,13 +24,13 @@ isValidVersion :: Int -> U.UUID -> Bool
21isValidVersion v u = lenOK && variantOK && versionOK
24isValidVersion v u = lenOK && variantOK && versionOK
22 where bs = U.toByteString u
25 where bs = U.toByteString u
23 lenOK = BL.length bs == 16
26 lenOK = BL.length bs == 16
24− variantOK = BL.index bs 8 .&. 0xc0 == 0x80
27+ variantOK = (BL.index bs 8) .&. 0xc0 == 0x80
25− versionOK = BL.index bs 6 .&. 0xf0 == fromIntegral (v `shiftL` 4)
28+ versionOK = (BL.index bs 6) .&. 0xf0 == fromIntegral (v `shiftL` 4)
26
29
27
30
28instance Arbitrary U.UUID where
31instance Arbitrary U.UUID where
29 -- the UUID random instance ignores bounds
32 -- the UUID random instance ignores bounds
30− arbitrary = pure U.nil
33+ arbitrary = choose (U.nil, U.nil)
31
34
32
35
33test_null :: Test
36test_null :: Test
@@ -35,6 +38,17 @@ test_null =
35 testCase "namespaceDNS is not null" $
38 testCase "namespaceDNS is not null" $
36 assertBool "" (not $ U.null U3.namespaceDNS)
39 assertBool "" (not $ U.null U3.namespaceDNS)
37
40
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+
38test_v3 :: Test
52test_v3 :: Test
39test_v3 =
53test_v3 =
40 testCase "V3 computation" $
54 testCase "V3 computation" $
@@ -79,11 +93,13 @@ prop_v5Valid = testProperty "V5 valid" v5Valid
79
93
80main :: IO ()
94main :: IO ()
81main = do
95main = do
96+ v1s <- replicateM 100 U.nextUUID
82 defaultMain $
97 defaultMain $
83 testGroup "tests" $
98 testGroup "tests" $
84 concat $
99 concat $
85 [ [
100 [ [
86 test_null,
101 test_null,
102+ test_v1 v1s,
87 test_v3,
103 test_v3,
88 test_v5
104 test_v5
89 ]
105 ]
uuid/uuid.cabal+25−22
@@ -1,7 +1,6 @@
1cabal-version: 1.12
1cabal-version: 1.12
2name: uuid
2name: uuid
3−version: 1.3.16
3+version: 1.3.14
4−x-revision: 2
5copyright: (c) 2008-2014 Antoine Latter
4copyright: (c) 2008-2014 Antoine Latter
6author: Antoine Latter
5author: Antoine Latter
7maintainer: Oleg Grenrus <oleg.grenrus@iki.fi>
6maintainer: Oleg Grenrus <oleg.grenrus@iki.fi>
@@ -10,16 +9,16 @@ license-file: LICENSE
10category: Data
9category: Data
11build-type: Simple
10build-type: Simple
12tested-with:
11tested-with:
13− GHC ==8.6.5
12+ GHC ==7.4.2
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
14 || ==8.8.4
20 || ==8.8.4
15− || ==8.10.7
21+ || ==8.10.3
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
23
22
24synopsis:
23synopsis:
25 For creating, comparing, parsing and printing Universally Unique Identifiers
24 For creating, comparing, parsing and printing Universally Unique Identifiers
@@ -41,19 +40,26 @@ source-repository head
41
40
42library
41library
43 build-depends:
42 build-depends:
44− base >=4.12 && <5
43+ base >=4.5 && <5
45− , binary >=0.8.6.0 && <0.9
44+ , binary >=0.5.1.0 && <0.9
46− , bytestring >=0.10.8.2 && <0.13
45+ , bytestring >=0.9.2.1 && <0.12
47 , cryptohash-md5 >=0.11.100 && <0.12
46 , cryptohash-md5 >=0.11.100 && <0.12
48 , cryptohash-sha1 >=0.11.100 && <0.12
47 , cryptohash-sha1 >=0.11.100 && <0.12
49 , entropy >=0.3.7 && <0.5
48 , entropy >=0.3.7 && <0.5
49+ , network-info >=0.2 && <0.3
50+ , random >=1.1 && <1.3
51+ , text >=1.2.3.0 && <1.3
52+ , time >=1.4 && <1.12
50
53
51 -- strict dependency on uuid-types,
54 -- strict dependency on uuid-types,
52 -- as we re-rexport datatype, thus leak instances etc.
55 -- as we re-rexport datatype, thus leak instances etc.
53− build-depends: uuid-types >=1.0.6 && <1.0.7
56+ build-depends:
57+ uuid-types >=1.0.4 && <1.0.5
58+
54 exposed-modules:
59 exposed-modules:
55 Data.UUID
60 Data.UUID
56 Data.UUID.Util
61 Data.UUID.Util
62+ Data.UUID.V1
57 Data.UUID.V3
63 Data.UUID.V3
58 Data.UUID.V4
64 Data.UUID.V4
59 Data.UUID.V5
65 Data.UUID.V5
@@ -66,8 +72,6 @@ library
66 default-extensions: DeriveDataTypeable
72 default-extensions: DeriveDataTypeable
67 other-extensions: TypeFamilies
73 other-extensions: TypeFamilies
68 ghc-options: -Wall
74 ghc-options: -Wall
69− if impl(ghc >= 8.10)
70− ghc-options: -Wunused-packages
71 hs-source-dirs: src
75 hs-source-dirs: src
72
76
73test-suite testuuid
77test-suite testuuid
@@ -78,18 +82,17 @@ test-suite testuuid
78 default-extensions: DeriveDataTypeable
82 default-extensions: DeriveDataTypeable
79 other-extensions: ViewPatterns
83 other-extensions: ViewPatterns
80 ghc-options: -Wall -fno-warn-orphans
84 ghc-options: -Wall -fno-warn-orphans
81− if impl(ghc >= 8.10)
82− ghc-options: -Wunused-packages
83
85
84 -- inherited constraints
86 -- inherited constraints
85 build-depends:
87 build-depends:
86 base
88 base
87 , bytestring
89 , bytestring
90+ , random
88 , uuid
91 , uuid
89
92
90 -- deps w/o inherited constraints
93 -- deps w/o inherited constraints
91 build-depends:
94 build-depends:
92− QuickCheck >=2.14.2 && <2.16
95+ QuickCheck >=2.14.2 && <2.15
93− , tasty >=1.4.0.1 && <1.6
96+ , tasty >=1.4.0.1 && <1.5
94 , tasty-hunit >=0.10 && <0.11
97 , tasty-hunit >=0.10 && <0.11
95− , tasty-quickcheck >=0.10 && <0.12
98+ , tasty-quickcheck >=0.10 && <0.11