on 13540a1 help sign in
129 files changed+12101−13049
since splitsnapshots
unifiedsplit
.dir-locals.el−3 .dockerignore−10 .github/PULL_REQUEST_TEMPLATE.md−22 .github/workflows/check.yml−21 .github/workflows/image.yml−26 .gitignore+25−9 CODE_OF_CONDUCT.md−3 CURATORS.md−594 DATA-FLOW.md−129 Dockerfile−15 MAINTAINERS.md−257 README.md+67−127 ROADMAP.md+61 etc/commenter/latest-version/Setup.hs → Setup.hs Stackage/Build.hs+116 Stackage/BuildPlan.hs+186 Stackage/CheckCabalVersion.hs+27 Stackage/CheckPlan.hs+73 Stackage/Config.hs+838 Stackage/GhcPkg.hs+49 Stackage/Init.hs+32 Stackage/InstallInfo.hs+211 Stackage/LoadDatabase.hs+264 Stackage/ModuleNameConflict.hs+52 Stackage/NarrowDatabase.hs+54 Stackage/Select.hs+173 Stackage/ServerFiles.hs+104 Stackage/Tarballs.hs+45 Stackage/Test.hs+298 Stackage/Types.hs+165 Stackage/Util.hs+174 Stackage2/BuildConstraints.hs+194 Stackage2/BuildPlan.hs+203 Stackage2/CheckBuildPlan.hs+107 Stackage2/CompleteBuild.hs+190 Stackage2/CorePackages.hs+53 Stackage2/GithubPings.hs+34 Stackage2/PackageDescription.hs+200 Stackage2/PackageIndex.hs+127 Stackage2/PerformBuild.hs+398 Stackage2/Prelude.hs+104 Stackage2/ServerBundle.hs+107 Stackage2/UpdateBuildPlan.hs+51 Stackage2/Upload.hs+260 allowed.txt+5557 app/lts-major-bump.hs+4 app/lts-minor-bump.hs+4 app/stackage-nightly.hs+4 app/stackage.hs+148 automated/.gitignore−2 automated/build.sh−158 automated/dockerfiles/README.md−33 automated/dockerfiles/build.sh−177 automated/dockerfiles/lts-10.0/Dockerfile−67 automated/dockerfiles/lts-10.1/Dockerfile−3 automated/dockerfiles/lts-10.5/Dockerfile−3 automated/dockerfiles/lts-11.0/Dockerfile−67 automated/dockerfiles/lts-11.22/Dockerfile−3 automated/dockerfiles/lts-11.6/Dockerfile−3 automated/dockerfiles/lts-12.0/Dockerfile−69 automated/dockerfiles/lts-12.13/Dockerfile−3 automated/dockerfiles/lts-12.15/Dockerfile−14 automated/dockerfiles/lts-12.21/Dockerfile−3 automated/dockerfiles/lts-12.26/Dockerfile−89 automated/dockerfiles/lts-13.0/Dockerfile−69 automated/dockerfiles/lts-13.12/Dockerfile−93 automated/dockerfiles/lts-13.20/Dockerfile−93 automated/dockerfiles/lts-13.25/Dockerfile−3 automated/dockerfiles/lts-13.27/Dockerfile−9 automated/dockerfiles/lts-13.3/Dockerfile−10 automated/dockerfiles/lts-14.0/Dockerfile−89 automated/dockerfiles/lts-14.0/Dockerfile.sub−89 automated/dockerfiles/lts-15.0/Dockerfile−89 automated/dockerfiles/lts-15.10/Dockerfile−3 automated/dockerfiles/lts-15.5/Dockerfile−89 automated/dockerfiles/lts-16.0/Dockerfile−90 automated/dockerfiles/lts-16.12/Dockerfile−90 automated/dockerfiles/lts-16.8/Dockerfile−3 automated/dockerfiles/lts-17.0/Dockerfile−90 automated/dockerfiles/lts-17.10/Dockerfile−3 automated/dockerfiles/lts-17.3/Dockerfile−90 automated/dockerfiles/lts-18.0/Dockerfile−90 automated/dockerfiles/lts-18.7/Dockerfile−90 automated/dockerfiles/lts-9.0/Dockerfile−55 automated/dockerfiles/lts-9.20/Dockerfile−3 automated/dockerfiles/lts-9.21/Dockerfile−3 automated/run-nightly.sh−11 become-a-curator.md−44 build-constraints.yaml−8048 cabal.config+830 check−14 commenter−20 debian-bootstrap.sh+31−325 etc/check.sh−28 etc/commenter/.gitignore−3 etc/commenter/Cargo.lock−365 etc/commenter/Cargo.toml−14 etc/commenter/README.md−3 etc/commenter/commenter−2 etc/commenter/latest-version/LICENSE−30 etc/commenter/latest-version/README.md−1 etc/commenter/latest-version/cabal.project−6 etc/commenter/latest-version/latest-version.cabal−23 etc/commenter/latest-version/src/Main.hs−28 etc/commenter/latest-version/stack.yaml−4 etc/commenter/latest-version/stack.yaml.lock−13 etc/commenter/src/lib.rs−574 etc/commenter/src/main.rs−171 etc/curator-exes/.gitignore−1 etc/curator-exes/Dockerfile−13 etc/curator-exes/README.md−5 etc/curator-exes/run.sh−11 etc/curator-exes/stack.yaml−22 etc/diskspace/clean-old-stack-libs.sh−13 etc/diskspace/remove-old-stack-work-libs.hs−57 full-run.sh+6 jenkins-build.sh+22 jenkins-nightly.sh+5 patching/.gitignore+2 patching/scripts/create-patches.sh+25 patching/scripts/create-tarballs.sh+31 patching/scripts/edit-package.sh+6 stackage-upload.hs+176 stackage.cabal+132 test/Spec.hs+1 test/Stackage2/BuildPlanSpec.hs+35 test/Stackage2/CorePackagesSpec.hs+19 test/Stackage2/PackageIndexSpec.hs+21 verify-package−47
.dir-locals.eldeleted−3
@@ -1,3 +0,0 @@
1−((haskell-mode . ((haskell-process-type . cabal-repl)
2− (haskell-indent-spaces . 4)
3− (hindent-style . "johan-tibell"))))
.dockerignoredeleted−10
@@ -1,10 +0,0 @@
1−dist
2−builds
3−logs
4−.cabal-sandbox
5−cabal.sandbox.config
6−tarballs
7−*.yaml
8−.git
9−automated
10−.github
.github/PULL_REQUEST_TEMPLATE.mddeleted−22
@@ -1,22 +0,0 @@
1−Checklist:
2−- [ ] Meaningful commit message, eg `add my-cool-package` (please don't mention `build-constraints.yml`)
3−- [ ] At least 30 minutes have passed since uploading to Hackage
4−- [ ] On your own machine, you have successfully run the following command (find verify-package in the root of this repo):
5−
6− ./verify-package $package # or $package-$version
7−
8−The script runs virtually the following commands in a clean directory:
9−
10− stack unpack $package-$version # `-$version` is optional
11− cd $package-$version
12− rm -f stack.yaml && stack init --resolver nightly --ignore-subdirs
13− stack build --resolver nightly --haddock --test --bench --no-run-benchmarks
14−
15−
16−### CI
17−
18−Our CI tries to line up build-constraints.yaml with the current state
19−of Hackage. This means that failures that are unrelated to your PR may
20−cause the check to fail. If you think a failure is unrelated you can
21−simply ignore it and the Curators will let you know if there is
22−anything you need to do.
.github/workflows/check.ymldeleted−21
@@ -1,21 +0,0 @@
1−name: check
2−on:
3− push:
4− branches: [ master ]
5− pull_request:
6− branches: [ master ]
7−jobs:
8− build:
9− runs-on: ubuntu-latest
10− name: Stackage check
11− steps:
12− - uses: actions/checkout@v2
13− - uses: actions/cache@v2
14− with:
15− path: |
16− ~/.stack
17− ~/.stackage/curator/cache
18− key: ${{ runner.os }}-stackage-nightly-${{ hashFiles('**/build-constraints.yaml') }}
19− restore-keys: |
20− ${{ runner.os }}-
21− - run: etc/check.sh
.github/workflows/image.ymldeleted−26
@@ -1,26 +0,0 @@
1−name: image
2−
3−on:
4− push:
5− branches:
6− - nightly
7− - lts18
8−
9−jobs:
10− push:
11− runs-on: ubuntu-latest
12− if: github.event_name == 'push'
13−
14− steps:
15− - uses: actions/checkout@v2
16−
17− - name: Log into Github registry
18− run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login docker.pkg.github.com -u ${{ github.actor }} --password-stdin
19−
20− - name: Build image
21− run: |
22− IMAGE_ID=docker.pkg.github.com/${{ github.repository }}/build:${GITHUB_REF#refs/heads/}
23− #IMAGE_ID=${{ github.repository }}:${GITHUB_REF#refs/heads/}
24− docker build . -f Dockerfile --tag $IMAGE_ID
25− docker push $IMAGE_ID
26− echo Pushed new build image $IMAGE_ID
.gitignore+25−9
@@ -1,10 +1,26 @@
1−/builds/
2−/logs/
3−nightly-*.yaml
4−lts-*.yaml
1+dist
2+cabal-dev
3+*.o
4+*.hi
5+*.chi
6+*.chs.h
7+.virthualenv
58*.swp
6−check-plan.yaml
7−*~
8−/constraints.yaml
9−/snapshot.yaml
10−/snapshot-incomplete.yaml
9+/runtests/
10+/build-plan.log
11+/build.log
12+/logs/
13+/sandbox/
14+/build-tools.log
15+/logs-tools/
16+build-plan.txt
17+build-plan.csv
18+hackage-map.txt
19+module-name-conflicts.txt
20+/exclusive
21+/inclusive
22+*.stackage
23+/haddock/
24+/build-summary/
25+/.cabal-sandbox/
26+cabal.sandbox.config
CODE_OF_CONDUCT.mddeleted−3
@@ -1,3 +0,0 @@
1−We use the [Haskell Foundation's Guidelines For Respectful
2−Communication](https://haskell.foundation/guidelines-for-respectful-communication/)
3−as our Code of Conduct.
CURATORS.mddeleted−594
@@ -1,594 +0,0 @@
1−This is a collection of instructions covering the processes that the Stackage curators - the
2−team who maintain the Stackage project itself - should be doing on a regular basis.
3−Curation activities are mostly automated, and do not take up a significant amount of time.
4−The following is the current list of curators, in alphabetical order:
5−
6−* Adam Bergmark (@bergmark)
7−* Alexey Zabelin (@alexeyzab)
8−* Chris Dornan (@cdornan)
9−* Dan Burton (@danburton)
10−* Jens Petersen (@juhp)
11−* Joe Kachmar (@jkachmar)
12−* Michael Snoyman (@snoyberg)
13−* Mihai Maruseac (@mihaimaruseac)
14−
15−## Workflow overview
16−
17−This section sketches out at a high level how the entire Stackage build/curation
18−process works:
19−
20−* [build-constraints.yaml](https://github.com/commercialhaskell/stackage/blob/master/build-constraints.yaml) specifies packages to be included in Stackage
21−* [curator](https://github.com/commercialhaskell/curator) combines build-constraints.yaml with the current state of Hackage to create a build plan for a Stackage Nightly
22−* `curator` can check that build plan to ensure all version bounds are consistent
23− * The [Travis job](https://github.com/commercialhaskell/stackage/blob/master/.travis.yml) performs these two steps to provide immediate feedback on pull requests
24−* Docker Hub [builds](https://github.com/commercialhaskell/stackage/blob/master/Dockerfile) a [Docker image](https://hub.docker.com/r/commercialhaskell/stackage/) for running builds
25−* The stackage-build server (described below) is able to run automated builds using the [build.sh script](https://github.com/commercialhaskell/stackage/blob/master/automated/build.sh)
26−* When a new Nightly build is completed, it is uploaded to [the nightly repo](https://github.com/commercialhaskell/stackage-nightly)
27−* Once a week, we run an LTS minor bump. Instead of using build-constraints.yaml, that job takes the previous LTS release, turns it into constraints, and then bumps the version numbers to the latest on Hackage, in accordance with the version bounds in the build plan. This plans are uploaded to [the LTS repo](https://github.com/commercialhaskell/lts-haskell)
28−* Cutting a new LTS major release is essentially just a Stackage Nightly that gets rebuilt and uploaded as an LTS
29−
30−## Pull requests
31−
32−The typical story on pull requests is: If Travis accepts it and the
33−author only added packages under his/her own name, merge it. If the
34−build later fails (see [Adding Debian packages]), then block the
35−package until it's fixed.
36−
37−[Adding Debian packages]: https://github.com/commercialhaskell/stackage/blob/master/CURATORS.md#adding-debian-packages-for-required-system-tools-or-libraries
38−
39−If benchmarks, haddocks, or test suites fails at this point we
40−typically also block the package until these issues are fixed. This in
41−order to add packages with a clean slate.
42−
43−Optionally we can check if packdeps says the package is up to date.
44−Visit http://packdeps.haskellers.com/feed?needle=<package-name>
45−
46−Builds may fail because of unrelated bounds changes. If this happens,
47−first add any version bounds to get master into a passing state (see
48−"Fixing bounds issues"), then re-run the travis build.
49−
50−A common issue is that authors submit newly uploaded packages, it can
51−take up to an hour before this has synced across the stack
52−infrastructure. You can usually compare the versions of the package in
53−https://github.com/commercialhaskell/all-cabal-metadata/tree/master/packages/
54−to what's on hackage to see if this is the case. Wait an hour and
55−re-run the pull request.
56−
57−Tests also commonly fail due to missing test files, and sometimes due
58−to doctest limitations. You can point the maintainer to
59−https://github.com/bergmark/blog/blob/master/2016/package-faq.md
60−
61−## Fixing bounds issues
62−
63−The most common activity you'll deal with in Stackage curation is a version
64−bound issue, usually a restrictive upper bound. You fix this by opening an
65−issue on the Stackage repo about the problem, and modifying the
66−build-constraints.yaml file to work around it in one of the ways below. Be sure
67−to refer to the issue for workarounds added to that file.
68−
69−### Temporary upper bounds
70−
71−Most common technique, just prevent a new version of a library from
72−being included immediately. This also applies to when only benchmarks
73−and tests are affected.
74−
75−* Copy the `curator` output and create a new issue, see e.g
76−https://github.com/commercialhaskell/stackage/issues/2108
77−
78−* Add a new entry under the "stackage upper bounds" section of `build-constraints.yaml`. For the above example it would be
79−
80−```yaml
81− "Stackage upper bounds":
82− # https://github.com/commercialhaskell/stackage/issues/2108
83− - pipes < 4.3.0
84−```
85−
86−* Commit (message e.g. "Upper bound for #2108")
87−* Optionally: Verify with `./check` locally
88−* Push
89−* Verify that everything works on the build server (you can restart the build or wait for it to to run again)
90−
91−Sometimes releases for different packages are tightly coupled. Then it
92−can make sense to combine them into one issue, as in
93−https://github.com/commercialhaskell/stackage/issues/2143.
94−
95−If a dependency that is not explicitly in stackage is causing test or
96−benchmark failures you can skip or expect them to fail (see "Skipping
97−tests and benchmarks" and "Expecting test/benchmark/haddock
98−failures"). Bonus points for reporting this upstream to that packages'
99−maintainer.
100−
101−### Lifting upper bounds
102−
103−You can try this when you notice that a package has been updated. You
104−can also periodically try to lift bounds (I think it's good to do this
105−at the start of your week /@bergmark)
106−
107−If not all packages have been updated check if any of them are missing
108−from the original issue and if so add a new comment mentioning them. A
109−new package may appear if its dependencies were part of this issue but
110−have been updated since the last time we checked. We want to give
111−these new packages ample time to be upgraded.
112−
113−If `curator` is happy commit the change ("Remove upper bounds
114−and close #X"). After doing this the next nightly build may fail
115−because some packages didn't have an upper bound in place, but
116−compilation failed. In this case revert the previous commit so any
117−disabled packages are enabled again, re-open the issue, and add a new
118−comment with the failing packages. This is to give all maintainers
119−enough time to upgrade for this case as well.
120−
121−### Amending upper bounds
122−
123−With the `pipes` example above there was later a new release of
124−`pipes-safe` that required the **newer** version of `pipes`. You can
125−add that package to the same upper bounds section,
126−(e.g. https://github.com/commercialhaskell/stackage/commit/6429b1eb14db3f2a0779813ef2927085fa4ad673)
127−as we want to lift them simultaneously.
128−
129−### Skipping tests and benchmarks
130−
131−Sometimes tests and benchmark dependencies are forgotten or not cared
132−for. To disable compilation for them add them to `skipped-tests` or
133−`skipped-benchmarks`. If a package is added to these sections they
134−won't be compiled, and their dependencies won't be taken into account.
135−
136−There are sub sections under these headers that is used to group types
137−of failures together, and also to document what type of failures
138−exist.
139−
140−### Expecting test/benchmark/haddock failures
141−
142−The difference from the `skipped` sections is that items listed here
143−are compiled and their dependencies are taken into account
144−(but they are allowed to fail to build).
145−These sections also have subsections with groups and descriptions.
146−
147−One big category of test suites in this section are those requiring
148−running services. We don't want to run those, but we do want to check
149−dependencies and compile them.
150−
151−If there are no version bounds that would fix the issue or if you
152−can't figure it out, file it
153−(e.g. https://github.com/commercialhaskell/stackage/issues/2133) to ask the
154−maintainer for help.
155−
156−### Waiting for new releases
157−
158−Sometimes there is a failure reported on a (now possibly closed) issue
159−on an external tracker. If an issue gets resolved but there is no
160−hackage release yet we'd like to get notified when it's uploaded.
161−
162−Add the package with its current version to the
163−`tell-me-when-its-released` section. This will cause the build to stop
164−when the new version is out.
165−
166−### Excluding packages
167−
168−In an extreme case of a non-responsive maintainer, you can remove the
169−package entirely from Stackage. We try to avoid that whenever
170−possible.
171−
172−This typically happens when we move to a new major GHC release or when
173−there are only a few packages waiting for updates on an upper bounds
174−issue.
175−
176−If a package needs to be disabled due to build failures: Add a `< 0`
177−bound to the package to exclude it, and add a comment stating why it
178−was disabled: `- swagger < 0 # compile failure againts aeson 1.0`
179−
180−If a package needs to be disabled due to bounds issues, see the "Large
181−scale enabling/disabling of packages" section below.
182−
183−If this causes reverse dependencies to be disabled we should notify
184−the maintainers of those packages.
185−
186−
187−## Updating the content of the Docker image used for building
188−
189−### Adding Debian packages for required system tools or libraries
190−Additional (non-Haskell) system libraries or tools should be added to `stackage/debian-bootstrap.sh`.
191−After you've committed those changes, merging them into the `nightly` branch should
192−trigger a DockerHub build. Simply run:
193−
194−```bash
195− $ git checkout nightly
196− $ git merge master
197− $ git push
198−```
199−
200−Use [Ubuntu Package content search](http://packages.ubuntu.com/) to determine which package provides particular dev files (it defaults to xenial which is the version used to build Nightly).
201−
202−Note that we generally don't install/run services needed for testsuites in the docker images - packages with tests requiring some system service can be added to `expected-test-failures`.
203−It's good to inform the maintainer of any disabled tests (commenting in the PR is sufficient).
204−
205−If a new package fails to build because of missing system libraries we often ask the maintainer to help figure out what to install.
206−
207−### Upgrading GHC version
208−The Dockerfile contains information on which GHC versions should be used. You
209−can modify it and push it to Github to trigger a build. The nightly
210−branch is used for nightlies. For LTSes, we use the ltsX branch, where X is the
211−major version number (e.g., lts3 for lts-3.\*).
212−
213−Update the `Win32` version in `build-constraints.yaml` under "GHC upper bounds".
214−
215−Note that when starting a new LTS major release, you'll need to modify `.github/workflows/image.yml` to add a new lts branch.
216−
217−Update `GHCVER` in `Dockerfile`. (This env var automatically gets passed to `debian-bootstrap.sh`.)
218−
219−Ensure that the [global-hints.yaml
220−file](https://github.com/fpco/stackage-content/blob/master/stack/global-hints.yaml)
221−is updated with information on the latest GHC release by cloning that
222−repo and running `./update-global-hints.hs ghc-X.Y.Z`.
223−
224−If enountering an error like the following, this means that the Stack metadata
225−has not yet been updated, so wait some time until this happens:
226−
227−```
228−This probably means a GHC bindist has not yet been added for OS key 'linux64', 'linux64-ncurses6', 'linux64-tinfo6'.
229−Supported versions: ...
230−update-global-hints.hs: Received ExitFailure 1 when running
231−```
232−
233−Also required to build an LTS minor bump with a ghc version change: On the build server, modify `/var/stackage/stackage/automated/work/lts-$THIS_LTS_MAJOR_VER/constraints.yaml` and update the ghc-version. (You may need to update sibling files as well.) Then run `NOPLAN=1 /var/stackage/stackage/automated/build.sh lts-$THIS_LTS_MINOR_BUMP` to build the LTS.
234−
235−### Getting the new image to the build server
236−Once a new Docker image is available, you'll need to pull it onto the stackage-build server (see
237−below). Instead of pulling an unbounded number of images, I typically just
238−delete all of the old images and let the new ones get downloaded:
239−
240−```
241−docker rm $(docker ps -a -q)
242−docker rmi $(docker images -q)
243−```
244−
245−but `docker pull ghcr.io/commercialhaskell/stackage/build:nightly` can also be run instead just to update the nightly image say.
246−
247−For a new GHC version you should also delete the ~~cache~~ .stack-work snapshot install directories on the stackage-build server to
248−~~force all packages to be rebuilt~~ clear up some space. See: [issue#746](https://github.com/commercialhaskell/stackage/issues/746). Eg:
249−
250−```
251−# for example
252−SNAP_SERIES=nightly # or lts16
253−OLD_GHCVER=8.10.1
254−rm -r work/$SNAP_SERIES/unpack-dir/.stack-work/install/x86_64-linux/*/$OLD_GHCVER/
255−```
256−This should also be done when moving the Nightly docker image to a new version of Ubuntu.
257−
258−If you're impatient and would like to build the Docker image on the
259−build server instead of waiting for Docker Hub, you can run the
260−following command (replacing `BRANCH=nightly` if the image for a different branch is desired):
261−
262−```
263−BRANCH=nightly
264−DIR=$(mktemp -d)
265−(cd $DIR \
266− && git clone https://github.com/commercialhaskell/stackage \
267− && cd stackage \
268− && git checkout $BRANCH \
269− && docker build --tag commercialhaskell/stackage:$BRANCH .)
270−rm -rf $DIR
271−```
272−
273−Note that we do a clean clone of the `stackage` repo instead of using
274−the existing checkout because of how `docker build` works: it will
275−send the entire local directory contents as context to the Docker
276−daemon, which in the case of the build tree is a _lot_ of content. (We
277−can discuss the wisdom&mdash;or lack thereof&mdash;of Docker's
278−approach separately.)
279−
280−## stackage-build server
281−
282−You'll need to get your SSH public key added to the machine. ~/.ssh/config info:
283−
284−```
285−Host stackage-build
286− User curators
287− Hostname build.stackage.org
288−```
289−
290−### Running the build script
291−
292−We currently run the builds manually so make it easy to see when there are
293−bounds issues that need to be corrected. Automated this would be even better,
294−we're just not there yet.
295−
296−```
297−# Run a nightly build
298−/var/stackage/stackage/automated/run-nightly.sh
299−
300−# Run an LTS minor bump
301−/var/stackage/stackage/automated/build.sh lts-15.1
302−
303−# Run an LTS major bump
304−/var/stackage/stackage/automated/build.sh lts-16.0
305−```
306−
307−Recommended: run these from inside a `tmux` session. If you get version bound
308−problems on nightly or LTS major, you need to fix build-constraints.yaml (see
309−info above).
310−
311−### Building LTS minor releases
312−Before running the build, please make sure that the Dockerfile in `automated/dockerfiles/lts-X.Y` is up to date, where X is the major version that you're building and Y is the latest minor version of X for which a Dockerfile exists.
313− * If any changes need to be made, (eg, new GHC version), copy `automated/lts-X.Y/Dockerfile` to `automated/lts-X.Z/Dockerfile`, where Z is the minor version you're building, and include the new changes.
314− * If you are building the first release of a new LTS major version, create a new `lts-X.Z/Dockerfile` based on the previous LTS's, and adjust the variables at the top to match the requirements of the snapshot. Ensure that `STACK_VERSION` is the latest release of Stack, and `BOOTSTRAP_COMMIT` is the commit ID of this repo containing the version of the `bootstrap-commit.sh` used to build the snapshot. Also ensure the FROM image's Ubuntu version matches that used in the [root Dockerfile](Dockerfile) used to build this snapshot.
315−
316−First run `build.sh` to regenerate updated `ltsXX/work/constraints.yaml` and `ltsXX/work/snapshot-incomplete.yaml` files.
317−
318−For an LTS minor bump, you'll typically want to:
319−
320−* Add constraints to package `range:` fields _under_ the `source:` field in that `constraints.yaml` (should not be necessary normally to edit `snapshot-incomplete.yaml` to change the version used for that package).
321−* Add new packages to the `constraints.yaml` file
322−* Test, benchmark, haddock failures can also be added to package fields in the `constraints.yaml` if necessary, though it should be avoided if possible for LTS.
323−
324−Then run `NOPLAN=1 build.sh` to build the generate an updated snapshot.
325−
326−If a build fails for bounds reasons, see all of the advice above. If the code
327−itself doesn't build, or tests fail, open up an issue and then either put in a
328−version bound to avoid that version or something else. It's difficult to give
329−universal advice on how to solve things, since each situation is unique. Let's
330−develop this advice over time. For now: if you're not sure, ask for guidance.
331−
332−__`NOPLAN=1`__ If you wish to rerun a build without recalculating a
333−build plan, you can set the environment variable `NOPLAN=1`. This is
334−useful for such cases as an intermittent test failure, out of memory
335−condition, or manually tweaking the plan file. (When using `NOPLAN=1`,
336−if one needs to revert one package, say due to a build or test regression,
337−one can edit `current-plan.yaml` and updated the SHA256 hash of the .cabal file,
338−to avoid having to rebuild everything again.)
339−
340−Note LTS builds without NOPLAN will use the latest Hackage data.
341−
342−If you need to make further modifications beyond what `constraints.yaml` allows, you can directly edit the `snapshot-incomplete.yaml` file. Then, instead of `NOPLAN=1 build.sh`, you need to use `NOPLAN=2 build.sh`. Note that from this point on, further changes to `constraints.yaml` will not impact the build plan.
343−
344−### Timing
345−
346−A looping script on the build server keeps trying to build nightly
347−with `sleep 30m` interleaved. It only publishes the nightly once per
348−day. This way new package versions or build failures can be caught
349−early and hopefully the nightlies will be timely.
350−
351−LTS minor bumps are typically run on weekends. It can be a good idea
352−to start the build on friday or saturday to have enough time to
353−resolve any issues before the next curator shift the coming monday.
354−
355−### Diskspace errors (and website sync debugging)
356−
357−* You can detect the problem by running `df`. If you see that `/` is out of space, we have a problem.
358−* If you see that `/var/stackage/` is out of space, you can:
359− * run `./etc/diskspace/clean-old-stack-libs.sh [nightly|lts-XX]`
360− * If that is insufficient then remove all the old builds under the previous ghc/Cabal version:
361− * `rm -r /var/stackage/stackage/automated/work/[nightly|lts-XX]/unpack-dir/unpacked/*/.stack-work/dist/x86_64-linux/Cabal-X.Y.0.0/`
362−
363− optionally (not recommended?):
364− * `rm -r /var/stackage/stackage/automated/work/lts*/unpack-dir/unpacked/`
365− * `rm -r /var/stackage/stackage/automated/work/nightly/unpack-dir/unpacked/`
366−
367−### Wiping the cache
368−
369−Sometimes the cache can get corrupted which might manifest as `can't load .so/.DLL`.
370−You can wipe the nightly cache and rebuild everything by doing
371−`rm -rf /var/stackage/stackage/automated/nightly`.
372−Replace nightly with `lts7` to wipe the LTS 7 cache.
373−
374−### Force a single package rebuild
375−
376−You can force a single package to rebuild by deleting its "previous result"
377−file, e.g.:
378−
379−```
380−$ rm /var/stackage/stackage/automated/nightly/work/builds/nightly/prevres/Build/cryptohash-0.11.9
381−```
382−
383−### Restarting docker
384−
385−If docker hangs with e.g. `docker: Error response from daemon:
386−connection error: desc = "transport: dial unix
387−/var/run/docker/containerd/docker-containerd .sock: connect:
388−connection refused".` you can restart it with `sudo systemctl restart
389−docker.service`.
390−
391−## Local curator setup
392−
393−We do not run the full stackage build locally as that might take too
394−much time. However, some steps on the other hand are much faster to do
395−yourself, e.g. verifying constraints without building anything.
396−
397−To get started, install `curator` via Git:
398−
399−```
400−$ git clone git@github.com:commercialhaskell/curator.git
401−$ cd curator && stack install curator
402−```
403−
404−It is a good idea to upgrade `curator` at the start of your week.
405−Then, clone the stackage repo, get the latest packages and run dependency
406−resolution:
407−
408−```
409−$ git clone git@github.com:commercialhaskell/stackage.git
410−$ cd stackage
411−$ ./check
412−```
413−
414−This can be used to make sure all version bounds are in place, including for
415−test suites and benchmarks, to check whether bounds can be lifted, and to get
416−[tell-me-when-its-released] notifications.
417−
418−`curator` does not build anything, so you wont see any compilation
419−errors for builds, tests and benchmarks.
420−
421−[tell-me-when-its-released]: https://github.com/commercialhaskell/stackage/blob/master/CURATORS.md#waiting-for-new-releases
422−
423−### Large scale enabling/disabling of packages
424−
425−`etc/commenter` is a binary that automates `build-constraints.yaml` workflows.
426−
427−#### Setup
428−This is currently a rust program, You can install the rust toolchain
429−by using [rustup](https://rustup.rs/).
430−
431−For some commands you also need etc/commenter/latest-version installed.
432−```
433−stack install --stack-yaml etc/commenter/latest-version/stack.yaml
434−```
435−
436−#### Example usage
437−
438−After disabling a few packages you get this curator output:
439−
440−```
441−ConfigFile (GHC 9 bounds issues, @maintainer) (not present) depended on by:
442−- [ ] xdg-desktop-entry-0.1.1.1 (-any). @maintainer. Used by: library
443−
444−
445−pipes-misc (GHC 9 bounds issues, @maintainer) (not present) depended on by:
446−- [ ] pipes-fluid-0.6.0.1 (>=0.5). @handles. Used by: test-suite
447−
448−
449−testing-feat (GHC 9 bounds issues, Grandfathered dependencies) (not present) depended on by:
450−- [ ] dual-tree-0.2.3.0 (-any). Grandfathered dependencies. @handles. Used by: test-suite
451−```
452−
453−Now run:
454−```
455−./check 2>&1 >/dev/null | ./commenter add
456−```
457−
458−You will get this output:
459−```
460−[INFO] ...
461−LIBS + EXES
462−
463− - xdg-desktop-entry < 0 # tried xdg-desktop-entry-0.1.1.1, but its *library* requires the disabled package: ConfigFile
464−
465−TESTS
466−
467− - dual-tree # tried dual-tree-0.2.3.0, but its *test-suite* requires the disabled package: testing-feat
468− - pipes-fluid # tried pipes-fluid-0.6.0.1, but its *test-suite* requires the disabled package: pipes-misc
469−
470−Adding 1 libs, 2 tests, 0 benches to build-constraints.yaml
471−```
472−
473−These bounds are added to build-constraints.yaml automatically.
474−
475−Re-run this command until no more packages are disabled.
476−
477−#### Re-enabling
478−
479−We can periodically remove all packages under the bounds sections and then re-run the disabling flow above until we get a clean plan. This will automatically pick up packages that have been fixed.
480−
481−```
482−./commenter clear
483−./check 2>&1 >/dev/null | ./commenter add
484−```
485−
486−Repeat the second command until no updates are made to build-constraints.yaml.
487−
488−#### Checking for new releases
489−
490−Run `stack update` before doing this.
491−
492−`./commenter outdated` looks through all bounds issues and library
493−compilation failures and compares the marked version with the latest hackage release. Example output is
494−
495−```
496−Fin mismatch, manual: 0.2.8.0, hackage: 0.2.9.0
497−aeson mismatch, auto: 1.5.6.0, hackage: 2.0.2.0
498−```
499−
500−where "manual" means the bound was added manually by a curator,
501−perhaps due to a compilation failure so we could try re-enabling the
502−package. "auto" means it's part of the sections generated by
503−`./commenter`, to update that run the `Re-enabling` step as documented
504−above.
505−
506−`outdated` only finds packages that are in the auto generated
507−sections, or that are of the form `- package < 0 # $version`.
508−
509−#### Notes
510−
511−* Please make sure to separate bounds issues from compilation failures/test run failures, as we cannot verify that a package builds or that tests pass without running the build!
512−
513−#### Diffing snapshots / Inspecting changes
514−
515−To diff existing snapshots, or to evaluate changes before they end up
516−in a snapshot you can run:
517−
518−```
519−./commenter diff-snapshot <old-snapshot.yaml> <new-snapshot.yaml>
520−```
521−
522−Existing snapshots can be retrieved from https://github.com/commercialhaskell/stackage-snapshots. Preliminary snapshots can be generated by running relevant parts of `automated/build.sh`, at the time of writing:
523−
524−```
525−TARGET=nightly-2021-01-14 \ # the date doesn't matter
526− curator update && \
527− curator constraints --target $TARGET && \
528− curator snapshot-incomplete --target $TARGET && \
529− curator snapshot
530−```
531−
532−#### Finding disabled packages with lots of dependents
533−
534−`./commenter disabled` prints the number of transitive dependents a disabled package has. Low hanging fruit to get a lot of packages included again.
535−
536−Example output:
537−```
538−[...]
539−stringable is disabled with 10 dependents
540−llvm-hs is disabled with 12 dependents
541−th-data-compat is disabled with 12 dependents
542−amazonka-core is disabled with 96 dependents
543−gogol-core is disabled with 96 dependents
544−```
545−
546−## Adding new curators
547−
548−1. Add public ssh key to `~/.ssh/authorized_keys` on build server
549−2. Add to commercialhaskell/stackage project.
550−
551−## Dealing with a new GHC release
552−
553−As mentioned in the [GHC upgrade note], the major impact of a new GHC release
554−is on the packages that are causing upper bounds to be put in place. In order
555−to minimise out-of-date breakage and allow maintainers to have a solid chance
556−of getting their packages into the newest LTS, we try to do the following:
557−
558−Make an early announcement (in the form of a blog post, typically) of the new
559−GHC release on the nightly build and the planned deadline for the new LTS release.
560−Make it clear, that in the time coming up to this, we hope package maintainers
561−will upgrade their packages to allow for the new GHC release.
562−
563−We prefer to prune packages causing upper bounds constraints **after** the LTS
564−release to allow the maximum amount of packages to get into the newest LTS.
565−
566−You will almost always need to update the Win32 package version listed in the
567−build-constraints.yaml file.
568−
569−After the first LTS release, the package pruning process may begin in the
570−nightly build in order to move forward with getting the latest versions of
571−packages compatible with the new GHC release.
572−
573−[GHC upgrade note]: https://github.com/commercialhaskell/stackage/blob/master/MAINTAINERS.md#upgrading-to-a-new-ghc-version
574−
575−## New LTS major bump
576−
577−Every 3-6 months, we make a new major release of LTS. The procedure we follow for this is:
578−
579−1. Write a blog post on stackage.org announcing the intent to cut a major
580− release. Give an estimated date two weeks in the future from the publication
581− date of the post.
582−2. Spread the blog post on social media and mailing lists as much as possible.
583−3. Expect maintainers to send significant requests for added packages and
584− relaxed upper bounds. There will likely be some hard decisions to be made
585− regarding relaxing a bound versus keeping more packages. All of these changes
586− occur on master and affect nightly.
587−4. Once the estimated date hits, push a new `ltsXX` and wait for the docker image build.
588−5. Run the build procedure for the new LTS release.
589−6. After the LTS build completes, more aggressively prune upper bounds from
590− `build-constraints.yaml`.
591−7. Once both (5) and (6) are done, publish a new blog post on stackage.org
592− announcing the new LTS and Nightly, with links to the change pages on
593− stackage.org. Include a reminder that requests for packages to be added to LTS
594− may be made on commercialhaskell/lts-haskell.
DATA-FLOW.mddeleted−129
@@ -1,129 +0,0 @@
1−# The Stackage data flow
2−
3−The Stackage project is really built on top of a number of different
4−subcomponents. This page covers how they fit together. The Stackage data flow
5−diagram gives a good bird's-eye view:
6−
7−![Stackage data flow diagram](https://cloud.githubusercontent.com/assets/49415/14490986/cad5274e-017e-11e6-85cc-a4d815175c61.png)
8−
9−## Inputs
10−
11−There are three inputs into the data flow:
12−
13−* [Hackage](http://hackage.haskell.org/) is the upstream repository of all
14− available open source Haskell packages that are part of our ecosystem.
15− Hackage provides both cabal file metadata (via the 00-index.tar file) and
16− tarballs of the individual packages.
17−
18−* [build-constraints.yaml](https://github.com/commercialhaskell/stackage/blob/master/build-constraints.yaml)
19− is the primary Stackage input file. This is where package maintainers can add
20− packages to the Stackage package set. This also defines upper bounds, skipped
21− tests, and a few other pieces of metadata.
22−
23−* [stackage-content](https://github.com/fpco/stackage-content) is a Github
24− repository containing static file content served from stackage.org
25−
26−## Travis
27−
28−For [various
29−reasons](https://tech.fpcomplete.com/blog/2015/05/distributing-packages-without-sysadmin),
30−we leverage Travis CI for running some processes. In particular:
31−
32−* [all-cabal-files](https://github.com/commercialhaskell/all-cabal-files/blob/hackage/.travis.yml)
33− clones all cabal files from Hackage's 00-index.tar file into a Git repository
34− without any modification
35−
36−* [all-cabal-hashes](https://github.com/commercialhaskell/all-cabal-hashes/blob/hackage/.travis.yml)
37− is mostly the same, but also includes cryptographic hashes of the package
38− tarballs for more secure download (as leveraged by
39− [Stack](http://haskellstack.com). It is powered by [all-cabal-hashes-tool](https://github.com/commercialhaskell/all-cabal-hashes-tool)
40−
41−* [all-cabal-packages](https://github.com/commercialhaskell/all-cabal-packages)
42− uses [hackage-mirror](http://github.com/fpco/hackage-mirror) to populate the
43− hackage.fpcomplete.com mirror of Hackage, which provides S3-backed high
44− availability hosting of all package tarballs
45−
46−* [all-cabal-metadata](https://github.com/commercialhaskell/all-cabal-metadata)
47− uses
48− [all-cabal-metadata-tool](https://github.com/commercialhaskell/all-cabal-metadata-tool)
49− to query extra metadata from Hackage about packages and put them into YAML
50− files. As we'll see later, this avoids the need to make a lot of costly calls
51− to Hackage APIs
52−
53−Travis does not currently provide a means of running jobs on a regular basis.
54−Therefore, we have a simple cron job on the Stackage build server that triggers
55−each of the above builds every 30 minutes.
56−
57−## stackage-curator
58−
59−The heart of running Stackage builds is the
60−[stackage-curator](https://github.com/fpco/stackage-curator) tool. We run this
61−on a daily basis on the Stackage build server for Stackage Nightly, and on a
62−weekly basis for LTS Haskell. The build process is [highly
63−automated](https://github.com/commercialhaskell/stackage/blob/master/automated/build.sh) and
64−leverages Docker quite a bit.
65−
66−stackage-curator needs to know about the most recent versions of all packages,
67−their tarball contents, and some metadata, all of which it gets from the
68−Travis-generated sources mentioned in the previous section. In addition, it
69−needs to know about build constraints, which can come from one of two places:
70−
71−* When doing an LTS Haskell minor version bump (e.g., building lts-5.13), it
72− grabs the previous version (e.g., lts-5.12) and converts the previous package
73− set into constraints. For example, if lts-5.12 contains the package foo-5.6.7,
74− this will be converted into the constraint `foo >= 5.6.7 && < 5.7`.
75−* When doing a Stackage Nightly build or LTS Haskell major version bump (e.g.,
76− building lts-6.0), it grabs the latest version of the build-constraints.yaml
77− file.
78−
79−By combining these constraints with the current package data, stackage-curator
80−can generate a build plan and check it. (As an aside, this build plan
81−generation and checking also occurs every time you make a pull request to the
82−stackage repo.) If there are version bounds problems, one of the [Stackage
83−curators](https://github.com/commercialhaskell/stackage/blob/master/CURATORS.md) will open
84−up a Github issue and will add upper bounds, temporarily block a package, or
85−some other corrective action.
86−
87−Once a valid build plan is found, stackage-curator will build all packages,
88−build docs, and run test suites. Assuming that all succeeds, it generates some
89−artifacts:
90−
91−* Uploads the build plan as a YAML file to either
92− [stackage-nightly](https://github.com/fpco/stackage-nightly) or
93− [lts-haskell](https://github.com/fpco/lts-haskell)
94−* Uploads the generated Haddock docs and a package index (containing all used
95− .cabal files) to haddock.stackage.org.
96−
97−## stackage-server-cron
98−
99−On the Stackage build server, we run the [stackage-server-cron
100−executable](https://github.com/fpco/stackage-server/blob/master/app/stackage-server-cron.hs)
101−regularly, which generates:
102−
103−* A [SQLite
104− database](https://github.com/fpco/stackage-server/blob/master/Stackage/Database.hs)
105− containing information on snapshots, the packages they contain, Hackage
106− metadata about packages, and a bit more. This database is uploaded to S3.
107−* A Hoogle database for each snapshot, which is also uploaded to S3
108−
109−## stackage-server
110−
111−The [software running stackage.org](https://github.com/fpco/stackage-server) is
112−a relatively simple Yesod web application. It pulls data from the
113−stackage-content repo, the SQLite database, the Hoogle databases, and the build
114−plans for Stackage Nightly and LTS Haskell. It doesn't generate anything
115−important of its own except for a user interface.
116−
117−## Stack
118−
119−[Stack](http://haskellstack.com) takes advantage of many of the pieces listed above as well:
120−
121−* It by default uses the all-cabal-hashes repo for getting package metadata,
122− and downloads package contents from the hackage.fpcomplete.com mirror (using
123− the hashes in the repo for verification)
124−* There are some metadata files in stackage-content which contain information
125− on, for example, where to download GHC tarballs from to make `stack setup`
126− work
127−* Stack downloads the raw build plans for Stackage Nightly and LTS Haskell from
128− the Github repo and uses them when deciding which packages to build for a
129− given stack.yaml file
Dockerfiledeleted−15
@@ -1,15 +0,0 @@
1−FROM fpco/pid1:18.04
2−
3−ENV HOME /home/stackage
4−ENV LANG en_US.UTF-8
5−ENV GHCVER 9.0.2
6−
7−# NOTE: also update debian-bootstrap.sh when cuda version changes
8−ENV PATH /home/stackage/.stack/programs/x86_64-linux/ghc-$GHCVER/bin:/usr/local/cuda-10.0/bin:/usr/sbin:/usr/bin:/sbin:/bin
9−ENV CUDA_PATH /usr/local/cuda-10.0
10−
11−ADD debian-bootstrap.sh /tmp/debian-bootstrap.sh
12−RUN /tmp/debian-bootstrap.sh && rm /tmp/debian-bootstrap.sh
13−
14−# Include file path
15−ENV CPATH /usr/lib/jvm/java-8-openjdk-amd64/include:/usr/lib/jvm/java-8-openjdk-amd64/include/linux:/usr/lib/llvm-3.7/include
MAINTAINERS.mddeleted−257
@@ -1,257 +0,0 @@
1−This project is built around the concept of maintainers taking responsibility for making their packages work with the rest of the stable ecosystem, usually meaning the newest version of all dependencies. This is a social contract, and is not reflected in the codebase in any way.
2−
3−The idea behind Stackage is that, if all packages work with the newest versions of dependencies, we avoid dependency hell. Specifically, we aim for:
4−
5−* All packages are buildable and testable from Hackage. We recommend [the Stack Travis script](https://docs.haskellstack.org/en/stable/travis_ci/), which ensures a package is not accidentally incomplete.
6−* All packages are compatible with the newest versions of all dependencies (You can find restrictive upper bounds by visiting http://packdeps.haskellers.com/feed?needle=PACKAGENAME).
7−* All packages in a snapshot are compatible with the versions of libraries that ship with the GHC used in the snapshot ([more information on lenient lower bounds](https://tech.fpcomplete.com/blog/2014/05/lenient-lower-bounds)).
8−
9−Packages in Stackage are not patched: all package changes occur upstream in Hackage.
10−
11−## Adding a package
12−
13−Anyone can add any package to Stackage but you may only add packages under your own name. It's highly encouraged that the actual package maintainer is also the Stackage maintainer, if that is not the case you should drop the package maintainer a note first.
14−
15−To add your package you can edit [`build-constraints.yaml`](https://github.com/fpco/stackage/blob/master/build-constraints.yaml) directly on github or fork the project. There's a section called `packages` where you would add yourself and your packages:
16−
17− "My Name <myemail@example.com> @mygithubuser":
18− - package1
19− - package2
20− - package3
21−
22−Any dependencies of your packages that are not already part of
23−stackage also need to be added explicitly (When this happens you will
24−see `not present` errors in the CI log). As mentioned above: If you
25−don't maintain this package yourself it is preferable that the actual
26−maintainer is also the stackage maintainer, but you are allowed to add
27−it under your own name.
28−
29−If your package depends on a C library, please add it to the `debian-bootstrap.sh` script.
30−
31−After doing that, commit with a message like "add foo-bar" and send a pull request.
32−
33−The continuous integration job will do some checks to see if your package's dependencies are up-to-date.
34−
35−The CI job notably doesn't compile packages, run tests, build documentation, or find missing C libraries.
36−If you want to be proactive or if CI fails, you can make sure that your package builds against the latest nightly.
37−See the [verify-package](https://github.com/commercialhaskell/stackage/blob/master/verify-package) script in this repository.
38−
39−This approach works well, but has two limitations you should be aware
40−of:
41−
42−* It won't notify you of restrictive upper bounds in your package if
43− Stackage has the same upper bounds. For that reason, we recommend
44− using [Packdeps](http://packdeps.haskellers.com/) (see "Following
45− dependency upgrades" below). You can also run `cabal outdated`.
46−* If the latest Stackage Nightly is missing some of the latest
47− packages, your build above may succeed whereas the Travis job may
48− fail. Again: Packdeps will help you detect this situation.
49−
50−## Github and Notifications
51−
52−Stackage uses Github notifications to reduce overhead of contacting individual
53−package maintainers through various channels. As a package maintainer, you will
54−receive notifications for a number of reasons, package build failures of
55−different sorts, blockages and bounds issues, etc.
56−
57−Please note, Github does some throttling on the number people that can be
58−notified within one issue. This means that on issues created with a large
59−number of packages affected, maintainers may not receive a notification. This
60−is not ideal, but Stackage is largely a manual process and done on a best
61−effort basis.
62−
63−## Uploading a new package version
64−
65−When a new version of a package in Stackage is uploaded to Hackage, we automatically try to include it in Stackage. That can result in a number of possible failures. If there is a failure we temporarily introduce an upper bound, and open a GitHub issue ticket to resolve the issue.
66−
67−If the new version doesn't compile then the package author should upload a fixed version.
68−
69−If a package's test suite is failing, the first job is to investigate why. If this is due to a bad interaction with versions of other packages in Stackage, then it is the responsibility of the maintainer to fix the test suite. In some situations, it is acceptable to not run the test suite.
70−
71−## Following dependency upgrades
72−
73−If a new version of a dependency is released your package may fail to
74−build or tests may fail. In most cases we will add an upper bound on
75−the dependency so that your package remains in nightly. We'll also
76−create a github issue pinging you with the bounds issues or give build
77−logs showing failures. It's then up to you to modify your package.
78−
79−We recommend that you also follow the dependencies of your packages on
80−[Packdeps](http://packdeps.haskellers.com/) (typically using the RSS
81−feeds) as well as that often gives you notice ahead of stackage
82−issues. There are cases where we will not notice a new release of a
83−package because of other upper bounds that are in place.
84−
85−If a package is not updated in time, it may be temporarily removed
86−from Stackage by the curator team. We strive to notify you when this
87−happens. If it does you are always welcome to file another pull
88−request to add it back.
89−
90−We typically use fairly long windows before disabling packages, but it
91−is decided on a case-by-case basis.
92−
93−* If restrictive version bounds are the only problem, we will give
94− maintainers at least a week to respond.
95−* If there are real breaking changes, the curator team will retain
96− more discretion on how long a window to give before dropping
97− packages.
98−* We typically drop upper bounds and disable conflicting packages in Nightly after we create
99− a new Long Term Support (LTS) major version.
100−* There are rare cases where an upper bound or build failure are hard
101− to deal with so then we may disable
102−
103−**NOTE** Previously we had stricter time limits, but we decided to
104−remove that: Anyone is free to add a package to Stackage regardless of
105−responsiveness guarantees. However, as stated above, we may elect to
106−temporarily remove a package if it is not updated in a timely manner.
107−
108−## Understanding stackage issues
109−
110−### Bounds issues
111−
112−These are the most common.
113−
114−Using https://github.com/commercialhaskell/stackage/issues/6217 as an example.
115−
116−Our convention is to title a PR after the package that is being held
117−back from the nightly snapshot (here: aeson).
118−
119−The issue body is templated and looks like this:
120−
121−```
122−aeson-2.0.0.0 ([changelog](http://hackage.haskell.org/package/aeson-2.0.0.0/changelog)) (MAINTAINER) is out of bounds for:
123−- [ ] Agda-2.6.2 (>=1.1.2.0 && < 1.6). MAINTAINER. Used by: library
124−- [ ] HsYAML-aeson-0.2.0.0 (>=1.4.0.0 && < 1.6). MAINTAINER. Used by: library
125−- [ ] IPv6Addr-2.0.2 (>=0.8.0.2 && < 1.6). MAINTAINER. Used by: library
126−[...]
127−```
128−
129−This (usually - see "Other issues") means that there was a new release of the package in the
130−header (aeson). This is expected and the aeson maintainer is
131−not expected to act. They are pinged to notify them that the
132−latest version of their package will not be part of the nightly
133−snapshots until the issue closed.
134−
135−The list of packages with checkboxes denote the packages that prevent
136−us from using the latest version of aeson, the first version number is
137−the current version of that package in nightly (e.g. Agda 2.6.2). The
138−constraint in parenthesis `(>=1.1.2.0 && < 1.6)` is Agda's current
139−bound on `aeson`. To check this box we expect there to be an update
140−of Agda to support aeson 2.0.0.0.
141−
142−Once all boxes are checked we should be able to close the issue and
143−upgrade aeson.
144−
145−### Other issues
146−
147−Other common types of issues are
148−* Packages with failing tests, haddocks, or benchmarks (note that we only *compile* benchmarks)
149− + Maintainers may choose to update these parts of their package, or
150− to exclude them from the stackage build (e.g. adding a package to
151− `skipped-tests`)
152−* New releases of packages that depend on packages that are not a part
153− of stackage. This is denoted as `not present`
154− + Maintainers are encouraged to ask the maintainer of these packages
155− to join stackage, or to be the stackage contact person themselves.
156−* A new release of a package with stricter upper bounds than its previous version
157− + This will look like a normal bounds issue, and should be treated
158− the same way by maintainers. Curators usually resolve this by
159− adding an upper bound to that package instead of its dependency.
160−
161−## Delays
162−
163−Maintainers are humans, humans get sick/have babies/go on
164−holiday. Sometimes a dependency upgrade is extra time consuming.
165−
166−Consider finding a co-maintainer with access to SCM and Hackage to
167−help you out.
168−
169−We appreciate if you notify us of any expected delays in the Github
170−issues, some kind soul might decide to help out.
171−
172−## Upgrading to a new GHC version
173−
174−The Stackage curation team tries to move Stackage Nightly to new
175−versions of GHC quickly as they become available, while keeping LTS
176−Haskell on a regular release schedule. For package maintainers, the
177−most important impacts of a new GHC release are:
178−
179−* We will typically do a sweep through the Stackage upper bounds and
180− remove blocking packages. We prefer to do it this way rather than
181− ask other maintainers to backport fixes.
182− * We will definitely do this at a GHC major version release, and
183− may do so at a minor version release
184−* Packages that are incompatible with the newest GHC version will be
185− temporarily disabled
186−
187−If your package ends up being temporarily disabled from Stackage
188−Nightly, please simply send a pull request to add it back once it and
189−its dependencies are compatible with the newest GHC version.
190−
191−Note that it is _not_ a goal of LTS Haskell to track the latest
192−version of GHC. If you want the latest and greatest, Stackage Nightly
193−is your best bet. In particular, LTS Haskell will often&mdash;but not
194−always&mdash;avoid upgrading to the first point release of GHC
195−releases (e.g., 8.x.1) to allow further testing and to get the
196−benefits of the first bugfix release (e.g., 8.x.2).
197−
198−## Adding a package to an LTS snapshot
199−
200−The steps above affect the Stackage Nightly builds, but do not directly affect
201−LTS Haskell builds. When we build a new LTS Haskell major version (anything
202−ending in `.0`), the package set is taken from Stackage Nightly. Therefore, by
203−following the above steps, you can get your package into the next major LTS
204−Haskell release.
205−
206−If you would like to get your package added to the current LTS Haskell
207−major release, please do the following in addition to the steps for Nightly described earlier:
208−
209−* Check that your package can be built with the current LTS version (e.g. `stack build --test --bench --haddock --resolver lts`)
210−* Open up a new issue on the [lts-haskell repo](https://github.com/fpco/lts-haskell/issues/new)
211− * Provide a list of packages you would like added
212− * If relevant, mention any upper bounds that are needed on those packages
213−* Be patient! The LTS releases are less frequent than Nightly. The
214− Stackage curators will try to get to your issue as soon as possible,
215− but it may take some time.
216−
217−## LTS package guarantees and exceptions
218−
219−In general, we try to stick to some rules when it comes to the
220−packages included in LTS minor bumps. In particular:
221−
222−* If a package exists in LTS-X.Y, it should also exist in LTS-X.(Y+1)
223−* We should not include a major version bump of a package between
224− LTS-X.Y and LTS-X.(Y+1)
225−
226−However, there are some cases where exceptions may be made, based
227−purely on Stackage Curator discretion. The most common examples are:
228−
229−* If a package does not follow the PVP in its version number policy,
230− applying the standard version bump rules would not necessarily
231− makes sense. As an example, suppose package `foo` decides to
232− follow SemVer instead of the PVP. By our standard rules of version
233− bumps, a change from `foo-1.2.0` to `foo-1.3.0` would be
234− considered a major version bump, and disallowed in an LTS minor
235− version bump. However, if a package is following SemVer, this
236− would not be a breaking change, and curators may elect to include
237− it. Note though that curators and their tooling will not know your
238− package is following SemVer, so in this case you would have to open
239− an issue on the [lts-haskell repo](https://github.com/fpco/lts-haskell/issues/new).
240−
241−* If a package has overly restrictive version bounds on a
242− dependency, in particular constraining a minor version
243− unnecessarily, we may drop that package instead of artificially
244− holding back the dependency. As an example: suppose `LTS-20.1`
245− includes `foo-1.2.0` and `bar-1`. `bar-1` has a dependency `foo >=
246− 1.2.0 && < 1.2.1`, which is overly constrained on the minor
247− version number according to the PVP. Then `foo-1.2.1` is
248− released. The Stackage Curator team would have two choices:
249−
250− * Reject `foo-1.2.1` from `LTS-20.2`, since that is what `bar-1`
251− requires.
252− * Drop `bar-1` from `LTS-20.2`, and allow `foo-1.2.1`.
253−
254− Decisions will need to be taken on a case-by-case basis, and may
255− depend on such issues as whether an important bugfix or security
256− update in included. The curator team may also try to notify the
257− author of `bar` to try and get a patched version released.
README.md+67−127
@@ -1,142 +1,82 @@
11stackage
22========
3−[![check](https://github.com/commercialhaskell/stackage/actions/workflows/check.yml/badge.svg)](https://github.com/commercialhaskell/stackage/actions/workflows/check.yml)
43
5−Stable sets of Haskell Packages from Hackage
4+"Stable Hackage," tools for creating a vetted set of packages from Hackage.
65
7−_This repository is for package authors and maintainers to get their packages into Stackage._
6+__NOTE__ This repository is for package authors to get their code into
7+Stackage. If you simply want to use Stackage as an end user, please follow the
8+instructions on http://www.stackage.org/.
89
9−If you simply want to use Stackage as an end user, please follow the instructions on [https://www.stackage.org/](https://www.stackage.org).
10+A note about the codebase: the goal is to minimize dependencies and have
11+the maximum range of supported compiler versions. Therefore, we avoid
12+anything "complicated." For example, instead of using the text package,
13+we use Strings everywhere.
1014
11−We strongly recommend using the Haskell [stack](https://github.com/commercialhaskell/stack) tool for doing builds, which
12−includes built-in Stackage support.
15+Get your package included
16+-------------------------
1317
14−Add your package
15−----------------
18+In order to get your package included in the set of stable packages, you should
19+send a pull request against this repository. In the `Stackage.Config` module,
20+there's a function called `defaultStablePackages`. In general, to add a set of
21+packages, you would add:
1622
17−We welcome all packages, provided:
23+ mapM_ (add "your-email-address") $ words
24+ "package1 package2 package3"
1825
19−* The package author/maintainer agrees to the [maintainers agreement](https://github.com/commercialhaskell/stackage/blob/master/MAINTAINERS.md).
20−* The package is buildable and testable from Hackage. We recommend [the Stack Travis script](https://docs.haskellstack.org/en/stable/travis_ci/), which ensures a package is not accidentally incomplete.
21−* The package is compatible with the newest versions of all dependencies (You can find restrictive upper bounds by visiting http://packdeps.haskellers.com/feed?needle=PACKAGENAME).
22−* The package is compatible with the versions of libraries that ship with GHC ([more information on lenient lower bounds](https://tech.fpcomplete.com/blog/2014/05/lenient-lower-bounds)).
26+You can follow the examples of the other sets of packages in that function.
27+Once you've done this, you can confirm that your newly added packages are
28+compatible with the rest of stackage by building the package set following the
29+instructions below.
2330
24−Full details on how to add and test a package can be found in the [maintainers agreement](https://github.com/commercialhaskell/stackage/blob/master/MAINTAINERS.md#adding-a-package).
31+__NOTE__: In order to ease the process of adding new packages, we no longer
32+require new submissions to be tested on your own system before sending a pull
33+request. If you believe your package works with the newest versions of all
34+dependencies, you may send a pull request without testing first. If you do so,
35+please be sure to state this in the pull request so that the Stackage
36+maintainers (e.g., Michael) will know to do basic sanity checking before
37+merging.
2538
26−__NOTE__: There is an approximate 30 minute delay between a package uploading
27−to Hackage and being available to the Github workflow action to check upper
28−bounds. If a pull request is marked as failed due to using an older version,
29−please close and reopen the PR to retrigger a Travis build.
30−
31−Other repos
32−-----------
33−
34−The Stackage project consists of multiple repositories. This repository
35−contains the metadata on packages to be included in future builds and some
36−project information. In addition, we have the following repositories:
37−
38−* [stackage-server](https://github.com/fpco/stackage-server) [![Base image](https://github.com/fpco/stackage-server/actions/workflows/base.yml/badge.svg)](https://github.com/fpco/stackage-server/actions/workflows/base.yml)
39−* [curator](https://github.com/commercialhaskell/curator) ![Build Status](https://github.com/commercialhaskell/curator/workflows/Runtime%20image/badge.svg)
40−* [lts-haskell](https://github.com/commercialhaskell/lts-haskell)
41−* [stackage-snapshots](https://github.com/commercialhaskell/stackage-snapshots/)
42−
43−Curious how it all fits together? See the [Stackage data
44−flow](https://github.com/commercialhaskell/stackage/blob/master/DATA-FLOW.md).
39+You should also read the [maintainers
40+agreement](https://github.com/fpco/stackage/wiki/Maintainers-Agreement).
4541
4642Build the package set
4743---------------------
4844
49−Generally only the stackage build server run by the stackage curator
50−team and people interested in incorporating stackage snapshots into an
51−OS distribution need to build the entire package set. If you're
52−interested in trying this yourself, please check out
53−[the curator guide](https://github.com/commercialhaskell/stackage/blob/master/CURATORS.md),
54−though be aware that this is not a recommended practice and there
55−likely will be problems you will need to debug yourself.
56−
57−## Processing
58−
59−The following describes at a high level the series of steps for processing
60−
61−### Nightlies
62−
63−1. Get list of core packages
64−2. Get build constraints from list of maintained packages
65−3. Load up package index
66−4. Calculate build plan using newest versions of packages
67−5. Write out a YAML file with complete build plan
68−6. Verify that the build plan can be compiled
69−7. Perform the build
70−
71−### LTS
72−
73−1. Load up most recent build plan
74−2. Convert build plan into constraints for next build
75−3. Continue from step (3) above
76−
77−Frequently Asked Questions
78−--------------------------
79−
80−__Why is Stackage LTS still on an older version of GHC?__
81−
82−Typically it takes some months from a new major ghc release before
83−the Haskell ecosystem supports it fully enough that we can push it
84−to a new stable Stackage major version release. There can also be
85−ghc regressions that hold up a LTS major release.
86−
87−The lag for minor ghc releases should be less
88−but it still requires extra work and there is usually some delay - this also
89−allows for some community testing before updating LTS.
90−
91−__Why does Stackage have an older version of a package than Hackage?__
92−
93−There are a number of answers to this question:
94−
95−* Simplest reason: how old of a Stackage snapshot are you using? Once a
96− snapshot is created, it's frozen for all time. So if you use
97− nightly-2016-01-01, by the time you get to 2018, it will be pretty dated.
98−* If you're using an LTS snapshot: we lock down major versions when
99− first creating an LTS run, so subsequent minor versions will not get
100− new versions necessary. For example, if LTS 6.0 has `foo` version
101− 1.2.3, and the author immediately thereafter releases a version
102− 1.3.0 and never releases another 1.2.\* version, you'll never get
103− another update in the LTS 6 line
104−* Sometimes we have upper bounds in place because other packages have
105− problems with newer versions of dependencies. Open up the
106− [build-constraints file](https://github.com/commercialhaskell/stackage/blob/master/build-constraints.yaml)
107− and search for "Stackage upper bounds"
108−* Wired-in packages - those that ship with GHC and cannot be upgraded,
109− and packages depending on them - are fixed to GHC versions. Common
110− examples of this are containers and transformers. There's a lot more
111− information on this in
112− [an FP Complete blog post](https://tech.fpcomplete.com/blog/2014/05/lenient-lower-bounds)
113−
114−__How long do you maintain an LTS build?__
115−
116−We only guarantee that we will maintain a single LTS major version at
117−a time, and that it will be maintained for at least three months. This
118−is the
119−[originally proposed support window](https://tech.fpcomplete.com/blog/2014/12/backporting-bug-fixes),
120−and hasn't changed since then.
121−
122−That said, we do maintain the capability to keep multiple LTS runs
123−operational in parallel, and with LTS 6 and 7 in fact did so. We
124−aren't changing our guarantees yet on longevity of a release, but are
125−trying to push out the bounds a bit farther.
126−
127−__What time are Stackage snapshots published?__
128−
129−Stackage Nightly and LTS are not released at a fixed time of day, they get
130−pushed to stackage.org (and the metadata to the stackage-nightly and
131−stackage-lts github repos) when their builds finish on the Stackage build
132−server and the latest built haddocks have been synced over. This time varies
133−greatly depending on build times for package updates, bounds breakage,
134−problems with new packages being added and other build issues, etc. There are
135−days when a release does not happen. LTS releases tend to happen over the
136−weekend or early in the week.
137−
138−__Where to get help regarding uploading packages?__
139−
140−Please ask on the #stackage channel on the
141−[Haskell Foundation Slack](https://join.slack.com/t/haskell-foundation/shared_invite/zt-mjh76fw0-CEjg2NbyVE8rVQDvR~0F4A)
142−or open an issue or comment on the PR which uploads the package.
45+As this project is just starting, we don't really have a solid set of steps. In
46+general, the following set of commands should be good for getting started:
47+
48+ cabal update
49+ git clone https://github.com/fpco/stackage
50+ cd stackage
51+ cabal sandbox init # requires cabal-install 1.18
52+ cabal install --only-dependencies
53+ cabal configure
54+ cabal build
55+ ./patching/scripts/create-tarballs.sh
56+ ./dist/build/stackage/stackage select
57+ ./dist/build/stackage/stackage check
58+ ./dist/build/stackage/stackage build # takes a *long* time
59+ ./dist/build/stackage/stackage test # also takes a *long* time
60+
61+Notes
62+-----
63+
64+Make sure to have Cabal-1.16 installed in either your global or user database,
65+regardless of any sandboxing, as custom build types require it to be present.
66+You must build with cabal-install 1.16, due to several important bug fixes.
67+
68+Using a non-Haskell Platform versions of GHC
69+--------------------------------------------
70+
71+By default, Stackage bases itself off of the Haskell Platform for determining
72+which packages are core packages, and locks down package versions to match the
73+Haskell Platform selections. This works fine when you are compiling with the
74+same version of GHC as the Haskell Platform was built on. If you're using a
75+different version of GHC, you'll probably need to use the following options for
76+the `select` call:
77+
78+ --no-platform --use-global-db
79+
80+The former says to disregard Haskell Platform package versions, and the latter
81+says to determine which packages are core packages based on their presence in
82+the global package database.
ROADMAP.mdnew file+61
@@ -0,0 +1,61 @@
1+## Processing
2+
3+High level series of steps for processing
4+
5+### Nightlies
6+
7+1. Get list of core packages
8+2. Get build constraints from list of maintained packages
9+3. Load up package index
10+4. Calculate build plan using newest versions of packages
11+5. Write out a YAML file with complete build plan
12+6. Verify that the build plan can be compiled
13+7. Perform the build
14+
15+### LTS
16+
17+1. Load up most recent build plan
18+2. Convert build plan into constraints for next build
19+3. Continue from step (3) above
20+
21+## Code explanation
22+
23+We start off with *constraints*. Constraints state things like "package X has a
24+given version range," who the maintainer is for a package, the description of
25+the system/compiler being used, etc. `BuildConstraints` describes the build as
26+a whole, whereas `PackageConstraints` describes the constraints on an
27+individual package.
28+
29+There are two primary ways of getting a `BuildConstraints`.
30+`defaultBuildConstraints` inspects the first GHC in the PATH environment variable to
31+determine GHC version, core packages, core tools, etc. It then uses the
32+`Stackage.Config` module to extract information on additional packages to be
33+installed. The secondary approach is in `Stackage2.UpdateBuildPlan`, which will be
34+discussed later.
35+
36+`BuildConstraints` does not specify a build completely. That is given by a
37+`BuildPlan`, which is similarly broken down into `BuildPlan` and `PackagePlan`.
38+In order to get a `BuildPlan`, we need two pieces of information: the
39+`BuildConstraints`, and a package index. The package index (usually downloaded
40+from Hackage) is a collection of all of the cabal files available.
41+
42+By applying a `BuildConstraints` to a package index (via `newBuildPlan`), we
43+get a proposed `BuildPlan`. There is no guarantee that this `BuildPlan` is
44+valid. To validate it, we use `checkBuildPlan`. A `BuildPlan` is an instance of
45+both `ToJSON` and `FromJSON`, and therefore can be serialized to a file for
46+later use.
47+
48+When dealing with LTS Haskell, we want to be able to take a `BuildPlan`, and
49+update to a newer `BuildPlan` that keeps all packages at the same major
50+version. `updateBuildConstraints` turns a `BuildPlan` into a new
51+`BuildConstraints` with that restriction, and `updateBuildPlan` applies
52+`newBuildPlan` to that result. As mentioned previously: this is *not* a
53+validated result, and therefore `checkBuildPlan` must be used.
54+
55+A `BuildPlan` can be acted on. This is done to check that all packages compile
56+together, run relevant test suites, test Haddock documentation is correct, and
57+produce as artifacts both a self-contained GHC binary package database and a
58+set of Haddock documentation. (Not yet implemented.)
59+
60+A `BuildPlan` may be converted into a bundle to be uploaded to Stackage Server.
61+(Not yet implemented.)
etc/commenter/latest-version/Setup.hs → Setup.hsrenamed

The content is the same.

Stackage/Build.hsnew file+116
@@ -0,0 +1,116 @@
1+module Stackage.Build
2+ ( build
3+ , defaultBuildSettings
4+ , BuildSettings (..)
5+ ) where
6+
7+import Control.Monad (unless)
8+import Prelude hiding (pi)
9+import Stackage.CheckCabalVersion (checkCabalVersion)
10+import Stackage.Config
11+import Stackage.InstallInfo
12+import Stackage.ModuleNameConflict
13+import Stackage.Types
14+import Stackage.Util
15+import System.Exit (ExitCode (ExitSuccess), exitWith)
16+import System.IO (BufferMode (NoBuffering),
17+ IOMode (WriteMode), hPutStrLn,
18+ hSetBuffering, withBinaryFile)
19+import qualified System.IO.UTF8
20+import System.Process (rawSystem, runProcess,
21+ waitForProcess)
22+import qualified Data.ByteString.Lazy.Char8 as L8
23+
24+defaultBuildSettings :: Maybe Int -- ^ argument to -j
25+ -> GhcMajorVersion
26+ -> BuildSettings
27+defaultBuildSettings cores version = BuildSettings
28+ { sandboxRoot = "sandbox"
29+ , extraArgs = \bs -> "-fnetwork23" : "-fhttps" :
30+ case bs of
31+ BSTest -> []
32+ _ ->
33+ case cores of
34+ Nothing -> ["-j"]
35+ Just 1 -> []
36+ Just j -> ["-j" ++ show j]
37+ , testWorkerThreads = 4
38+ , buildDocs = True
39+ , tarballDir = "patching/tarballs"
40+ , cabalFileDir = Nothing
41+ , underlayPackageDirs = []
42+ }
43+
44+build :: BuildSettings -> BuildPlan -> IO ()
45+build settings' bp = do
46+ libVersion <- checkCabalVersion
47+
48+ putStrLn "Wiping out old sandbox folder"
49+ rm_r $ sandboxRoot settings'
50+ rm_r "logs"
51+ settings <- fixBuildSettings settings'
52+
53+ putStrLn "Creating new package database"
54+ ec1 <- rawSystem "ghc-pkg" ["init", packageDir settings]
55+ unless (ec1 == ExitSuccess) $ do
56+ putStrLn "Unable to create package database via ghc-pkg init"
57+ exitWith ec1
58+
59+ menv <- fmap Just $ getModifiedEnv settings
60+ let runCabal args handle = runProcess "cabal" args Nothing menv Nothing (Just handle) (Just handle)
61+
62+ -- First install build tools so they can be used below.
63+ let installBuildTool tool = do
64+ let toolsDir = packageDir settings ++ "-tools"
65+ rm_r toolsDir
66+ ecInit <- rawSystem "ghc-pkg" ["init", toolsDir]
67+ unless (ecInit == ExitSuccess) $ do
68+ putStrLn "Unable to create package database via ghc-pkg init"
69+ exitWith ecInit
70+
71+ putStrLn $ "Installing build tool: " ++ tool
72+ ec <- withBinaryFile "build-tools.log" WriteMode $ \handle -> do
73+ hSetBuffering handle NoBuffering
74+
75+ let args = addCabalArgs settings BSTools
76+ $ "install"
77+ : ("--cabal-lib-version=" ++ libVersion)
78+ : "--build-log=logs-tools/$pkg.log"
79+ : [tool]
80+ hPutStrLn handle ("cabal " ++ unwords (map (\s -> "'" ++ s ++ "'") args))
81+ ph <- runCabal args handle
82+ waitForProcess ph
83+ unless (ec == ExitSuccess) $ do
84+ putStrLn $ concat
85+ [ "Building of "
86+ , tool
87+ , " failed, please see build-tools.log"
88+ ]
89+ exitWith ec
90+ putStrLn $ tool ++ " built"
91+ rm_r toolsDir
92+ mapM_ installBuildTool $ bpTools bp
93+
94+ putStrLn "Beginning Stackage build"
95+ ph <- withBinaryFile "build.log" WriteMode $ \handle -> do
96+ packageList <- mapM (replaceTarball $ tarballDir settings) $ bpPackageList bp
97+ let args = addCabalArgs settings BSBuild
98+ $ "install"
99+ : ("--cabal-lib-version=" ++ libVersion)
100+ : "--build-log=logs/$pkg.log"
101+ : "--max-backjumps=-1"
102+ : "--reorder-goals"
103+ : "--build-summary=build-summary/$pkgid.report"
104+ : packageList
105+ hPutStrLn handle ("cabal " ++ unwords (map (\s -> "'" ++ s ++ "'") args))
106+ runCabal args handle
107+ ec <- waitForProcess ph
108+ unless (ec == ExitSuccess) $ do
109+ putStrLn "Build failed, please see build.log"
110+ L8.readFile "build.log" >>= L8.putStr
111+ exitWith ec
112+
113+ putStrLn "Build completed successfully, checking for module name conflicts"
114+ conflicts <- getModuleNameConflicts $ packageDir settings
115+ System.IO.UTF8.writeFile "module-name-conflicts.txt"
116+ $ renderModuleNameConflicts conflicts
Stackage/BuildPlan.hsnew file+186
@@ -0,0 +1,186 @@
1+{-# LANGUAGE FlexibleInstances #-}
2+{-# LANGUAGE RecordWildCards #-}
3+{-# LANGUAGE TypeSynonymInstances #-}
4+module Stackage.BuildPlan
5+ ( readBuildPlan
6+ , writeBuildPlan
7+ , writeBuildPlanCsv
8+ ) where
9+
10+import qualified Data.Map as Map
11+import qualified Data.Set as Set
12+import Distribution.Text (display, simpleParse)
13+import Stackage.Types
14+import qualified System.IO.UTF8
15+import Data.Char (isSpace)
16+import Stackage.Util
17+import Data.List (intercalate)
18+
19+readBuildPlan :: FilePath -> IO BuildPlan
20+readBuildPlan fp = do
21+ str <- System.IO.UTF8.readFile fp
22+ case fromString str of
23+ Left s -> error $ "Could not read build plan: " ++ s
24+ Right (x, "") -> return x
25+ Right (_, _:_) -> error "Trailing content when reading build plan"
26+
27+writeBuildPlan :: FilePath -> BuildPlan -> IO ()
28+writeBuildPlan fp bp = System.IO.UTF8.writeFile fp $ toString bp
29+
30+class AsString a where
31+ toString :: a -> String
32+ fromString :: String -> Either String (a, String)
33+
34+instance AsString BuildPlan where
35+ toString BuildPlan {..} = concat
36+ [ makeSection "tools" bpTools
37+ , makeSection "packages" $ Map.toList bpPackages
38+ , makeSection "core" $ Map.toList bpCore
39+ , makeSection "optional-core" $ Map.toList bpOptionalCore
40+ , makeSection "skipped-tests" $ Set.toList bpSkippedTests
41+ , makeSection "expected-failures" $ Set.toList bpExpectedFailures
42+ ]
43+ fromString s1 = do
44+ (tools, s2) <- getSection "tools" s1
45+ (packages, s3) <- getSection "packages" s2
46+ (core, s4) <- getSection "core" s3
47+ (optionalCore, s5) <- getSection "optional-core" s4
48+ (skipped, s6) <- getSection "skipped-tests" s5
49+ (failures, s7) <- getSection "expected-failures" s6
50+ let bp = BuildPlan
51+ { bpTools = tools
52+ , bpPackages = Map.fromList packages
53+ , bpCore = Map.fromList core
54+ , bpOptionalCore = Map.fromList optionalCore
55+ , bpSkippedTests = Set.fromList skipped
56+ , bpExpectedFailures = Set.fromList failures
57+ }
58+ return (bp, s7)
59+
60+makeSection :: AsString a => String -> [a] -> String
61+makeSection title contents = unlines
62+ $ ("-- BEGIN " ++ title)
63+ : map toString contents
64+ ++ ["-- END " ++ title, ""]
65+
66+instance AsString String where
67+ toString = id
68+ fromString s = Right (s, "")
69+
70+instance AsString PackageName where
71+ toString (PackageName pn) = pn
72+ fromString s = Right (PackageName s, "")
73+
74+instance AsString (Maybe Version) where
75+ toString Nothing = ""
76+ toString (Just x) = toString x
77+ fromString s
78+ | all isSpace s = return (Nothing, s)
79+ | otherwise = do
80+ (v, s') <- fromString s
81+ return (Just v, s')
82+
83+instance AsString a => AsString (PackageName, a) where
84+ toString (PackageName pn, s) = concat [pn, " ", toString s]
85+ fromString s = do
86+ (pn, rest) <- takeWord s
87+ (rest', s') <- fromString rest
88+ return ((PackageName pn, rest'), s')
89+
90+takeWord :: AsString a => String -> Either String (a, String)
91+takeWord s =
92+ case break (== ' ') s of
93+ (x, _:y) -> do
94+ (x', s') <- fromString x
95+ if null s'
96+ then Right (x', y)
97+ else Left $ "Unconsumed input in takeWord call"
98+ (_, []) -> Left "takeWord failed"
99+
100+instance AsString SelectedPackageInfo where
101+ toString SelectedPackageInfo {..} = unwords
102+ [ display spiVersion
103+ , toString spiHasTests
104+ , (\v -> if null v then "@" else v) $ githubMentions spiGithubUser
105+ , unMaintainer spiMaintainer
106+ ]
107+ fromString s1 = do
108+ (version, s2) <- takeWord s1
109+ (hasTests, s3) <- takeWord s2
110+ (gu, m) <- takeWord s3
111+ Right (SelectedPackageInfo
112+ { spiVersion = version
113+ , spiHasTests = hasTests
114+ , spiGithubUser = [gu]
115+ , spiMaintainer = Maintainer m
116+ }, "")
117+
118+instance AsString (Maybe String) where
119+ toString Nothing = "@"
120+ toString (Just x) = "@" ++ x
121+ fromString "@" = Right (Nothing, "")
122+ fromString ('@':rest) = Right (Just rest, "")
123+ fromString x = Left $ "Invalid Github user: " ++ x
124+
125+instance AsString Bool where
126+ toString True = "test"
127+ toString False = "notest"
128+ fromString "test" = Right (True, "")
129+ fromString "notest" = Right (False, "")
130+ fromString x = Left $ "Invalid test value: " ++ x
131+
132+instance AsString Version where
133+ toString = display
134+ fromString s =
135+ case simpleParse s of
136+ Nothing -> Left $ "Invalid version: " ++ s
137+ Just v -> Right (v, "")
138+
139+getSection :: AsString a => String -> String -> Either String ([a], String)
140+getSection title orig =
141+ case lines orig of
142+ [] -> Left "Unexpected EOF when looking for a section"
143+ l1:ls1
144+ | l1 == begin ->
145+ case break (== end) ls1 of
146+ (here, _:"":rest) -> do
147+ here' <- mapM fromString' here
148+ Right (here', unlines rest)
149+ (_, _) -> Left $ "Could not find section end: " ++ title
150+ | otherwise -> Left $ "Could not find section start: " ++ title
151+ where
152+ begin = "-- BEGIN " ++ title
153+ end = "-- END " ++ title
154+
155+ fromString' x = do
156+ (y, z) <- fromString x
157+ if null z
158+ then return y
159+ else Left $ "Unconsumed input on line: " ++ x
160+
161+-- | Used for Hackage distribution purposes.
162+writeBuildPlanCsv :: FilePath -> BuildPlan -> IO ()
163+writeBuildPlanCsv fp bp =
164+ -- Obviously a proper CSV library should be used... but we're minimizing
165+ -- deps
166+ System.IO.UTF8.writeFile fp $ unlines' $ map toRow $ Map.toList fullMap
167+ where
168+ -- Hackage server is buggy, and won't accept trailing newlines. See:
169+ -- https://github.com/haskell/hackage-server/issues/141#issuecomment-34615935
170+ unlines' = intercalate "\n"
171+
172+ fullMap = Map.unions
173+ [ fmap spiVersion $ bpPackages bp
174+ , Map.mapMaybe id $ bpCore bp
175+ , bpOptionalCore bp
176+ ]
177+
178+ toRow (PackageName name, version) = concat
179+ [ "\""
180+ , name
181+ , "\",\""
182+ , display version
183+ , "\",\"http://www.stackage.org/package/"
184+ , name
185+ , "\""
186+ ]
Stackage/CheckCabalVersion.hsnew file+27
@@ -0,0 +1,27 @@
1+module Stackage.CheckCabalVersion
2+ ( checkCabalVersion
3+ ) where
4+
5+import Control.Exception (assert)
6+import Distribution.Text (simpleParse)
7+import Distribution.Version (withinRange)
8+import Prelude hiding (pi)
9+import System.Process (readProcess)
10+
11+checkCabalVersion :: IO String
12+checkCabalVersion = do
13+ putStrLn "Checking Cabal version"
14+ versionString <- readProcess "cabal" ["--version"] ""
15+ libVersion <-
16+ case map words $ lines versionString of
17+ [_,["using","version",libVersion,"of","the","Cabal","library"]] -> return libVersion
18+ _ -> error "Did not understand cabal --version output"
19+
20+ case (simpleParse libVersion, simpleParse ">= 1.16") of
21+ (Nothing, _) -> error $ "cabal binary reported an invalid Cabal library version: " ++ libVersion
22+ (_, Nothing) -> assert False $ return ()
23+ (Just v, Just vr)
24+ | v `withinRange` vr -> return ()
25+ | otherwise -> error $ "cabal binary build against unsupported Cabal library version: " ++ libVersion
26+
27+ return libVersion
Stackage/CheckPlan.hsnew file+73
@@ -0,0 +1,73 @@
1+module Stackage.CheckPlan
2+ ( checkPlan
3+ ) where
4+
5+import Control.Monad (unless, when)
6+import Data.List (isPrefixOf, sort)
7+import qualified Data.Map as Map
8+import qualified Data.Set as Set
9+import Stackage.CheckCabalVersion (checkCabalVersion)
10+import Stackage.InstallInfo
11+import Stackage.Types
12+import Stackage.Util
13+import System.Exit (ExitCode (ExitFailure, ExitSuccess),
14+ exitWith)
15+import System.Process (readProcessWithExitCode)
16+
17+data Mismatch = OnlyDryRun String | OnlySimpleList String
18+ deriving Show
19+
20+checkPlan :: BuildSettings -> BuildPlan -> IO ()
21+checkPlan settings bp = do
22+ _ <- checkCabalVersion
23+
24+ putStrLn "Checking build plan"
25+ packages <- mapM (replaceTarball $ tarballDir settings) (bpPackageList bp)
26+ (ec, dryRun', stderr) <- readProcessWithExitCode "cabal"
27+ ( addCabalArgsOnlyGlobal settings
28+ $ "install"
29+ : "--dry-run"
30+ : "--max-backjumps=-1"
31+ : "--reorder-goals"
32+ : extraArgs settings BSBuild ++ packages
33+ ) ""
34+ when (ec /= ExitSuccess || "Warning:" `isPrefixOf` stderr) $ do
35+ putStr stderr
36+ putStr dryRun'
37+ putStrLn "cabal returned a bad result, exiting"
38+ exitWith ec
39+ let dryRun = sort $ filter notOptionalCore $ map (takeWhile (/= ' ')) $ drop 2 $ lines dryRun'
40+ let mismatches = getMismatches dryRun (filter notOptionalCore $ bpPackageList bp)
41+ unless (null $ filter (not . acceptableMismatch) mismatches) $ do
42+ putStrLn "Found the following mismatches"
43+ mapM_ print mismatches
44+ exitWith $ ExitFailure 1
45+ putStrLn "Build plan checked, no mismatches"
46+ where
47+ optionalCore = Set.fromList $ map packageVersionString $ Map.toList $ bpOptionalCore bp
48+ notOptionalCore s = not $ s `Set.member` optionalCore
49+
50+getMismatches :: [String] -> [String] -> [Mismatch]
51+getMismatches =
52+ go
53+ where
54+ go [] y = map OnlySimpleList y
55+ go x [] = map OnlyDryRun x
56+ go (x:xs) (y:ys) =
57+ case compare x y of
58+ EQ -> go xs ys
59+ LT -> OnlyDryRun x : go xs (y:ys)
60+ GT -> OnlySimpleList y : go (x:xs) ys
61+
62+-- | Some mismatches are going to be acceptable. The reasons are described
63+-- below.
64+acceptableMismatch :: Mismatch -> Bool
65+acceptableMismatch m =
66+ case m of
67+ -- GHC 7.4 included extensible-extensions as a core package, and
68+ -- therefore the HP at time of writing (2012.4.0.0) includes it in that
69+ -- list. However, GHC 7.6 does /not/ include that package. As a result,
70+ -- we get that package included in the dry run but not our list of
71+ -- packages to build. See issue #57.
72+ OnlyDryRun s | "extensible-exceptions-" `isPrefixOf` s -> True
73+ _ -> False
Stackage/Config.hsnew file+838
@@ -0,0 +1,838 @@
1+{-# LANGUAGE CPP #-}
2+module Stackage.Config where
3+
4+import Control.Monad (when, unless)
5+import Control.Monad.Trans.Writer (Writer, execWriter, tell)
6+import Data.Char (toLower)
7+import qualified Data.Map as Map
8+import Data.Maybe (fromMaybe)
9+import Data.Set (fromList, singleton)
10+import Distribution.Text (simpleParse)
11+import Stackage.Types
12+
13+-- | Packages which are shipped with GHC but are not included in the
14+-- Haskell Platform list of core packages.
15+defaultExtraCore :: GhcMajorVersion -> Set PackageName
16+defaultExtraCore _ = fromList $ map PackageName $ words
17+ "binary Win32 ghc-prim integer-gmp"
18+
19+-- | Test suites which are expected to fail for some reason. The test suite
20+-- will still be run and logs kept, but a failure will not indicate an
21+-- error in our package combination.
22+defaultExpectedFailures :: GhcMajorVersion
23+ -> Bool -- ^ haskell platform
24+ -> Set PackageName
25+defaultExpectedFailures ghcVer requireHP = execWriter $ do
26+ -- Requires an old version of WAI and Warp for tests
27+ add "HTTP"
28+
29+ -- text and setenv have recursive dependencies in their tests, which
30+ -- cabal can't (yet) handle
31+ add "text"
32+ add "setenv"
33+
34+ -- The version of GLUT included with the HP does not generate
35+ -- documentation correctly.
36+ add "GLUT"
37+
38+ -- https://github.com/bos/statistics/issues/42
39+ add "statistics"
40+
41+ -- https://github.com/kazu-yamamoto/simple-sendfile/pull/10
42+ add "simple-sendfile"
43+
44+ -- http://hackage.haskell.org/trac/hackage/ticket/954
45+ add "diagrams"
46+
47+ -- https://github.com/fpco/stackage/issues/24
48+ add "unix-time"
49+
50+ -- With transformers 0.3, it doesn't provide any modules
51+ add "transformers-compat"
52+
53+ -- Tests require shell script and are incompatible with sandboxed package
54+ -- databases
55+ add "HTF"
56+
57+ -- https://github.com/simonmar/monad-par/issues/28
58+ add "monad-par"
59+
60+ -- Unfortunately network failures seem to happen haphazardly
61+ add "network"
62+
63+ -- https://github.com/ekmett/hyphenation/issues/1
64+ add "hyphenation"
65+
66+ -- Test suite takes too long to run on some systems
67+ add "punycode"
68+
69+ -- http://hub.darcs.net/stepcut/happstack/issue/1
70+ add "happstack-server"
71+
72+ -- Requires a Facebook app.
73+ add "fb"
74+
75+ -- https://github.com/tibbe/hashable/issues/64
76+ add "hashable"
77+
78+ -- https://github.com/vincenthz/language-java/issues/10
79+ add "language-java"
80+
81+ add "threads"
82+ add "crypto-conduit"
83+ add "pandoc"
84+ add "language-ecmascript"
85+ add "hspec"
86+ add "alex"
87+
88+ -- https://github.com/basvandijk/concurrent-extra/issues/
89+ add "concurrent-extra"
90+
91+ -- https://github.com/skogsbaer/xmlgen/issues/2
92+ add "xmlgen"
93+
94+ -- Something very strange going on with the test suite, I can't figure
95+ -- out how to fix it
96+ add "bson"
97+
98+ -- Requires a locally running PostgreSQL server with appropriate users
99+ add "postgresql-simple"
100+
101+ -- Missing files
102+ add "websockets"
103+
104+ -- Some kind of Cabal bug when trying to run tests
105+ add "thyme"
106+
107+ add "shake"
108+
109+ -- https://github.com/jgm/pandoc-citeproc/issues/5
110+ add "pandoc-citeproc"
111+
112+ -- Problems with doctest and sandboxing
113+ add "warp"
114+ add "wai-logger"
115+
116+ -- https://github.com/fpco/stackage/issues/163
117+ add "hTalos"
118+ add "seqloc"
119+
120+ -- https://github.com/bos/math-functions/issues/25
121+ add "math-functions"
122+
123+ -- FIXME the test suite fails fairly regularly in builds, though I haven't
124+ -- discovered why yet
125+ add "crypto-numbers"
126+
127+ -- Test suite is currently failing regularly, needs to be worked out still.
128+ add "lens"
129+
130+ -- Requires too old a version of test-framework
131+ add "time"
132+
133+ -- No code included any more, therefore Haddock fails
134+ mapM_ add $ words =<<
135+ [ "comonad-transformers comonads-fd groupoids"
136+ , "profunctor-extras semigroupoid-extras"
137+ , "hamlet shakespeare-css shakespeare-i18n"
138+ , "shakespeare-js shakespeare-text"
139+ , "attoparsec-conduit blaze-builder-conduit http-client-conduit"
140+ , "network-conduit zlib-conduit http-client-multipart"
141+ , "wai-eventsource wai-test"
142+ , "hspec-discover"
143+ ]
144+
145+ -- Cloud Haskell tests seem to be unreliable
146+ mapM_ add $ words =<<
147+ [ "distributed-process lockfree-queue network-transport-tcp"
148+ ]
149+
150+ -- Pulls in monad-peel which does not compile
151+ when (ghcVer >= GhcMajorVersion 7 8) $ add "monad-control"
152+
153+ -- https://github.com/fpco/stackage/issues/226
154+ add "options"
155+
156+ -- https://github.com/gtk2hs/gtk2hs/issues/36
157+ add "glib"
158+ add "pango"
159+
160+ -- https://github.com/acw/bytestring-progress/issues/3
161+ add "bytestring-progress"
162+
163+ -- Seems to require 32-bit functions
164+ add "nettle"
165+
166+ -- Depends on a missing graphviz executable
167+ add "graphviz"
168+
169+ -- https://github.com/silkapp/json-schema/issues/8
170+ when (ghcVer <= GhcMajorVersion 7 6) $
171+ add "json-schema"
172+
173+ -- No AWS creds available
174+ add "aws"
175+
176+ -- Not sure why...
177+ add "singletons"
178+
179+ add "hspec2"
180+ add "hspec-wai"
181+
182+ -- Requires too new a version of time
183+ when (ghcVer < GhcMajorVersion 7 8) $ add "cookie"
184+
185+ -- https://github.com/fpco/stackage/issues/285
186+ add "diagrams-haddock"
187+ add "scientific"
188+ add "json-schema"
189+
190+ -- https://github.com/BioHaskell/octree/issues/4
191+ add "Octree"
192+
193+ -- No code until we upgrade to network 2.6
194+ add "network-uri"
195+
196+ -- https://github.com/goldfirere/th-desugar/issues/12
197+ add "th-desugar"
198+
199+ -- https://github.com/haskell/c2hs/issues/108
200+ add "c2hs"
201+
202+ -- https://github.com/jmillikin/haskell-filesystem/issues/3
203+ add "system-filepath"
204+
205+ -- For some unknown reason, doctest has trouble on GHC 7.6. This only
206+ -- happens during a Stackage test.
207+ --
208+ -- See: http://www.reddit.com/r/haskell/comments/2go92u/beginner_error_messages_in_c_vs_haskell/cklaspk
209+ when (ghcVer == GhcMajorVersion 7 6) $ add "http-types"
210+
211+ -- Requires a running webdriver server
212+ add "webdriver"
213+ add "webdriver-snoy"
214+
215+ -- Weird conflicts with sandboxing
216+ add "ghc-mod"
217+ add "ghcid"
218+
219+ -- Requires locally running server
220+ add "bloodhound"
221+
222+ -- Too lazy to keep the test dependencies up to date
223+ let names =
224+ words "hasql hasql-postgres hasql-backend postgresql-binary" ++
225+ words "stm-containers focus list-t slave-thread partial-handler" ++
226+ words "neat-interpolation cases" ++
227+ words "base-prelude mtl-prelude"
228+ in mapM_ add names
229+
230+ -- https://github.com/gtk2hs/gtk2hs/issues/79
231+ add "gio"
232+ add "gtk"
233+
234+ -- Requires SAT solver and old QuickCheck
235+ add "ersatz"
236+
237+ -- https://github.com/ekmett/gl/issues/3
238+ add "gl"
239+
240+ -- Failing doctests
241+ add "bits"
242+
243+ -- No server running
244+ add "amqp"
245+
246+ when (ghcVer == GhcMajorVersion 7 8 && requireHP) $ do
247+ -- https://github.com/vincenthz/hs-asn1/issues/11
248+ add "asn1-encoding"
249+
250+ -- https://github.com/vincenthz/hs-tls/issues/84
251+ add "tls"
252+
253+ add "x509"
254+
255+ -- Often run out of inotify handles
256+ add "fsnotify"
257+
258+ -- Requires a correctly set up Postgres instance
259+ add "opaleye"
260+ where
261+ add = tell . singleton . PackageName
262+
263+-- | List of packages for our stable Hackage. All dependencies will be
264+-- included as well. Please indicate who will be maintaining the package
265+-- via comments.
266+defaultStablePackages :: GhcMajorVersion
267+ -> Bool -- ^ using haskell platform?
268+ -> Map PackageName (VersionRange, Maintainer)
269+defaultStablePackages ghcVer requireHP = unPackageMap $ execWriter $ do
270+ when (ghcVer == GhcMajorVersion 7 8 && requireHP) haskellPlatform78
271+ mapM_ (add "michael@snoyman.com") $ words =<<
272+ [ "yesod yesod-newsfeed yesod-sitemap yesod-static yesod-test yesod-bin"
273+ , "markdown mime-mail-ses"
274+ , "persistent persistent-template persistent-sqlite persistent-postgresql persistent-mysql"
275+ , "network-conduit-tls yackage warp-tls keter"
276+ , "process-conduit stm-conduit"
277+ , "classy-prelude-yesod yesod-fay yesod-eventsource wai-websockets"
278+ , "random-shuffle hebrew-time"
279+ , "bzlib-conduit case-insensitive"
280+ , "conduit-extra conduit-combinators yesod-websockets"
281+ , "cabal-src"
282+ , "yesod-auth-deskcom monadcryptorandom sphinx"
283+ , "yesod-gitrepo"
284+ ]
285+
286+ -- https://github.com/fpco/stackage/issues/261
287+ addRange "Michael Snoyman" "cabal-install" $
288+ case () of
289+ ()
290+ | ghcVer <= GhcMajorVersion 7 6 -> "< 1.17"
291+ | ghcVer <= GhcMajorVersion 7 8 -> "< 1.19"
292+ | otherwise -> "-any"
293+ -- cabal-install is buggy still...
294+ addRange "Michael Snoyman" "network" "< 2.6"
295+ addRange "Michael Snoyman" "network-uri" "< 2.6"
296+
297+ mapM_ (add "FP Complete <michael@fpcomplete.com>") $ words =<<
298+ [ "web-fpco th-expand-syns configurator smtLib"
299+ , "fixed-list indents language-c pretty-class"
300+ , "csv-conduit cassava"
301+ , "async shelly thyme"
302+ , "hxt hxt-relaxng dimensional"
303+ , "cairo diagrams-cairo gtk2hs-buildtools"
304+ , "base16-bytestring convertible"
305+ , "compdata hybrid-vectors"
306+ , "executable-path formatting quandl-api"
307+ , "fgl hmatrix hmatrix-gsl"
308+ , "alex happy c2hs"
309+ , "fpco-api aws persistent-mongoDB"
310+ , "random-fu lhs2tex"
311+ , "Chart Chart-diagrams histogram-fill random-source"
312+ , "webdriver"
313+ , "foreign-store"
314+ , "statistics-linreg"
315+ -- https://github.com/Soostone/retry/issues/18
316+ -- , "retry"
317+ ]
318+ when (ghcVer < GhcMajorVersion 7 8) $ do -- No GHC 7.8 support
319+ mapM_ (add "FP Complete <michael@fpcomplete.com>") $ words =<<
320+ [ "" -- too unreliable for the moment "distributed-process distributed-process-simplelocalnet"
321+ -- https://github.com/fpco/stackage/issues/295
322+ --, "threepenny-gui unification-fd"
323+ ]
324+ addRange "FP Complete <michael@fpcomplete.com>" "compdata" "< 0.8"
325+ when (ghcVer >= GhcMajorVersion 7 8 && not requireHP) $
326+ mapM_ (add "FP Complete <michael@fpcomplete.com>") $ words =<<
327+ [ "criterion"
328+ , "th-lift singletons th-desugar quickcheck-assertions"
329+ , "distributed-process distributed-process-simplelocalnet" -- cloud-haskell"
330+ ]
331+
332+ addRange "FP Complete <michael@fpcomplete.com>" "kure" "<= 2.4.10"
333+
334+ mapM_ (add "Omari Norman <omari@smileystation.com>") $ words
335+ "barecheck rainbow rainbow-tests"
336+ when (ghcVer >= GhcMajorVersion 7 8 && not requireHP) $
337+ mapM_ (add "Omari Norman <omari@smileystation.com>") $ words
338+ "quickpull"
339+
340+ mapM_ (add "Neil Mitchell") $ words
341+ "hlint hoogle shake derive tagsoup cmdargs safe uniplate nsis js-jquery js-flot extra bake ghcid"
342+
343+ mapM_ (add "Alan Zimmerman") $ words
344+ "hjsmin language-javascript"
345+
346+ when (ghcVer >= GhcMajorVersion 7 8 && not requireHP) $
347+ mapM_ (add "Alfredo Di Napoli <alfredo.dinapoli@gmail.com>") $ words
348+ "mandrill"
349+
350+ mapM_ (add "Jasper Van der Jeugt") $ words
351+ "blaze-html blaze-markup stylish-haskell"
352+
353+ mapM_ (add "Antoine Latter") $ words
354+ "uuid byteorder"
355+
356+ mapM_ (add "Philipp Middendorf <pmidden@secure.mailbox.org>") $ words
357+ "clock"
358+
359+ mapM_ (add "Stefan Wehr <wehr@factisresearch.com>") $ words
360+ "HTF xmlgen stm-stats"
361+ when (ghcVer < GhcMajorVersion 7 8) $ add "Stefan Wehr <wehr@factisresearch.com>" "hscurses"
362+
363+ mapM_ (add "Bart Massey <bart.massey+stackage@gmail.com>") $ words
364+ "parseargs"
365+
366+ mapM_ (add "Vincent Hanquez") $ words =<<
367+ [ "bytedump certificate cipher-aes cipher-rc4 connection"
368+ , "cprng-aes cpu crypto-pubkey-types crypto-random-api cryptocipher"
369+ , "cryptohash hit language-java libgit pem siphash socks tls"
370+ , "tls-debug vhd language-java"
371+ ]
372+
373+ mapM_ (add "Chris Done") $ words =<<
374+ [ "ace check-email freenect gd"
375+ , "hostname-validate ini lucid osdkeys pdfinfo"
376+ , "pure-io sourcemap frisby"
377+ , "present"
378+ ]
379+
380+ -- Requires older haddock currently
381+ when (ghcVer == GhcMajorVersion 7 8 && requireHP) $
382+ mapM_ (add "Chris Done") $ words =<<
383+ [ "haskell-docs"
384+ ]
385+
386+ -- https://github.com/jgoerzen/testpack/issues/10
387+ when (ghcVer >= GhcMajorVersion 7 8 && not requireHP) $
388+ mapM_ (add "Chris Done") $ words =<<
389+ [ "scrobble"
390+ ]
391+
392+ -- Requires too new a process for GHC 7.6
393+ when (ghcVer >= GhcMajorVersion 7 8) $
394+ mapM_ (add "Chris Done") $ words =<<
395+ [ "shell-conduit"
396+ ]
397+
398+ -- TODO: Add hindent and structured-haskell-mode once they've been ported to HSE 1.16.
399+
400+#if !defined(mingw32_HOST_OS) && !defined(__MINGW32__)
401+ -- Does not compile on Windows
402+ mapM_ (add "Vincent Hanquez") $ words "udbus xenstore"
403+#endif
404+
405+ when (ghcVer < GhcMajorVersion 7 8) $
406+ mapM_ (add "Alberto G. Corona <agocorona@gmail.com>") $ words
407+ "RefSerialize TCache Workflow MFlow"
408+
409+ mapM_ (add "Edward Kmett <ekmett@gmail.com>") $ words =<<
410+ [ "ad adjunctions bifunctors bound charset comonad comonad-transformers"
411+ , "comonads-fd compressed concurrent-supply constraints contravariant"
412+ , "distributive either eq free groupoids heaps hyphenation"
413+ , "integration intervals kan-extensions lca lens linear monadic-arrays machines"
414+ , "mtl profunctors profunctor-extras reducers reflection"
415+ , "semigroups semigroupoids semigroupoid-extras speculation tagged void"
416+ , "graphs monad-products monad-st wl-pprint-extras wl-pprint-terminfo"
417+ , "numeric-extras parsers pointed prelude-extras reducers"
418+ , "streams vector-instances"
419+ , "approximate bits bytes compensated exceptions"
420+ , "linear-accelerate log-domain"
421+ , "monad-products monad-st nats"
422+ , "ersatz"
423+ -- hyperloglog
424+ ]
425+ when (ghcVer < GhcMajorVersion 7 8) $ do
426+ mapM_ (add "Edward Kmett <ekmett@gmail.com>") $ words =<<
427+ [ "categories comonad-extras recursion-schemes syb-extras"
428+ ]
429+ addRange "Edward Kmett <ekmett@gmail.com>" "bits" "< 0.4"
430+ when (ghcVer >= GhcMajorVersion 7 8) $
431+ mapM_ (add "Edward Kmett <ekmett@gmail.com>") $ words =<<
432+ -- https://github.com/ekmett/fixed/issues/1
433+ [ "fixed"
434+ -- https://github.com/ekmett/half/issues/1
435+ , "half gl"
436+ ]
437+ when (ghcVer >= GhcMajorVersion 7 8 && not requireHP) $
438+ mapM_ (add "Edward Kmett <ekmett@gmail.com>") $ words =<<
439+ [ "lens-aeson quickpull zlib-lens"
440+ ]
441+ -- Temporary upper bound for some of the above packages
442+ addRange "Edward Kmett <ekmett@gmail.com>" "generic-deriving" "< 1.7"
443+
444+ mapM_ (add "Andrew Farmer <afarmer@ittc.ku.edu>") $ words
445+ "scotty wai-middleware-static"
446+
447+ mapM_ (add "Simon Hengel <sol@typeful.net>") $ words
448+ "hspec hspec-wai hspec-wai-json aeson-qq interpolate doctest base-compat"
449+
450+ mapM_ (add "Mario Blazevic <blamario@yahoo.com>") $ words
451+ "monad-parallel monad-coroutine incremental-parser monoid-subclasses"
452+
453+ mapM_ (add "Brent Yorgey <byorgey@gmail.com>") $ words =<<
454+ [ "monoid-extras dual-tree vector-space-points active force-layout"
455+ , "diagrams diagrams-contrib diagrams-core diagrams-lib diagrams-svg"
456+ , "diagrams-postscript haxr"
457+ , "BlogLiterately"
458+ , "MonadRandom"
459+ , "diagrams-builder diagrams-haddock BlogLiterately-diagrams"
460+ ]
461+ mapM_ (add "Vincent Berthoux <vincent.berthoux@gmail.com>") $ words
462+ "JuicyPixels"
463+
464+ mapM_ (add "Patrick Brisbin") $ words "gravatar"
465+
466+ -- https://github.com/fpco/stackage/issues/299
467+ -- mapM_ (add "Paul Harper <benekastah@gmail.com>") $ words "yesod-auth-oauth2"
468+
469+ mapM_ (add "Felipe Lessa <felipe.lessa@gmail.com>") $ words
470+ "esqueleto fb fb-persistent yesod-fb yesod-auth-fb"
471+
472+ mapM_ (add "Alexander Altman <alexanderaltman@me.com>") $ words
473+ "base-unicode-symbols containers-unicode-symbols"
474+
475+ if ghcVer >= GhcMajorVersion 7 8
476+ then add "Trevor L. McDonell <tmcdonell@cse.unsw.edu.au>" "accelerate"
477+ else do
478+ addRange "Trevor L. McDonell <tmcdonell@cse.unsw.edu.au>" "accelerate" "< 0.15"
479+ addRange "Michael Snoyman" "linear-accelerate" "< 0.2"
480+
481+ mapM_ (add "Dan Burton <danburton.email@gmail.com>") $ words =<<
482+ [ "basic-prelude composition io-memoize numbers rev-state runmemo"
483+ , "tardis lens-family-th"
484+ ]
485+
486+ mapM_ (add "Daniel Díaz <dhelta.diaz@gmail.com>") $ words
487+ "HaTeX matrix"
488+ when (ghcVer >= GhcMajorVersion 7 8) $
489+ mapM_ (add "Daniel Díaz <dhelta.diaz@gmail.com>") $ words
490+ "binary-list"
491+
492+ mapM_ (add "Gabriel Gonzalez <Gabriel439@gmail.com>")
493+ ["pipes", "pipes-parse", "pipes-concurrency"]
494+
495+ when (ghcVer >= GhcMajorVersion 7 8) $
496+ mapM_ (add "Chris Allen <cma@bitemyapp.com>")
497+ ["bloodhound"]
498+
499+ mapM_ (add "Adam Bergmark <adam@bergmark.nl>") $ words
500+ "fay fay-base fay-dom fay-jquery fay-text fay-uri snaplet-fay"
501+
502+ when (ghcVer >= GhcMajorVersion 7 8 && not requireHP) $
503+ mapM_ (add "Rodrigo Setti <rodrigosetti@gmail.com>") $ words
504+ "messagepack messagepack-rpc"
505+
506+ mapM_ (add "Boris Lykah <lykahb@gmail.com>") $ words
507+ "groundhog groundhog-th groundhog-sqlite groundhog-postgresql groundhog-mysql"
508+
509+ mapM_ (add "Janne Hellsten <jjhellst@gmail.com>") $ words
510+ "sqlite-simple"
511+
512+ mapM_ (add "Michal J. Gajda") $ words
513+ "iterable Octree FenwickTree"
514+ -- https://github.com/BioHaskell/hPDB/issues/2
515+ when (ghcVer >= GhcMajorVersion 7 8) $ do
516+ mapM_ (add "Michal J. Gajda") $ words
517+ "hPDB hPDB-examples"
518+
519+ mapM_ (add "Roman Cheplyaka <roma@ro-che.info>") $ words =<<
520+ [ "smallcheck tasty tasty-smallcheck tasty-quickcheck tasty-hunit tasty-golden"
521+ , "traverse-with-class regex-applicative time-lens"
522+ , "haskell-names haskell-packages hse-cpp"
523+ , "action-permutations amqp curl generics-sop heredoc immortal timezone-olson timezone-series"
524+ ]
525+
526+ mapM_ (add "George Giorgidze <giorgidze@gmail.com>") $ words
527+ "HCodecs YampaSynth"
528+
529+ mapM_ (add "Phil Hargett <phil@haphazardhouse.net>") $ words
530+ "courier"
531+
532+#if !defined(mingw32_HOST_OS) && !defined(__MINGW32__)
533+ mapM_ (add "Aycan iRiCAN <iricanaycan@gmail.com>") $ words
534+ "hdaemonize hsyslog hweblib"
535+#else
536+ mapM_ (add "Aycan iRiCAN <iricanaycan@gmail.com>") $ words
537+ "hweblib"
538+#endif
539+
540+ mapM_ (add "Joachim Breitner <mail@joachim-breitner.de>") $ words
541+ "circle-packing arbtt"
542+ when (ghcVer >= GhcMajorVersion 7 8) $
543+ mapM_ (add "Joachim Breitner <mail@joachim-breitner.de>") $ words
544+ "ghc-heap-view"
545+
546+ when (ghcVer < GhcMajorVersion 7 8) $
547+ mapM_ (add "John Wiegley") $ words =<<
548+ [ "bindings-DSL github monad-extras numbers"
549+ ]
550+
551+ mapM_ (add "Aditya Bhargava <adit@adit.io") $ words
552+ "HandsomeSoup"
553+
554+ mapM_ (add "Clint Adams <clint@debian.org>") $ words
555+ "hOpenPGP openpgp-asciiarmor MusicBrainz DAV hopenpgp-tools"
556+
557+ -- https://github.com/fpco/stackage/issues/160
558+ mapM_ (add "Ketil Malde") $ words =<<
559+ [ "biocore biofasta biofastq biosff"
560+ , "blastxml bioace biophd"
561+ , "biopsl" -- https://github.com/ingolia/SamTools/issues/3 samtools
562+ , "seqloc bioalign BlastHTTP"
563+ -- The following have out-of-date dependencies currently
564+ -- biostockholm memexml RNAwolf
565+ -- , "Biobase BiobaseDotP BiobaseFR3D BiobaseInfernal BiobaseMAF"
566+ -- , "BiobaseTrainingData BiobaseTurner BiobaseXNA BiobaseVienna"
567+ -- , "BiobaseTypes BiobaseFasta"
568+ -- MC-Fold-DP
569+ ]
570+ -- https://github.com/fpco/stackage/issues/163
571+ addRange "Michael Snoyman" "biophd" "< 0.0.6 || > 0.0.6"
572+
573+ mapM_ (add "Silk <code@silk.co>") $ words =<<
574+ [ "arrow-list attoparsec-expr bumper code-builder fay-builder"
575+ , "hxt-pickle-utils multipart regular-xmlpickler"
576+ , "tostring uri-encode imagesize-conduit"
577+ ]
578+ when (ghcVer >= GhcMajorVersion 7 8 && not requireHP) $ do
579+ mapM_ (add "Silk <code@silk.co>") $ words =<<
580+ [ "aeson-utils generic-aeson json-schema"
581+ , "rest-client rest-core rest-gen rest-happstack rest-snap rest-stringmap"
582+ , "rest-types rest-wai tostring uri-encode imagesize-conduit"
583+ ]
584+
585+ mapM_ (add "Simon Michael <simon@joyful.com>") $ words
586+ "hledger"
587+
588+ mapM_ (add "Mihai Maruseac <mihai.maruseac@gmail.com>") $ words
589+ "io-manager"
590+
591+ mapM_ (add "Dimitri Sabadie <dimitri.sabadie@gmail.com") $ words
592+ "monad-journal"
593+
594+ mapM_ (add "Thomas Schilling <nominolo@googlemail.com>") $ words
595+ "ghc-syb-utils"
596+
597+ mapM_ (add "Boris Buliga <d12frosted@icloud.com>") $ words
598+ "ghc-mod io-choice"
599+ when (ghcVer >= GhcMajorVersion 7 8) $
600+ mapM_ (add "Boris Buliga <d12frosted@icloud.com>") $ words
601+ "system-canonicalpath"
602+
603+ when (ghcVer >= GhcMajorVersion 7 8) $
604+ mapM_ (add "Yann Esposito <yann.esposito@gmail.com>") $ words
605+ "holy-project"
606+ when requireHP $ addRange "Yann Esposito <yann.esposito@gmail.com>" "holy-project" "< 0.1.1.1"
607+
608+ mapM_ (add "Paul Rouse <pgr@doynton.org>") $ words
609+ "yesod-auth-hashdb"
610+
611+ add "Toralf Wittner <tw@dtex.org>" "zeromq4-haskell"
612+
613+ mapM_ (add "trupill@gmail.com") $ words
614+ "djinn-lib djinn-ghc"
615+
616+ mapM_ (add "Arash Rouhani <miffoljud@gmail.com>") $ words
617+ "yesod-text-markdown"
618+
619+ mapM_ (add "Matvey Aksenov <matvey.aksenov@gmail.com") $ words
620+ "terminal-size"
621+
622+ mapM_ (add "Luis G. Torres <lgtorres42@gmail.com") $ words
623+ "kdt"
624+ {- https://github.com/fpco/stackage/pull/331
625+ mapM_ (add "Jyotirmoy Bhattacharya <jyotirmoy@jyotirmoy.net") $ words
626+ "hakyll"
627+ -}
628+
629+ mapM_ (add "Emanuel Borsobom <manny@fpcomplete.com>") $ words =<<
630+ ["text-binary BoundedChan bytestring-lexing bytestring-trie"
631+ ,"data-accessor data-accessor-mtl file-location here"
632+ ,"hlibgit2 hostname-validate interpolatedstring-perl6 iproute"
633+ ,"missing-foreign multimap parallel-io"]
634+ when (ghcVer >= GhcMajorVersion 7 8) $
635+ mapM_ (add "Emanuel Borsobom <manny@fpcomplete.com>") $ words
636+ "haddock-api"
637+ when (not requireHP) $
638+ mapM_ (add "Emanuel Borsobom <manny@fpcomplete.com>") $ words
639+ "fuzzcheck MissingH"
640+
641+ mapM_ (add "Michael Sloan <mgsloan@gmail.com") $ words
642+ "th-orphans th-reify-many"
643+
644+ when (ghcVer == GhcMajorVersion 7 8 && not requireHP) $
645+ mapM_ (add "Michael Snoyman") $ words =<<
646+ [ "repa repa-io repa-algorithms repa-devil JuicyPixels-repa"
647+ ]
648+
649+ when (ghcVer >= GhcMajorVersion 7 8 && not requireHP) $ do
650+ mapM_ (add "Nikita Volkov <nikita.y.volkov@mail.ru>") $
651+ words "hasql hasql-postgres hasql-backend postgresql-binary" ++
652+ words "stm-containers focus list-t slave-thread partial-handler" ++
653+ words "neat-interpolation cases" ++
654+ words "base-prelude mtl-prelude"
655+ addRange "Nikita Volkov <nikita.y.volkov@mail.ru>" "mtl-prelude" "< 2"
656+
657+ mapM_ (add "Iustin Pop <iustin@k1024.org>") $ words
658+ "prefix-units"
659+
660+ mapM_ (add "Alexander Thiemann <mail@athiemann.net>") $ words
661+ "graph-core reroute Spock"
662+
663+ mapM_ (add "Joey Eremondi <joey@eremondi.com>") $ words
664+ "prettyclass language-glsl union-find aeson-pretty QuasiText"
665+
666+ mapM_ (add "Arthur Fayzrakhmanov <heraldhoi@gmail.com>") $ words
667+ "sodium hdevtools"
668+
669+ -- https://github.com/fpco/stackage/issues/217
670+ addRange "Michael Snoyman" "transformers" "< 0.4"
671+ addRange "Michael Snoyman" "mtl" "< 2.2"
672+ addRange "Michael Snoyman" "lifted-base" "< 0.2.2.2"
673+
674+ -- https://github.com/fpco/stackage/issues/224
675+ when (ghcVer <= GhcMajorVersion 7 6) $ do
676+ addRange "Michael Snoyman" "zip-archive" "== 0.2.2.1"
677+ addRange "Michael Snoyman" "pandoc" "== 1.12.4.2"
678+ addRange "Michael Snoyman" "texmath" "<= 0.6.6.3"
679+ addRange "Michael Snoyman" "attoparsec" "== 0.11.3.1"
680+ addRange "Michael Snoyman" "parsers" "< 0.11"
681+ addRange "Michael Snoyman" "scientific" "< 0.3"
682+ addRange "Michael Snoyman" "aeson" "< 0.7.0.5"
683+ addRange "Michael Snoyman" "aeson-utils" "< 0.2.2"
684+ addRange "Michael Snoyman" "formatting" "< 5"
685+ addRange "Michael Snoyman" "aws" "< 0.10"
686+ addRange "Michael Snoyman" "network" "< 2.6"
687+ addRange "Michael Snoyman" "network-uri" "< 2.6"
688+
689+ -- 0.16.2 fixes dependency issues with different version of GHC
690+ -- and Haskell Platform. Now builds on GHC 7.4-7.8. Version 1.0 is
691+ -- guaranteed to break the API. See
692+ -- https://travis-ci.org/jswebtools/language-ecmascript for
693+ -- current build status.
694+ addRange "Andrey Chudnov <oss@chudnov.com>" "language-ecmascript" ">= 0.16.2 && < 1.0"
695+
696+ -- https://github.com/fpco/stackage/issues/271
697+ when (ghcVer < GhcMajorVersion 7 8) $
698+ addRange "Michael Snoyman" "aeson" "< 0.8"
699+
700+ -- https://github.com/fpco/stackage/issues/288
701+ addRange "Michael Snoyman" "text" "< 1.2"
702+
703+ -- Force a specific version that's compatible with transformers 0.3
704+ addRange "Michael Snoyman" "transformers-compat" "== 0.3.3.3"
705+
706+ -- https://github.com/fpco/stackage/issues/291
707+ addRange "Michael Snoyman" "random" "< 1.0.1.3"
708+
709+ -- https://github.com/fpco/stackage/issues/314
710+ addRange "Michael Snoyman" "hxt" "< 9.3.1.9"
711+
712+ -- https://github.com/fpco/stackage/issues/318
713+ addRange "Michael Snoyman" "HaXml" "< 1.25"
714+
715+ -- https://github.com/fpco/stackage/issues/319
716+ addRange "Michael Snoyman" "polyparse" "< 1.10"
717+
718+ -- https://github.com/fpco/stackage/issues/341
719+ addRange "Michael Snoyman" "haskell-names" "< 0.5"
720+
721+ -- https://github.com/nikita-volkov/stm-containers/issues/3
722+ addRange "Michael Snoyman" "free" "< 4.10"
723+
724+ -- https://github.com/fpco/stackage/issues/354
725+ addRange "Michael Snoyman" "JuicyPixels" "< 3.2"
726+
727+ when (ghcVer == GhcMajorVersion 7 8 && requireHP) $ do
728+ -- Yay workarounds for unnecessarily old versions
729+ let peg x y = addRange "Haskell Platform" x y
730+ peg "aeson" "== 0.7.0.4"
731+ peg "scientific" "== 0.2.0.2"
732+ peg "criterion" "<= 0.8.1.0"
733+ peg "tasty-quickcheck" "< 0.8.0.3"
734+ peg "formatting" "< 5.0"
735+ peg "parsers" "< 0.11"
736+ peg "lens" "< 4.2"
737+ peg "contravariant" "< 1"
738+ peg "adjunctions" "< 4.2"
739+ peg "kan-extensions" "< 4.1"
740+ peg "semigroupoids" "< 4.1"
741+ peg "aws" "< 0.10"
742+ peg "pandoc" "< 1.13"
743+ peg "texmath" "<= 0.6.6.3"
744+ peg "checkers" "== 0.3.2"
745+ peg "HandsomeSoup" "< 0.3.3"
746+ peg "network-uri" "< 2.6"
747+
748+ mapM_ (add "Tom Ellis <tom-stackage@jaguarpaw.co.uk>") $ words
749+ "opaleye product-profunctors"
750+
751+add :: String -> String -> Writer PackageMap ()
752+add maintainer package = addRange maintainer package "-any"
753+
754+addRange :: String -> String -> String -> Writer PackageMap ()
755+addRange maintainer package range =
756+ case simpleParse range of
757+ Nothing -> error $ "Invalid range " ++ show range ++ " for " ++ package
758+ Just range' -> tell $ PackageMap $ Map.singleton (PackageName package) (range', Maintainer maintainer)
759+
760+-- | Hard coded Haskell Platform versions
761+haskellPlatform78 :: Writer PackageMap ()
762+haskellPlatform78 = do
763+ addRange "Haskell Platform" "ghc" "== 7.8.3"
764+ addRange "Haskell Platform" "haddock" "== 2.14.3"
765+ addRange "Haskell Platform" "array" "== 0.5.0.0"
766+ addRange "Haskell Platform" "base" "== 4.7.0.1"
767+ addRange "Haskell Platform" "bytestring" "== 0.10.4.0"
768+ addRange "Haskell Platform" "Cabal" "== 1.18.1.3"
769+ addRange "Haskell Platform" "containers" "== 0.5.5.1"
770+ addRange "Haskell Platform" "deepseq" "== 1.3.0.2"
771+ addRange "Haskell Platform" "directory" "== 1.2.1.0"
772+ addRange "Haskell Platform" "filepath" "== 1.3.0.2"
773+ addRange "Haskell Platform" "haskell2010" "== 1.1.2.0"
774+ addRange "Haskell Platform" "haskell98" "== 2.0.0.3"
775+ addRange "Haskell Platform" "hpc" "== 0.6.0.1"
776+ addRange "Haskell Platform" "old-locale" "== 1.0.0.6"
777+ addRange "Haskell Platform" "old-time" "== 1.1.0.2"
778+ addRange "Haskell Platform" "pretty" "== 1.1.1.1"
779+ addRange "Haskell Platform" "process" "== 1.2.0.0"
780+ addRange "Haskell Platform" "template-haskell" "== 2.9.0.0"
781+ addRange "Haskell Platform" "time" "== 1.4.2"
782+ addRange "Haskell Platform" "transformers" "== 0.3.0.0"
783+ addRange "Haskell Platform" "unix" "== 2.7.0.1"
784+ addRange "Haskell Platform" "xhtml" "== 3000.2.1"
785+ addRange "Haskell Platform" "async" "== 2.0.1.5"
786+ addRange "Haskell Platform" "attoparsec" "== 0.10.4.0"
787+ addRange "Haskell Platform" "case-insensitive" "== 1.1.0.3"
788+ addRange "Haskell Platform" "fgl" "== 5.5.0.1"
789+ addRange "Haskell Platform" "GLURaw" "== 1.4.0.1"
790+ addRange "Haskell Platform" "GLUT" "== 2.5.1.1"
791+ addRange "Haskell Platform" "hashable" "== 1.2.2.0"
792+ addRange "Haskell Platform" "haskell-src" "== 1.0.1.6"
793+ addRange "Haskell Platform" "html" "== 1.0.1.2"
794+ addRange "Haskell Platform" "HTTP" "== 4000.2.10"
795+ addRange "Haskell Platform" "HUnit" "== 1.2.5.2"
796+ addRange "Haskell Platform" "mtl" "== 2.1.3.1"
797+ addRange "Haskell Platform" "network" "== 2.4.2.3"
798+ addRange "Haskell Platform" "OpenGL" "== 2.9.2.0"
799+ addRange "Haskell Platform" "OpenGLRaw" "== 1.5.0.0"
800+ addRange "Haskell Platform" "parallel" "== 3.2.0.4"
801+ addRange "Haskell Platform" "parsec" "== 3.1.5"
802+ addRange "Haskell Platform" "primitive" "== 0.5.2.1"
803+ addRange "Haskell Platform" "QuickCheck" "== 2.6"
804+ addRange "Haskell Platform" "random" "== 1.0.1.1"
805+ addRange "Haskell Platform" "regex-base" "== 0.93.2"
806+ addRange "Haskell Platform" "regex-compat" "== 0.95.1"
807+ addRange "Haskell Platform" "regex-posix" "== 0.95.2"
808+ addRange "Haskell Platform" "split" "== 0.2.2"
809+ addRange "Haskell Platform" "stm" "== 2.4.2"
810+ addRange "Haskell Platform" "syb" "== 0.4.1"
811+ addRange "Haskell Platform" "text" "== 1.1.0.0"
812+ addRange "Haskell Platform" "transformers" "== 0.3.0.0"
813+ addRange "Haskell Platform" "unordered-containers" "== 0.2.4.0"
814+ addRange "Haskell Platform" "vector" "== 0.10.9.1"
815+ addRange "Haskell Platform" "xhtml" "== 3000.2.1"
816+ addRange "Haskell Platform" "zlib" "== 0.5.4.1"
817+ addRange "Haskell Platform" "alex" "== 3.1.3"
818+ addRange "Haskell Platform" "cabal-install" "== 1.18.0.5"
819+ addRange "Haskell Platform" "happy" "== 1.19.4"
820+ addRange "Haskell Platform" "hscolour" "== 1.20.3"
821+
822+-- | Replacement Github users. This is useful when a project is owned by an
823+-- organization. It also lets you ping multiple users.
824+--
825+-- Note that cross organization team mentions aren't allowed by Github.
826+convertGithubUser :: String -> [String]
827+convertGithubUser x =
828+ fromMaybe [x] $ Map.lookup (map toLower x) pairs
829+ where
830+ pairs = Map.fromList
831+ [ ("diagrams", ["byorgey", "fryguybob", "jeffreyrosenbluth", "bergey"])
832+ , ("yesodweb", ["snoyberg"])
833+ , ("fpco", ["snoyberg"])
834+ , ("faylang", ["bergmark"])
835+ , ("silkapp", ["bergmark", "hesselink"])
836+ , ("snapframework",["mightybyte"])
837+ , ("haskell-ro", ["mihaimaruseac"])
838+ ]
Stackage/GhcPkg.hsnew file+49
@@ -0,0 +1,49 @@
1+module Stackage.GhcPkg where
2+
3+import Stackage.Types
4+import System.Process
5+import Distribution.Text (simpleParse)
6+import Distribution.Version (Version (Version))
7+import Data.Char (isSpace)
8+import qualified Data.Set as Set
9+
10+getPackages :: [String] -> GhcMajorVersion -> IO (Set PackageIdentifier)
11+getPackages extraArgs version = do
12+ output <- readProcess "ghc-pkg" (extraArgs ++ [arg, "list"]) ""
13+ fmap Set.unions $ mapM parse $ drop 1 $ lines output
14+ where
15+ -- Account for a change in command line option name
16+ arg
17+ | version >= GhcMajorVersion 7 6 = "--no-user-package-db"
18+ | otherwise = "--no-user-package-conf"
19+ parse s =
20+ case clean s of
21+ "" -> return Set.empty
22+ s' ->
23+ case simpleParse s' of
24+ Just x -> return $ Set.singleton x
25+ Nothing -> error $ "Could not parse ghc-pkg output: " ++ show s
26+ clean = stripParens . dropWhile isSpace . reverse . dropWhile isSpace . reverse
27+ stripParens x@('(':_:_)
28+ | last x == ')' = tail $ init $ x
29+ stripParens x = x
30+
31+getGlobalPackages :: GhcMajorVersion -> IO (Set PackageIdentifier)
32+getGlobalPackages version = getPackages [] version
33+
34+getDBPackages :: [FilePath] -> GhcMajorVersion -> IO (Set PackageIdentifier)
35+getDBPackages [] _ = return Set.empty
36+getDBPackages packageDirs version =
37+ getPackages (map packageDbArg packageDirs) version
38+ where
39+ packageDbArg db
40+ | version >= GhcMajorVersion 7 6 = "--package-db=" ++ db
41+ | otherwise = "--package-conf" ++ db
42+
43+getGhcVersion :: IO GhcMajorVersion
44+getGhcVersion = do
45+ versionOutput <- readProcess "ghc-pkg" ["--version"] ""
46+ maybe (error $ "Invalid version output: " ++ show versionOutput) return $ do
47+ verS:_ <- Just $ reverse $ words versionOutput
48+ Version (x:y:_) _ <- simpleParse verS
49+ return $ GhcMajorVersion x y
Stackage/Init.hsnew file+32
@@ -0,0 +1,32 @@
1+module Stackage.Init (stackageInit) where
2+
3+import Data.List (isInfixOf, isPrefixOf)
4+import Stackage.Util
5+import System.FilePath ((</>))
6+
7+stackageInit :: IO ()
8+stackageInit = do
9+ c <- getCabalRoot
10+ let config = c </> "config"
11+ orig <- readFile config
12+ -- bypass laziness
13+ _ <- return $! length orig
14+ writeFile config $ unlines $ go $ lines orig
15+ where
16+ go = addStackage
17+ . map commentHackage
18+ . filter (\s -> not $ "stackage" `isInfixOf` s)
19+
20+ addStackage [] = stackageLines []
21+ addStackage (l:ls)
22+ | "remote-repo-cache:" `isPrefixOf` l = stackageLines $ l : ls
23+ | otherwise = l : addStackage ls
24+
25+ stackageLines x =
26+ "remote-repo: stackage:http://hackage.haskell.org/packages/archive"
27+ : "remote-repo: stackage-extra:http://hackage.haskell.org/packages/archive"
28+ : x
29+
30+ commentHackage s
31+ | s == "remote-repo: hackage.haskell.org:http://hackage.haskell.org/packages/archive" = "--" ++ s
32+ | otherwise = s
Stackage/InstallInfo.hsnew file+211
@@ -0,0 +1,211 @@
1+{-# LANGUAGE RecordWildCards #-}
2+{-# LANGUAGE TupleSections #-}
3+module Stackage.InstallInfo
4+ ( getInstallInfo
5+ , bpPackageList
6+ ) where
7+
8+import Control.Monad (forM_, unless)
9+import Data.List (foldl')
10+import qualified Data.Map as Map
11+import qualified Data.Set as Set
12+import Data.Time (getCurrentTime, formatTime)
13+import Data.Version (showVersion)
14+import qualified Distribution.Text
15+import Distribution.Version (simplifyVersionRange, withinRange)
16+import Stackage.GhcPkg
17+import Stackage.LoadDatabase
18+import Stackage.NarrowDatabase
19+import Stackage.ServerFiles
20+import Stackage.Types
21+import Stackage.Util
22+import System.Directory (createDirectoryIfMissing)
23+import System.FilePath ((</>))
24+import qualified System.IO as IO
25+import qualified System.IO.UTF8
26+import System.Locale (defaultTimeLocale)
27+import System.Exit (exitFailure)
28+
29+dropExcluded :: SelectSettings
30+ -> Map PackageName (VersionRange, Maintainer)
31+ -> Map PackageName (VersionRange, Maintainer)
32+dropExcluded bs m0 =
33+ foldl' (flip Map.delete) m0 (Set.toList $ excludedPackages bs)
34+
35+getInstallInfo :: SelectSettings -> IO InstallInfo
36+getInstallInfo settings = do
37+ core <- do
38+ putStrLn "Loading core packages from global database"
39+ getGlobalPackages $ selectGhcVersion settings
40+ underlay <- getDBPackages (selectUnderlayPackageDirs settings) (selectGhcVersion settings)
41+ let underlaySet = Set.map pkgName underlay
42+ coreMap = Map.unions
43+ $ map (\(PackageIdentifier k v) -> Map.singleton k v)
44+ $ Set.toList core
45+ allPackages' =
46+ stablePackages settings $ requireHaskellPlatform settings
47+ allPackages = dropExcluded settings allPackages'
48+ totalCore
49+ | ignoreUpgradeableCore settings =
50+ Map.fromList $ map (\n -> (PackageName n, Nothing)) $ words "base containers template-haskell"
51+ | otherwise =
52+ Map.fromList (map (\(PackageIdentifier p v) -> (p, Just v)) (Set.toList core))
53+ `Map.union` Map.fromList (map (, Nothing) (Set.toList $ extraCore settings))
54+
55+ putStrLn "Loading package database"
56+ pdb <- loadPackageDB settings coreMap (Map.keysSet totalCore) allPackages underlaySet
57+
58+ putStrLn "Narrowing package database"
59+ (final, errs) <- narrowPackageDB settings (Map.keysSet totalCore) pdb $ Set.fromList $ Map.toList $ Map.map snd $ allPackages
60+
61+ putStrLn "Printing build plan to build-plan.log"
62+ System.IO.UTF8.writeFile "build-plan.log" $ unlines $ map showDep $ Map.toList final
63+ System.IO.UTF8.writeFile "hackage-map.txt" $ unlines $ map showHackageMap $ Map.toList final
64+
65+ unless (Set.null errs) $ do
66+ putStrLn "Build plan requires some disallowed packages"
67+ mapM_ putStrLn $ Set.toList errs
68+ exitFailure
69+
70+ putStrLn "Checking for bad versions"
71+ case checkBadVersions settings coreMap pdb final of
72+ badVersions
73+ | Map.null badVersions -> return ()
74+ | otherwise -> do
75+ forM_ (Map.toList badVersions) $ \(user, badDeps) -> do
76+ putStrLn $ user ++ " cannot use: "
77+ forM_ (Map.toList badDeps) $ \(name, (version, range)) -> do
78+ putStrLn $ concat
79+ [ "- "
80+ , packageVersionString (name, version)
81+ , " -- "
82+ , Distribution.Text.display $ simplifyVersionRange range
83+ ]
84+ putStrLn ""
85+
86+ error "Conflicting build plan, exiting"
87+
88+ let ii = InstallInfo
89+ { iiCore = totalCore
90+ , iiPackages = Map.map biToSPI final
91+ , iiOptionalCore = Map.empty
92+ , iiPackageDB = pdb
93+ }
94+
95+ forM_ [False, True] $ \isInc -> do
96+ let incexc = if isInc then "inclusive" else "exclusive"
97+
98+ now <- getCurrentTime
99+ let ghcVer =
100+ let GhcMajorVersion x y = selectGhcVersion settings
101+ in show x ++ "." ++ show y
102+ date = formatTime defaultTimeLocale "%Y-%m-%d" now
103+
104+ createDirectoryIfMissing True incexc
105+
106+ putStrLn $ "Inclusive/exclusive: " ++ incexc
107+
108+ putStrLn "Creating hackage file (for publishing to Stackage server)"
109+ let isHP = requireHaskellPlatform settings
110+ IO.withBinaryFile (incexc </> "hackage") IO.WriteMode $ \hackageH ->
111+ IO.withBinaryFile (incexc </> "create-snapshot.sh") IO.WriteMode
112+ (createHackageFile isInc isHP ii ghcVer date hackageH)
113+
114+ putStrLn "Creating desc file (for publishing to Stackage server)"
115+ System.IO.UTF8.writeFile (incexc </> "desc") $ concat
116+ [ "Stackage build for GHC "
117+ , ghcVer
118+ , if requireHaskellPlatform settings
119+ then " + Haskell Platform"
120+ else ""
121+ , ", "
122+ , date
123+ , ", "
124+ , incexc
125+ , "\nGenerated on "
126+ , show now
127+ ]
128+
129+ System.IO.UTF8.writeFile (incexc </> "slug") $ concat
130+ [ date
131+ , "-ghc"
132+ , ghcVer
133+ , if requireHaskellPlatform settings then "hp" else ""
134+ , if isInc then "-inc" else "-exc"
135+ ]
136+
137+ return ii
138+
139+biToSPI :: BuildInfo -> SelectedPackageInfo
140+biToSPI BuildInfo {..} = SelectedPackageInfo
141+ { spiVersion = biVersion
142+ , spiMaintainer = biMaintainer
143+ , spiGithubUser = biGithubUser
144+ , spiHasTests = biHasTests
145+ }
146+
147+showDep :: (PackageName, BuildInfo) -> String
148+showDep (PackageName name, BuildInfo {..}) =
149+ concat
150+ [ name
151+ , "-"
152+ , showVersion biVersion
153+ , " ("
154+ , unMaintainer biMaintainer
155+ , " " ++ githubMentions biGithubUser
156+ , ")"
157+ , ": "
158+ , unwords $ map unP biUsers
159+ ]
160+ where
161+ unP (PackageName p) = p
162+
163+-- | Convert to format used by Hackage for displaying distribution versions.
164+-- For more info, see https://github.com/fpco/stackage/issues/38.
165+showHackageMap :: (PackageName, BuildInfo) -> String
166+showHackageMap (PackageName name, BuildInfo {..}) =
167+ show (name, showVersion biVersion, Nothing :: Maybe String)
168+
169+bpPackageList :: BuildPlan -> [String]
170+bpPackageList = map packageVersionString . Map.toList . Map.map spiVersion . bpPackages
171+
172+-- | Check for internal mismatches in required and actual package versions.
173+checkBadVersions :: SelectSettings
174+ -> Map PackageName Version -- ^ core
175+ -> PackageDB
176+ -> Map PackageName BuildInfo
177+ -> Map String (Map PackageName (Version, VersionRange))
178+checkBadVersions settings core (PackageDB pdb) buildPlan =
179+ Map.unions $ map getBadVersions $ Map.toList $ Map.filterWithKey unexpectedFailure buildPlan
180+ where
181+ unexpectedFailure name _ = name `Set.notMember` expectedFailures settings
182+
183+ getBadVersions :: (PackageName, BuildInfo) -> Map String (Map PackageName (Version, VersionRange))
184+ getBadVersions (name, bi)
185+ | Map.null badVersions = Map.empty
186+ | otherwise = Map.singleton display badVersions
187+ where
188+ badVersions = Map.unions $ map (uncurry checkPackage) $ Map.toList $ biDeps bi
189+ display = concat
190+ [ packageVersionString (name, biVersion bi)
191+ , " ("
192+ , unMaintainer $ biMaintainer bi
193+ , case Map.lookup name pdb of
194+ Just PackageInfo { piGithubUser = gus } -> " " ++ githubMentions gus
195+ _ -> ""
196+ , ")"
197+ ]
198+
199+ checkPackage :: PackageName -> VersionRange -> Map PackageName (Version, VersionRange)
200+ checkPackage name vr =
201+ case Map.lookup name buildPlan of
202+ Nothing ->
203+ case Map.lookup name core of
204+ -- Might be part of extra-core
205+ Nothing -> Map.empty
206+ Just version
207+ | version `withinRange` vr -> Map.empty
208+ | otherwise -> Map.singleton name (version, vr)
209+ Just bi
210+ | biVersion bi `withinRange` vr -> Map.empty
211+ | otherwise -> Map.singleton name (biVersion bi, vr)
Stackage/LoadDatabase.hsnew file+264
@@ -0,0 +1,264 @@
1+{-# LANGUAGE ScopedTypeVariables #-}
2+module Stackage.LoadDatabase where
3+
4+import qualified Codec.Archive.Tar as Tar
5+import qualified Codec.Compression.GZip as GZip
6+import Control.Exception (IOException, handle)
7+import Control.Monad (guard, foldM)
8+import qualified Data.ByteString.Lazy as L
9+import qualified Data.ByteString.Lazy.Char8 as L8
10+import Data.List (stripPrefix)
11+import qualified Data.Map as Map
12+import Data.Maybe (catMaybes, listToMaybe,
13+ mapMaybe, fromMaybe)
14+import Data.Monoid (Monoid (..))
15+import Data.Set (member)
16+import qualified Data.Set as Set
17+import Distribution.Compiler (CompilerFlavor (GHC))
18+import Distribution.Package (Dependency (Dependency))
19+import Distribution.PackageDescription (Condition (..),
20+ ConfVar (..),
21+ FlagName (FlagName),
22+ RepoType (Git),
23+ SourceRepo (..),
24+ benchmarkBuildInfo,
25+ buildInfo, buildTools,
26+ condBenchmarks,
27+ condExecutables,
28+ condLibrary,
29+ condTestSuites,
30+ condTreeComponents,
31+ condTreeConstraints,
32+ condTreeData,
33+ flagDefault, flagName,
34+ genPackageFlags,
35+ homepage, libBuildInfo,
36+ packageDescription,
37+ sourceRepos,
38+ testBuildInfo)
39+import Distribution.PackageDescription.Parse (ParseResult (ParseOk),
40+ parsePackageDescription)
41+import Distribution.System (buildArch, buildOS)
42+import Distribution.Text (simpleParse)
43+import Distribution.Version (Version (Version),
44+ unionVersionRanges,
45+ withinRange)
46+import Stackage.Config (convertGithubUser)
47+import Stackage.Types
48+import Stackage.Util
49+import System.Directory (doesFileExist, getDirectoryContents)
50+import System.FilePath ((<.>), (</>))
51+
52+-- | Load the raw package database.
53+--
54+-- We want to put in some restrictions:
55+--
56+-- * Drop all core packages. We never want to install a new version of
57+-- those, nor include them in the package list.
58+--
59+-- * For packages with a specific version bound, find the maximum matching
60+-- version.
61+--
62+-- * For other packages, select the maximum version number.
63+loadPackageDB :: SelectSettings
64+ -> Map PackageName Version -- ^ core packages from HP file
65+ -> Set PackageName -- ^ all core packages, including extras
66+ -> Map PackageName (VersionRange, Maintainer) -- ^ additional deps
67+ -> Set PackageName -- ^ underlay packages to exclude
68+ -> IO PackageDB
69+loadPackageDB settings coreMap core deps underlay = do
70+ tarName <- getTarballName
71+ lbs <- L.readFile tarName
72+ pdb <- addEntries mempty $ Tar.read lbs
73+ contents <- handle (\(_ :: IOException) -> return [])
74+ $ getDirectoryContents $ selectTarballDir settings
75+ pdb' <- foldM addTarball pdb $ mapMaybe stripTarGz contents
76+ return $ excludeUnderlay pdb'
77+ where
78+ addEntries _ (Tar.Fail e) = error $ show e
79+ addEntries db Tar.Done = return db
80+ addEntries db (Tar.Next e es) = addEntry db e >>= flip addEntries es
81+
82+ stripTarGz = fmap reverse . stripPrefix (reverse ".tar.gz") . reverse
83+
84+ ghcVersion' =
85+ let GhcMajorVersion x y = selectGhcVersion settings
86+ in Version [x, y, 2] []
87+
88+ addEntry :: PackageDB -> Tar.Entry -> IO PackageDB
89+ addEntry pdb e =
90+ case getPackageVersion e of
91+ Nothing -> return pdb
92+ Just (p, v)
93+ | p `member` core -> return pdb
94+ | otherwise ->
95+ case Map.lookup p deps of
96+ Just (vrange, _maintainer)
97+ | not $ withinRange v vrange -> return pdb
98+ _ -> do
99+ let pkgname = packageVersionString (p, v)
100+ tarball = selectTarballDir settings </> pkgname <.> "tar.gz"
101+ case Tar.entryContent e of
102+ Tar.NormalFile bs _ -> addPackage p v bs pdb
103+ _ -> return pdb
104+
105+ addTarball :: PackageDB -> FilePath -> IO PackageDB
106+ addTarball pdb tarball' = do
107+ lbs <- L.readFile tarball
108+ let (v', p') = break (== '-') $ reverse tarball'
109+ p = PackageName $ reverse $ drop 1 p'
110+ v <- maybe (error $ "Invalid tarball name: " ++ tarball) return
111+ $ simpleParse $ reverse v'
112+ case Map.lookup p deps of
113+ Just (vrange, _)
114+ | not $ withinRange v vrange -> return pdb
115+ _ -> findCabalAndAddPackage tarball p v pdb $ Tar.read $ GZip.decompress lbs
116+ where
117+ tarball = selectTarballDir settings </> tarball' <.> "tar.gz"
118+
119+ excludeUnderlay :: PackageDB -> PackageDB
120+ excludeUnderlay (PackageDB pdb) =
121+ PackageDB $ Map.filterWithKey (\k _ -> Set.notMember k underlay) pdb
122+
123+ skipTests p = p `Set.member` skippedTests settings
124+
125+ -- Find the relevant cabal file in the given entries and add its contents
126+ -- to the package database
127+ findCabalAndAddPackage tarball p v pdb =
128+ loop
129+ where
130+ fixPath '\\' = '/'
131+ fixPath c = c
132+
133+ expectedPath = let PackageName p' = p in concat
134+ [ packageVersionString (p, v)
135+ , "/"
136+ , p'
137+ , ".cabal"
138+ ]
139+ loop Tar.Done = error $ concat
140+ [ "Missing cabal file "
141+ , show expectedPath
142+ , " in tarball: "
143+ , show tarball
144+ ]
145+ loop (Tar.Fail e) = error $ concat
146+ [ "Unable to read tarball "
147+ , show tarball
148+ , ": "
149+ , show e
150+ ]
151+ loop (Tar.Next entry rest)
152+ | map fixPath (Tar.entryPath entry) == expectedPath =
153+ case Tar.entryContent entry of
154+ Tar.NormalFile bs _ -> addPackage p v bs pdb
155+ _ -> error $ concat
156+ [ "In tarball "
157+ , show tarball
158+ , " the cabal file "
159+ , show expectedPath
160+ , " was not a normal file"
161+ ]
162+ | otherwise = loop rest
163+
164+ addPackage p v lbs pdb = do
165+ let (deps', hasTests, buildToolsExe', buildToolsOther', mgpd, execs, mgithub) = parseDeps p lbs
166+ return $ mappend pdb $ PackageDB $ Map.singleton p PackageInfo
167+ { piVersion = v
168+ , piDeps = deps'
169+ , piHasTests = hasTests
170+ , piBuildToolsExe = buildToolsExe'
171+ , piBuildToolsAll = buildToolsExe' `Set.union` buildToolsOther'
172+ , piGPD = mgpd
173+ , piExecs = execs
174+ , piGithubUser = fromMaybe [] mgithub
175+ }
176+
177+ parseDeps p lbs =
178+ case parsePackageDescription $ L8.unpack lbs of
179+ ParseOk _ gpd -> (mconcat
180+ [ maybe mempty (go gpd) $ condLibrary gpd
181+ , mconcat $ map (go gpd . snd) $ condExecutables gpd
182+ , if skipTests p
183+ then mempty
184+ else mconcat $ map (go gpd . snd) $ condTestSuites gpd
185+ -- FIXME , mconcat $ map (go gpd . snd) $ condBenchmarks gpd
186+ ], not $ null $ condTestSuites gpd
187+ , Set.fromList $ map depName $ libExeBuildInfo gpd
188+ , Set.fromList $ map depName $ testBenchBuildInfo gpd
189+ , Just gpd
190+ , Set.fromList $ map (Executable . fst) $ condExecutables gpd
191+ , fmap convertGithubUser $ listToMaybe $ catMaybes
192+ $ parseGithubUserHP (homepage $ packageDescription gpd)
193+ : map parseGithubUserSR (sourceRepos $ packageDescription gpd)
194+ )
195+ _ -> (mempty, defaultHasTestSuites, Set.empty, Set.empty, Nothing, Set.empty, Nothing)
196+ where
197+ libExeBuildInfo gpd = concat
198+ [ maybe mempty (goBI libBuildInfo) $ condLibrary gpd
199+ , concat $ map (goBI buildInfo . snd) $ condExecutables gpd
200+ ]
201+ testBenchBuildInfo gpd = concat
202+ [ if skipTests p
203+ then []
204+ else concat $ map (goBI testBuildInfo . snd) $ condTestSuites gpd
205+ , concat $ map (goBI benchmarkBuildInfo . snd) $ condBenchmarks gpd
206+ ]
207+ goBI f x = buildTools $ f $ condTreeData x
208+
209+ depName (Dependency (PackageName pn) _) = Executable pn
210+ go gpd tree
211+ = Map.filterWithKey (\k _ -> not $ ignoredDep k)
212+ $ Map.unionsWith unionVersionRanges
213+ $ Map.fromList (map (\(Dependency pn vr) -> (pn, vr)) $ condTreeConstraints tree)
214+ : map (go gpd) (mapMaybe (checkCond gpd) $ condTreeComponents tree)
215+
216+ -- Some specific overrides for cases where getting Stackage to be smart
217+ -- enough to handle things would be too difficult.
218+ ignoredDep :: PackageName -> Bool
219+ ignoredDep dep
220+ -- The flag logic used by text-stream-decode confuses Stackage.
221+ | dep == PackageName "text" && p == PackageName "text-stream-decode" = True
222+ | otherwise = False
223+
224+ checkCond gpd (cond, tree, melse)
225+ | checkCond' cond = Just tree
226+ | otherwise = melse
227+ where
228+ checkCond' (Var (OS os)) = os == buildOS
229+ checkCond' (Var (Arch arch)) = arch == buildArch
230+
231+ -- Sigh... the small_base flag on mersenne-random-pure64 is backwards
232+ checkCond' (Var (Flag (FlagName "small_base")))
233+ | p == PackageName "mersenne-random-pure64" = False
234+
235+ checkCond' (Var (Flag flag@(FlagName flag'))) =
236+ flag' `Set.notMember` disabledFlags settings &&
237+ flag `elem` flags'
238+ checkCond' (Var (Impl compiler range)) =
239+ compiler == GHC && withinRange ghcVersion' range
240+ checkCond' (Lit b) = b
241+ checkCond' (CNot c) = not $ checkCond' c
242+ checkCond' (COr c1 c2) = checkCond' c1 || checkCond' c2
243+ checkCond' (CAnd c1 c2) = checkCond' c1 && checkCond' c2
244+
245+ flags' = map flagName (filter flagDefault $ genPackageFlags gpd) ++
246+ (map FlagName $ Set.toList $ Stackage.Types.flags settings coreMap)
247+
248+-- | Attempt to grab the Github username from a homepage.
249+parseGithubUserHP :: String -> Maybe String
250+parseGithubUserHP url1 = do
251+ url2 <- listToMaybe $ mapMaybe (flip stripPrefix url1)
252+ [ "http://github.com/"
253+ , "https://github.com/"
254+ ]
255+ let x = takeWhile (/= '/') url2
256+ guard $ not $ null x
257+ Just x
258+
259+-- | Attempt to grab the Github username from a source repo.
260+parseGithubUserSR :: SourceRepo -> Maybe String
261+parseGithubUserSR sr =
262+ case (repoType sr, repoLocation sr) of
263+ (Just Git, Just s) -> parseGithubUserHP s
264+ _ -> Nothing
Stackage/ModuleNameConflict.hsnew file+52
@@ -0,0 +1,52 @@
1+module Stackage.ModuleNameConflict
2+ ( ModuleNameConflicts
3+ , getModuleNameConflicts
4+ , renderModuleNameConflicts
5+ , parseModuleNameConflicts
6+ ) where
7+
8+import Distribution.Simple.Configure (configCompiler, getInstalledPackages)
9+import Distribution.Simple.Compiler (CompilerFlavor (GHC), PackageDB (GlobalPackageDB, SpecificPackageDB))
10+import Distribution.Verbosity (normal)
11+import Distribution.Simple.Program (defaultProgramConfiguration)
12+import Distribution.Simple.PackageIndex (moduleNameIndex)
13+import Distribution.InstalledPackageInfo (sourcePackageId)
14+import Distribution.Package (PackageIdentifier (PackageIdentifier), PackageName (PackageName))
15+import qualified Data.Map as Map
16+import qualified Data.Set as Set
17+import Data.List (intercalate)
18+import Distribution.ModuleName (components)
19+
20+type ModuleNameConflicts = Map.Map (Set.Set String) (Set.Set String)
21+
22+getModuleNameConflicts :: FilePath -> IO ModuleNameConflicts
23+getModuleNameConflicts path = do
24+ (compiler, progConfig) <-
25+ configCompiler (Just GHC) Nothing Nothing defaultProgramConfiguration normal
26+ let stack =
27+ [ GlobalPackageDB
28+ , SpecificPackageDB path
29+ ]
30+ packageIndex <- getInstalledPackages normal compiler stack progConfig
31+ let modMap = moduleNameIndex packageIndex
32+ packageName (PackageIdentifier (PackageName x) _) = x
33+ simpleMN = intercalate "." . components
34+ overlaps = Map.unionsWith Set.union
35+ $ map (\(mn, pkgs) -> Map.singleton pkgs (Set.singleton $ simpleMN mn))
36+ $ Map.toList
37+ $ Map.filter (\x -> Set.size x > 1)
38+ $ Map.map Set.fromList
39+ $ fmap (map (packageName . sourcePackageId)) modMap
40+ return overlaps
41+
42+renderModuleNameConflicts :: ModuleNameConflicts -> String
43+renderModuleNameConflicts =
44+ unlines . map (unwords . Set.toList) . concatMap (\(x, y) -> [x, y]) . Map.toList
45+
46+parseModuleNameConflicts :: String -> ModuleNameConflicts
47+parseModuleNameConflicts =
48+ Map.fromList . toPairs . map (Set.fromList . words) . lines
49+ where
50+ toPairs [] = []
51+ toPairs [_] = []
52+ toPairs (x:y:z) = (x, y) : toPairs z
Stackage/NarrowDatabase.hsnew file+54
@@ -0,0 +1,54 @@
1+module Stackage.NarrowDatabase where
2+
3+import Control.Monad.Trans.Writer
4+import Data.List (foldl')
5+import qualified Data.Map as Map
6+import qualified Data.Set as Set
7+import Prelude hiding (pi)
8+import Stackage.Types
9+import Stackage.Util
10+
11+-- | Narrow down the database to only the specified packages and all of
12+-- their dependencies.
13+narrowPackageDB :: SelectSettings
14+ -> Set PackageName -- ^ core packages to be excluded from installation
15+ -> PackageDB
16+ -> Set (PackageName, Maintainer)
17+ -> IO (Map PackageName BuildInfo, Set String)
18+narrowPackageDB settings core (PackageDB pdb) packageSet =
19+ runWriterT $ loop Map.empty $ Set.map (\(name, maintainer) -> ([], name, maintainer)) packageSet
20+ where
21+ loop result toProcess =
22+ case Set.minView toProcess of
23+ Nothing -> return result
24+ Just ((users, p, maintainer), toProcess') ->
25+ case Map.lookup p pdb of
26+ Nothing
27+ | p `Set.member` core -> loop result toProcess'
28+ | null users -> error $ "Unknown package: " ++ show p
29+ | otherwise -> loop result toProcess'
30+ Just pi -> do
31+ let users' = p:users
32+ result' = Map.insert p BuildInfo
33+ { biVersion = piVersion pi
34+ , biUsers = users
35+ , biMaintainer = maintainer
36+ , biDeps = piDeps pi
37+ , biGithubUser = piGithubUser pi
38+ , biHasTests = piHasTests pi
39+ } result
40+ case piGPD pi of
41+ Nothing -> return ()
42+ Just gpd ->
43+ case allowedPackage settings gpd of
44+ Left msg -> tell $ Set.singleton $ concat
45+ [ packageVersionString (p, piVersion pi)
46+ , ": "
47+ , msg
48+ ]
49+ Right () -> return ()
50+ loop result' $ foldl' (addDep users' result' maintainer) toProcess' $ Map.keys $ piDeps pi
51+ addDep users result maintainer toProcess p =
52+ case Map.lookup p result of
53+ Nothing -> Set.insert (users, p, maintainer) toProcess
54+ Just{} -> toProcess
Stackage/Select.hsnew file+173
@@ -0,0 +1,173 @@
1+{-# LANGUAGE PatternGuards #-}
2+{-# LANGUAGE CPP #-}
3+module Stackage.Select
4+ ( select
5+ , defaultSelectSettings
6+ ) where
7+
8+import Data.Either (partitionEithers)
9+import qualified Data.Map as Map
10+import Data.Maybe (mapMaybe)
11+import Data.Set (empty)
12+import qualified Data.Set as Set
13+import Distribution.Text (simpleParse)
14+import Distribution.Version (withinRange)
15+import Prelude hiding (pi)
16+import Stackage.Config
17+import Stackage.InstallInfo
18+import Stackage.Types
19+import Stackage.Util
20+
21+defaultSelectSettings :: GhcMajorVersion
22+ -> Bool -- ^ haskell platform?
23+ -> SelectSettings
24+defaultSelectSettings version requireHP = SelectSettings
25+ { extraCore = defaultExtraCore version
26+ , expectedFailures = defaultExpectedFailures version requireHP
27+ , stablePackages = defaultStablePackages version
28+ , haskellPlatformDir = "hp"
29+ , requireHaskellPlatform = requireHP
30+ , ignoreUpgradeableCore = False
31+ , excludedPackages = empty
32+ , flags = \coreMap ->
33+ Set.fromList (words "blaze_html_0_5 small_base https splitbase old-locale new-base") `Set.union`
34+
35+#if defined(mingw32_HOST_OS) || defined(__MINGW32__)
36+ -- Needed on Windows to get unix-compat to compile
37+ (if version >= GhcMajorVersion 7 6 then Set.empty else Set.fromList (words "old-time"))
38+ `Set.union`
39+#endif
40+ -- Support for containers-unicode-symbols
41+ (case Map.lookup (PackageName "containers") coreMap of
42+ Just v | Just range <- simpleParse "< 0.5", v `withinRange` range
43+ -> Set.singleton "containers-old"
44+ _ -> Set.empty) `Set.union`
45+
46+ {-
47+ -- Support for network 2.6
48+ (if version >= GhcMajorVersion 7 8 && not requireHP
49+ then Set.singleton "network-uri"
50+ else Set.empty)
51+ -}
52+ Set.empty
53+ , disabledFlags = Set.fromList (words "bytestring-in-base test-hlint")
54+ `Set.union`
55+ (if version <= GhcMajorVersion 7 4
56+ then Set.singleton "bytestring-builder"
57+ else Set.empty)
58+
59+ -- SHA and binary
60+
61+ `Set.union`
62+ (if version <= GhcMajorVersion 7 6
63+ then Set.singleton "decoderinterface"
64+ else Set.empty) `Set.union`
65+
66+ {-
67+ -- Support for network 2.6
68+ (if version >= GhcMajorVersion 7 8 && not requireHP
69+ then Set.empty
70+ else Set.singleton "network-uri")
71+ -}
72+ Set.singleton "network-uri"
73+ , allowedPackage = const $ Right ()
74+ , useGlobalDatabase = False
75+ , skippedTests =
76+ Set.insert (PackageName "ReadArgs") $ -- old version of hspec
77+ Set.insert (PackageName "ersatz") $ -- old QuickCheck
78+ if version >= GhcMajorVersion 7 8
79+ then Set.fromList
80+ [ PackageName "punycode" -- pulls in encoding
81+ ]
82+ else Set.empty
83+ , selectGhcVersion = version
84+ , selectTarballDir = "patching/tarballs"
85+ , selectUnderlayPackageDirs = []
86+ }
87+
88+select :: SelectSettings -> IO BuildPlan
89+select settings' = do
90+ ii <- getInstallInfo settings'
91+
92+ bt <-
93+ case iiBuildTools ii of
94+ Left s -> error $ "Could not topologically sort build tools: " ++ s
95+ Right x -> return x
96+
97+ return BuildPlan
98+ { bpTools = bt
99+ , bpPackages = iiPackages ii
100+ , bpOptionalCore = iiOptionalCore ii
101+ , bpCore = iiCore ii
102+ , bpSkippedTests = skippedTests settings'
103+ , bpExpectedFailures = expectedFailures settings'
104+ }
105+
106+-- | Get all of the build tools required.
107+iiBuildTools :: InstallInfo -> Either String [String]
108+iiBuildTools InstallInfo { iiPackageDB = PackageDB m, iiPackages = packages } =
109+ fmap (map packageVersionString)
110+ $ topSort
111+ $ map addDependencies
112+ $ filter (flip Set.notMember coreTools . fst)
113+ $ Set.toList
114+ $ Set.fromList
115+ $ mapMaybe (flip Map.lookup buildToolMap)
116+ $ Set.toList
117+ $ Set.unions
118+ $ map piBuildToolsAll
119+ $ Map.elems
120+ $ Map.filterWithKey isSelected m
121+ where
122+ isSelected name _ = name `Set.member` selected
123+ selected = Set.fromList $ Map.keys packages
124+
125+ -- Build tools shipped with GHC which we should not attempt to build
126+ -- ourselves.
127+ coreTools = Set.fromList $ map PackageName $ words "hsc2hs"
128+
129+ -- The map from build tool name to the package it comes from.
130+ buildToolMap :: Map Executable (PackageName, Version)
131+ buildToolMap = Map.unions $ map toBuildToolMap $ Map.toList m
132+
133+ toBuildToolMap :: (PackageName, PackageInfo) -> Map Executable (PackageName, Version)
134+ toBuildToolMap (pn, pi) = Map.unions
135+ $ map (flip Map.singleton (pn, piVersion pi))
136+ $ Set.toList
137+ $ piExecs pi
138+
139+ addDependencies :: (PackageName, Version) -> ((PackageName, Version), Set (PackageName, Version))
140+ addDependencies (pn, pv) =
141+ ((pn, pv), deps)
142+ where
143+ deps =
144+ case Map.lookup pn m of
145+ Nothing -> Set.empty
146+ Just pi -> Set.fromList
147+ $ mapMaybe (flip Map.lookup buildToolMap)
148+ $ Set.toList
149+ $ piBuildToolsExe pi `Set.union` manualDeps
150+
151+ manualDeps
152+ | pn == PackageName "c2hs" = Set.singleton $ Executable "happy"
153+ | otherwise = Set.empty
154+
155+topSort :: (Show a, Ord a) => [(a, Set a)] -> Either String [a]
156+topSort orig =
157+ uncurry go . partitionEithers . map (splitter . limitDeps) $ orig
158+ where
159+ splitter (x, y)
160+ | Set.null y = Left x
161+ | otherwise = Right (x, y)
162+
163+ go x [] = Right x
164+ go [] y = Left $ "The following form a cycle: " ++ show (map fst y)
165+ go (x:xs) ys = do
166+ let (xs', ys') = partitionEithers $ map (splitter . dropDep x) ys
167+ rest <- go (xs ++ xs') ys'
168+ return $ x : rest
169+
170+ dropDep x (y, z) = (y, Set.delete x z)
171+
172+ allVertices = Set.fromList $ map fst orig
173+ limitDeps (x, y) = (x, Set.intersection allVertices y)
Stackage/ServerFiles.hsnew file+104
@@ -0,0 +1,104 @@
1+-- | Create the files necessary for Stackage server.
2+module Stackage.ServerFiles
3+ ( createHackageFile
4+ ) where
5+
6+import Stackage.Util
7+import Stackage.Types
8+import qualified Data.Map as Map
9+import Control.Exception (throwIO)
10+import qualified Codec.Archive.Tar as Tar
11+import qualified Data.ByteString.Lazy as L
12+import Control.Arrow (second)
13+import Control.Monad (unless)
14+import Distribution.Text (display)
15+import System.Directory (doesFileExist)
16+import System.FilePath ((</>), (<.>))
17+import System.IO (Handle, hPutStrLn, hPutStr)
18+
19+createHackageFile :: Bool -- ^ inclusive?
20+ -> Bool -- ^ haskell platform?
21+ -> InstallInfo
22+ -> String -- ^ GHC version
23+ -> String -- ^ date
24+ -> Handle -- ^ hackage
25+ -> Handle -- ^ tarballs
26+ -> IO ()
27+createHackageFile isInc hp ii ghcVer date hackageH tarballH = do
28+ let stackageFP = concat
29+ [ "../ghc-"
30+ , ghcVer
31+ , if hp then "hp" else ""
32+ , "-"
33+ , date
34+ , if isInc then "-inclusive" else "-exclusive"
35+ , ".stackage"
36+ ]
37+ hPutStr tarballH $ concat
38+ [ "#!/bin/bash -ex\n\ntar czfv "
39+ , stackageFP
40+ , " hackage desc slug ../build*"
41+ ]
42+ indextargz <- getTarballName
43+ indexLBS <- L.readFile indextargz
44+ loop $ Tar.read indexLBS
45+ hPutStrLn tarballH ""
46+ hPutStrLn tarballH $ concat
47+ [ "runghc ../stackage-upload.hs "
48+ , stackageFP
49+ , " unstable-ghc"
50+ , filter (/= '.') ghcVer
51+ , if hp then "hp" else ""
52+ , if isInc then "-inclusive" else "-exclusive"
53+ ]
54+
55+ unless isInc $ do
56+ -- Add in some OS-specific package/version combos to work with
57+ -- non-Linux systems.
58+ hPutStrLn hackageH "hfsevents-0.1.5"
59+ hPutStrLn hackageH "Win32-notify-0.3"
60+ where
61+ selected = Map.fromList . map toStrs . Map.toList $
62+ fmap spiVersion (iiPackages ii)
63+ `Map.union` iiOptionalCore ii
64+ `Map.union` Map.mapMaybe id (iiCore ii)
65+
66+ toStrs (PackageName name, version) = (name, display version)
67+
68+ loop Tar.Done = return ()
69+ loop (Tar.Fail e) = throwIO e
70+ loop (Tar.Next e es) = go e >> loop es
71+
72+ go e =
73+ case parsePair $ Tar.entryPath e of
74+ Nothing -> return ()
75+ Just (name, version) ->
76+ case Map.lookup name selected of
77+ Just version'
78+ | version == version' -> emit True name version
79+ | otherwise -> return ()
80+ Nothing
81+ | isInc -> emit False name version
82+ | otherwise -> return ()
83+
84+ emit usePatch name version = do
85+ exists <- if usePatch then doesFileExist tarball else return False
86+ if exists
87+ then hPutStr tarballH $ ' ' : ".." </> tarball
88+ else hPutStrLn hackageH base
89+ where
90+ base = concat [name, "-", version]
91+ tarball = "patching" </> "tarballs" </> base <.> "tar" <.> "gz"
92+
93+parsePair :: String -> Maybe (String, String)
94+parsePair s =
95+ case splitOn '/' s of
96+ [name, version, cabal] | name ++ ".cabal" == cabal -> Just (name, version)
97+ _ -> Nothing
98+
99+splitOn :: Eq a => a -> [a] -> [[a]]
100+splitOn _ [] = []
101+splitOn c x =
102+ y : splitOn c z
103+ where
104+ (y, z) = second (drop 1) $ break (== c) x
Stackage/Tarballs.hsnew file+45
@@ -0,0 +1,45 @@
1+module Stackage.Tarballs
2+ ( makeTarballs
3+ ) where
4+
5+import qualified Codec.Archive.Tar as Tar
6+import qualified Data.ByteString.Lazy as L
7+import qualified Data.Map as Map
8+import qualified Data.Set as Set
9+import Stackage.Types
10+import Stackage.Util
11+import System.Directory (createDirectoryIfMissing)
12+import System.FilePath (takeDirectory)
13+
14+makeTarballs :: BuildPlan -> IO ()
15+makeTarballs bp = do
16+ putStrLn "Building tarballs"
17+ tarName <- getTarballName
18+ origEntries <- fmap Tar.read $ L.readFile tarName
19+ (stableEntries, extraEntries) <- loop id id origEntries
20+
21+ (stableTar, extraTar) <- getStackageTarballNames
22+
23+ createDirectoryIfMissing True $ takeDirectory stableTar
24+ L.writeFile stableTar $ Tar.write stableEntries
25+
26+ createDirectoryIfMissing True $ takeDirectory extraTar
27+ L.writeFile extraTar $ Tar.write extraEntries
28+ where
29+ -- Using "error . show" for compatibility with tar 0.3 and 0.4
30+ loop _ _ (Tar.Fail err) = error $ show err
31+ loop stable extra Tar.Done = return (stable [], extra [])
32+ loop stable extra (Tar.Next e es) =
33+ loop stable' extra' es
34+ where
35+ (stable', extra') =
36+ case getPackageVersion e of
37+ Nothing -> (stable, extra)
38+ Just (package, version) ->
39+ case Map.lookup package $ bpPackages bp of
40+ Just spi
41+ | version == spiVersion spi -> (stable . (e:), extra)
42+ | otherwise -> (stable, extra)
43+ Nothing
44+ | package `Map.member` bpCore bp -> (stable, extra)
45+ | otherwise -> (stable, extra . (e:))
Stackage/Test.hsnew file+298
@@ -0,0 +1,298 @@
1+{-# LANGUAGE DeriveDataTypeable #-}
2+{-# LANGUAGE RecordWildCards #-}
3+{-# LANGUAGE ScopedTypeVariables #-}
4+module Stackage.Test
5+ ( runTestSuites
6+ ) where
7+
8+import qualified Control.Concurrent as C
9+import Control.Exception (Exception, SomeException, handle, throwIO, IOException, try)
10+import Control.Monad (replicateM, unless, when, forM_)
11+import qualified Data.Map as Map
12+import qualified Data.Set as Set
13+import qualified Control.Monad.Trans.Writer as W
14+import Distribution.Package (Dependency (Dependency))
15+import Data.Version (parseVersion, Version (Version))
16+import Data.Typeable (Typeable)
17+import Stackage.Types
18+import Stackage.Util
19+import System.Directory (copyFile, createDirectory,
20+ createDirectoryIfMissing, doesFileExist, findExecutable,
21+ getDirectoryContents, removeFile,
22+ renameDirectory, canonicalizePath)
23+import System.Exit (ExitCode (ExitSuccess))
24+import System.FilePath ((<.>), (</>), takeDirectory)
25+import System.IO (IOMode (WriteMode, AppendMode),
26+ withBinaryFile)
27+import System.Process (readProcess, runProcess, waitForProcess, createProcess, proc, cwd)
28+import Text.ParserCombinators.ReadP (readP_to_S)
29+import Data.IORef (IORef, readIORef, atomicModifyIORef, newIORef)
30+import qualified Data.ByteString.Lazy as L
31+import qualified Data.ByteString.Lazy.Char8 as L8
32+import qualified Distribution.PackageDescription as PD
33+import Distribution.PackageDescription.Parse (ParseResult (ParseOk),
34+ parsePackageDescription)
35+
36+runTestSuites :: BuildSettings -> BuildPlan -> IO ()
37+runTestSuites settings' bp = do
38+ settings <- fixBuildSettings settings'
39+ let selected' = Map.filterWithKey notSkipped $ bpPackages bp
40+ let testdir = "runtests"
41+ docdir = "haddock"
42+ rm_r testdir
43+ rm_r docdir
44+ createDirectory testdir
45+ createDirectory docdir
46+
47+ putStrLn "Determining package dependencies"
48+ selected <- mapM (addDependencies settings (Map.keysSet selected') testdir)
49+ $ Map.toList selected'
50+ putStrLn "Running test suites"
51+
52+ copyBuiltInHaddocks docdir
53+
54+ cabalVersion <- getCabalVersion
55+ haddockFilesRef <- newIORef []
56+ allPass <- parFoldM
57+ (testWorkerThreads settings)
58+ (runTestSuite cabalVersion settings testdir docdir bp haddockFilesRef)
59+ (&&)
60+ True
61+ selected
62+ unless allPass $ error $ "There were failures, please see the logs in " ++ testdir
63+ where
64+ notSkipped p _ = p `Set.notMember` bpSkippedTests bp
65+
66+addDependencies :: BuildSettings
67+ -> Set PackageName -- ^ all packages to be installed
68+ -> FilePath -- ^ testdir
69+ -> (PackageName, SelectedPackageInfo)
70+ -> IO (PackageName, Set PackageName, SelectedPackageInfo)
71+addDependencies settings allPackages testdir (packageName, spi) = do
72+ package' <- replaceTarball (tarballDir settings) package
73+ deps <- handle (\e -> print (e :: IOException) >> return Set.empty)
74+ $ getDeps allPackages testdir packageName package package'
75+ return (packageName, deps, spi)
76+ where
77+ package = packageVersionString (packageName, spiVersion spi)
78+
79+getDeps :: Set PackageName -- ^ all packages to be installed
80+ -> FilePath -> PackageName -> String -> String -> IO (Set PackageName)
81+getDeps allPackages testdir (PackageName name) nameVer loc = do
82+ (Nothing, Nothing, Nothing, ph) <- createProcess
83+ (proc "cabal" ["unpack", loc, "--verbose=0"]) { cwd = Just testdir }
84+ ec <- waitForProcess ph
85+ unless (ec == ExitSuccess) $ error $ "Unable to unpack: " ++ loc
86+ lbs <- L.readFile $ testdir </> nameVer </> name <.> "cabal"
87+ case parsePackageDescription $ L8.unpack lbs of
88+ ParseOk _ gpd -> return $ Set.intersection allPackages $ allLibraryDeps gpd
89+ _ -> return Set.empty
90+
91+allLibraryDeps :: PD.GenericPackageDescription -> Set PackageName
92+allLibraryDeps =
93+ maybe Set.empty (W.execWriter . goTree) . PD.condLibrary
94+ where
95+ goTree tree = do
96+ mapM_ goDep $ PD.condTreeConstraints tree
97+ forM_ (PD.condTreeComponents tree) $ \(_, y, z) -> do
98+ goTree y
99+ maybe (return ()) goTree z
100+
101+ goDep (Dependency pn _) = W.tell $ Set.singleton pn
102+
103+getCabalVersion :: IO CabalVersion
104+getCabalVersion = do
105+ output <- readProcess "cabal" ["--numeric-version"] ""
106+ case filter (null . snd) $ readP_to_S parseVersion $ filter notCRLF output of
107+ (Version (x:y:_) _, _):_ -> return $ CabalVersion x y
108+ _ -> error $ "Invalid cabal version: " ++ show output
109+ where
110+ notCRLF '\n' = False
111+ notCRLF '\r' = False
112+ notCRLF _ = True
113+
114+parFoldM :: Int -- ^ number of threads
115+ -> ((PackageName, payload) -> IO c)
116+ -> (a -> c -> a)
117+ -> a
118+ -> [(PackageName, Set PackageName, payload)]
119+ -> IO a
120+parFoldM threadCount0 f g a0 bs0 = do
121+ ma <- C.newMVar a0
122+ mbs <- C.newMVar bs0
123+ signal <- C.newEmptyMVar
124+ completed <- newIORef Set.empty
125+ tids <- replicateM threadCount0 $ C.forkIO $ worker completed ma mbs signal
126+ wait threadCount0 signal tids
127+
128+ unrun <- C.takeMVar mbs
129+ when (not $ null unrun) $
130+ error $ "The following tests were not run: " ++ unwords
131+ [x | (PackageName x, _, _) <- unrun]
132+ C.takeMVar ma
133+ where
134+ worker completedRef ma mbs signal =
135+ handle
136+ (C.putMVar signal . Just)
137+ (loop >> C.putMVar signal Nothing)
138+ where
139+ loop = do
140+ mb <- C.modifyMVar mbs $ \bs -> do
141+ completed <- readIORef completedRef
142+ return $ case findReady completed bs of
143+ -- There's a workload ready with no deps
144+ Just (b, bs') -> (bs', Just b)
145+ -- No workload with no deps
146+ Nothing -> (bs, Nothing)
147+ case mb of
148+ Nothing -> return ()
149+ Just (name, _, payload) -> do
150+ c <- f (name, payload)
151+ C.modifyMVar_ ma $ \a -> return $! g a c
152+ atomicModifyIORef completedRef $ \s -> (Set.insert name s, ())
153+ loop
154+ wait threadCount signal tids
155+ | threadCount == 0 = return ()
156+ | otherwise = do
157+ me <- C.takeMVar signal
158+ case me of
159+ Nothing -> wait (threadCount - 1) signal tids
160+ Just e -> do
161+ mapM_ C.killThread tids
162+ throwIO (e :: SomeException)
163+
164+-- | Find a workload whose dependencies have been met.
165+findReady :: Ord key
166+ => Set key -- ^ workloads already complete
167+ -> [(key, Set key, value)]
168+ -> Maybe ((key, Set key, value), [(key, Set key, value)])
169+findReady completed =
170+ loop id
171+ where
172+ loop _ [] = Nothing
173+ loop front (x@(_, deps, _):xs)
174+ | Set.null $ Set.difference deps completed = Just (x, front xs)
175+ | otherwise = loop (front . (x:)) xs
176+
177+data TestException = TestException
178+ deriving (Show, Typeable)
179+instance Exception TestException
180+
181+data CabalVersion = CabalVersion Int Int
182+ deriving (Eq, Ord, Show)
183+
184+runTestSuite :: CabalVersion
185+ -> BuildSettings
186+ -> FilePath -- ^ testdir
187+ -> FilePath -- ^ docdir
188+ -> BuildPlan
189+ -> IORef [(String, FilePath)] -- ^ .haddock files
190+ -> (PackageName, SelectedPackageInfo)
191+ -> IO Bool
192+runTestSuite cabalVersion settings testdir docdir
193+ bp haddockFilesRef (packageName, SelectedPackageInfo {..}) = do
194+ -- Set up a new environment that includes the sandboxed bin folder in PATH.
195+ env' <- getModifiedEnv settings
196+ let menv = Just $ addSandbox env'
197+ addSandbox = (("HASKELL_PACKAGE_SANDBOX", packageDir settings):)
198+
199+ let run cmd args wdir handle' = do
200+ ph <- runProcess cmd args (Just wdir) menv Nothing (Just handle') (Just handle')
201+ ec <- waitForProcess ph
202+ unless (ec == ExitSuccess) $ throwIO TestException
203+
204+ passed <- handle (\TestException -> return False) $ do
205+ case cabalFileDir settings of
206+ Nothing -> return ()
207+ Just cfd -> do
208+ let PackageName name = packageName
209+ basename = name ++ ".cabal"
210+ src = dir </> basename
211+ dst = cfd </> basename
212+ createDirectoryIfMissing True cfd
213+ copyFile src dst
214+ getHandle WriteMode $ run "cabal" (addCabalArgs settings BSTest ["configure", "--enable-tests"]) dir
215+
216+ -- Try building docs first in case tests have an expected failure.
217+ when (buildDocs settings) $ do
218+ -- https://github.com/gtk2hs/gtk2hs/issues/79
219+ when (packageName `Set.member` buildBeforeHaddock) $
220+ getHandle AppendMode $ run "cabal" ["build"] dir
221+
222+ hfs <- readIORef haddockFilesRef
223+ let hfsOpts = flip map hfs $ \(pkgVer, hf) -> concat
224+ [ "--haddock-options=--read-interface="
225+ , "../"
226+ , pkgVer
227+ , "/,"
228+ , hf
229+ ]
230+ getHandle AppendMode $ run "cabal"
231+ ( "haddock"
232+ : "--hyperlink-source"
233+ : "--html"
234+ : "--hoogle"
235+ -- FIXME is this redundant with read-interface above?
236+ : "--html-location=../$pkg-$version/"
237+ : hfsOpts) dir
238+ let PackageName packageName' = packageName
239+ handle (\(_ :: IOException) -> return ()) $ renameDirectory
240+ (dir </> "dist" </> "doc" </> "html" </> packageName')
241+ (docdir </> package)
242+
243+ enewPath <- try $ canonicalizePath $ docdir </> package </> packageName' <.> "haddock"
244+ case enewPath :: Either IOException FilePath of
245+ Left _ -> return () -- print e
246+ Right newPath -> atomicModifyIORef haddockFilesRef $ \hfs'
247+ -> ((package, newPath) : hfs', ())
248+
249+ when spiHasTests $ do
250+ getHandle AppendMode $ run "cabal" ["build"] dir
251+ getHandle AppendMode $ run "cabal" (concat
252+ [ ["test"]
253+ , if cabalVersion >= CabalVersion 1 20
254+ then ["--show-details=streaming"] -- FIXME temporary workaround for https://github.com/haskell/cabal/issues/1810
255+ else []
256+ ]) dir
257+ return True
258+ let expectedFailure = packageName `Set.member` bpExpectedFailures bp
259+ if passed
260+ then do
261+ removeFile logfile
262+ when expectedFailure $ putStrLn $ " " ++ package ++ " passed, but I didn't think it would."
263+ else unless expectedFailure $ putStrLn $ concat
264+ [ "Test suite failed: "
265+ , package
266+ , "("
267+ , unMaintainer spiMaintainer
268+ , githubMentions spiGithubUser
269+ , ")"
270+ ]
271+ rm_r dir
272+ return $! passed || expectedFailure
273+ where
274+ logfile = testdir </> package <.> "log"
275+ dir = testdir </> package
276+ getHandle mode = withBinaryFile logfile mode
277+ package = packageVersionString (packageName, spiVersion)
278+
279+ buildBeforeHaddock = Set.fromList $ map PackageName $ words =<<
280+ [ "gio gtk"
281+ ]
282+
283+copyBuiltInHaddocks docdir = do
284+ Just ghc <- findExecutable "ghc"
285+ copyTree (takeDirectory ghc </> "../share/doc/ghc/html/libraries") docdir
286+ where
287+ copyTree src dest = do
288+ entries <- fmap (filter (\s -> s /= "." && s /= ".."))
289+ $ getDirectoryContents src
290+ forM_ entries $ \entry -> do
291+ let src' = src </> entry
292+ dest' = dest </> entry
293+ isFile <- doesFileExist src'
294+ if isFile
295+ then copyFile src' dest'
296+ else do
297+ createDirectory dest'
298+ copyTree src' dest'
Stackage/Types.hsnew file+165
@@ -0,0 +1,165 @@
1+module Stackage.Types
2+ ( module X
3+ , module Stackage.Types
4+ ) where
5+
6+import Data.Map as X (Map)
7+import Data.Map (unionWith)
8+import Data.Monoid (Monoid (..))
9+import Data.Set as X (Set)
10+import Data.Version as X (Version)
11+import Distribution.Package as X (PackageIdentifier (..),
12+ PackageName (..))
13+import Distribution.PackageDescription (GenericPackageDescription)
14+import Distribution.Version as X (VersionRange (..))
15+import Distribution.Version (intersectVersionRanges)
16+
17+newtype PackageDB = PackageDB (Map PackageName PackageInfo)
18+ deriving (Show, Eq)
19+
20+instance Monoid PackageDB where
21+ mempty = PackageDB mempty
22+ PackageDB x `mappend` PackageDB y =
23+ PackageDB $ unionWith newest x y
24+ where
25+ newest pi1 pi2
26+ | piVersion pi1 > piVersion pi2 = pi1
27+ | otherwise = pi2
28+
29+data PackageInfo = PackageInfo
30+ { piVersion :: Version
31+ , piDeps :: Map PackageName VersionRange
32+ , piHasTests :: Bool
33+ , piBuildToolsExe :: Set Executable -- ^ required just for building executable/lib
34+ , piBuildToolsAll :: Set Executable -- ^ required for all stanzas
35+ , piGPD :: Maybe GenericPackageDescription
36+ , piExecs :: Set Executable
37+ , piGithubUser :: [String]
38+ }
39+ deriving (Show, Eq)
40+
41+newtype Executable = Executable String
42+ deriving (Show, Eq, Ord)
43+
44+-- | Information on a package we're going to build.
45+data BuildInfo = BuildInfo
46+ { biVersion :: Version
47+ , biUsers :: [PackageName]
48+ , biMaintainer :: Maintainer
49+ , biDeps :: Map PackageName VersionRange
50+ , biGithubUser :: [String]
51+ , biHasTests :: Bool
52+ }
53+
54+data HaskellPlatform = HaskellPlatform
55+ { hpcore :: Set PackageIdentifier
56+ , hplibs :: Set PackageIdentifier
57+ }
58+ deriving (Show, Eq, Ord)
59+instance Monoid HaskellPlatform where
60+ mempty = HaskellPlatform mempty mempty
61+ HaskellPlatform a x `mappend` HaskellPlatform b y = HaskellPlatform (mappend a b) (mappend x y)
62+
63+data InstallInfo = InstallInfo
64+ { iiCore :: Map PackageName (Maybe Version)
65+ , iiPackages :: Map PackageName SelectedPackageInfo
66+ , iiOptionalCore :: Map PackageName Version
67+ -- ^ This is intended to hold onto packages which might be automatically
68+ -- provided in the global package database. In practice, this would be
69+ -- Haskell Platform packages provided by distributions.
70+ , iiPackageDB :: PackageDB
71+ }
72+
73+data SelectedPackageInfo = SelectedPackageInfo
74+ { spiVersion :: Version
75+ , spiMaintainer :: Maintainer
76+ , spiGithubUser :: [String]
77+ , spiHasTests :: Bool
78+ }
79+ deriving (Show, Read)
80+
81+data BuildPlan = BuildPlan
82+ { bpTools :: [String]
83+ , bpPackages :: Map PackageName SelectedPackageInfo
84+ , bpCore :: Map PackageName (Maybe Version)
85+ , bpOptionalCore :: Map PackageName Version
86+ -- ^ See 'iiOptionalCore'
87+ , bpSkippedTests :: Set PackageName
88+ , bpExpectedFailures :: Set PackageName
89+ -- ^ Expected test failures. Unlike SkippedTests, we should still try to
90+ -- build them.
91+ }
92+
93+-- | Email address of a Stackage maintainer.
94+newtype Maintainer = Maintainer { unMaintainer :: String }
95+ deriving (Show, Eq, Ord, Read)
96+
97+data SelectSettings = SelectSettings
98+ { haskellPlatformDir :: FilePath
99+ , flags :: Map PackageName Version -> Set String
100+ -- ^ Compile flags which should be turned on. Takes a Map providing the
101+ -- core packages so that flags can be set appropriately.
102+ , disabledFlags :: Set String
103+ -- ^ Compile flags which should always be disabled.
104+ , extraCore :: Set PackageName
105+ , ignoreUpgradeableCore :: Bool
106+ -- ^ Do not pin down the versions of upgradeable core packages.
107+ , requireHaskellPlatform :: Bool
108+ , allowedPackage :: GenericPackageDescription -> Either String ()
109+ -- ^ Checks if a package is allowed into the distribution. By default, we
110+ -- allow all packages in, though this could be used to filter out certain
111+ -- untrusted packages, or packages with an unacceptable license.
112+ --
113+ -- Returns a reason for stripping in Left, or Right if the package is
114+ -- allowed.
115+ , expectedFailures :: Set PackageName
116+ , excludedPackages :: Set PackageName
117+ -- ^ Packages which should be dropped from the list of stable packages,
118+ -- even if present via the Haskell Platform or @stablePackages@. If these
119+ -- packages are dependencies of others, they will still be included.
120+ , stablePackages :: Bool -- require Haskell Platform?
121+ -> Map PackageName (VersionRange, Maintainer)
122+ , useGlobalDatabase :: Bool
123+ -- ^ Instead of checking the Haskell Platform file for core packages, query
124+ -- the global database. For this to be reliable, you should only have
125+ -- default packages in your global database. Default is @False@.
126+ , skippedTests :: Set PackageName
127+ -- ^ Do not build or run test suites, usually in order to avoid a
128+ -- dependency.
129+ , selectGhcVersion :: GhcMajorVersion
130+ , selectTarballDir :: FilePath
131+ -- ^ Directory containing replacement tarballs.
132+ , selectUnderlayPackageDirs :: [FilePath]
133+ -- ^ Additional package directories to reference
134+ }
135+
136+data BuildStage = BSTools | BSBuild | BSTest
137+
138+data BuildSettings = BuildSettings
139+ { sandboxRoot :: FilePath
140+ , extraArgs :: BuildStage -> [String]
141+ , testWorkerThreads :: Int
142+ -- ^ How many threads to spawn for running test suites.
143+ , buildDocs :: Bool
144+ -- ^ Build docs as part of the test procedure.
145+ , tarballDir :: FilePath
146+ -- ^ Directory containing replacement tarballs.
147+ , cabalFileDir :: Maybe FilePath
148+ -- ^ Directory to place cabal files in
149+ , underlayPackageDirs :: [FilePath]
150+ -- ^ Additional package directories to reference
151+ }
152+
153+-- | A wrapper around a @Map@ providing a better @Monoid@ instance.
154+newtype PackageMap = PackageMap { unPackageMap :: Map PackageName (VersionRange, Maintainer) }
155+
156+instance Monoid PackageMap where
157+ mempty = PackageMap mempty
158+ PackageMap x `mappend` PackageMap y =
159+ PackageMap $ unionWith go x y
160+ where
161+ go (r1, m1) (r2, _) = (intersectVersionRanges r1 r2, m1)
162+
163+-- | GHC major version. For example, for GHC 7.4.2, this would be 7 4.
164+data GhcMajorVersion = GhcMajorVersion Int Int
165+ deriving (Show, Ord, Eq)
Stackage/Util.hsnew file+174
@@ -0,0 +1,174 @@
1+{-# LANGUAGE CPP #-}
2+module Stackage.Util where
3+
4+import qualified Codec.Archive.Tar as Tar
5+import qualified Codec.Archive.Tar.Entry as TarEntry
6+import Control.Monad (guard, when)
7+import Data.Char (isSpace, toUpper)
8+import Data.List (intercalate, stripPrefix)
9+import qualified Data.Map as Map
10+import Data.Maybe (mapMaybe)
11+import qualified Data.Set as Set
12+import Data.Version (showVersion)
13+import Distribution.License (License (..))
14+import qualified Distribution.Package as P
15+import qualified Distribution.PackageDescription as PD
16+import Distribution.Text (display, simpleParse)
17+import Distribution.Version (thisVersion)
18+import Stackage.Types
19+import System.Directory (doesDirectoryExist,
20+ removeDirectoryRecursive,
21+ getAppUserDataDirectory,
22+ canonicalizePath,
23+ createDirectoryIfMissing, doesFileExist)
24+import System.Environment (getEnvironment)
25+import System.FilePath ((</>), (<.>))
26+
27+-- | Allow only packages with permissive licenses.
28+allowPermissive :: [String] -- ^ list of explicitly allowed packages
29+ -> PD.GenericPackageDescription
30+ -> Either String ()
31+allowPermissive allowed gpd
32+ | P.pkgName (PD.package $ PD.packageDescription gpd) `elem` map PackageName allowed = Right ()
33+ | otherwise =
34+ case PD.license $ PD.packageDescription gpd of
35+ BSD3 -> Right ()
36+ MIT -> Right ()
37+ PublicDomain -> Right ()
38+ l -> Left $ "Non-permissive license: " ++ display l
39+
40+identsToRanges :: Set PackageIdentifier -> Map PackageName (VersionRange, Maintainer)
41+identsToRanges =
42+ Map.unions . map go . Set.toList
43+ where
44+ go (PackageIdentifier package version) = Map.singleton package (thisVersion version, Maintainer "Haskell Platform")
45+
46+packageVersionString :: (PackageName, Version) -> String
47+packageVersionString (PackageName p, v) = concat [p, "-", showVersion v]
48+
49+rm_r :: FilePath -> IO ()
50+rm_r fp = do
51+ exists <- doesDirectoryExist fp
52+ when exists $ removeDirectoryRecursive fp
53+
54+getCabalRoot :: IO FilePath
55+getCabalRoot = getAppUserDataDirectory "cabal"
56+
57+-- | Name of the 00-index.tar downloaded from Hackage.
58+getTarballName :: IO FilePath
59+getTarballName = do
60+ c <- getCabalRoot
61+ configLines <- fmap lines $ readFile (c </> "config")
62+ case mapMaybe getRemoteCache configLines of
63+ [x] -> return $ x </> "hackage.haskell.org" </> "00-index.tar"
64+ [] -> error $ "No remote-repo-cache found in Cabal config file"
65+ _ -> error $ "Multiple remote-repo-cache entries found in Cabal config file"
66+ where
67+ getRemoteCache s = do
68+ ("remote-repo-cache", ':':v) <- Just $ break (== ':') s
69+ Just $ reverse $ dropWhile isSpace $ reverse $ dropWhile isSpace v
70+
71+stableRepoName, extraRepoName :: String
72+stableRepoName = "stackage"
73+extraRepoName = "stackage-extra"
74+
75+-- | Locations for the stackage and stackage-extra tarballs
76+getStackageTarballNames :: IO (FilePath, FilePath)
77+getStackageTarballNames = do
78+ c <- getCabalRoot
79+ let f x = c </> "packages" </> x </> "00-index.tar"
80+ return (f stableRepoName, f extraRepoName)
81+
82+getPackageVersion :: Tar.Entry -> Maybe (PackageName, Version)
83+getPackageVersion e = do
84+ let (package', s1) = break (== '/') fp
85+ package = PackageName package'
86+ s2 <- stripPrefix "/" s1
87+ let (version', s3) = break (== '/') s2
88+ version <- simpleParse version'
89+ s4 <- stripPrefix "/" s3
90+ guard $ s4 == package' ++ ".cabal"
91+ Just (package, version)
92+ where
93+ fp = TarEntry.fromTarPathToPosixPath $ TarEntry.entryTarPath e
94+
95+-- | If a package cannot be parsed or is not found, the default value for
96+-- whether it has a test suite. We default to @True@ since, worst case
97+-- scenario, this just means a little extra time trying to run a suite that's
98+-- not there. Defaulting to @False@ would result in silent failures.
99+defaultHasTestSuites :: Bool
100+defaultHasTestSuites = True
101+
102+packageDir, libDir, binDir, dataDir, docDir :: BuildSettings -> FilePath
103+packageDir = (</> "package-db") . sandboxRoot
104+libDir = (</> "lib") . sandboxRoot
105+binDir = (</> "bin") . sandboxRoot
106+dataDir = (</> "share") . sandboxRoot
107+docDir x = sandboxRoot x </> "share" </> "doc" </> "$pkgid"
108+
109+addCabalArgsOnlyGlobal :: BuildSettings -> [String] -> [String]
110+addCabalArgsOnlyGlobal settings rest
111+ = "--package-db=clear"
112+ : "--package-db=global"
113+ : map ("--package-db=" ++) (underlayPackageDirs settings)
114+ ++ rest
115+
116+addCabalArgs :: BuildSettings -> BuildStage -> [String] -> [String]
117+addCabalArgs settings bs rest
118+ = addCabalArgsOnlyGlobal settings
119+ $ ("--package-db=" ++ packageDir settings ++ toolsSuffix)
120+ : ("--libdir=" ++ libDir settings ++ toolsSuffix)
121+ : ("--bindir=" ++ binDir settings)
122+ : ("--datadir=" ++ dataDir settings)
123+ : ("--docdir=" ++ docDir settings ++ toolsSuffix)
124+ : extraArgs settings bs ++ rest
125+ where
126+ toolsSuffix =
127+ case bs of
128+ BSTools -> "-tools"
129+ _ -> ""
130+
131+-- | Modified environment that adds our sandboxed bin folder to PATH.
132+getModifiedEnv :: BuildSettings -> IO [(String, String)]
133+getModifiedEnv settings = do
134+ fmap (map $ fixEnv $ binDir settings) getEnvironment
135+ where
136+ fixEnv :: FilePath -> (String, String) -> (String, String)
137+ fixEnv bin (p, x)
138+ -- Thank you Windows having case-insensitive environment variables...
139+ | map toUpper p == "PATH" = (p, bin ++ pathSep : x)
140+ | otherwise = (p, x)
141+
142+ -- | Separate for the PATH environment variable
143+ pathSep :: Char
144+#ifdef mingw32_HOST_OS
145+ pathSep = ';'
146+#else
147+ pathSep = ':'
148+#endif
149+
150+-- | Minor fixes, such as making paths absolute.
151+--
152+-- Note: creates the sandbox root in the process.
153+fixBuildSettings :: BuildSettings -> IO BuildSettings
154+fixBuildSettings settings' = do
155+ let root' = sandboxRoot settings'
156+ createDirectoryIfMissing True root'
157+ root <- canonicalizePath root'
158+ return settings' { sandboxRoot = root }
159+
160+-- | Check if a tarball exists in the tarball directory and, if so, use that
161+-- instead of the given name.
162+replaceTarball :: FilePath -- ^ tarball directory
163+ -> String
164+ -> IO String
165+replaceTarball tarballdir pkgname = do
166+ exists <- doesFileExist fp
167+ if exists
168+ then canonicalizePath fp
169+ else return pkgname
170+ where
171+ fp = tarballdir </> pkgname <.> "tar.gz"
172+
173+githubMentions :: [String] -> String
174+githubMentions = intercalate "," . map ('@' :)
Stackage2/BuildConstraints.hsnew file+194
@@ -0,0 +1,194 @@
1+{-# LANGUAGE NoImplicitPrelude #-}
2+{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE RecordWildCards #-}
4+{-# LANGUAGE TupleSections #-}
5+-- | The constraints on package selection for a new build plan.
6+module Stackage2.BuildConstraints
7+ ( BuildConstraints (..)
8+ , PackageConstraints (..)
9+ , TestState (..)
10+ , SystemInfo (..)
11+ , defaultBuildConstraints
12+ ) where
13+
14+import Data.Aeson
15+import qualified Data.Map as Map
16+import Distribution.System (Arch, OS)
17+import qualified Distribution.System
18+import Distribution.Version (anyVersion)
19+import qualified Stackage.Config as Old
20+import qualified Stackage.Select as Old
21+import qualified Stackage.Types as Old
22+import Stackage2.CorePackages
23+import Stackage2.Prelude
24+
25+data TestState = ExpectSuccess
26+ | ExpectFailure
27+ | Don'tBuild -- ^ when the test suite will pull in things we don't want
28+ deriving (Show, Eq, Ord, Bounded, Enum)
29+
30+testStateToText :: TestState -> Text
31+testStateToText ExpectSuccess = "expect-success"
32+testStateToText ExpectFailure = "expect-failure"
33+testStateToText Don'tBuild = "do-not-build"
34+
35+instance ToJSON TestState where
36+ toJSON = toJSON . testStateToText
37+instance FromJSON TestState where
38+ parseJSON = withText "TestState" $ \t ->
39+ case lookup t states of
40+ Nothing -> fail $ "Invalid state: " ++ unpack t
41+ Just v -> return v
42+ where
43+ states = asHashMap $ mapFromList
44+ $ map (\x -> (testStateToText x, x)) [minBound..maxBound]
45+
46+data SystemInfo = SystemInfo
47+ { siGhcVersion :: Version
48+ , siOS :: OS
49+ , siArch :: Arch
50+ , siCorePackages :: Map PackageName Version
51+ , siCoreExecutables :: Set ExeName
52+ }
53+ deriving (Show, Eq, Ord)
54+instance ToJSON SystemInfo where
55+ toJSON SystemInfo {..} = object
56+ [ "ghc-version" .= display siGhcVersion
57+ , "os" .= display siOS
58+ , "arch" .= display siArch
59+ , "core-packages" .= Map.mapKeysWith const unPackageName (map display siCorePackages)
60+ , "core-executables" .= siCoreExecutables
61+ ]
62+instance FromJSON SystemInfo where
63+ parseJSON = withObject "SystemInfo" $ \o -> do
64+ let helper name = (o .: name) >>= either (fail . show) return . simpleParse
65+ siGhcVersion <- helper "ghc-version"
66+ siOS <- helper "os"
67+ siArch <- helper "arch"
68+ siCorePackages <- (o .: "core-packages") >>= goPackages
69+ siCoreExecutables <- o .: "core-executables"
70+ return SystemInfo {..}
71+ where
72+ goPackages = either (fail . show) return
73+ . mapM simpleParse
74+ . Map.mapKeysWith const mkPackageName
75+
76+data BuildConstraints = BuildConstraints
77+ { bcPackages :: Set PackageName
78+ -- ^ This does not include core packages.
79+ , bcPackageConstraints :: PackageName -> PackageConstraints
80+
81+ , bcSystemInfo :: SystemInfo
82+ }
83+
84+data PackageConstraints = PackageConstraints
85+ { pcVersionRange :: VersionRange
86+ , pcMaintainer :: Maybe Maintainer
87+ , pcTests :: TestState
88+ , pcHaddocks :: TestState
89+ , pcBuildBenchmarks :: Bool
90+ , pcFlagOverrides :: Map FlagName Bool
91+ }
92+ deriving (Show, Eq)
93+instance ToJSON PackageConstraints where
94+ toJSON PackageConstraints {..} = object $ addMaintainer
95+ [ "version-range" .= display pcVersionRange
96+ , "tests" .= pcTests
97+ , "haddocks" .= pcHaddocks
98+ , "build-benchmarks" .= pcBuildBenchmarks
99+ , "flags" .= Map.mapKeysWith const unFlagName pcFlagOverrides
100+ ]
101+ where
102+ addMaintainer = maybe id (\m -> (("maintainer" .= m):)) pcMaintainer
103+instance FromJSON PackageConstraints where
104+ parseJSON = withObject "PackageConstraints" $ \o -> do
105+ pcVersionRange <- (o .: "version-range")
106+ >>= either (fail . show) return . simpleParse
107+ pcTests <- o .: "tests"
108+ pcHaddocks <- o .: "haddocks"
109+ pcBuildBenchmarks <- o .: "build-benchmarks"
110+ pcFlagOverrides <- Map.mapKeysWith const mkFlagName <$> o .: "flags"
111+ pcMaintainer <- o .:? "maintainer"
112+ return PackageConstraints {..}
113+
114+-- | The proposed plan from the requirements provided by contributors.
115+defaultBuildConstraints :: IO BuildConstraints
116+defaultBuildConstraints = do
117+ siCorePackages <- getCorePackages
118+ siCoreExecutables <- getCoreExecutables
119+ siGhcVersion <- getGhcVersion
120+ oldGhcVer <-
121+ case siGhcVersion of
122+ Version (x:y:_) _ -> return $ Old.GhcMajorVersion x y
123+ _ -> error $ "Didn't not understand GHC version: " ++ show siGhcVersion
124+
125+
126+ let oldSettings = Old.defaultSelectSettings oldGhcVer False
127+ oldStable = Old.defaultStablePackages oldGhcVer False
128+ defaultGlobalFlags = asMap $ mapFromList $
129+ map (, True) (map FlagName $ setToList $ Old.flags oldSettings mempty) ++
130+ map (, False) (map FlagName $ setToList $ Old.disabledFlags oldSettings)
131+ expectedFailures = Old.defaultExpectedFailures oldGhcVer False ++
132+ newExpectedFailures
133+ skippedTests =
134+ old ++ extraSkippedTests
135+ where
136+ old = setFromList $ map unPackageName $ setToList $ Old.skippedTests oldSettings
137+
138+ bcPackages = Map.keysSet oldStable
139+ bcPackageConstraints name =
140+ PackageConstraints {..}
141+ where
142+ mold = lookup name $ oldStable
143+
144+ pcVersionRange = simplifyVersionRange $ maybe anyVersion fst mold
145+ pcMaintainer = (Maintainer . pack . Old.unMaintainer . snd) <$> mold
146+ pcTests
147+ | unPackageName name `member` skippedTests = Don'tBuild
148+ | name `member` expectedFailures = ExpectFailure
149+ | otherwise = ExpectSuccess
150+
151+ pcBuildBenchmarks = unPackageName name `notMember` skippedBenchs
152+
153+ -- FIXME ultimately separate haddock and test failures in specification
154+ pcHaddocks
155+ | name `member` expectedFailures = ExpectFailure
156+ | otherwise = ExpectSuccess
157+
158+ pcFlagOverrides = packageFlags name ++ defaultGlobalFlags
159+
160+ -- FIXME consider not hard-coding the next two values
161+ siOS = Distribution.System.Linux
162+ siArch = Distribution.System.X86_64
163+
164+ bcSystemInfo = SystemInfo {..}
165+
166+ return BuildConstraints {..}
167+
168+packageFlags :: PackageName -> Map FlagName Bool
169+packageFlags (PackageName "mersenne-random-pure64") = singletonMap (FlagName "small_base") False
170+packageFlags _ = mempty
171+
172+extraSkippedTests :: HashSet Text
173+extraSkippedTests = setFromList $ words =<<
174+ [ "HTTP Octree options"
175+ , "hasql"
176+ , "bloodhound fb" -- require old hspec
177+ , "diagrams-haddock" -- requires old tasty
178+ , "hasql-postgres" -- requires old hasql
179+ , "compdata" -- https://github.com/pa-ba/compdata/issues/4
180+ ]
181+
182+skippedBenchs :: HashSet Text
183+skippedBenchs = setFromList $ words =<<
184+ [ "machines criterion-plus graphviz lifted-base pandoc stm-containers uuid"
185+ , "cases hasql-postgres" -- pulls in criterion-plus, which has restrictive upper bounds
186+ -- https://github.com/vincenthz/hs-crypto-cipher/issues/46
187+ , "cipher-aes cipher-blowfish cipher-camellia cipher-des cipher-rc4"
188+ , "hasql" -- sometimes falls out-of-sync on hasql-postgres
189+ ]
190+
191+newExpectedFailures :: Set PackageName
192+newExpectedFailures = setFromList $ map PackageName $ words =<<
193+ [ "cautious-file" -- weird problems with cabal test
194+ ]
Stackage2/BuildPlan.hsnew file+203
@@ -0,0 +1,203 @@
1+{-# LANGUAGE DeriveDataTypeable #-}
2+{-# LANGUAGE DeriveFoldable #-}
3+{-# LANGUAGE DeriveFunctor #-}
4+{-# LANGUAGE DeriveTraversable #-}
5+{-# LANGUAGE NoImplicitPrelude #-}
6+{-# LANGUAGE OverloadedStrings #-}
7+{-# LANGUAGE RecordWildCards #-}
8+{-# LANGUAGE TupleSections #-}
9+{-# LANGUAGE TypeFamilies #-}
10+-- | Representation of a concrete build plan, and how to generate a new one
11+-- based on constraints.
12+module Stackage2.BuildPlan
13+ ( BuildPlan (..)
14+ , PackagePlan (..)
15+ , newBuildPlan
16+ , makeToolMap
17+ ) where
18+
19+import Control.Monad.State.Strict (execState, get, put)
20+import Data.Aeson
21+import qualified Data.Map as Map
22+import qualified Data.Set as Set
23+import qualified Distribution.Compiler
24+import Distribution.PackageDescription
25+import Stackage2.BuildConstraints
26+import Stackage2.GithubPings
27+import Stackage2.PackageDescription
28+import Stackage2.PackageIndex
29+import Stackage2.Prelude
30+
31+data BuildPlan = BuildPlan
32+ { bpSystemInfo :: SystemInfo
33+ , bpTools :: Vector (PackageName, Version)
34+ , bpPackages :: Map PackageName PackagePlan
35+ }
36+ deriving (Show, Eq)
37+
38+instance ToJSON BuildPlan where
39+ toJSON BuildPlan {..} = object
40+ [ "system-info" .= bpSystemInfo
41+ , "tools" .= map goTool bpTools
42+ , "packages" .= Map.mapKeysWith const unPackageName bpPackages
43+ ]
44+ where
45+ goTool (k, v) = object
46+ [ "name" .= display k
47+ , "version" .= display v
48+ ]
49+instance FromJSON BuildPlan where
50+ parseJSON = withObject "BuildPlan" $ \o -> do
51+ bpSystemInfo <- o .: "system-info"
52+ bpTools <- (o .: "tools") >>= mapM goTool
53+ bpPackages <- Map.mapKeysWith const mkPackageName <$> (o .: "packages")
54+ return BuildPlan {..}
55+ where
56+ goTool = withObject "Tool" $ \o -> (,)
57+ <$> ((o .: "name") >>=
58+ either (fail . show) return . simpleParse . asText)
59+ <*> ((o .: "version") >>=
60+ either (fail . show) return . simpleParse . asText)
61+
62+data PackagePlan = PackagePlan
63+ { ppVersion :: Version
64+ , ppGithubPings :: Set Text
65+ , ppUsers :: Set PackageName
66+ , ppConstraints :: PackageConstraints
67+ , ppDesc :: SimpleDesc
68+ }
69+ deriving (Show, Eq)
70+
71+instance ToJSON PackagePlan where
72+ toJSON PackagePlan {..} = object
73+ [ "version" .= asText (display ppVersion)
74+ , "github-pings" .= ppGithubPings
75+ , "users" .= map unPackageName (unpack ppUsers)
76+ , "constraints" .= ppConstraints
77+ , "description" .= ppDesc
78+ ]
79+instance FromJSON PackagePlan where
80+ parseJSON = withObject "PackageBuild" $ \o -> do
81+ ppVersion <- o .: "version"
82+ >>= either (fail . show) return
83+ . simpleParse . asText
84+ ppGithubPings <- o .:? "github-pings" .!= mempty
85+ ppUsers <- Set.map PackageName <$> (o .:? "users" .!= mempty)
86+ ppConstraints <- o .: "constraints"
87+ ppDesc <- o .: "description"
88+ return PackagePlan {..}
89+
90+newBuildPlan :: MonadIO m => BuildConstraints -> m BuildPlan
91+newBuildPlan bc@BuildConstraints {..} = liftIO $ do
92+ packagesOrig <- getLatestDescriptions (isAllowed bc) (mkPackagePlan bc)
93+ let toolMap = makeToolMap packagesOrig
94+ packages = populateUsers $ removeUnincluded bc toolMap packagesOrig
95+ toolNames :: [ExeName]
96+ toolNames = concatMap (Map.keys . sdTools . ppDesc) packages
97+ tools <- topologicalSortTools toolMap $ mapFromList $ do
98+ exeName <- toolNames
99+ guard $ exeName `notMember` siCoreExecutables
100+ packageName <- maybe mempty setToList $ lookup exeName toolMap
101+ packagePlan <- maybeToList $ lookup packageName packagesOrig
102+ return (packageName, packagePlan)
103+ -- FIXME topologically sort packages? maybe just leave that to the build phase
104+ return BuildPlan
105+ { bpSystemInfo = bcSystemInfo
106+ , bpTools = tools
107+ , bpPackages = packages
108+ }
109+ where
110+ SystemInfo {..} = bcSystemInfo
111+
112+makeToolMap :: Map PackageName PackagePlan
113+ -> Map ExeName (Set PackageName)
114+makeToolMap =
115+ unionsWith (++) . map go . mapToList
116+ where
117+ go (packageName, pp) =
118+ foldMap go' $ sdProvidedExes $ ppDesc pp
119+ where
120+ go' exeName = singletonMap exeName (singletonSet packageName)
121+
122+topologicalSortTools :: MonadThrow m
123+ => Map ExeName (Set PackageName)
124+ -> Map PackageName PackagePlan
125+ -> m (Vector (PackageName, Version))
126+topologicalSortTools toolMap = topologicalSort
127+ ppVersion
128+ (concatMap (fromMaybe mempty . flip lookup toolMap) . Map.keys . sdTools . ppDesc)
129+
130+-- | Include only packages which are dependencies of the required packages and
131+-- their build tools.
132+removeUnincluded :: BuildConstraints
133+ -> Map ExeName (Set PackageName)
134+ -> Map PackageName PackagePlan
135+ -> Map PackageName PackagePlan
136+removeUnincluded BuildConstraints {..} toolMap orig =
137+ mapFromList $ filter (\(x, _) -> x `member` included) $ mapToList orig
138+ where
139+ SystemInfo {..} = bcSystemInfo
140+
141+ included :: Set PackageName
142+ included = flip execState mempty $ mapM_ add bcPackages
143+
144+ add name = do
145+ inc <- get
146+ when (name `notMember` inc) $ do
147+ put $ insertSet name inc
148+ case lookup name orig of
149+ Nothing -> return ()
150+ Just pb -> do
151+ mapM_ add $ Map.keys $ sdPackages $ ppDesc pb
152+ forM_ (Map.keys $ sdTools $ ppDesc pb) $
153+ \exeName -> when (exeName `notMember` siCoreExecutables)
154+ $ mapM_ add $ fromMaybe mempty $ lookup exeName toolMap
155+
156+populateUsers :: Map PackageName PackagePlan
157+ -> Map PackageName PackagePlan
158+populateUsers orig =
159+ mapWithKey go orig
160+ where
161+ go name pb = pb { ppUsers = foldMap (go2 name) (mapToList orig) }
162+
163+ go2 dep (user, pb)
164+ | dep `member` sdPackages (ppDesc pb) = singletonSet user
165+ | otherwise = mempty
166+
167+-- | Check whether the given package/version combo meets the constraints
168+-- currently in place.
169+isAllowed :: BuildConstraints
170+ -> PackageName -> Version -> Bool
171+isAllowed bc = \name version ->
172+ case lookup name $ siCorePackages $ bcSystemInfo bc of
173+ Just _ -> False -- never reinstall a core package
174+ Nothing -> withinRange version $ pcVersionRange $ bcPackageConstraints bc name
175+
176+mkPackagePlan :: MonadThrow m
177+ => BuildConstraints
178+ -> GenericPackageDescription
179+ -> m PackagePlan
180+mkPackagePlan bc gpd = do
181+ ppDesc <- toSimpleDesc CheckCond {..} gpd
182+ return PackagePlan {..}
183+ where
184+ PackageIdentifier name ppVersion = package $ packageDescription gpd
185+ ppGithubPings = getGithubPings gpd
186+ ppConstraints = bcPackageConstraints bc name
187+ ppUsers = mempty -- must be filled in later
188+
189+ ccPackageName = name
190+ ccOS = siOS
191+ ccArch = siArch
192+ ccCompilerFlavor = Distribution.Compiler.GHC
193+ ccCompilerVersion = siGhcVersion
194+ ccFlags = flags
195+ ccIncludeTests = pcTests ppConstraints /= Don'tBuild
196+ ccIncludeBenchmarks = pcBuildBenchmarks ppConstraints
197+
198+ SystemInfo {..} = bcSystemInfo bc
199+
200+ overrides = pcFlagOverrides ppConstraints
201+ getFlag MkFlag {..} =
202+ (flagName, fromMaybe flagDefault $ lookup flagName overrides)
203+ flags = mapFromList $ map getFlag $ genPackageFlags gpd
Stackage2/CheckBuildPlan.hsnew file+107
@@ -0,0 +1,107 @@
1+{-# LANGUAGE DeriveDataTypeable #-}
2+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3+{-# LANGUAGE NoImplicitPrelude #-}
4+{-# LANGUAGE OverloadedStrings #-}
5+{-# LANGUAGE RecordWildCards #-}
6+{-# LANGUAGE ViewPatterns #-}
7+-- | Confirm that a build plan has a consistent set of dependencies.
8+module Stackage2.CheckBuildPlan
9+ ( checkBuildPlan
10+ ) where
11+
12+import Control.Monad.Writer.Strict (Writer, execWriter, tell)
13+import Stackage2.BuildConstraints
14+import Stackage2.BuildPlan
15+import Stackage2.PackageDescription
16+import Stackage2.Prelude
17+
18+-- FIXME check cycles in dependencies, only looking at libraries and
19+-- executables
20+
21+checkBuildPlan :: MonadThrow m => BuildPlan -> m ()
22+checkBuildPlan BuildPlan {..}
23+ | null errs' = return ()
24+ | otherwise = throwM errs
25+ where
26+ allPackages = siCorePackages bpSystemInfo ++ map ppVersion bpPackages
27+ errs@(BadBuildPlan errs') =
28+ execWriter $ mapM_ (checkDeps allPackages) $ mapToList bpPackages
29+
30+checkDeps :: Map PackageName Version
31+ -> (PackageName, PackagePlan)
32+ -> Writer BadBuildPlan ()
33+checkDeps allPackages (user, pb) =
34+ mapM_ go $ mapToList $ sdPackages $ ppDesc pb
35+ where
36+ go (dep, diRange -> range) =
37+ case lookup dep allPackages of
38+ Nothing -> tell $ BadBuildPlan $ singletonMap (dep, Nothing) errMap
39+ Just version
40+ | version `withinRange` range -> return ()
41+ | otherwise -> tell $ BadBuildPlan $ singletonMap
42+ (dep, Just version)
43+ errMap
44+ where
45+ errMap = singletonMap pu range
46+ pu = PkgUser
47+ { puName = user
48+ , puVersion = ppVersion pb
49+ , puMaintainer = pcMaintainer $ ppConstraints pb
50+ , puGithubPings = ppGithubPings pb
51+ }
52+
53+data PkgUser = PkgUser
54+ { puName :: PackageName
55+ , puVersion :: Version
56+ , puMaintainer :: Maybe Maintainer
57+ , puGithubPings :: Set Text
58+ }
59+ deriving (Eq, Ord)
60+
61+pkgUserShow1 :: PkgUser -> Text
62+pkgUserShow1 PkgUser {..} = concat
63+ [ display puName
64+ , "-"
65+ , display puVersion
66+ ]
67+
68+pkgUserShow2 :: PkgUser -> Text
69+pkgUserShow2 PkgUser {..} = unwords
70+ $ (maybe "No maintainer" unMaintainer puMaintainer ++ ".")
71+ : map (cons '@') (setToList puGithubPings)
72+
73+newtype BadBuildPlan =
74+ BadBuildPlan (Map (PackageName, Maybe Version) (Map PkgUser VersionRange))
75+ deriving Typeable
76+instance Exception BadBuildPlan
77+instance Show BadBuildPlan where
78+ show (BadBuildPlan errs) =
79+ unpack $ concatMap go $ mapToList errs
80+ where
81+ go ((dep, mdepVer), users) = unlines
82+ $ showDepVer dep mdepVer
83+ : map showUser (mapToList users)
84+
85+ showDepVer :: PackageName -> Maybe Version -> Text
86+ showDepVer dep Nothing = display dep ++ " (not present) depended on by:"
87+ showDepVer dep (Just version) = concat
88+ [ display dep
89+ , "-"
90+ , display version
91+ , " depended on by:"
92+ ]
93+
94+ showUser :: (PkgUser, VersionRange) -> Text
95+ showUser (pu, range) = concat
96+ [ "- "
97+ , pkgUserShow1 pu
98+ , " ("
99+ , display range
100+ , "). "
101+ , pkgUserShow2 pu
102+ ]
103+
104+instance Monoid BadBuildPlan where
105+ mempty = BadBuildPlan mempty
106+ mappend (BadBuildPlan x) (BadBuildPlan y) =
107+ BadBuildPlan $ unionWith (unionWith intersectVersionRanges) x y
Stackage2/CompleteBuild.hsnew file+190
@@ -0,0 +1,190 @@
1+{-# LANGUAGE NoImplicitPrelude #-}
2+{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE RecordWildCards #-}
4+module Stackage2.CompleteBuild
5+ ( BuildType (..)
6+ , BumpType (..)
7+ , completeBuild
8+ ) where
9+import Data.Default.Class (def)
10+import Data.Semigroup (Max (..), Option (..))
11+import Data.Text.Read (decimal)
12+import Data.Time
13+import Data.Yaml (decodeFileEither, encodeFile)
14+import Network.HTTP.Client
15+import Stackage2.BuildConstraints
16+import Stackage2.BuildPlan
17+import Stackage2.CheckBuildPlan
18+import Stackage2.PerformBuild
19+import Stackage2.Prelude
20+import Stackage2.ServerBundle
21+import Stackage2.UpdateBuildPlan
22+import Stackage2.Upload
23+import System.IO (BufferMode (LineBuffering), hSetBuffering)
24+
25+data BuildType = Nightly | LTS BumpType
26+ deriving (Show, Read, Eq, Ord)
27+
28+data BumpType = Major | Minor
29+ deriving (Show, Read, Eq, Ord)
30+
31+data Settings = Settings
32+ { plan :: BuildPlan
33+ , planFile :: FilePath
34+ , buildDir :: FilePath
35+ , logDir :: FilePath
36+ , title :: Text -> Text -- ^ GHC version -> title
37+ , slug :: Text
38+ , setArgs :: Text -> UploadBundle -> UploadBundle
39+ , postBuild :: IO ()
40+ }
41+
42+getSettings :: BuildType -> IO Settings
43+getSettings Nightly = do
44+ day <- tshow . utctDay <$> getCurrentTime
45+ let slug' = "nightly-" ++ day
46+ plan' <- defaultBuildConstraints >>= newBuildPlan
47+ return Settings
48+ { planFile = fpFromText ("nightly-" ++ day) <.> "yaml"
49+ , buildDir = fpFromText $ "builds/stackage-nightly-" ++ day
50+ , logDir = fpFromText $ "logs/stackage-nightly-" ++ day
51+ , title = \ghcVer -> concat
52+ [ "Stackage Nightly "
53+ , day
54+ , ", GHC "
55+ , ghcVer
56+ ]
57+ , slug = slug'
58+ , setArgs = \ghcVer ub -> ub { ubNightly = Just ghcVer }
59+ , plan = plan'
60+ , postBuild = return ()
61+ }
62+getSettings (LTS bumpType) = do
63+ Option mlts <- fmap (fmap getMax) $ runResourceT
64+ $ sourceDirectory "."
65+ $$ foldMapC (Option . fmap Max . parseLTSVer . filename)
66+
67+ (new, plan') <- case bumpType of
68+ Major -> do
69+ let new =
70+ case mlts of
71+ Nothing -> LTSVer 0 0
72+ Just (LTSVer x _) -> LTSVer (x + 1) 0
73+ plan' <- defaultBuildConstraints >>= newBuildPlan
74+ return (new, plan')
75+ Minor -> do
76+ old <- maybe (error "No LTS plans found in current directory") return mlts
77+ oldplan <- decodeFileEither (fpToString $ renderLTSVer old)
78+ >>= either throwM return
79+ let new = incrLTSVer old
80+ plan' <- updateBuildPlan oldplan
81+ return (new, plan')
82+
83+ let newfile = renderLTSVer new
84+
85+ return Settings
86+ { planFile = newfile
87+ , buildDir = fpFromText $ "builds/stackage-lts-" ++ tshow new
88+ , logDir = fpFromText $ "logs/stackage-lts-" ++ tshow new
89+ , title = \ghcVer -> concat
90+ [ "LTS Haskell "
91+ , tshow new
92+ , ", GHC "
93+ , ghcVer
94+ ]
95+ , slug = "lts-" ++ tshow new
96+ , setArgs = \_ ub -> ub { ubLTS = Just $ tshow new }
97+ , plan = plan'
98+ , postBuild = do
99+ let git args = withCheckedProcess
100+ (proc "git" args) $ \ClosedStream Inherited Inherited ->
101+ return ()
102+ putStrLn "Committing new LTS file to Git"
103+ git ["add", fpToString newfile]
104+ git ["commit", "-m", "Added new LTS release: " ++ show new]
105+ putStrLn "Pushing to Git repository"
106+ git ["push"]
107+ }
108+
109+data LTSVer = LTSVer !Int !Int
110+ deriving (Eq, Ord)
111+instance Show LTSVer where
112+ show (LTSVer x y) = concat [show x, ".", show y]
113+incrLTSVer :: LTSVer -> LTSVer
114+incrLTSVer (LTSVer x y) = LTSVer x (y + 1)
115+
116+parseLTSVer :: FilePath -> Maybe LTSVer
117+parseLTSVer fp = do
118+ w <- stripPrefix "lts-" $ fpToText fp
119+ x <- stripSuffix ".yaml" w
120+ Right (major, y) <- Just $ decimal x
121+ z <- stripPrefix "." y
122+ Right (minor, "") <- Just $ decimal z
123+ return $ LTSVer major minor
124+renderLTSVer :: LTSVer -> FilePath
125+renderLTSVer lts = fpFromText $ concat
126+ [ "lts-"
127+ , tshow lts
128+ , ".yaml"
129+ ]
130+
131+completeBuild :: BuildType -> IO ()
132+completeBuild buildType = withManager defaultManagerSettings $ \man -> do
133+ hSetBuffering stdout LineBuffering
134+
135+ putStrLn $ "Loading settings for: " ++ tshow buildType
136+ Settings {..} <- getSettings buildType
137+
138+ putStrLn $ "Writing build plan to: " ++ fpToText planFile
139+ encodeFile (fpToString planFile) plan
140+
141+ putStrLn "Checking build plan"
142+ checkBuildPlan plan
143+
144+ putStrLn "Performing build"
145+ let pb = PerformBuild
146+ { pbPlan = plan
147+ , pbInstallDest = buildDir
148+ , pbLogDir = logDir
149+ , pbLog = hPut stdout
150+ , pbJobs = 8
151+ }
152+ performBuild pb >>= mapM_ putStrLn
153+
154+ putStrLn "Uploading bundle to Stackage Server"
155+ token <- readFile "/auth-token"
156+ now <- epochTime
157+ let ghcVer = display $ siGhcVersion $ bpSystemInfo plan
158+ ident <- flip uploadBundle man $ setArgs ghcVer def
159+ { ubContents = serverBundle now (title ghcVer) slug plan
160+ , ubAuthToken = decodeUtf8 token
161+ }
162+ putStrLn $ "New ident: " ++ unSnapshotIdent ident
163+
164+ putStrLn "Uploading docs to Stackage Server"
165+ res1 <- uploadDocs UploadDocs
166+ { udServer = def
167+ , udAuthToken = decodeUtf8 token
168+ , udDocs = pbDocDir pb
169+ , udSnapshot = ident
170+ } man
171+ putStrLn $ "Doc upload response: " ++ tshow res1
172+
173+ ecreds <- tryIO $ readFile "/hackage-creds"
174+ case map encodeUtf8 $ words $ decodeUtf8 $ either (const "") id ecreds of
175+ [username, password] -> do
176+ putStrLn "Uploading as Hackage distro"
177+ res2 <- uploadHackageDistro plan username password man
178+ putStrLn $ "Distro upload response: " ++ tshow res2
179+ _ -> putStrLn "No creds found, skipping Hackage distro upload"
180+
181+ putStrLn "Uploading doc map"
182+ uploadDocMap UploadDocMap
183+ { udmServer = def
184+ , udmAuthToken = decodeUtf8 token
185+ , udmSnapshot = ident
186+ , udmDocDir = pbDocDir pb
187+ , udmPlan = plan
188+ } man >>= print
189+
190+ postBuild
Stackage2/CorePackages.hsnew file+53
@@ -0,0 +1,53 @@
1+{-# LANGUAGE NoImplicitPrelude #-}
2+{-# LANGUAGE OverloadedStrings #-}
3+module Stackage2.CorePackages
4+ ( getCorePackages
5+ , getCoreExecutables
6+ , getGhcVersion
7+ ) where
8+
9+import qualified Data.Text as T
10+import Filesystem (listDirectory)
11+import Stackage2.Prelude
12+import System.Directory (findExecutable)
13+
14+-- | Get a @Map@ of all of the core packages. Core packages are defined as
15+-- packages which ship with GHC itself.
16+--
17+-- Precondition: GHC global package database has only core packages, and GHC
18+-- ships with just a single version of each packages.
19+getCorePackages :: IO (Map PackageName Version)
20+getCorePackages =
21+ withCheckedProcess cp $ \ClosedStream src Inherited ->
22+ src $$ decodeUtf8C =$ linesUnboundedC =$ foldMapMC parsePackage
23+ where
24+ cp = proc "ghc-pkg" ["--no-user-package-conf", "list"]
25+ parsePackage t
26+ | ":" `isInfixOf` t = return mempty
27+ | Just p <- stripSuffix "-" p' = singletonMap
28+ <$> simpleParse p
29+ <*> simpleParse v
30+ | otherwise = return mempty
31+ where
32+ (p', v) = T.breakOnEnd "-" $ dropParens $ T.strip t
33+
34+ dropParens s
35+ | length s > 2 && headEx s == '(' && lastEx s == ')' =
36+ initEx $ tailEx s
37+ | otherwise = s
38+
39+-- | A list of executables that are shipped with GHC.
40+getCoreExecutables :: IO (Set ExeName)
41+getCoreExecutables = do
42+ mfp <- findExecutable "ghc"
43+ dir <-
44+ case mfp of
45+ Nothing -> error "No ghc executable found on PATH"
46+ Just fp -> return $ directory $ fpFromString fp
47+ (setFromList . map (ExeName . fpToText . filename)) <$> listDirectory dir
48+
49+getGhcVersion :: IO Version
50+getGhcVersion = do
51+ withCheckedProcess (proc "ghc" ["--numeric-version"]) $
52+ \ClosedStream src Inherited ->
53+ (src $$ decodeUtf8C =$ foldC) >>= simpleParse
Stackage2/GithubPings.hsnew file+34
@@ -0,0 +1,34 @@
1+{-# LANGUAGE NoImplicitPrelude #-}
2+{-# LANGUAGE OverloadedStrings #-}
3+module Stackage2.GithubPings
4+ ( getGithubPings
5+ ) where
6+
7+import Distribution.PackageDescription
8+import qualified Stackage.Config as Old
9+import Stackage2.Prelude
10+
11+-- | Determine accounts to be pinged on Github based on various metadata in the
12+-- package description.
13+getGithubPings :: GenericPackageDescription -> Set Text
14+getGithubPings gpd =
15+ setFromList $ map pack $ foldMap Old.convertGithubUser $
16+ goHomepage (homepage $ packageDescription gpd) ++
17+ concatMap goRepo (sourceRepos $ packageDescription gpd)
18+ where
19+ goHomepage t = do
20+ prefix <-
21+ [ "http://github.com/"
22+ , "https://github.com/"
23+ , "git://github.com/"
24+ , "git@github.com:"
25+ ]
26+ t' <- maybeToList $ stripPrefix prefix t
27+ let t'' = takeWhile (/= '/') t'
28+ guard $ not $ null t''
29+ return t''
30+
31+ goRepo sr =
32+ case (repoType sr, repoLocation sr) of
33+ (Just Git, Just s) -> goHomepage s
34+ _ -> []
Stackage2/PackageDescription.hsnew file+200
@@ -0,0 +1,200 @@
1+{-# LANGUAGE DeriveDataTypeable #-}
2+{-# LANGUAGE DeriveFoldable #-}
3+{-# LANGUAGE DeriveFunctor #-}
4+{-# LANGUAGE DeriveTraversable #-}
5+{-# LANGUAGE FlexibleContexts #-}
6+{-# LANGUAGE NoImplicitPrelude #-}
7+{-# LANGUAGE OverloadedStrings #-}
8+{-# LANGUAGE RecordWildCards #-}
9+{-# LANGUAGE TypeFamilies #-}
10+-- | Manipulate @GenericPackageDescription@ from Cabal into something more
11+-- useful for us.
12+module Stackage2.PackageDescription
13+ ( SimpleDesc (..)
14+ , toSimpleDesc
15+ , CheckCond (..)
16+ , Component (..)
17+ , DepInfo (..)
18+ ) where
19+
20+import Control.Monad.Writer.Strict (MonadWriter, execWriterT,
21+ tell)
22+import Data.Aeson
23+import qualified Data.Map as Map
24+import Distribution.Compiler (CompilerFlavor)
25+import Distribution.Package (Dependency (..))
26+import Distribution.PackageDescription
27+import Distribution.System (Arch, OS)
28+import Stackage2.Prelude
29+
30+data Component = CompLibrary
31+ | CompExecutable
32+ | CompTestSuite
33+ | CompBenchmark
34+ deriving (Show, Read, Eq, Ord, Enum, Bounded)
35+
36+compToText :: Component -> Text
37+compToText CompLibrary = "library"
38+compToText CompExecutable = "executable"
39+compToText CompTestSuite = "test-suite"
40+compToText CompBenchmark = "benchmark"
41+
42+instance ToJSON Component where
43+ toJSON = toJSON . compToText
44+instance FromJSON Component where
45+ parseJSON = withText "Component" $ \t -> maybe
46+ (fail $ "Invalid component: " ++ unpack t)
47+ return
48+ (lookup t comps)
49+ where
50+ comps = asHashMap $ mapFromList $ map (compToText &&& id) [minBound..maxBound]
51+
52+data DepInfo = DepInfo
53+ { diComponents :: Set Component
54+ , diRange :: VersionRange
55+ }
56+ deriving (Show, Eq)
57+
58+instance Semigroup DepInfo where
59+ DepInfo a x <> DepInfo b y = DepInfo
60+ (a <> b)
61+ (intersectVersionRanges x y)
62+instance ToJSON DepInfo where
63+ toJSON DepInfo {..} = object
64+ [ "components" .= diComponents
65+ , "range" .= display diRange
66+ ]
67+instance FromJSON DepInfo where
68+ parseJSON = withObject "DepInfo" $ \o -> do
69+ diComponents <- o .: "components"
70+ diRange <- o .: "range" >>= either (fail . show) return . simpleParse
71+ return DepInfo {..}
72+
73+-- | A simplified package description that tracks:
74+--
75+-- * Package dependencies
76+--
77+-- * Build tool dependencies
78+--
79+-- * Provided executables
80+--
81+-- It has fully resolved all conditionals
82+data SimpleDesc = SimpleDesc
83+ { sdPackages :: Map PackageName DepInfo
84+ , sdTools :: Map ExeName DepInfo
85+ , sdProvidedExes :: Set ExeName
86+ , sdModules :: Set Text
87+ -- ^ modules exported by the library
88+ }
89+ deriving (Show, Eq)
90+instance Monoid SimpleDesc where
91+ mempty = SimpleDesc mempty mempty mempty mempty
92+ mappend (SimpleDesc a b c d) (SimpleDesc w x y z) = SimpleDesc
93+ (unionWith (<>) a w)
94+ (unionWith (<>) b x)
95+ (c ++ y)
96+ (d ++ z)
97+instance ToJSON SimpleDesc where
98+ toJSON SimpleDesc {..} = object
99+ [ "packages" .= Map.mapKeysWith const unPackageName sdPackages
100+ , "tools" .= Map.mapKeysWith const unExeName sdTools
101+ , "provided-exes" .= sdProvidedExes
102+ , "modules" .= sdModules
103+ ]
104+instance FromJSON SimpleDesc where
105+ parseJSON = withObject "SimpleDesc" $ \o -> do
106+ sdPackages <- Map.mapKeysWith const mkPackageName <$> (o .: "packages")
107+ sdTools <- Map.mapKeysWith const ExeName <$> (o .: "tools")
108+ sdProvidedExes <- o .: "provided-exes"
109+ sdModules <- o .: "modules"
110+ return SimpleDesc {..}
111+
112+-- | Convert a 'GenericPackageDescription' into a 'SimpleDesc' by following the
113+-- constraints in the provided 'CheckCond'.
114+toSimpleDesc :: MonadThrow m
115+ => CheckCond
116+ -> GenericPackageDescription
117+ -> m SimpleDesc
118+toSimpleDesc cc gpd = execWriterT $ do
119+ forM_ (condLibrary gpd) $ tellTree cc CompLibrary libBuildInfo getModules
120+ forM_ (condExecutables gpd) $ tellTree cc CompExecutable buildInfo noModules . snd
121+ tell mempty { sdProvidedExes = setFromList
122+ $ map (fromString . fst)
123+ $ condExecutables gpd
124+ }
125+ when (ccIncludeTests cc) $ forM_ (condTestSuites gpd)
126+ $ tellTree cc CompTestSuite testBuildInfo noModules . snd
127+ when (ccIncludeBenchmarks cc) $ forM_ (condBenchmarks gpd)
128+ $ tellTree cc CompBenchmark benchmarkBuildInfo noModules . snd
129+ where
130+ noModules = const mempty
131+ getModules = setFromList . map display . exposedModules
132+
133+-- | Convert a single CondTree to a 'SimpleDesc'.
134+tellTree :: (MonadWriter SimpleDesc m, MonadThrow m)
135+ => CheckCond
136+ -> Component
137+ -> (a -> BuildInfo)
138+ -> (a -> Set Text) -- ^ get module names
139+ -> CondTree ConfVar [Dependency] a
140+ -> m ()
141+tellTree cc component getBI getModules =
142+ loop
143+ where
144+ loop (CondNode dat deps comps) = do
145+ tell mempty
146+ { sdPackages = unionsWith (<>) $ flip map deps
147+ $ \(Dependency x y) -> singletonMap x DepInfo
148+ { diComponents = singletonSet component
149+ , diRange = simplifyVersionRange y
150+ }
151+ , sdTools = unionsWith (<>) $ flip map (buildTools $ getBI dat)
152+ $ \(Dependency name range) -> singletonMap
153+ -- In practice, cabal files refer to the exe name, not the
154+ -- package name.
155+ (ExeName $ unPackageName name)
156+ DepInfo
157+ { diComponents = singletonSet component
158+ , diRange = simplifyVersionRange range
159+ }
160+ , sdModules = getModules dat
161+ }
162+ forM_ comps $ \(cond, ontrue, onfalse) -> do
163+ b <- checkCond cc cond
164+ if b
165+ then loop ontrue
166+ else maybe (return ()) loop onfalse
167+
168+-- | Resolve a condition to a boolean based on the provided 'CheckCond'.
169+checkCond :: MonadThrow m => CheckCond -> Condition ConfVar -> m Bool
170+checkCond CheckCond {..} cond0 =
171+ go cond0
172+ where
173+ go (Var (OS os)) = return $ os == ccOS
174+ go (Var (Arch arch)) = return $ arch == ccArch
175+ go (Var (Flag flag)) =
176+ case lookup flag ccFlags of
177+ Nothing -> throwM $ FlagNotDefined ccPackageName flag cond0
178+ Just b -> return b
179+ go (Var (Impl flavor range)) = return
180+ $ flavor == ccCompilerFlavor
181+ && ccCompilerVersion `withinRange` range
182+ go (Lit b) = return b
183+ go (CNot c) = not `liftM` go c
184+ go (CAnd x y) = (&&) `liftM` go x `ap` go y
185+ go (COr x y) = (||) `liftM` go x `ap` go y
186+
187+data CheckCondException = FlagNotDefined PackageName FlagName (Condition ConfVar)
188+ deriving (Show, Typeable)
189+instance Exception CheckCondException
190+
191+data CheckCond = CheckCond
192+ { ccPackageName :: PackageName -- for debugging only
193+ , ccOS :: OS
194+ , ccArch :: Arch
195+ , ccFlags :: Map FlagName Bool
196+ , ccCompilerFlavor :: CompilerFlavor
197+ , ccCompilerVersion :: Version
198+ , ccIncludeTests :: Bool
199+ , ccIncludeBenchmarks :: Bool
200+ }
Stackage2/PackageIndex.hsnew file+127
@@ -0,0 +1,127 @@
1+{-# LANGUAGE DeriveDataTypeable #-}
2+{-# LANGUAGE FlexibleContexts #-}
3+{-# LANGUAGE NoImplicitPrelude #-}
4+{-# LANGUAGE OverloadedStrings #-}
5+{-# LANGUAGE RankNTypes #-}
6+{-# LANGUAGE ViewPatterns #-}
7+-- | Dealing with the 00-index file and all its cabal files.
8+module Stackage2.PackageIndex
9+ ( sourcePackageIndex
10+ , UnparsedCabalFile (..)
11+ , getLatestDescriptions
12+ ) where
13+
14+import qualified Codec.Archive.Tar as Tar
15+import Data.Conduit.Lazy (MonadActive,
16+ lazyConsume)
17+import qualified Data.Text as T
18+import Distribution.PackageDescription (package,
19+ packageDescription)
20+import Distribution.PackageDescription.Parse (ParseResult (..),
21+ parsePackageDescription)
22+import Distribution.ParseUtils (PError)
23+import Stackage2.Prelude
24+import System.Directory (getAppUserDataDirectory)
25+
26+-- | Name of the 00-index.tar downloaded from Hackage.
27+getPackageIndexPath :: MonadIO m => m FilePath
28+getPackageIndexPath = liftIO $ do
29+ c <- getCabalRoot
30+ configLines <- runResourceT $ sourceFile (c </> "config")
31+ $$ decodeUtf8C
32+ =$ linesUnboundedC
33+ =$ concatMapC getRemoteCache
34+ =$ sinkList
35+ case configLines of
36+ [x] -> return $ x </> "hackage.haskell.org" </> "00-index.tar"
37+ [] -> error $ "No remote-repo-cache found in Cabal config file"
38+ _ -> error $ "Multiple remote-repo-cache entries found in Cabal config file"
39+ where
40+ getCabalRoot :: IO FilePath
41+ getCabalRoot = fpFromString <$> getAppUserDataDirectory "cabal"
42+
43+ getRemoteCache s = do
44+ ("remote-repo-cache", stripPrefix ":" -> Just v) <- Just $ break (== ':') s
45+ Just $ fpFromText $ T.strip v
46+
47+-- | A cabal file with name and version parsed from the filepath, and the
48+-- package description itself ready to be parsed. It's left in unparsed form
49+-- for efficiency.
50+data UnparsedCabalFile = UnparsedCabalFile
51+ { ucfName :: PackageName
52+ , ucfVersion :: Version
53+ , ucfParse :: forall m. MonadThrow m => m GenericPackageDescription
54+ }
55+
56+-- | Stream all of the cabal files from the 00-index tar file.
57+sourcePackageIndex :: (MonadThrow m, MonadResource m, MonadActive m, MonadBaseControl IO m)
58+ => Producer m UnparsedCabalFile
59+sourcePackageIndex = do
60+ fp <- getPackageIndexPath
61+ -- yay for the tar package. Use lazyConsume instead of readFile to get some
62+ -- kind of resource protection
63+ lbs <- lift $ fromChunks <$> lazyConsume (sourceFile fp)
64+ loop (Tar.read lbs)
65+ where
66+ loop (Tar.Next e es) = goE e >> loop es
67+ loop Tar.Done = return ()
68+ loop (Tar.Fail e) = throwM e
69+
70+ goE e
71+ | Just front <- stripSuffix ".cabal" $ pack $ Tar.entryPath e
72+ , Tar.NormalFile lbs _size <- Tar.entryContent e = do
73+ (name, version) <- parseNameVersion front
74+ yield UnparsedCabalFile
75+ { ucfName = name
76+ , ucfVersion = version
77+ , ucfParse = goContent (Tar.entryPath e) name version lbs
78+ }
79+ | otherwise = return ()
80+
81+ goContent fp name version lbs =
82+ case parsePackageDescription $ unpack $ decodeUtf8 lbs of
83+ ParseFailed e -> throwM $ CabalParseException (fpFromString fp) e
84+ ParseOk _warnings gpd -> do
85+ let pd = packageDescription gpd
86+ PackageIdentifier name' version' = package pd
87+ when (name /= name' || version /= version') $
88+ throwM $ MismatchedNameVersion (fpFromString fp)
89+ name name' version version'
90+ return gpd
91+
92+ parseNameVersion t1 = do
93+ let (p', t2) = break (== '/') t1
94+ p <- simpleParse p'
95+ t3 <- maybe (throwM $ InvalidCabalPath t1 "no slash") return
96+ $ stripPrefix "/" t2
97+ let (v', t4) = break (== '/') t3
98+ v <- simpleParse v'
99+ when (t4 /= cons '/' p') $ throwM $ InvalidCabalPath t1 $ "Expected at end: " ++ p'
100+ return (p, v)
101+
102+data InvalidCabalPath = InvalidCabalPath Text Text
103+ deriving (Show, Typeable)
104+instance Exception InvalidCabalPath
105+
106+data CabalParseException = CabalParseException FilePath PError
107+ | MismatchedNameVersion FilePath PackageName PackageName Version Version
108+ deriving (Show, Typeable)
109+instance Exception CabalParseException
110+
111+-- | Get all of the latest descriptions for name/version pairs matching the
112+-- given criterion.
113+getLatestDescriptions :: MonadIO m
114+ => (PackageName -> Version -> Bool)
115+ -> (GenericPackageDescription -> IO desc)
116+ -> m (Map PackageName desc)
117+getLatestDescriptions f parseDesc = liftIO $ do
118+ m <- runResourceT $ sourcePackageIndex $$ filterC f' =$ foldlC add mempty
119+ forM m $ \ucf -> liftIO $ ucfParse ucf >>= parseDesc
120+ where
121+ f' ucf = f (ucfName ucf) (ucfVersion ucf)
122+ add m ucf =
123+ case lookup name m of
124+ Just ucf' | ucfVersion ucf < ucfVersion ucf' -> m
125+ _ -> insertMap name ucf m
126+ where
127+ name = ucfName ucf
Stackage2/PerformBuild.hsnew file+398
@@ -0,0 +1,398 @@
1+-- | Perform an actual build, generate a binary package database and a
2+-- documentation directory in the process.
3+{-# LANGUAGE CPP #-}
4+{-# LANGUAGE DeriveDataTypeable #-}
5+{-# LANGUAGE RecordWildCards #-}
6+{-# LANGUAGE NoImplicitPrelude #-}
7+{-# LANGUAGE OverloadedStrings #-}
8+module Stackage2.PerformBuild
9+ ( performBuild
10+ , PerformBuild (..)
11+ , BuildException (..)
12+ , pbDocDir
13+ ) where
14+
15+import Stackage2.BuildConstraints
16+import Stackage2.PackageDescription
17+import Stackage2.BuildPlan
18+import Stackage2.Prelude hiding (pi)
19+import qualified Data.Map as Map
20+import Control.Concurrent.STM.TSem
21+import Data.NonNull (fromNullable)
22+import Control.Concurrent.Async (async)
23+import System.IO.Temp (withSystemTempDirectory)
24+import Filesystem (createTree, removeTree, isDirectory, rename, canonicalizePath, getWorkingDirectory)
25+import System.IO (withBinaryFile, IOMode (WriteMode))
26+import Filesystem.Path (parent)
27+import qualified Filesystem.Path as F
28+import System.Environment (getEnvironment)
29+import System.Directory (findExecutable)
30+
31+data BuildException = BuildException (Map PackageName BuildFailure) [Text]
32+ deriving Typeable
33+instance Exception BuildException
34+instance Show BuildException where
35+ show (BuildException m warnings) =
36+ unlines $ map go (mapToList m) ++ map unpack warnings
37+ where
38+ go (PackageName name, bf) = concat
39+ [ name
40+ , ": "
41+ , show bf
42+ ]
43+
44+data BuildFailure = DependencyFailed PackageName
45+ | DependencyMissing PackageName
46+ | ToolMissing ExeName
47+ | NotImplemented
48+ | BuildFailureException SomeException
49+ deriving (Show, Typeable)
50+instance Exception BuildFailure
51+
52+data PerformBuild = PerformBuild
53+ { pbPlan :: BuildPlan
54+ , pbInstallDest :: FilePath
55+ , pbLog :: ByteString -> IO ()
56+ , pbLogDir :: FilePath
57+ , pbJobs :: Int
58+ }
59+
60+data PackageInfo = PackageInfo
61+ { piPlan :: PackagePlan
62+ , piName :: PackageName
63+ , piResult :: TMVar Bool
64+ }
65+
66+waitForDeps :: Map ExeName (Set PackageName)
67+ -> Map PackageName PackageInfo
68+ -> Set Component
69+ -> BuildPlan
70+ -> PackageInfo
71+ -> IO a
72+ -> IO a
73+waitForDeps toolMap packageMap activeComps bp pi action = do
74+ atomically $ do
75+ mapM_ checkPackage $ Map.keys $ filterUnused $ sdPackages $ ppDesc $ piPlan pi
76+ forM_ (Map.keys $ filterUnused $ sdTools $ ppDesc $ piPlan pi) $ \exe -> do
77+ case lookup exe toolMap >>= fromNullable . map checkPackage . setToList of
78+ Nothing
79+ | isCoreExe exe -> return ()
80+ | otherwise -> throwSTM $ ToolMissing exe
81+ Just packages -> ofoldl1' (<|>) packages
82+ action
83+ where
84+ filterUnused :: Ord key => Map key DepInfo -> Map key DepInfo
85+ filterUnused =
86+ mapFromList . filter (go . snd) . mapToList
87+ where
88+ go = not . null . intersection activeComps . diComponents
89+
90+ checkPackage package | package == piName pi = return ()
91+ checkPackage package =
92+ case lookup package packageMap of
93+ Nothing
94+ | isCore package -> return ()
95+ | otherwise -> throwSTM $ DependencyMissing package
96+ Just dep -> do
97+ res <- readTMVar $ piResult dep
98+ unless res $ throwSTM $ DependencyFailed package
99+
100+ isCore = (`member` siCorePackages (bpSystemInfo bp))
101+ isCoreExe = (`member` siCoreExecutables (bpSystemInfo bp))
102+
103+withCounter counter = bracket_
104+ (atomically $ modifyTVar counter (+ 1))
105+ (atomically $ modifyTVar counter (subtract 1))
106+
107+withTSem sem = bracket_ (atomically $ waitTSem sem) (atomically $ signalTSem sem)
108+
109+pbDatabase pb = pbInstallDest pb </> "pkgdb"
110+pbBinDir pb = pbInstallDest pb </> "bin"
111+pbLibDir pb = pbInstallDest pb </> "lib"
112+pbDataDir pb = pbInstallDest pb </> "share"
113+pbDocDir pb = pbInstallDest pb </> "doc"
114+
115+performBuild :: PerformBuild -> IO [Text]
116+performBuild pb = do
117+ cwd <- getWorkingDirectory
118+ performBuild' pb
119+ { pbInstallDest = cwd </> pbInstallDest pb
120+ , pbLogDir = cwd </> pbLogDir pb
121+ }
122+
123+performBuild' :: PerformBuild -> IO [Text]
124+performBuild' pb@PerformBuild {..} = withBuildDir $ \builddir -> do
125+ let removeTree' fp = whenM (isDirectory fp) (removeTree fp)
126+ mapM_ removeTree' [pbInstallDest, pbLogDir]
127+
128+ createTree $ parent $ pbDatabase pb
129+ withCheckedProcess (proc "ghc-pkg" ["init", fpToString (pbDatabase pb)])
130+ $ \ClosedStream Inherited Inherited -> return ()
131+ pbLog $ encodeUtf8 "Copying built-in Haddocks\n"
132+ copyBuiltInHaddocks (pbDocDir pb)
133+
134+ sem <- atomically $ newTSem pbJobs
135+ active <- newTVarIO (0 :: Int)
136+ let toolMap = makeToolMap $ bpPackages pbPlan
137+ packageMap <- fmap fold $ forM (mapToList $ bpPackages pbPlan)
138+ $ \(name, plan) -> do
139+ let piPlan = plan
140+ piName = name
141+ piResult <- newEmptyTMVarIO
142+ return $ singletonMap name PackageInfo {..}
143+
144+ errsVar <- newTVarIO mempty
145+ warningsVar <- newTVarIO id
146+ mutex <- newMVar ()
147+ env <- getEnvironment
148+ haddockFiles <- newTVarIO mempty
149+
150+ forM_ packageMap $ \pi -> void $ async $ singleBuild pb SingleBuild
151+ { sbSem = sem
152+ , sbErrsVar = errsVar
153+ , sbWarningsVar = warningsVar
154+ , sbActive = active
155+ , sbToolMap = toolMap
156+ , sbPackageMap = packageMap
157+ , sbBuildDir = builddir
158+ , sbPackageInfo = pi
159+ , sbRegisterMutex = mutex
160+ , sbModifiedEnv = ("HASKELL_PACKAGE_SANDBOX", fpToString $ pbDatabase pb)
161+ : map fixEnv env
162+ , sbHaddockFiles = haddockFiles
163+ }
164+
165+ void $ tryAny $ atomically $ readTVar active >>= checkSTM . (== 0)
166+
167+ warnings <- ($ []) <$> readTVarIO warningsVar
168+ errs <- readTVarIO errsVar
169+ when (not $ null errs) $ throwM $ BuildException errs warnings
170+ return warnings
171+ where
172+ withBuildDir f = withSystemTempDirectory "stackage-build" (f . fpFromString)
173+
174+ fixEnv (p, x)
175+ -- Thank you Windows having case-insensitive environment variables...
176+ | toUpper p == "PATH" = (p, fpToString (pbBinDir pb) ++ pathSep : x)
177+ | otherwise = (p, x)
178+
179+ -- | Separate for the PATH environment variable
180+ pathSep :: Char
181+#ifdef mingw32_HOST_OS
182+ pathSep = ';'
183+#else
184+ pathSep = ':'
185+#endif
186+
187+data SingleBuild = SingleBuild
188+ { sbSem :: TSem
189+ , sbErrsVar :: TVar (Map PackageName BuildFailure)
190+ , sbWarningsVar :: TVar ([Text] -> [Text])
191+ , sbActive :: TVar Int
192+ , sbToolMap :: Map ExeName (Set PackageName)
193+ , sbPackageMap :: Map PackageName PackageInfo
194+ , sbBuildDir :: FilePath
195+ , sbPackageInfo :: PackageInfo
196+ , sbRegisterMutex :: MVar ()
197+ , sbModifiedEnv :: [(String, String)]
198+ , sbHaddockFiles :: TVar (Map Text FilePath) -- ^ package-version, .haddock file
199+ }
200+
201+singleBuild :: PerformBuild -> SingleBuild -> IO ()
202+singleBuild pb@PerformBuild {..} SingleBuild {..} =
203+ withCounter sbActive
204+ $ handle updateErrs
205+ $ (`finally` void (atomically $ tryPutTMVar (piResult sbPackageInfo) False))
206+ $ inner
207+ where
208+ libComps = setFromList [CompLibrary, CompExecutable]
209+ testComps = insertSet CompTestSuite libComps
210+ inner = do
211+ let wfd comps =
212+ waitForDeps sbToolMap sbPackageMap comps pbPlan sbPackageInfo
213+ . withTSem sbSem
214+ wfd libComps buildLibrary
215+
216+ wfd testComps runTests
217+
218+ name = display $ piName sbPackageInfo
219+ namever = concat
220+ [ name
221+ , "-"
222+ , display $ ppVersion $ piPlan sbPackageInfo
223+ ]
224+
225+ runIn wdir outH cmd args =
226+ withCheckedProcess cp $ \ClosedStream UseProvidedHandle UseProvidedHandle ->
227+ (return () :: IO ())
228+ where
229+ cp = (proc (unpack $ asText cmd) (map (unpack . asText) args))
230+ { cwd = Just $ fpToString wdir
231+ , std_out = UseHandle outH
232+ , std_err = UseHandle outH
233+ , env = Just sbModifiedEnv
234+ }
235+ runParent = runIn sbBuildDir
236+ runChild = runIn childDir
237+ childDir = sbBuildDir </> fpFromText namever
238+
239+ log' t = do
240+ i <- readTVarIO sbActive
241+ errs <- readTVarIO sbErrsVar
242+ pbLog $ encodeUtf8 $ concat
243+ [ t
244+ , " (pending: "
245+ , tshow i
246+ , ", failures: "
247+ , tshow $ length errs
248+ , ")\n"
249+ ]
250+ libOut = pbLogDir </> fpFromText namever </> "build.out"
251+ testOut = pbLogDir </> fpFromText namever </> "test.out"
252+ testRunOut = pbLogDir </> fpFromText namever </> "test-run.out"
253+
254+ wf fp inner = do
255+ createTree $ parent fp
256+ withBinaryFile (fpToString fp) WriteMode inner
257+
258+ configArgs =
259+ [ "--package-db=clear"
260+ , "--package-db=global"
261+ , "--package-db=" ++ fpToText (pbDatabase pb)
262+ , "--libdir=" ++ fpToText (pbLibDir pb)
263+ , "--bindir=" ++ fpToText (pbBinDir pb)
264+ , "--datadir=" ++ fpToText (pbDataDir pb)
265+ , "--docdir=" ++ fpToText (pbDocDir pb)
266+ , "--flags=" ++ flags
267+ ]
268+
269+ flags :: Text
270+ flags = unwords $ map go $ mapToList pcFlagOverrides
271+ where
272+ go (name, isOn) = concat
273+ [ if isOn then "" else "-"
274+ , unFlagName name
275+ ]
276+
277+ PackageConstraints {..} = ppConstraints $ piPlan sbPackageInfo
278+
279+ buildLibrary = wf libOut $ \outH -> do
280+ let run = runChild outH
281+ log' $ "Unpacking " ++ namever
282+ runParent outH "cabal" ["unpack", namever]
283+
284+ log' $ "Configuring " ++ namever
285+ run "cabal" $ "configure" : configArgs
286+
287+ log' $ "Building " ++ namever
288+ run "cabal" ["build"]
289+
290+ log' $ "Copying/registering " ++ namever
291+ run "cabal" ["copy"]
292+ withMVar sbRegisterMutex $ const $
293+ run "cabal" ["register"]
294+
295+ -- Even if the tests later fail, we can allow other libraries to build
296+ -- on top of our successful results
297+ --
298+ -- FIXME do we need to wait to do this until after Haddocks build?
299+ -- otherwise, we could have a race condition and try to build a
300+ -- dependency's haddocks before this finishes
301+ atomically $ putTMVar (piResult sbPackageInfo) True
302+
303+ when (pcHaddocks /= Don'tBuild && not (null $ sdModules $ ppDesc $ piPlan sbPackageInfo)) $ do
304+ log' $ "Haddocks " ++ namever
305+ hfs <- readTVarIO sbHaddockFiles
306+ let hfsOpts = flip map (mapToList hfs) $ \(pkgVer, hf) -> concat
307+ [ "--haddock-options=--read-interface="
308+ , "../"
309+ , pkgVer
310+ , "/,"
311+ , fpToText hf
312+ ]
313+ args = "haddock"
314+ : "--hyperlink-source"
315+ : "--html"
316+ : "--hoogle"
317+ : "--html-location=../$pkg-$version/"
318+ : hfsOpts
319+
320+ eres <- tryAny $ run "cabal" args
321+
322+ forM_ eres $ \() -> do
323+ renameOrCopy
324+ (childDir </> "dist" </> "doc" </> "html" </> fpFromText name)
325+ (pbDocDir pb </> fpFromText namever)
326+
327+ enewPath <- tryIO
328+ $ canonicalizePath
329+ $ pbDocDir pb
330+ </> fpFromText namever
331+ </> fpFromText name <.> "haddock"
332+ case enewPath of
333+ Left e -> warn $ tshow e
334+ Right newPath -> atomically
335+ $ modifyTVar sbHaddockFiles
336+ $ insertMap namever newPath
337+
338+ case (eres, pcHaddocks) of
339+ (Left e, ExpectSuccess) -> throwM e
340+ (Right (), ExpectFailure) -> warn $ namever ++ ": unexpected Haddock success"
341+ _ -> return ()
342+
343+ runTests = wf testOut $ \outH -> do
344+ let run = runChild outH
345+
346+ when (pcTests /= Don'tBuild) $ do
347+ log' $ "Test configure " ++ namever
348+ run "cabal" $ "configure" : "--enable-tests" : configArgs
349+
350+ eres <- tryAny $ do
351+ log' $ "Test build " ++ namever
352+ run "cabal" ["build"]
353+
354+ log' $ "Test run " ++ namever
355+ run "cabal" ["test", "--log=" ++ fpToText testRunOut]
356+
357+ case (eres, pcTests) of
358+ (Left e, ExpectSuccess) -> throwM e
359+ (Right (), ExpectFailure) -> warn $ namever ++ ": unexpected test success"
360+ _ -> return ()
361+
362+ warn t = atomically $ modifyTVar sbWarningsVar (. (t:))
363+
364+ updateErrs exc = do
365+ log' $ concat
366+ [ display (piName sbPackageInfo)
367+ , ": "
368+ , tshow exc
369+ ]
370+ atomically $ modifyTVar sbErrsVar $ insertMap (piName sbPackageInfo) exc'
371+ where
372+ exc' =
373+ case fromException exc of
374+ Just bf -> bf
375+ Nothing -> BuildFailureException exc
376+
377+renameOrCopy :: FilePath -> FilePath -> IO ()
378+renameOrCopy src dest = rename src dest `catchIO` \_ -> copyDir src dest
379+
380+copyDir :: FilePath -> FilePath -> IO ()
381+copyDir src dest =
382+ runResourceT $ sourceDirectoryDeep False src $$ mapM_C go
383+ where
384+ src' = src </> ""
385+ go fp = forM_ (F.stripPrefix src' fp) $ \suffix -> do
386+ let dest' = dest </> suffix
387+ liftIO $ createTree $ parent dest'
388+ sourceFile fp $$ (sinkFile dest' :: Sink ByteString (ResourceT IO) ())
389+
390+copyBuiltInHaddocks :: FilePath -> IO ()
391+copyBuiltInHaddocks docdir = do
392+ mghc <- findExecutable "ghc"
393+ case mghc of
394+ Nothing -> error "GHC not found on PATH"
395+ Just ghc -> do
396+ src <- canonicalizePath
397+ (parent (fpFromString ghc) </> "../share/doc/ghc/html/libraries")
398+ copyDir src docdir
Stackage2/Prelude.hsnew file+104
@@ -0,0 +1,104 @@
1+{-# LANGUAGE DeriveDataTypeable #-}
2+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3+{-# LANGUAGE NoImplicitPrelude #-}
4+{-# LANGUAGE OverloadedStrings #-}
5+{-# LANGUAGE TypeFamilies #-}
6+module Stackage2.Prelude
7+ ( module X
8+ , module Stackage2.Prelude
9+ ) where
10+
11+import ClassyPrelude.Conduit as X
12+import Data.Aeson (FromJSON, ToJSON)
13+import Data.Conduit.Process as X
14+import qualified Data.Map as Map
15+import Data.Typeable (TypeRep, typeOf)
16+import Distribution.Package as X (PackageIdentifier (..), PackageName (PackageName))
17+import Distribution.PackageDescription as X (FlagName (..), GenericPackageDescription)
18+import qualified Distribution.Text as DT
19+import Distribution.Version as X (Version (..),
20+ VersionRange)
21+import Distribution.Version as X (withinRange)
22+import qualified Distribution.Version as C
23+import System.Exit (ExitCode (ExitSuccess))
24+
25+unPackageName :: PackageName -> Text
26+unPackageName (PackageName str) = pack str
27+
28+unFlagName :: FlagName -> Text
29+unFlagName (FlagName str) = pack str
30+
31+mkPackageName :: Text -> PackageName
32+mkPackageName = PackageName . unpack
33+
34+mkFlagName :: Text -> FlagName
35+mkFlagName = FlagName . unpack
36+
37+display :: DT.Text a => a -> Text
38+display = fromString . DT.display
39+
40+simpleParse :: (MonadThrow m, DT.Text a, Typeable a) => Text -> m a
41+simpleParse orig = withTypeRep $ \rep ->
42+ case DT.simpleParse str of
43+ Nothing -> throwM (ParseFailedException rep (pack str))
44+ Just v -> return v
45+ where
46+ str = unpack orig
47+
48+ withTypeRep :: Typeable a => (TypeRep -> m a) -> m a
49+ withTypeRep f =
50+ res
51+ where
52+ res = f (typeOf (unwrap res))
53+
54+ unwrap :: m a -> a
55+ unwrap _ = error "unwrap"
56+
57+data ParseFailedException = ParseFailedException TypeRep Text
58+ deriving (Show, Typeable)
59+instance Exception ParseFailedException
60+
61+newtype Maintainer = Maintainer { unMaintainer :: Text }
62+ deriving (Show, Eq, Ord, Hashable, ToJSON, FromJSON, IsString)
63+
64+-- | Name of an executable.
65+newtype ExeName = ExeName { unExeName :: Text }
66+ deriving (Show, Eq, Ord, Hashable, ToJSON, FromJSON, IsString)
67+
68+intersectVersionRanges :: VersionRange -> VersionRange -> VersionRange
69+intersectVersionRanges x y = C.simplifyVersionRange $ C.intersectVersionRanges x y
70+
71+-- | There seems to be a bug in Cabal where serializing and deserializing
72+-- version ranges winds up with different representations. So we have a
73+-- super-simplifier to deal with that.
74+simplifyVersionRange :: VersionRange -> VersionRange
75+simplifyVersionRange vr =
76+ fromMaybe (assert False vr') $ simpleParse $ display vr'
77+ where
78+ vr' = C.simplifyVersionRange vr
79+
80+-- | Topologically sort so that items with dependencies occur after those
81+-- dependencies.
82+topologicalSort :: (Ord key, Show key, MonadThrow m, Typeable key)
83+ => (value -> finalValue)
84+ -> (value -> Set key) -- ^ deps
85+ -> Map key value
86+ -> m (Vector (key, finalValue))
87+topologicalSort toFinal toDeps =
88+ loop id . mapWithKey removeSelfDeps . fmap (toDeps &&& toFinal)
89+ where
90+ removeSelfDeps k (deps, final) = (deleteSet k deps, final)
91+ loop front toProcess | null toProcess = return $ pack $ front []
92+ loop front toProcess
93+ | null noDeps = throwM $ NoEmptyDeps (map fst toProcess')
94+ | otherwise = loop (front . noDeps') (mapFromList hasDeps)
95+ where
96+ toProcess' = fmap (first removeUnavailable) toProcess
97+ allKeys = Map.keysSet toProcess
98+ removeUnavailable = asSet . setFromList . filter (`member` allKeys) . setToList
99+ (noDeps, hasDeps) = partition (null . fst . snd) $ mapToList toProcess'
100+ noDeps' = (map (second snd) noDeps ++)
101+
102+data TopologicalSortException key = NoEmptyDeps (Map key (Set key))
103+ deriving (Show, Typeable)
104+instance (Show key, Typeable key) => Exception (TopologicalSortException key)
Stackage2/ServerBundle.hsnew file+107
@@ -0,0 +1,107 @@
1+-- | Create a bundle to be uploaded to Stackage Server.
2+{-# LANGUAGE NoImplicitPrelude #-}
3+{-# LANGUAGE OverloadedStrings #-}
4+{-# LANGUAGE RecordWildCards #-}
5+module Stackage2.ServerBundle
6+ ( serverBundle
7+ , epochTime
8+ , bpAllPackages
9+ , docsListing
10+ ) where
11+
12+import qualified Codec.Archive.Tar as Tar
13+import qualified Codec.Archive.Tar.Entry as Tar
14+import qualified Codec.Compression.GZip as GZip
15+import qualified Data.Yaml as Y
16+import Foreign.C.Types (CTime (CTime))
17+import Stackage2.BuildConstraints
18+import Stackage2.BuildPlan
19+import Stackage2.Prelude
20+import qualified System.PosixCompat.Time as PC
21+import qualified Text.XML as X
22+import Text.XML.Cursor
23+import Filesystem (isFile)
24+
25+-- | Get current time
26+epochTime :: IO Tar.EpochTime
27+epochTime = (\(CTime t) -> t) <$> PC.epochTime
28+
29+-- | All package/versions in a build plan, including core packages.
30+--
31+-- Note that this may include packages not available on Hackage.
32+bpAllPackages :: BuildPlan -> Map PackageName Version
33+bpAllPackages BuildPlan {..} =
34+ siCorePackages bpSystemInfo ++ map ppVersion bpPackages
35+
36+serverBundle :: Tar.EpochTime
37+ -> Text -- ^ title
38+ -> Text -- ^ slug
39+ -> BuildPlan
40+ -> LByteString
41+serverBundle time title slug bp@BuildPlan {..} = GZip.compress $ Tar.write
42+ [ fe "build-plan.yaml" (fromStrict $ Y.encode bp)
43+ , fe "hackage" hackage
44+ , fe "slug" (fromStrict $ encodeUtf8 slug)
45+ , fe "desc" (fromStrict $ encodeUtf8 title)
46+ ]
47+ where
48+ fe name contents =
49+ case Tar.toTarPath False name of
50+ Left s -> error s
51+ Right name' -> (Tar.fileEntry name' contents)
52+ { Tar.entryTime = time
53+ }
54+ hackage = builderToLazy $ foldMap goPair $ mapToList packageMap
55+
56+ -- need to remove some packages that don't exist on Hackage
57+ packageMap = foldr deleteMap (bpAllPackages bp) $ map PackageName
58+ [ "bin-package-db"
59+ , "ghc"
60+ , "rts"
61+ ]
62+
63+ goPair (name, version) =
64+ toBuilder (display name) ++
65+ toBuilder (asText "-") ++
66+ toBuilder (display version) ++
67+ toBuilder (asText "\n")
68+
69+docsListing :: BuildPlan
70+ -> FilePath -- ^ docs directory
71+ -> IO ByteString
72+docsListing bp docsDir =
73+ fmap (Y.encode . fold) $ mapM go $ mapToList $ bpAllPackages bp
74+ where
75+ go :: (PackageName, Version) -> IO (Map Text Y.Value)
76+ go (package, version) = do -- handleAny (const $ return mempty) $ do
77+ let dirname = fpFromText (concat
78+ [ display package
79+ , "-"
80+ , display version
81+ ])
82+ indexFP = (docsDir </> dirname </> "index.html")
83+ ie <- isFile indexFP
84+ if ie
85+ then do
86+ doc <- flip X.readFile indexFP X.def
87+ { X.psDecodeEntities = X.decodeHtmlEntities
88+ }
89+ let cursor = fromDocument doc
90+ getPair x = take 1 $ do
91+ href <- attribute "href" x
92+ let name = concat $ x $// content
93+ guard $ not $ null name
94+ return (href, name)
95+ pairs = cursor $// attributeIs "class" "module"
96+ &/ laxElement "a" >=> getPair
97+ m <- fmap fold $ forM pairs $ \(href, name) -> do
98+ let suffix = dirname </> fpFromText href
99+ e <- isFile $ docsDir </> suffix
100+ return $ if e
101+ then asMap $ singletonMap name [fpToText dirname, href]
102+ else mempty
103+ return $ singletonMap (display package) $ Y.object
104+ [ "version" Y..= display version
105+ , "modules" Y..= m
106+ ]
107+ else return mempty
Stackage2/UpdateBuildPlan.hsnew file+51
@@ -0,0 +1,51 @@
1+{-# LANGUAGE NoImplicitPrelude #-}
2+{-# LANGUAGE OverloadedStrings #-}
3+{-# LANGUAGE RecordWildCards #-}
4+-- | Take an existing build plan and bump all packages to the newest version in
5+-- the same major version number.
6+module Stackage2.UpdateBuildPlan
7+ ( updateBuildConstraints
8+ , updateBuildPlan
9+ ) where
10+
11+import qualified Data.Map as Map
12+import Distribution.Version (anyVersion, earlierVersion,
13+ orLaterVersion)
14+import Stackage2.BuildConstraints
15+import Stackage2.BuildPlan
16+import Stackage2.Prelude
17+
18+updateBuildPlan :: BuildPlan -> IO BuildPlan
19+updateBuildPlan = newBuildPlan . updateBuildConstraints
20+
21+updateBuildConstraints :: BuildPlan -> BuildConstraints
22+updateBuildConstraints BuildPlan {..} =
23+ BuildConstraints {..}
24+ where
25+ bcSystemInfo = bpSystemInfo
26+ bcPackages = Map.keysSet bpPackages
27+
28+ bcPackageConstraints name = PackageConstraints
29+ { pcVersionRange = addBumpRange (maybe anyVersion pcVersionRange moldPC)
30+ , pcMaintainer = moldPC >>= pcMaintainer
31+ , pcTests = maybe ExpectSuccess pcTests moldPC
32+ , pcHaddocks = maybe ExpectSuccess pcHaddocks moldPC
33+ , pcBuildBenchmarks = maybe True pcBuildBenchmarks moldPC
34+ , pcFlagOverrides = maybe mempty pcFlagOverrides moldPC
35+ }
36+ where
37+ moldBP = lookup name bpPackages
38+ moldPC = ppConstraints <$> moldBP
39+
40+ addBumpRange oldRange =
41+ case moldBP of
42+ Nothing -> oldRange
43+ Just bp -> intersectVersionRanges oldRange
44+ $ bumpRange $ ppVersion bp
45+
46+ bumpRange version = intersectVersionRanges
47+ (orLaterVersion version)
48+ (earlierVersion $ bumpVersion version)
49+ bumpVersion (Version (x:y:_) _) = Version [x, y + 1] []
50+ bumpVersion (Version [x] _) = Version [x, 1] []
51+ bumpVersion (Version [] _) = assert False $ Version [1, 0] []
Stackage2/Upload.hsnew file+260
@@ -0,0 +1,260 @@
1+-- | Upload to Stackage and Hackage
2+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3+{-# LANGUAGE NoImplicitPrelude #-}
4+{-# LANGUAGE OverloadedStrings #-}
5+{-# LANGUAGE RecordWildCards #-}
6+{-# LANGUAGE TupleSections #-}
7+module Stackage2.Upload
8+ ( UploadBundle (..)
9+ , SnapshotIdent (..)
10+ , uploadBundle
11+ , UploadDocs (..)
12+ , uploadDocs
13+ , uploadHackageDistro
14+ , UploadDocMap (..)
15+ , uploadDocMap
16+ ) where
17+
18+import Control.Monad.Writer.Strict (execWriter, tell)
19+import Data.Default.Class (Default (..))
20+import Filesystem (isDirectory, isFile)
21+import Network.HTTP.Client
22+import Network.HTTP.Client.MultipartFormData
23+import Stackage2.BuildPlan (BuildPlan)
24+import Stackage2.Prelude
25+import Stackage2.ServerBundle (bpAllPackages, docsListing)
26+import System.IO.Temp (withSystemTempFile)
27+
28+newtype StackageServer = StackageServer { unStackageServer :: Text }
29+ deriving (Show, Eq, Ord, Hashable, IsString)
30+instance Default StackageServer where
31+ def = "http://www.stackage.org"
32+
33+data UploadBundle = UploadBundle
34+ { ubServer :: StackageServer
35+ , ubContents :: LByteString
36+ , ubAlias :: Maybe Text
37+ , ubNightly :: Maybe Text -- ^ should be GHC version
38+ , ubLTS :: Maybe Text -- ^ e.g. 2.3
39+ , ubAuthToken :: Text
40+ }
41+instance Default UploadBundle where
42+ def = UploadBundle
43+ { ubServer = def
44+ , ubContents = mempty
45+ , ubAlias = Nothing
46+ , ubNightly = Nothing
47+ , ubLTS = Nothing
48+ , ubAuthToken = "no-auth-token-provided"
49+ }
50+
51+newtype SnapshotIdent = SnapshotIdent { unSnapshotIdent :: Text }
52+ deriving (Show, Eq, Ord, Hashable, IsString)
53+
54+uploadBundle :: UploadBundle -> Manager -> IO SnapshotIdent
55+uploadBundle UploadBundle {..} man = do
56+ req1 <- parseUrl $ unpack $ unStackageServer ubServer ++ "/upload"
57+ req2 <- formDataBody formData req1
58+ let req3 = req2
59+ { method = "PUT"
60+ , requestHeaders =
61+ [ ("Authorization", encodeUtf8 ubAuthToken)
62+ , ("Accept", "application/json")
63+ ] ++ requestHeaders req2
64+ , redirectCount = 0
65+ , checkStatus = \_ _ _ -> Nothing
66+ , responseTimeout = Just 300000000
67+ }
68+ res <- httpLbs req3 man
69+ case lookup "x-stackage-ident" $ responseHeaders res of
70+ Just snapid -> return $ SnapshotIdent $ decodeUtf8 snapid
71+ Nothing -> error $ "An error occurred: " ++ show res
72+ where
73+ params = mapMaybe (\(x, y) -> (x, ) <$> y)
74+ [ ("alias", ubAlias)
75+ , ("nightly", ubNightly)
76+ , ("lts", ubLTS)
77+ ]
78+ formData = ($ []) $ execWriter $ do
79+ forM_ params $ \(key, value) ->
80+ tell' $ partBS key $ encodeUtf8 value
81+ tell' $ partFileRequestBody "stackage" "stackage"
82+ $ RequestBodyLBS ubContents
83+
84+ tell' x = tell (x:)
85+
86+data UploadDocs = UploadDocs
87+ { udServer :: StackageServer
88+ , udDocs :: FilePath -- ^ may be a directory or a tarball
89+ , udAuthToken :: Text
90+ , udSnapshot :: SnapshotIdent
91+ }
92+
93+uploadDocs (UploadDocs (StackageServer host) fp0 token ident) man = do
94+ fe <- isFile fp0
95+ if fe
96+ then uploadDocsFile $ fpToString fp0
97+ else do
98+ de <- isDirectory fp0
99+ if de
100+ then uploadDocsDir
101+ else error $ "Path not found: " ++ fpToString fp0
102+ where
103+ uploadDocsDir = withSystemTempFile "haddocks.tar.xz" $ \fp h -> do
104+ hClose h
105+ dirs <- fmap sort
106+ $ runResourceT
107+ $ sourceDirectory fp0
108+ $$ filterMC (liftIO . isDirectory)
109+ =$ mapC (fpToString . filename)
110+ =$ sinkList
111+ writeFile (fp0 </> "index.html") $ mkIndex
112+ (unpack $ unSnapshotIdent ident)
113+ dirs
114+ writeFile (fp0 </> "style.css") styleCss
115+ -- FIXME write index.html, style.css
116+ let cp = (proc "tar" $ "cJf" : fp : "index.html" : "style.css" : dirs)
117+ { cwd = Just $ fpToString fp0
118+ }
119+ withCheckedProcess cp $ \Inherited Inherited Inherited -> return ()
120+ uploadDocsFile fp
121+ uploadDocsFile fp = do
122+ req1 <- parseUrl $ unpack $ concat
123+ [ host
124+ , "/upload-haddock/"
125+ , unSnapshotIdent ident
126+ ]
127+ let formData =
128+ [ partFileSource "tarball" fp
129+ ]
130+ req2 <- formDataBody formData req1
131+ let req3 = req2
132+ { method = "PUT"
133+ , requestHeaders =
134+ [ ("Authorization", encodeUtf8 token)
135+ , ("Accept", "application/json")
136+ ] ++ requestHeaders req2
137+ , redirectCount = 0
138+ , checkStatus = \_ _ _ -> Nothing
139+ , responseTimeout = Just 300000000
140+ }
141+ httpLbs req3 man
142+
143+uploadHackageDistro :: BuildPlan
144+ -> ByteString -- ^ Hackage username
145+ -> ByteString -- ^ Hackage password
146+ -> Manager
147+ -> IO (Response LByteString)
148+uploadHackageDistro bp username password =
149+ httpLbs (applyBasicAuth username password req)
150+ where
151+ csv = encodeUtf8
152+ $ builderToLazy
153+ $ mconcat
154+ $ intersperse "\n"
155+ $ map go
156+ $ mapToList
157+ $ bpAllPackages bp
158+ go (name, version) =
159+ "\"" ++
160+ (toBuilder $ display name) ++
161+ "\",\"" ++
162+ (toBuilder $ display version) ++
163+ "\",\"http://www.stackage.org/package/" ++
164+ (toBuilder $ display name) ++
165+ "\""
166+
167+ req = "http://hackage.haskell.org/distro/Stackage/packages.csv"
168+ { requestHeaders = [("Content-Type", "text/csv")]
169+ , requestBody = RequestBodyLBS csv
170+ , checkStatus = \_ _ _ -> Nothing
171+ , method = "PUT"
172+ }
173+
174+data UploadDocMap = UploadDocMap
175+ { udmServer :: StackageServer
176+ , udmAuthToken :: Text
177+ , udmSnapshot :: SnapshotIdent
178+ , udmDocDir :: FilePath
179+ , udmPlan :: BuildPlan
180+ }
181+
182+uploadDocMap UploadDocMap {..} man = do
183+ docmap <- docsListing udmPlan udmDocDir
184+ req1 <- parseUrl $ unpack $ unStackageServer udmServer ++ "/upload-doc-map"
185+ req2 <- formDataBody (formData docmap) req1
186+ let req3 = req2
187+ { method = "PUT"
188+ , requestHeaders =
189+ [ ("Authorization", encodeUtf8 udmAuthToken)
190+ , ("Accept", "application/json")
191+ ] ++ requestHeaders req2
192+ , redirectCount = 0
193+ , checkStatus = \_ _ _ -> Nothing
194+ , responseTimeout = Just 300000000
195+ }
196+ httpLbs req3 man
197+ where
198+ formData docmap =
199+ [ partBS "snapshot" (encodeUtf8 $ unSnapshotIdent udmSnapshot)
200+ , partFileRequestBody "docmap" "docmap" $ RequestBodyBS docmap
201+ ]
202+
203+mkIndex :: String -> [String] -> String
204+mkIndex snapid dirs = concat
205+ [ "<!DOCTYPE html>\n<html lang='en'><head><title>Haddocks index</title>"
206+ , "<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css'>"
207+ , "<link rel='stylesheet' href='style.css'>"
208+ , "<link rel='shortcut icon' href='http://www.stackage.org/static/img/favicon.ico' />"
209+ , "</head>"
210+ , "<body><div class='container'>"
211+ , "<div class='row'><div class='span12 col-md-12'>"
212+ , "<h1>Haddock documentation index</h1>"
213+ , "<p class='return'><a href=\"http://www.stackage.org/stackage/"
214+ , snapid
215+ , "\">Return to snapshot</a></p><ul>"
216+ , concatMap toLI dirs
217+ , "</ul></div></div></div></body></html>"
218+ ]
219+ where
220+ toLI name = concat
221+ [ "<li><a href='"
222+ , name
223+ , "/index.html'>"
224+ , name
225+ , "</a></li>"
226+ ]
227+
228+styleCss :: String
229+styleCss = concat
230+ [ "@media (min-width: 530px) {"
231+ , "ul { -webkit-column-count: 2; -moz-column-count: 2; column-count: 2 }"
232+ , "}"
233+ , "@media (min-width: 760px) {"
234+ , "ul { -webkit-column-count: 3; -moz-column-count: 3; column-count: 3 }"
235+ , "}"
236+ , "ul {"
237+ , " margin-left: 0;"
238+ , " padding-left: 0;"
239+ , " list-style-type: none;"
240+ , "}"
241+ , "body {"
242+ , " background: #f0f0f0;"
243+ , " font-family: 'Lato', sans-serif;"
244+ , " text-shadow: 1px 1px 1px #ffffff;"
245+ , " font-size: 20px;"
246+ , " line-height: 30px;"
247+ , " padding-bottom: 5em;"
248+ , "}"
249+ , "h1 {"
250+ , " font-weight: normal;"
251+ , " color: #06537d;"
252+ , " font-size: 45px;"
253+ , "}"
254+ , ".return a {"
255+ , " color: #06537d;"
256+ , " font-style: italic;"
257+ , "}"
258+ , ".return {"
259+ , " margin-bottom: 1em;"
260+ , "}"]
allowed.txtnew file+5557
@@ -0,0 +1,5557 @@
1+4Blocks AndrewCalleja
2+AC-Angle AndrewCoppin
3+AC-Boolean AndrewCoppin
4+AC-BuildPlatform AndrewCoppin
5+AC-Colour AndrewCoppin
6+AC-EasyRaster-GTK AndrewCoppin
7+AC-HalfInteger AndrewCoppin
8+AC-MiniTest AndrewCoppin
9+AC-PPM AndrewCoppin
10+AC-Random AndrewCoppin
11+AC-Terminal AndrewCoppin
12+AC-VanillaArray AndrewCoppin
13+AC-Vector AndrewCoppin
14+AC-Vector-Fancy AndrewCoppin
15+ADPfusion ChristianHoener
16+AERN-Basics MichalKonecny
17+AERN-Net MichalKonecny
18+AERN-Real MichalKonecny
19+AERN-Real-Double MichalKonecny
20+AERN-Real-Interval MichalKonecny
21+AERN-RnToRm MichalKonecny
22+AERN-RnToRm-Plot MichalKonecny
23+AES SveinOveAas
24+AGI JeremyShaw
25+ALUT RossPaterson SvenPanne
26+AMI IlyaPortnov
27+ASN1 DominicSteinitz
28+AVar AlexMason
29+AWin32Console HaraldWolfsgruber
30+AbortT-monadstf GregoryCrosswhite
31+AbortT-mtl GregoryCrosswhite
32+AbortT-transformers GregoryCrosswhite
33+Adaptive DustinDeWeese MagnusCarlsson PeterJonsson
34+Adaptive-Blaisorblade PaoloGiarrusso
35+Advgame TimWawrzynczak
36+AesonBson NiklasHambuechen
37+Agata JonasDuregard
38+Agda AndreasAbel NilsAndersDanielsson UlfNorell AndresSicardRamirez
39+Agda-executable NilsAndersDanielsson UlfNorell
40+AhoCorasick SergeyLymar
41+Allure MikolajKonarski
42+AndroidViewHierarchyImporter alpheccar
43+Animas EdwardAmsden
44+Annotations MartijnVanSteenbergen
45+Ansi2Html JensStimpfle
46+ApplePush ChrisMoos
47+AppleScript ReinerPope WouterSwierstra
48+ArrayRef GwernBranwen
49+AspectAG MarcosViera
50+AttoBencode FlorianHartwig
51+AttoJson HiromiIshii
52+Attrac RubenZilibowitz
53+Aurochs XinyuJiang
54+AutoForms MadsLindstroem
55+AvlTree AdrianHey
56+BASIC LennartAugustsson
57+BNFC AndreasAbel GregoireDetrez MarkusForsberg ThomasHallgren
58+BNFC-meta JeanPhilippeBernardy JonasDuregard
59+Barracuda GwernBranwen
60+Befunge93 BrandonSimmons
61+BerkeleyDB JohnMcCall StephenBlackheath
62+BerkeleyDBXML StephenBlackheath
63+Binpack BjoernBrandenburg
64+Biobase ChristianHoener
65+BiobaseDotP ChristianHoener
66+BiobaseFR3D ChristianHoener
67+BiobaseFasta ChristianHoener
68+BiobaseInfernal ChristianHoener
69+BiobaseMAF ChristianHoener
70+BiobaseTrainingData ChristianHoener
71+BiobaseTurner ChristianHoener
72+BiobaseTypes ChristianHoener
73+BiobaseVienna ChristianHoener
74+BiobaseXNA ChristianHoener
75+BirdPP SeanMcLaughlin
76+BitSyntax AdamLangley
77+Bitly SergeyAstanin
78+Blobs AlanZimmerman
79+BlogLiterately BrentYorgey RobertGreayer
80+BlogLiterately-diagrams BrentYorgey
81+BluePrintCSS SergeyMironov
82+Blueprint GregoryCrosswhite
83+Bookshelf EmilAxelsson
84+Boolean ConalElliott
85+BoundedChan AdamWick
86+Bravo MatthiasReisner
87+Buster MichaelXavier
88+CC-delcont DanDoel
89+CC-delcont-alt KidoTakahiro
90+CC-delcont-cxe KidoTakahiro
91+CC-delcont-exc KidoTakahiro
92+CC-delcont-ref KidoTakahiro
93+CC-delcont-ref-tf KidoTakahiro
94+CCA PaulLiu
95+CHXHtml PaulTalaga
96+CLASE TristanAllwood
97+CMCompare ChristianHoener
98+CMQ JoergFritsch
99+COrdering AdrianHey
100+CPBrainfuck ThomasDavie
101+CPL MasahiroSakai
102+CSPM-CoreLanguage MarcFontaine
103+CSPM-FiringRules MarcFontaine
104+CSPM-Frontend MarcFontaine
105+CSPM-Interpreter MarcFontaine
106+CSPM-ToProlog MarcFontaine
107+CSPM-cspm MarcFontaine
108+CV VilleTirronen
109+Cabal DuncanCoutts IanLynagh JohanTibell RossPaterson
110+CabalSearch JohanBrinch
111+Cardinality AndreySisoyev
112+CarneadesDSL BasVanGijzel
113+Catana DustinDeWeese
114+Chart TimDocker
115+Chart-gtk TimDocker
116+ChasingBottoms DonaldStewart NilsAndersDanielsson
117+CheatSheet JustinBailey
118+Checked RobertOnslow
119+Chitra KashyapChatamballi
120+ChristmasTree DoaitseSwierstra MarcosViera
121+ClassLaws PatrikJansson
122+ClassyPrelude SveinOveAas
123+Clipboard DanielDiaz
124+Coadjute MattiNiemenmaa
125+Codec-Compression-LZF DonaldStewart
126+Codec-Image-DevIL LukePalmer
127+Combinatorrent JesperLouisAndersen
128+Command TonyMorris
129+ConfigFile JohnGoerzen
130+ConfigFileTH VilleTirronen
131+Configger NateSoares
132+Configurable JosephAbrahamson
133+ConsStream ConalElliott
134+ConstraintKinds MikeIzbicki
135+Consumer JeremyShaw
136+ContArrow EvgenyJukov
137+Contract OlafChitil
138+Control-Engine ThomasDuBuisson
139+CoreErlang AlexKropivny HenriqueFerreiro
140+CoreFoundation ReinerPope
141+Coroutine RyanIngram
142+CouchDB ArjunGuha
143+Craft3e SimonThompson
144+Crypto CreightonHogg DominicSteinitz IsaacJones LennartAugustsson
145+CurryDB HideyukiTanaka
146+DAG-Tournament JoachimBreitner
147+DAV ClintAdams
148+DBlimited JohnMayer
149+DBus DavidHimmelstrup GwernBranwen AlexanderKojevnikov
150+DOM DmitryGolubovsky
151+DP SashaRush
152+DPM StefanWehr
153+DRBG ThomasDuBuisson
154+DSH GeorgeGiorgidze JeroenWeijers
155+DSTM FrankKupke
156+DTC DanielDiaz
157+Dangerous NateSoares
158+Dao RaminHonary
159+DarcsHelpers ThomasHartman
160+Data-Hash-Consistent BradClawsie
161+Data-Rope PierreEtienneMeunier
162+DataTreeView DanielSchuessler
163+DebugTraceHelpers ThomasHartman
164+Decimal PaulJohnson
165+DecisionTree AdrianNeumann
166+DeepArrow ConalElliott
167+DefendTheKing YairChuchem
168+DescriptiveKeys TonyMorris
169+Dflow PaulJohnson
170+Diff SterlingClover
171+DifferentialEvolution VilleTirronen
172+Digit TonyMorris
173+DimensionalHash GhassenHamrouni
174+DisTract GwernBranwen
175+DistanceTransform AnthonyCowley
176+DocTest SimonHengel
177+Docs DanielDiaz
178+DrHylo HugoPacheco
179+DrIFT-cabalized GwernBranwen KiwamuOkabe
180+DysFRP MarekMaterzok
181+DysFRP-Cairo MarekMaterzok
182+DysFRP-Craftwerk MarekMaterzok
183+EEConfig BartoszWojcik
184+Ebnf2ps PeterThiemann
185+EdisonAPI RobertDockins
186+EdisonCore RobertDockins
187+EditTimeReport BartSpaans
188+EitherT EyalLotem
189+Elm EvanCzaplicki
190+Emping HansVanThiel
191+Encode OtakarSmrz
192+EnumContainers EyalLotem
193+EnumMap JohnVanEnk
194+Eq VincentBerthoux
195+EsounD MasatakeDaimon
196+Etage MitarMilutinovic
197+Etage-Graph MitarMilutinovic
198+Eternal10Seconds HirotoKoyama
199+Etherbunny NicholasBurlett
200+EuroIT PaoloVeronelli
201+EventSocket DavidAustin
202+Extra DavidFox JeremyShaw
203+FM-SBLEX MarkusForsberg
204+FPretty OlafChitil
205+FTGL JeffersonHeard
206+FTPLine DanielDiaz
207+Facts AlexanderSolla
208+FailureT MatthewFarkasDyck
209+FenwickTree MichalGajda
210+FermatsLastMargin GwernBranwen
211+FerryCore JeroenWeijers
212+FieldTrip ConalElliott
213+FileManip BryanOSullivan
214+FileManipCompat ThomasHartman
215+FilePather TonyMorris
216+FileSystem DanielDiaz
217+Finance-Quote-Yahoo BradClawsie
218+Finance-Treasury DonaldStewart StephenLihn
219+FindBin AudreyTang
220+FiniteMap PepeIborra
221+FixedPoint-simple ThomasDuBuisson
222+Flippi AudreyTang GwernBranwen
223+Focus NateSoares
224+ForSyDe AlfonsoAcosta HoseinAttarzadeh
225+FpMLv53 MalcolmWallace
226+Frank ConorMcBride
227+FreeTypeGL EyalLotem
228+FunGEn MiloslavRaus SimonMichael
229+Fungi ThomasEding
230+GA KennethHoste
231+GHood HugoPacheco
232+GLFW PaulLiu
233+GLFW-OGL NealAlexander
234+GLFW-b BrianLewis
235+GLFW-b-demo BrianLewis
236+GLFW-task PaulLiu
237+GLHUI HugoGomes
238+GLURaw JasonDagit SvenPanne
239+GLUT ChrisDornan IanLynagh JasonDagit RossPaterson SvenPanne
240+GLUtil AnthonyCowley
241+GPX ThomasDuBuisson TonyMorris
242+GPipe TobiasBexelius
243+GPipe-Collada TobiasBexelius
244+GPipe-Examples KreeColeMcLaughlin
245+GPipe-TextureLoad TobiasBexelius
246+GTALib KentoEmoto
247+Ganymede WaltBaety
248+GaussQuadIntegration GrigorySarnitsky
249+GeBoP HenkJanVanTuyl
250+GenI EricKow
251+GenSmsPdu KwanghoonChoi
252+GenericPretty RazvanRanca
253+GeoIp StephenCook
254+Geodetic TonyMorris
255+GeomPredicates NealAlexander
256+GeomPredicates-SSE NealAlexander
257+Glob MattiNiemenmaa
258+GlomeTrace JimSnow
259+GlomeVec JimSnow
260+GoogleChart EvanMartin
261+GoogleDirections KevinOberlies
262+GoogleSB AlexOtt
263+GoogleSuggest AndyStewart
264+GoogleTranslate AndyStewart
265+GotoT-transformers GregoryCrosswhite
266+GraphSCC IavorDiatchki
267+Graphalyze IvanMiljenovic
268+Grempa OlleFredriksson
269+GroteTrap MartijnVanSteenbergen
270+GrowlNotify NicholasBurlett
271+Gtk2hsGenerics MichaelDever
272+GtkGLTV ConalElliott
273+GtkTV ConalElliott
274+GuiHaskell NeilMitchell
275+GuiTV ConalElliott
276+HARM AlexMason
277+HAppS-Data DavidHimmelstrup
278+HAppS-IxSet DavidHimmelstrup
279+HAppS-Server DavidHimmelstrup
280+HAppS-State DavidHimmelstrup
281+HAppS-Util DavidHimmelstrup
282+HAppSHelpers ThomasHartman
283+HCL JustinBailey
284+HCard JoeFredette
285+HCodecs GeorgeGiorgidze
286+HDBC IsaacJones JohnGoerzen NicolasWu
287+HDBC-mysql BryanOSullivan ChrisWaterson
288+HDBC-odbc IsaacJones JohnGoerzen NicolasWu
289+HDBC-postgresql IsaacJones JohnGoerzen NicolasWu
290+HDBC-postgresql-hstore AlexanderBondarenko
291+HDBC-sqlite3 IsaacJones JohnGoerzen
292+HDRUtils JeffersonHeard
293+HERA LukePalmer
294+HFuse GwernBranwen MaximTreskin PaulVanDerWalt TaruKarttunen
295+HGL ChristophLueth RossPaterson
296+HGamer3D PeterAlthainz
297+HGamer3D-API PeterAlthainz
298+HGamer3D-Bullet-Binding PeterAlthainz
299+HGamer3D-CAudio-Binding PeterAlthainz
300+HGamer3D-CEGUI-Binding PeterAlthainz
301+HGamer3D-Data PeterAlthainz
302+HGamer3D-Enet-Binding PeterAlthainz
303+HGamer3D-OIS-Binding PeterAlthainz
304+HGamer3D-Ogre-Binding PeterAlthainz
305+HGamer3D-SFML-Binding PeterAlthainz
306+HHDL SergueyZefirov
307+HJScript NiklasBroberg JeremyShaw
308+HJVM JeanPhilippeMoresmau
309+HJavaScript NiklasBroberg
310+HLearn-algebra MikeIzbicki
311+HLearn-classification MikeIzbicki
312+HLearn-distributions MikeIzbicki
313+HList AdamVogt GwernBranwen
314+HLogger JonKristensen
315+HMM MikeIzbicki
316+HNM CetinSert
317+HODE DavidHimmelstrup
318+HOpenCV NoamLewis
319+HPDF alpheccar
320+HPath JasonDusek
321+HPlot YakovZaytsev
322+HPong RemcoNiemeijer
323+HROOT IanWooKim
324+HRay GwernBranwen KennethHoste
325+HSFFIG DmitryGolubovsky
326+HSGEP MatthewSottile
327+HSH JohnGoerzen
328+HSHHelpers ThomasHartman
329+HSoundFile JohnLato
330+HStringTemplate SterlingClover
331+HStringTemplateHelpers ThomasHartman
332+HSvm PaoloLosi
333+HTF DavidLeuschner GwernBranwen StefanWehr
334+HTTP BjornBringert BryanOSullivan DonaldStewart DuncanCoutts GaneshSittampalam SigbjornFinne
335+HTTP-Simple BradClawsie
336+HTab GuillaumeHoffmann
337+HTicTacToe KorcanHussein
338+HUnit DonaldStewart DuncanCoutts RichardGiraud RossPaterson
339+HUnit-Diff DagOdenhall
340+HXMPP JonKristensen
341+HXQ LeonidasFegaras
342+HaLeX GwernBranwen
343+HaRe ChrisBrown AlanZimmerman
344+HaTeX DanielDiaz
345+HaTeX-meta DanielDiaz
346+HaVSA RoganCreswick
347+HaXml MalcolmWallace RossPaterson
348+Hach DmitryMalikov
349+HackMail JoeFredette
350+HandlerSocketClient XingboWu
351+HandsomeSoup AdityaBhargava
352+HarmTrace JosePedroMagalhaes
353+HarmTrace-Base BasDeHaas JosePedroMagalhaes
354+HasGP SeanHolden
355+Haschoo MattiNiemenmaa
356+Hashell GwernBranwen
357+HaskellForMaths DavidAmos
358+HaskellLM KietLam
359+HaskellNN KietLam
360+HaskellNet JonathanDaugherty RobertWills ShaeErisson
361+HaskellTorrent JesperLouisAndersen
362+Haskelloids MatthewHayden
363+Hawk BjoernPeemoeller
364+Hayoo UweSchmidt
365+Hedi PaoloVeronelli
366+Hermes SveinOveAas
367+Hieroglyph JeffersonHeard
368+HiggsSet LarsPetersen
369+Hipmunk FelipeLessa SoenkeHahn
370+HipmunkPlayground FelipeLessa
371+Histogram MikeIzbicki
372+Hmpf TomBevan
373+HoleyMonoid MartijnVanSteenbergen
374+Holumbus-Distribution StefanSchmidt
375+Holumbus-MapReduce StefanSchmidt
376+Holumbus-Searchengine UweSchmidt
377+Holumbus-Storage StefanSchmidt
378+Homology DamekDavis
379+HongoDB HideyukiTanaka
380+Hricket AnthonyGrimes
381+Hs2lib TamarChristina
382+HsASA DonaldStewart MalcolmWallace
383+HsHaruPDF AudreyTang
384+HsHyperEstraier MasatakeDaimon
385+HsJudy GwernBranwen
386+HsOpenSSL MasatakeDaimon
387+HsParrot AudreyTang
388+HsPerl5 AudreyTang
389+HsSVN MasatakeDaimon
390+HsSyck AudreyTang GwernBranwen
391+HsTools ChristianHoener
392+Hsed VitaliyRukavishnikov
393+HueAPI SjoerdVisscher
394+IDynamic AlbertoCorona
395+IFS alpheccar
396+INblobs MiguelVilaca
397+IOR IvanTomac
398+IORefCAS RyanNewton
399+IOSpec WouterSwierstra
400+IPv6Addr MichelBoucey
401+IcoGrid JimSnow
402+IfElse JeffersonHeard
403+Imlib AndreasRaster CaleGibbard
404+ImperativeHaskell MatthewMirman
405+IndentParser PiyushKurur
406+InfixApplicative ThomasDavie
407+Interpolation VilleTirronen
408+IntervalMap ChristophBreitkopf
409+IrrHaskell EwenCochran MaciejBaranski
410+JSON-Combinator TonyMorris
411+JSON-Combinator-Examples TonyMorris
412+JSONb JasonDusek
413+JYU-Utils VilleTirronen
414+JackMiniMix RenickBell
415+Javasf TonyMorris
416+Javav TonyMorris
417+JsContracts ArjunGuha
418+JsonGrammar MartijnVanSteenbergen
419+JuicyPixels VincentBerthoux
420+JuicyPixels-repa ThomasDuBuisson
421+KMP CindyLinz
422+KdTree IssacTrotts
423+KiCS BerndBrassel BjoernPeemoeller
424+KiCS-debugger BerndBrassel
425+KiCS-prophecy BerndBrassel
426+Kleislify DylanJust
427+KyotoCabinet WarrenHarris
428+L-seed JoachimBreitner
429+LDAP EdwardYang JohnGoerzen
430+LRU AdamLangley
431+LTree RahulGopinath
432+LambdaCalculator ThomasDuBuisson
433+LambdaHack AndresLoeh MikolajKonarski
434+LambdaINet PaulLiu
435+LambdaPrettyQuote JonathanFischoff
436+LambdaShell RobertDockins
437+Lastik TonyMorris
438+Lattices BartCoppens
439+LazyVault KevinVanRooijen
440+Level0 MikeLedger
441+LibClang ChetanTaralekar
442+LibZip SergeyAstanin
443+Limit NateSoares
444+LinearSplit VitaliyRukavishnikov
445+LinkChecker JensStimpfle
446+List YairChuchem
447+ListLike JohnGoerzen JohnLato
448+ListTree YairChuchem
449+ListZipper RyanIngram
450+LslPlus RobertGreayer
451+Lucu MasatakeDaimon
452+MC-Fold-DP ChristianHoener
453+MFlow AlbertoCorona
454+MagicHaskeller SusumuKatayama
455+MaybeT CaleGibbard DonaldStewart EricKidd
456+MaybeT-monads-tf BenMillwood
457+MaybeT-transformers ErikHesselink SebastiaanVisser
458+MazesOfMonad JeanPhilippeMoresmau
459+MeanShift VilleTirronen
460+Measure TonyMorris
461+MemoTrie ConalElliott
462+MetaHDBC MadsLindstroem
463+MetaObject AudreyTang
464+Metrics BenHamner
465+Mhailist LarsKotthoff
466+MissingH JohnGoerzen
467+MissingM DylanJust
468+MissingPy JohnGoerzen MattBrown SimonHengel
469+Modulo NikolayMurzin
470+Moe XinyuJiang
471+MonadCatchIO-mtl DanielGorin
472+MonadCatchIO-mtl-foreign AntoineLatter
473+MonadCatchIO-transformers AriePeterson
474+MonadCatchIO-transformers-foreign AntoineLatter
475+MonadLab AdamProcter
476+MonadPrompt CaleGibbard JamesCook RyanIngram
477+MonadRandom BrentYorgey CaleGibbard ChrisDone EricKidd LukePalmer PaoloVeronelli PatrickPalka
478+MonadRandomLazy NormanRamsey
479+Monadius GwernBranwen HideyukiTanaka
480+Monaris FumiakiKinoshita
481+Monatron TomSchrijvers
482+Monatron-IO TobiasBrandt
483+Monocle OsmanBineev
484+MorseCode AndyStewart
485+Munkres BalazsKomuves
486+MusicBrainz ClintAdams
487+MusicBrainz-libdiscid AndreTwupack
488+NGrams JustinBailey
489+NXT MitarMilutinovic
490+NanoProlog DoaitseSwierstra JurrienStutterheim
491+NaturalSort JoachimFasting
492+NestedSampling IssacTrotts
493+NetSNMP JohnDorsey PavloKerestey
494+Network-NineP SergeyAlirzaev
495+NewBinary JeremyShaw
496+NineP DaveLeimbach
497+NoSlow RomanLeshchinskiy
498+Noise HugoGomes
499+Nomyx CorentinDupont
500+Nomyx-Rules CorentinDupont
501+NonEmpty RobinGreen
502+NonEmptyList TonyMorris
503+NumInstances ConalElliott
504+NumLazyByteString ThomasDuBuisson
505+NumberSieves LeonSmith
506+Numbers AdrianNeumann
507+Nussinov78 ChristianHoener
508+OGL NealAlexander
509+OSM ThomasDuBuisson TonyMorris
510+OTP ArtemLeshchev
511+ObjectIO RossPaterson
512+ObjectName SvenPanne
513+Obsidian JoelSvensson
514+Octree MichalGajda
515+OddWord RobinKay
516+Omega ChristopherRodrigues
517+OneTuple JohnDorsey
518+OpenAFP AudreyTang
519+OpenAFP-Utils AudreyTang
520+OpenAL AndrewMiller BenFoppa RossPaterson SvenPanne
521+OpenCL LuisCabellos
522+OpenCLRaw JeffersonHeard
523+OpenCLWrappers EmilKarlson
524+OpenGL JasonDagit RossPaterson SvenPanne
525+OpenGLCheck ThomasDavie
526+OpenGLRaw JasonDagit SvenPanne
527+OpenGLRaw21 JakeMcArthur
528+OpenVG StephenTetley
529+OpenVGRaw StephenTetley
530+Operads MikaelVejdemoJohansson
531+OptDir MasahiroSakai
532+Ordinals KiYungAhn
533+PArrows GwernBranwen
534+PBKDF2 ErikHesselink JeremyShaw ThomasHartman
535+PCLT AndreySisoyev
536+PCLT-DB AndreySisoyev
537+PDBtools GrantRotskoff
538+PSQueue ScottDillard
539+PTQ MasahiroSakai
540+PageIO AudreyTang
541+PandocAgda PeterDivianszky
542+Paraiso TakayukiMuranushi
543+ParsecTools ChristianHoener
544+ParserFunction EnzoHaussecker
545+PastePipe RoganCreswick
546+Pathfinder GeorgeGiorgidze JeroenWeijers
547+Peano AndrasSlemmer FrancescoMazzoli
548+PerfectHash MarkWotton
549+PermuteEffects MartijnVanSteenbergen
550+Pipe MattiNiemenmaa
551+PlayHangmanGame HaishengWu
552+Plot-ho-matic GregHorn
553+PlslTools LarryLayland
554+Plural AndyStewart
555+Pollutocracy IsaacDupree
556+PortFusion CetinSert
557+PortMidi PaulLiu
558+PostgreSQL IanLynagh
559+PrimitiveArray ChristianHoener
560+Printf-TH MarcWeber
561+PriorityChansConverger AndreySisoyev
562+ProbabilityMonads EricKidd
563+PropLogic DavidFox
564+ProxN AndrasSlemmer
565+Pugs AudreyTang JeffShaw
566+Pup-Events DanielWilson
567+Pup-Events-Client DanielWilson
568+Pup-Events-Demo DanielWilson
569+Pup-Events-PQueue DanielWilson
570+Pup-Events-Server DanielWilson
571+QIO AlexanderGreen
572+QuadEdge NealAlexander
573+QuasiText MikeLedger
574+QuickAnnotate ShayanNajd
575+QuickCheck DonaldStewart KoenClaessen NickSmallbone RossPaterson SimonMarlow
576+RANSAC AnthonyCowley
577+RBTree XingboWu
578+RESTng SergioUrinovsky
579+RJson AlexDrummond
580+RMP NoamLewis
581+RNAFold ChristianHoener
582+RNAFoldProgs ChristianHoener
583+RNAwolf ChristianHoener
584+RSA AdamWick
585+Raincat MikhailPobolovets
586+Random123 BogdanOpanchuk
587+RandomDotOrg AustinSeipp
588+Range ThomasEding
589+Ranged-sets PaulJohnson
590+Ranka OlegIvanov
591+Rasenschach MartinWoehrle
592+ReadArgs NoahEasterly
593+Ref CarterSchonwald
594+RefSerialize AlbertoCorona
595+RepLib BrentYorgey ChrisCasinghino
596+ReplicateEffects MartijnVanSteenbergen
597+ReviewBoard AdamSmyczek
598+RollingDirectory FalcoHirschenberger
599+RxHaskell JustinSpahrSummers
600+SBench DanielSeidel
601+SDL DavidHimmelstrup
602+SDL-gfx DavidHimmelstrup
603+SDL-image DavidHimmelstrup
604+SDL-mixer DavidHimmelstrup
605+SDL-mpeg AudreyTang
606+SDL-ttf DavidHimmelstrup
607+SFont LiamOConnorDavis
608+SG NeilBrown
609+SGdemo NeilBrown
610+SHA AdamWick RaphaelJavaux
611+SHA2 SveinOveAas
612+SMTPClient StephenBlackheath
613+SNet MerijnVerstraaten
614+SQLDeps AlexanderThiemann
615+STMonadTrans JosefSvenningsson
616+SVG2Q JanGreve
617+SVGFonts BrentYorgey TillmannVogt
618+SVGPath TillmannVogt
619+SableCC2Hs MarcFontaine
620+Safe RossPaterson
621+SafeSemaphore ChrisKuklewicz
622+Salsa AndrewAppleyard
623+ScratchFs FalcoHirschenberger
624+Scurry JohnVanEnk
625+SegmentTree AlexandruScvortov DmitryAstapov
626+Semantique DavidHimmelstrup
627+Semigroup TonyMorris
628+SessionLogger GeroKriependorf
629+Shellac RobertDockins
630+Shellac-compatline RobertDockins
631+Shellac-editline RobertDockins
632+Shellac-haskeline JudahJacobson
633+Shellac-readline RobertDockins
634+Shu-thing GwernBranwen
635+SimpleAES DavidHimmelstrup
636+SimpleEA ErlendHamberg
637+SizeCompare BramSchuur
638+Snusmumrik SergeyAstanin
639+SoOSiM ChristiaanBaaij
640+SoccerFun JanRochel
641+SoccerFunGL JanRochel
642+SourceGraph IvanMiljenovic
643+SpaceInvaders GeorgeGiorgidze KidoTakahiro
644+SpreadsheetML JasonDagit
645+Sprig LiamOConnorDavis
646+StateVar SvenPanne
647+StatisticalMethods ChristianHoener
648+Stomp VitaliyRukavishnikov
649+Strafunski-ATermLib JamesKoppel
650+Strafunski-Sdf2Haskell JamesKoppel
651+Strafunski-StrategyLib JamesKoppel
652+StrategyLib SamuelBronson
653+Stream WouterSwierstra
654+StrictBench RemcoNiemeijer
655+SybWidget MadsLindstroem
656+SyntaxMacros MarcosViera
657+Sysmon VitaliyRukavishnikov
658+TBC PeterGammie
659+TCache AlbertoCorona
660+TTTAS MarcosViera
661+TV ConalElliott
662+TYB MichaelAdams ThomasDuBuisson
663+TableAlgebra JeroenWeijers
664+Tablify DanielLyons
665+Takusen AlistairBayley DonaldStewart JasonDagit
666+TeaHS LiamOConnorDavis
667+Tensor SvenPanne
668+TernaryTrees AlexMason
669+Theora PierreEtienneMeunier
670+Thingie JeffersonHeard
671+ThreadObjects TimothyHobbs
672+Thrift DonaldStewart KirkPeterson OzgunAtaman
673+TicTacToe TonyMorris
674+TigerHash NikolayOrlyuk
675+TimePiece AudreyTang
676+TinyLaunchbury DavidSankel
677+TinyURL ReidBarton
678+Top JurriaanHage
679+Tournament EirikAlbrigtsen
680+TraceUtils EyalLotem
681+Transhare ChrisKuklewicz
682+TreeStructures BrendanHickey
683+TreeT RahulGopinath
684+TrieMap LouisWasserman
685+Twofish RonLeisti
686+TypeClass JeanPhilippeMoresmau
687+TypeCompose ConalElliott
688+TypeIlluminator GwernBranwen
689+TypingTester AlanHawkins
690+UMM UweHollerbach
691+URLT JeremyShaw
692+URLb JasonDusek
693+Unixutils DavidFox JeremyShaw
694+Unixutils-shadow JeremyShaw
695+UrlDisp ArtyomShalkhakov
696+Useful DanielHolden
697+UtilityTM TonyMorris
698+VKHS SergeyMironov
699+Validation TonyMorris
700+Vec ScottDillard
701+Vec-Boolean TobiasBexelius
702+Vec-OpenGLRaw ChristopherLaneHinson
703+Vec-Transform TobiasBexelius
704+VecN AndrasSlemmer
705+ViennaRNA-bindings ChristianHoener
706+WAVE BartonMassey
707+WL500gPControl VasylPasternak
708+WL500gPLib VasylPasternak
709+WURFL alpheccar
710+WXDiffCtrl JeremyODonoghue
711+WashNGo MarcWeber
712+WebBits AndreyChudnov ArjunGuha
713+WebBits-Html ArjunGuha
714+WebBits-multiplate BalazsEndresz
715+WebCont SamAnklesaria
716+Webrexp VincentBerthoux
717+WikimediaParser EzekielSmithburg
718+Win32 IanLynagh RossPaterson
719+Win32-junction-point MichaelSteele
720+Win32-notify MarkDittmer NiklasBroberg
721+Win32-services MichaelSteele
722+Wired EmilAxelsson
723+WordNet JoelTaylor MaxRabkin
724+WordNet-ghc74 JoelTaylor
725+Workflow AlbertoCorona
726+WxGeneric MadsLindstroem
727+X11 DanielWagner DonaldStewart RossPaterson SpencerJanssen
728+X11-extras DonaldStewart SpencerJanssen
729+X11-rm TroelsHenriksen
730+X11-xdamage DonaldStewart EwanHiggs
731+X11-xfixes ArenOlson
732+X11-xft ClemensFruhwirth
733+X11-xshape DonaldStewart EwanHiggs
734+XAttr NicolaSquartini
735+XInput ErikCharlebois
736+XMMS EvgeniyVodolazskiy
737+XMPP GregoriKholomyev OlegIvanov
738+Xauth SpencerJanssen
739+Xec DaikiHanda
740+XmlHtmlWriter MatthewMirman
741+YACPong KorcanHussein
742+YFrob TristanSkudlik
743+Yablog HiromiIshii
744+YamlReference OrenBenKiki
745+Yampa GeorgeGiorgidze KidoTakahiro
746+YampaSynth GeorgeGiorgidze
747+Yogurt MartijnVanSteenbergen
748+Yogurt-Standalone MartijnVanSteenbergen
749+ZFS GwernBranwen
750+ZMachine GwernBranwen
751+ZipFold ConalElliott
752+Zwaluw MartijnVanSteenbergen
753+a50 KetilMalde
754+abacate MarcoSilva
755+abstract-deque RyanNewton
756+abstract-par RyanNewton
757+abstract-par-accelerate RyanNewton
758+accelerate ManuelChakravarty TrevorMcDonell
759+accelerate-cuda ManuelChakravarty TrevorMcDonell
760+accelerate-examples ManuelChakravarty TrevorMcDonell
761+accelerate-fft TrevorMcDonell
762+accelerate-io ManuelChakravarty TrevorMcDonell
763+accentuateus MichaelSchade
764+access-time MaxBolingbroke
765+acid-state DavidHimmelstrup
766+acme-colosson KeeganMcAllister
767+acme-comonad JoeQuinn
768+acme-dont GracjanPolak
769+acme-hq9plus JoeyAdams
770+acme-http JeremyShaw
771+acme-inator MarkLentczner
772+acme-missiles JoeyAdams
773+acme-now SjurGjoesteinKarevoll
774+acme-php JoeQuinn
775+acme-realworld JoeyAdams
776+acme-strfry ElliottHird
777+acme-year JoeyAdams
778+action-permutations RossPaterson
779+active BrentYorgey
780+activehs PeterDivianszky
781+activehs-base PeterDivianszky
782+actor MartinSulzmann
783+ad EdwardKmett
784+adaptive-containers DonaldStewart
785+adaptive-tuple JohnLato
786+addLicenseInfo JoeFredette
787+adhoc-network GwernBranwen StephanFriedrichs
788+adict JakubWaszczuk
789+adjunctions EdwardKmett
790+adobe-swatch-exchange JeremyShaw
791+adp-multi MaikRiechert
792+adp-multi-monadiccp MaikRiechert
793+aeson AndrasSlemmer BryanOSullivan
794+aeson-bson AlfredoDiNapoli
795+aeson-lens HideyukiTanaka
796+aeson-native MichaelSnoyman
797+aeson-pretty FalkoPeters
798+aeson-qq OscarFinnsson
799+aeson-schema TimBaumann
800+aeson-smart SamAnklesaria
801+affine-invariant-ensemble-mcmc JaredTobin
802+afv TomHawkins
803+agum JohnRamsdell
804+air JinjingWang
805+air-extra JinjingWang
806+aivika DavidSorokin
807+aivika-experiment DavidSorokin
808+aivika-experiment-chart DavidSorokin
809+ajhc KiwamuOkabe
810+alex RossPaterson SimonMarlow
811+alex-meta JonasDuregard
812+algebra EdwardKmett WolfgangJeltsch
813+algebraic-classes SjoerdVisscher
814+aligned-foreignptr BalazsKomuves
815+allocated-processor NoamLewis
816+alloy MattGlazar NeilBrown
817+alloy-proxy-fd NeilBrown
818+alms JesseTov
819+alpha MarcCoiffier
820+alpino-tools DanielDeKok
821+alsa HenningThielemann
822+alsa-core HenningThielemann
823+alsa-gui HenningThielemann
824+alsa-midi HenningThielemann
825+alsa-mixer ThomasTuegel
826+alsa-pcm HenningThielemann
827+alsa-pcm-tests HenningThielemann
828+alsa-seq HenningThielemann
829+alsa-seq-tests HenningThielemann
830+alternative-io KazuYamamoto
831+altfloat NickBowler
832+alure CarlJoachimSvenn
833+amqp HolgerReinhardt
834+amrun DanielSeidel
835+anansi JohnMillikin
836+anansi-hscolour JohnMillikin
837+anansi-pandoc JohnMillikin
838+anatomy AlexSuraci
839+angel JamieTurner MichaelXavier
840+ansi-terminal MaxBolingbroke
841+ansi-wl-pprint MaxBolingbroke
842+antfarm EricKow
843+antigate MikhailKuddah
844+antimirov RickKaudewitz
845+antiquoter LarsCorbijn
846+antlrc MarkWright
847+anydbm JohnGoerzen
848+aosd DanielSchuessler
849+apelsin ChristofferOjeling
850+appar KazuYamamoto
851+applicative-extras ChrisEidhof
852+applicative-numbers ConalElliott
853+applicative-quoters BenMillwood
854+approx-rand-test DanielDeKok
855+approximate EdwardKmett
856+approximate-equality GregoryCrosswhite
857+arbb-vm JoelSvensson
858+arbtt JoachimBreitner
859+archive JeremyShaw
860+archiver GwernBranwen
861+archlinux DonaldStewart MagnusTherning PeterSimons
862+archlinux-web MagnusTherning
863+archnews DonaldStewart
864+arff StefanKersten
865+arithmoi DanielFischer
866+armada TimothyCarstens
867+array IanLynagh RossPaterson
868+array-forth TikhonJelvis
869+array-utils AlexMason
870+arrow-list SebastiaanVisser
871+arrowapply-utils AndrewMiller
872+arrowp RossPaterson
873+arrows RossPaterson
874+arx JasonDusek
875+ascetic AndreiLapets
876+ascii MichaelSnoyman
877+asic ArieMiddelkoop
878+asil ArieMiddelkoop
879+asn1-data VincentHanquez
880+asn1-encoding VincentHanquez
881+asn1-parse VincentHanquez
882+asn1-types VincentHanquez
883+assembler JeffDouglas
884+assert LiyangHu
885+assimp JoelBurget
886+astar CaleGibbard
887+astrds AndresLoeh
888+astview SebastianMenge
889+astview-utils SebastianMenge
890+async PeterSimons SimonMarlow
891+aterm ChristianMaeder
892+aterm-utils JasonDagit
893+atl MatthewFarkasDyck
894+atmos GregHorn
895+atmos-dimensional GregHorn
896+atmos-dimensional-tf GregHorn
897+atom LeePike TomHawkins
898+atomic-primops RyanNewton
899+atomo AlexSuraci
900+attempt MichaelSnoyman
901+atto-lisp ThomasSchilling
902+attoparsec BryanOSullivan
903+attoparsec-arff PaulWilson
904+attoparsec-binary AndrewDrake
905+attoparsec-conduit MichaelSnoyman
906+attoparsec-csv RobinBateBoerop
907+attoparsec-enumerator JohnMillikin
908+attoparsec-expr SebastiaanVisser
909+attoparsec-iteratee GregoryCollins JohnLato
910+attoparsec-parsec SimonHengel
911+attoparsec-text BryanOSullivan FelipeLessa
912+attoparsec-text-enumerator FelipeLessa
913+attosplit YitzGale
914+atuin EdwinBrady
915+augeas JudeNagurney
916+augur DavidHimmelstrup
917+authenticate FelipeLessa MichaelSnoyman
918+authenticate-kerberos ArashRouhani
919+authenticate-ldap MichaelLitchard
920+authenticate-oauth HiromiIshii
921+autoproc GwernBranwen JasonDagit
922+avahi IlyaPortnov
923+awesomium MaksymilianOwsianny
924+awesomium-glut MaksymilianOwsianny
925+awesomium-raw MaksymilianOwsianny
926+aws AristidBreitkreuz FelipeLessa JohnWiegley MichaelSnoyman
927+aws-sdk YusukeNomura
928+azure-service-api EdskoDeVries
929+babylon PedroVasconcelos
930+backdropper YannGolanski
931+backward-state LukePalmer
932+bacteria DanielWagner
933+bag DanielWaterworth
934+bamboo JinjingWang
935+bamboo-launcher JinjingWang
936+bamboo-plugin-highlight JinjingWang
937+bamboo-plugin-photo JinjingWang
938+bamboo-theme-blueprint JinjingWang
939+bamboo-theme-mini-html5 JinjingWang
940+bamse SigbjornFinne
941+bamstats KetilMalde
942+barchart SebastianFischer
943+barley JohanTibell
944+barrie FraserWilson
945+barrier-monad AaronBlack
946+base IanLynagh PaoloCapriotti RossPaterson
947+base-compat SimonHengel
948+base-unicode-symbols RoelVanDijk
949+base16-bytestring BryanOSullivan
950+base58address StephenWeber
951+base64-bytestring BryanOSullivan
952+base64-conduit MichaelSnoyman
953+base64-string IanLynagh
954+bash JasonDusek
955+basic-prelude DanBurton MichaelSnoyman
956+baskell GwernBranwen
957+bayes-stack BenGamari
958+bbdb HenryLaxen
959+bcrypt AndrewMiller
960+bdelta JoeyAdams
961+beamable JohnLato
962+beautifHOL LeePike
963+bed-and-breakfast JulianFleischer
964+bein FrederickRoss
965+benchpress JohanTibell
966+bencode DavidHimmelstrup
967+berkeleydb DavidHimmelstrup
968+berp BerniePope
969+bert MariusEriksen
970+besout AbdelwahebMiled
971+bf-cata ArieMiddelkoop
972+bff DanielSeidel JanisVoigtlaender JoachimBreitner
973+bibtex HenningThielemann
974+bidirectionalization-combined JoachimBreitner
975+bidispec DavidLeuschner StefanWehr
976+bidispec-extras StefanWehr
977+bifunctors EdwardKmett
978+billboard-parser BasDeHaas
979+billeksah-forms JuergenNicklischFranken
980+billeksah-main JuergenNicklischFranken
981+billeksah-main-static JuergenNicklischFranken
982+billeksah-pane JuergenNicklischFranken
983+billeksah-services JuergenNicklischFranken
984+bimap StuartCook
985+binary DonaldStewart IanLynagh KetilMalde LennartKolmodin
986+binary-bits LennartKolmodin
987+binary-communicator SoenkeHahn YvesPares
988+binary-conduit AlexanderVershilov
989+binary-derive JaredHance
990+binary-file YoshikuniJujo
991+binary-generic LarsPetersen
992+binary-indexed-tree MaxwellSayles
993+binary-literal-qq MathieuBoespflug
994+binary-protocol GregoryCrosswhite
995+binary-protocol-zmq NicolasTrangez
996+binary-search RossPaterson TakayukiMuranushi
997+binary-shared HamishMackenzie JuergenNicklischFranken
998+binary-state IlyaPortnov
999+binary-strict AdamLangley DominicSteinitz
1000+binarydefer NeilMitchell
1001+bind-marshal CoreyOConnor
1002+binding-core GideonSireling
1003+binding-gtk GideonSireling
1004+binding-wx GideonSireling
1005+bindings MauricioAntunes
1006+bindings-DSL MauricioAntunes
1007+bindings-EsounD MasatakeDaimon
1008+bindings-K8055 JorisPutcuyps
1009+bindings-apr MasatakeDaimon
1010+bindings-apr-util MasatakeDaimon
1011+bindings-audiofile MasatakeDaimon
1012+bindings-bfd MichaelNelson
1013+bindings-cctools BadiAbdulWahid
1014+bindings-common BasVanDijk MauricioAntunes
1015+bindings-dc1394 VilleTirronen
1016+bindings-directfb MauricioAntunes
1017+bindings-eskit AndrewMiller
1018+bindings-fann MauricioAntunes
1019+bindings-glib MauricioAntunes
1020+bindings-gobject MauricioAntunes YurasShumovich
1021+bindings-gpgme MauricioAntunes
1022+bindings-gsl MauricioAntunes
1023+bindings-gts JoelCrisp
1024+bindings-levmar BasVanDijk RoelVanDijk
1025+bindings-libcddb MauricioAntunes
1026+bindings-libffi MauricioAntunes
1027+bindings-libftdi SivaramGowkanapalli
1028+bindings-librrd MasatakeDaimon
1029+bindings-libusb BasVanDijk MauricioAntunes
1030+bindings-libv4l2 ClaudeHeilandAllen
1031+bindings-libzip SergeyAstanin
1032+bindings-linux-videodev2 ClaudeHeilandAllen
1033+bindings-mmap ClaudeHeilandAllen
1034+bindings-parport SivaramGowkanapalli
1035+bindings-posix BasVanDijk MauricioAntunes
1036+bindings-ppdev SivaramGowkanapalli
1037+bindings-sane ClintAdams
1038+bindings-sc3 StefanKersten
1039+bindings-sipc JustinEthier
1040+bindings-sqlite3 MauricioAntunes
1041+bindings-svm PauloTanimoto VilleTirronen
1042+bindings-uname MasatakeDaimon
1043+bindings-yices PepeIborra
1044+binembed ClaudeHeilandAllen
1045+binembed-example ClaudeHeilandAllen
1046+bio GwernBranwen KetilMalde
1047+bioace DanFornika
1048+bioalign DanFornika
1049+biocore KetilMalde
1050+biofasta DanFornika
1051+biofastq KetilMalde
1052+biophd DanFornika
1053+biopsl KetilMalde
1054+biosff KetilMalde
1055+biostockholm FelipeLessa
1056+bird MattParker
1057+bit-vector AdamFoltzer
1058+bitarray BalazsKomuves
1059+bitly-cli SergeyAstanin
1060+bitmap BalazsKomuves
1061+bitmap-opengl BalazsKomuves
1062+bitmaps ByronJohnson
1063+bits EdwardKmett
1064+bits-atomic GabrielWicke
1065+bits-conduit HideyukiTanaka
1066+bits-extras GabrielWicke
1067+bitset DenisBueno FedorGogolev SergeiLebedev
1068+bitspeak MauricioAntunes
1069+bitstream MasatakeDaimon
1070+bitstring BalazsKomuves
1071+bitvec JamesCook
1072+bitwise ClaudeHeilandAllen
1073+bk-tree FrancescoMazzoli
1074+bkr MichaelSmietana
1075+bktrees JosefSvenningsson
1076+bla JinjingWang
1077+blakesum KevinCantu
1078+blakesum-demo KevinCantu
1079+blank-canvas AndrewFarmer AndyGill
1080+blas PatrickPerry
1081+blastxml KetilMalde
1082+blaze-builder JasperVanDerJeugt SimonMeier
1083+blaze-builder-conduit MichaelSnoyman
1084+blaze-builder-enumerator SimonHengel SimonMeier ThomasSutton
1085+blaze-from-html JasperVanDerJeugt
1086+blaze-html JasperVanDerJeugt SimonMeier
1087+blaze-html-contrib AdityaBhargava ChrisDone
1088+blaze-html-hexpat JasperVanDerJeugt
1089+blaze-html-truncate MarcelRuegenberg
1090+blaze-markup DeepakJois JasperVanDerJeugt
1091+blaze-svg DeepakJois
1092+blaze-textual BryanOSullivan
1093+blaze-textual-native MichaelSnoyman
1094+blink1 DylanSimon
1095+blip BerniePope
1096+bliplib BerniePope
1097+blocking-transactions ChristopherLaneHinson
1098+blockio GwernBranwen
1099+blogination ChrisDone
1100+bloomfilter BryanOSullivan
1101+bloxorz ViktorDevecseri
1102+bluetile JanVornberger
1103+bluetileutils JanVornberger
1104+bmp BenLippmeier
1105+board-games HenningThielemann
1106+bogre-banana DavidEichmann
1107+bool-extras TomLokhorst
1108+boolexpr NicolasPouillard
1109+boolsimplifier GershomBazerman
1110+boomerang JeremyShaw DagOdenhall
1111+boomslang BrianLewis
1112+bot ConalElliott
1113+botpp GwernBranwen
1114+bound EdwardKmett
1115+bounded-tchan ThomasDuBuisson
1116+boxes BrentYorgey eelis BennoFuenfstueck
1117+bpann RobertSteuck
1118+brainfuck GwernBranwen
1119+breakout EyalLotem
1120+brians-brain WillDonnelly
1121+brillig EricKow
1122+bsd-sysctl MaximeHenrion
1123+bson FedorGogolev TonyHannan
1124+bson-generic PetrPilar
1125+bson-generics PetrPilar
1126+bson-mapping FrancescoMazzoli
1127+btree-concurrent JohanBrinch
1128+buildbox BenLippmeier
1129+buildbox-tools BenLippmeier
1130+buildwrapper JeanPhilippeMoresmau
1131+bullet CsabaHruska
1132+bumper BramSchuur ErikHesselink
1133+buster JeffersonHeard
1134+buster-gtk JeffersonHeard
1135+buster-network JeffersonHeard
1136+bv IagoAbal
1137+bytedump VincentHanquez
1138+byteorder AntoineLatter
1139+bytes EdwardKmett
1140+bytestring DonaldStewart DuncanCoutts IanLynagh RossPaterson
1141+bytestring-class MichaelSnoyman
1142+bytestring-csv DonaldStewart
1143+bytestring-delta JoeyAdams
1144+bytestring-handle GaneshSittampalam
1145+bytestring-lexing DonaldStewart WrenThornton
1146+bytestring-mmap DonaldStewart
1147+bytestring-nums JasonDusek
1148+bytestring-progress AdamWick
1149+bytestring-rematch TomCrayford
1150+bytestring-show DanDoel
1151+bytestring-trie WrenThornton
1152+bytestringparser BryanOSullivan
1153+bytestringparser-temporary JasonDusek
1154+bytestringreadp GracjanPolak
1155+bzlib DuncanCoutts
1156+bzlib-conduit HideyukiTanaka
1157+c-io MattMorrow
1158+c-storable-deriving MatthewMaurer
1159+c0check DanielSeidel
1160+c0parser DanielSeidel
1161+c10k KazuYamamoto
1162+c2hs DuncanCoutts IanRoss
1163+c2hsc JohnWiegley
1164+cab KazuYamamoto
1165+cabal-db VincentHanquez
1166+cabal-debian DavidFox
1167+cabal-dev JonathanDaugherty JoshHoyt RoganCreswick
1168+cabal-file-th NickPartridge SimonMichael
1169+cabal-ghci EtienneLaurin
1170+cabal-install AndresLoeh DuncanCoutts JohanTibell
1171+cabal-install-bundle BartoszCwiklowski
1172+cabal-install-ghc72 TonyHannan
1173+cabal-install-ghc74 AndreasAbel
1174+cabal-macosx AndyGimblett EricKow
1175+cabal-meta GregWeber
1176+cabal-nirvana MichaelSnoyman
1177+cabal-progdeps KevinQuick
1178+cabal-query MaxDesyatov
1179+cabal-rpm BryanOSullivan JensPetersen
1180+cabal-scripts HenningThielemann
1181+cabal-setup DuncanCoutts
1182+cabal-sign ChrisDone
1183+cabal-sort HenningThielemann
1184+cabal-src MichaelSnoyman
1185+cabal-test DavidHimmelstrup
1186+cabal-uninstall JanChristiansen
1187+cabal-upload BjornBringert
1188+cabal2arch DonaldStewart MagnusTherning PeterSimons
1189+cabal2doap GregHeartsfield
1190+cabal2ghci HiromiIshii
1191+cabal2nix PeterSimons
1192+cabal2spec YaakovNemoy
1193+cabalgraph DonaldStewart
1194+cabalmdvrpm OlivierThauvin
1195+cabalrpmdeps OlivierThauvin
1196+cabalvchk KevinQuick
1197+caf MartinaWillig
1198+cairo AndyStewart AxelSimon DanielWagner DuncanCoutts
1199+cairo-appbase ConradParker
1200+cake JeanPhilippeBernardy
1201+cakyrespa YoshikuniJujo
1202+cal3d GregoryWeber
1203+cal3d-examples GregoryWeber
1204+cal3d-opengl GregoryWeber
1205+calc AustinSeipp
1206+caldims RickKaudewitz
1207+caledon MatthewMirman
1208+campfire MichaelXavier
1209+canonical-filepath ThomasSchilling
1210+cap ThomasDavie
1211+capped-list JohnMillikin
1212+capri DmitryGolubovsky
1213+carboncopy EugenyDzhurinsky
1214+carettah KiwamuOkabe
1215+carray HenningThielemann JedBrown
1216+case-insensitive BasVanDijk
1217+cash ChrisBrown
1218+cassandra-thrift KirkPeterson OzgunAtaman
1219+cassava JohanTibell
1220+cassette MathieuBoespflug
1221+cassy OzgunAtaman
1222+casui EtienneLaurin
1223+catch-fd AndySonnenburg
1224+categorical-algebra JonathanFischoff
1225+categories EdwardKmett
1226+category-extras DanDoel DanielWagner EdwardKmett RussellOConnor
1227+cautious-file CoreyOConnor RobinGreen
1228+cblrepo MagnusTherning
1229+ccnx TomHawkins
1230+cctools-workqueue BadiAbdulWahid
1231+cedict JasonDusek
1232+cellrenderer-cairo JohnLato
1233+cereal TrevorElliott
1234+cereal-conduit MylesMaxfield
1235+cereal-derive JaredHance
1236+cereal-enumerator PatrickPalka
1237+cereal-ieee754 JacobStanley
1238+cereal-vector AdamFoltzer
1239+certificate VincentHanquez
1240+cflp SebastianFischer
1241+cfopu ByronJohnson
1242+cgen AnttiSalonen
1243+cgi AndersKaseorg BjornBringert IanLynagh MaxBolingbroke RossPaterson
1244+cgi-undecidable BjornBringert
1245+cgi-utils ChrisDone
1246+chalkboard AndyGill
1247+chalkboard-viewer AndyGill
1248+chalmers-lava2000 EmilAxelsson
1249+chan-split BrandonSimmons
1250+change-monger GwernBranwen
1251+charade DougBeardsley
1252+charset EdwardKmett
1253+charsetdetect MaxBolingbroke
1254+check-email ChrisDone
1255+checked AntoineLatter
1256+checkers ConalElliott
1257+chell JohnMillikin
1258+chell-hunit JohnMillikin
1259+chell-quickcheck JohnMillikin
1260+child GwernBranwen
1261+chp NeilBrown
1262+chp-mtl NeilBrown
1263+chp-plus NeilBrown
1264+chp-spec NeilBrown
1265+chp-transformers NeilBrown
1266+chronograph JohnLato
1267+chu2 JinjingWang
1268+chuchu FelipeLessa MarcoSilva
1269+chunks MatthewSackman
1270+cil TomHawkins
1271+cinvoke RemiTurk
1272+cipher-aes VincentHanquez
1273+cipher-aes128 ThomasDuBuisson
1274+cipher-rc4 VincentHanquez
1275+circ TomHawkins
1276+circle-packing JoachimBreitner
1277+citation-resolve TakayukiMuranushi
1278+citeproc-hs AndreaRossato
1279+cityhash AustinSeipp
1280+cjk MaxBolingbroke
1281+clash ChristiaanBaaij
1282+classify DavidHimmelstrup
1283+classy-parallel SamAnklesaria
1284+classy-prelude MichaelSnoyman
1285+classy-prelude-conduit MichaelSnoyman
1286+classy-prelude-yesod MichaelSnoyman
1287+clay SebastiaanVisser
1288+clckwrks JeremyShaw
1289+clckwrks-cli JeremyShaw
1290+clckwrks-plugin-bugs JeremyShaw
1291+clckwrks-plugin-ircbot JeremyShaw
1292+clckwrks-plugin-media JeremyShaw
1293+clckwrks-plugin-page JeremyShaw
1294+clckwrks-theme-bootstrap JeremyShaw
1295+clckwrks-theme-geo-bootstrap JeremyShaw
1296+clean-home IvanPerez
1297+clevercss GeorgBrandl
1298+click-clack AntonKholomiov
1299+clientsession FelipeLessa MichaelSnoyman
1300+clippard AnthonyGrimes
1301+clipper ChetanTaralekar
1302+clock CetinSert
1303+clocked SoenkeHahn
1304+clogparse KeeganMcAllister
1305+cloudyfs BrendanHickey
1306+cltw DinoMorelli
1307+clua TomSchouten
1308+clustertools GwernBranwen KetilMalde
1309+clutterhs MatthewArsenault
1310+cmaes TakayukiMuranushi
1311+cmath DonaldStewart
1312+cmathml3 AndrewMiller
1313+cmdargs NeilMitchell
1314+cmdargs-browser NeilMitchell
1315+cmdlib PetrRockai
1316+cmdtheline EliFrey
1317+cml BenFranksen
1318+cmonad LennartAugustsson
1319+cmu JohnRamsdell
1320+cnc-spec-compiler RyanNewton
1321+codec-libevent AdamLangley
1322+codec-mbox NicolasPouillard
1323+codemonitor RickardLindberg
1324+codepad ChrisDone
1325+codo-notation DominicOrchard
1326+cofunctor BrandonSimmons
1327+cognimeta-utils PatrickPremont
1328+colada GrzegorzChrupala
1329+collada-output TillmannVogt
1330+collada-types TillmannVogt
1331+collections JeanPhilippeBernardy JohannesWaldmann
1332+collections-api JeanPhilippeBernardy
1333+collections-base-instances JeanPhilippeBernardy
1334+colock LukasMai
1335+colorize-haskell IavorDiatchki
1336+colour RussellOConnor
1337+com KidoTakahiro SigbjornFinne
1338+combinat BalazsKomuves
1339+combinatorial-problems RichardSenington
1340+combinatorics WrenThornton
1341+combobuffer JohnLato
1342+commsec ThomasDuBuisson
1343+commsec-keyexchange ThomasDuBuisson
1344+comonad EdwardKmett
1345+comonad-extras EdwardKmett
1346+comonad-random JakeMcArthur
1347+comonad-transformers EdwardKmett
1348+comonads-fd EdwardKmett
1349+compact-map DavidHimmelstrup
1350+compact-string TwanVanLaarhoven
1351+compact-string-fix TonyHannan
1352+compdata PatrickBahr
1353+compensated EdwardKmett
1354+complex-generic ClaudeHeilandAllen
1355+complex-integrate MarkSafronov
1356+complexity RoelVanDijk
1357+compose-trans MiguelMitrofanov
1358+composition DanBurton
1359+compressed EdwardKmett
1360+compression IanLynagh
1361+computational-algebra HiromiIshii
1362+concatenative SamAnklesaria
1363+concorde KeeganMcAllister
1364+concraft JakubWaszczuk
1365+concraft-pl JakubWaszczuk
1366+concrete-relaxng-parser MarioBlazevic
1367+concrete-typerep ReinerPope
1368+concurrent-barrier JeremyFitzhardinge
1369+concurrent-extra BasVanDijk RoelVanDijk
1370+concurrent-sa LouisWasserman
1371+concurrent-split HenningThielemann
1372+concurrent-supply EdwardKmett
1373+concurrentoutput JoachimBreitner
1374+cond AdamCurtis
1375+condorcet GwernBranwen
1376+conductive-base RenickBell
1377+conductive-clock RenickBell
1378+conductive-hsc3 RenickBell
1379+conductive-song RenickBell
1380+conduit MichaelSnoyman
1381+conduit-network-stream NilsSchweinsberg
1382+conduit-resumablesink AndrewMiller
1383+config-select TimothyHobbs
1384+configuration HiromiIshii
1385+configurator BryanOSullivan
1386+confsolve DanielTrstenjak
1387+conjugateGradient LeventErkok
1388+conjure GwernBranwen
1389+connection VincentHanquez
1390+console-program AriePeterson
1391+const-math-ghc-plugin ConradParker
1392+constrained-normal NeilSculthorpe
1393+constraints EdwardKmett
1394+constructive-algebra AndersMortberg
1395+container-classes IvanMiljenovic
1396+containers IanLynagh JohanTibell RossPaterson
1397+containers-benchmark MilanStraka
1398+containers-deepseq MichaelSnoyman
1399+containers-unicode-symbols RoelVanDijk
1400+continue ErtugrulSoeylemez
1401+continued-fractions JamesCook
1402+contravariant EdwardKmett
1403+control-event ThomasDuBuisson
1404+control-monad-attempt MichaelSnoyman NicolasPouillard
1405+control-monad-exception PepeIborra
1406+control-monad-exception-monadsfd PepeIborra
1407+control-monad-exception-monadstf PepeIborra
1408+control-monad-exception-mtl PepeIborra
1409+control-monad-failure MichaelSnoyman PepeIborra
1410+control-monad-failure-mtl MichaelSnoyman PepeIborra
1411+control-monad-free LukePalmer PepeIborra
1412+control-monad-loop JoeyAdams
1413+control-monad-omega LukePalmer
1414+control-monad-queue LeonSmith
1415+control-timeout AdamLangley
1416+contstuff ErtugrulSoeylemez
1417+contstuff-monads-tf ErtugrulSoeylemez
1418+contstuff-transformers ErtugrulSoeylemez
1419+converge JamesCook
1420+convertible JohnGoerzen
1421+convertible-ascii MasatakeDaimon
1422+convertible-text MichaelSnoyman
1423+cookie MichaelSnoyman
1424+copilot LeePike
1425+copilot-c99 LeePike
1426+copilot-cbmc LeePike
1427+copilot-core LeePike
1428+copilot-language LeePike
1429+copilot-libraries LeePike
1430+copilot-sbv LeePike
1431+core DavidHimmelstrup
1432+corebot-bliki CoreyOConnor
1433+coroutine-enumerator MarioBlazevic
1434+coroutine-iteratee MarioBlazevic
1435+coroutine-object IanWooKim
1436+couch-hs PeterSagerson
1437+couchdb-conduit AlexanderDorofeev
1438+couchdb-enumerator JohnLenz
1439+countable AshleyYakeley
1440+cpphs MalcolmWallace RossPaterson
1441+cprng-aes VincentHanquez
1442+cpsa JohnRamsdell
1443+cpu VincentHanquez
1444+cpuid HenningThielemann MartinGrabmueller
1445+cpuperf DonaldStewart
1446+cpython JohnMillikin
1447+cqrs BardurArantsson
1448+cqrs-example BardurArantsson
1449+cqrs-postgresql BardurArantsson
1450+cqrs-sqlite3 BardurArantsson
1451+cqrs-test BardurArantsson
1452+cqrs-types BardurArantsson
1453+cr AlexandruScvortov
1454+crack TrevorElliott
1455+craftwerk MalteHarder
1456+craftwerk-cairo MalteHarder
1457+craftwerk-gtk MalteHarder
1458+crc16 JorisPutcuyps
1459+crc16-table KeeganMcAllister
1460+creatur AmyDeBuitleir
1461+crf-chain1 JakubWaszczuk
1462+crf-chain1-constrained JakubWaszczuk
1463+crf-chain2-generic JakubWaszczuk
1464+crf-chain2-tiers JakubWaszczuk
1465+critbit BryanOSullivan
1466+criterion BryanOSullivan
1467+criterion-to-html JasperVanDerJeugt
1468+crockford HenryBucklow
1469+crocodile TomHammersley
1470+cron MichaelXavier
1471+crypto-api ThomasDuBuisson
1472+crypto-api-tests ThomasDuBuisson
1473+crypto-conduit FelipeLessa MichaelSnoyman
1474+crypto-numbers VincentHanquez
1475+crypto-pubkey VincentHanquez
1476+crypto-pubkey-openssh FedorGogolev
1477+crypto-pubkey-types VincentHanquez
1478+crypto-random-api VincentHanquez
1479+cryptocipher VincentHanquez
1480+cryptohash VincentHanquez
1481+cryptohash-cryptoapi VincentHanquez
1482+crystalfontz KeeganMcAllister
1483+cse-ghc-plugin AustinSeipp
1484+csound-expression AntonKholomiov
1485+cspmchecker ThomasGibsonRobinson
1486+css ChrisDone
1487+css-text MichaelSnoyman
1488+csv JaapWeel
1489+csv-conduit OzgunAtaman
1490+csv-enumerator OzgunAtaman
1491+csv-nptools NicolasPouillard
1492+ctemplate AdamLangley
1493+cubicspline GershomBazerman
1494+cuboid PedroMartins
1495+cuda TrevorMcDonell
1496+cufft RobEverest
1497+curl DonaldStewart EricMertens IavorDiatchki SigbjornFinne
1498+curl-aeson JoelLehtonen
1499+curlhs KrzysztofKardzis
1500+current-locale AlexeyKotlyarov
1501+curry-base BerndBrassel BjoernPeemoeller HolgerSiegel
1502+curry-frontend BerndBrassel BjoernPeemoeller HolgerSiegel
1503+cursedcsv GershomBazerman
1504+custom-prelude AnupamJain
1505+cv-combinators NoamLewis
1506+cyclotomic ScottWalck
1507+cypher SamAnklesaria
1508+daemonize-doublefork AlexandruScvortov
1509+daemons AlexandruScvortov
1510+dapi OmariNorman
1511+darcs EricKow FlorentBecker GaneshSittampalam JasonDagit PetrRockai ReinierLamers
1512+darcs-benchmark EricKow PetrRockai
1513+darcs-beta FlorentBecker GaneshSittampalam PetrRockai ReinierLamers
1514+darcs-buildpackage JohnGoerzen
1515+darcs-cabalized GwernBranwen
1516+darcs-fastconvert PetrRockai
1517+darcs-graph DonaldStewart IsaacJones
1518+darcs-monitor AnttiJuhaniKaijanaho MarcoSilva
1519+darcs-scripts HenningThielemann
1520+darcs2dot SoenkeHahn
1521+darcsden AlexSuraci SimonMichael
1522+darcswatch JoachimBreitner
1523+data-accessor HenningThielemann LukePalmer
1524+data-accessor-monadLib RussellOConnor
1525+data-accessor-monads-fd HenningThielemann
1526+data-accessor-monads-tf HenningThielemann
1527+data-accessor-mtl HenningThielemann
1528+data-accessor-template HenningThielemann LukePalmer
1529+data-accessor-transformers HenningThielemann
1530+data-aviary StephenTetley
1531+data-binary-ieee754 JohnMillikin
1532+data-category SjoerdVisscher
1533+data-checked MikhailVorozhtsov
1534+data-clist JohnVanEnk
1535+data-cycle TobiasBrandt
1536+data-default LukasMai
1537+data-default-class LukasMai
1538+data-default-instances-base LukasMai
1539+data-default-instances-containers LukasMai
1540+data-default-instances-dlist LukasMai
1541+data-default-instances-old-locale LukasMai
1542+data-dword MikhailVorozhtsov
1543+data-endian MikhailVorozhtsov
1544+data-fix AntonKholomiov
1545+data-fix-cse AntonKholomiov
1546+data-flags MikhailVorozhtsov
1547+data-hash DanielGorin
1548+data-interval MasahiroSakai
1549+data-inttrie LukePalmer ThomasDuBuisson
1550+data-ivar LukePalmer
1551+data-lens EdwardKmett RussellOConnor
1552+data-lens-fd EdwardKmett RussellOConnor
1553+data-lens-ixset DagOdenhall
1554+data-lens-template EdwardKmett JoelBurget RussellOConnor
1555+data-list-sequences JonasKramer
1556+data-memocombinators DmitryMalikov LukePalmer ThomasDuBuisson
1557+data-named JakubWaszczuk
1558+data-nat GaborLehel
1559+data-object MichaelSnoyman
1560+data-object-json MichaelSnoyman
1561+data-object-yaml MichaelSnoyman
1562+data-or WrenThornton
1563+data-ordlist LeonSmith
1564+data-partition LukePalmer
1565+data-pprint PeterDivianszky
1566+data-quotientref LukePalmer
1567+data-reify AndyGill
1568+data-reify-cse SebastiaanVisser
1569+data-rope PierreEtienneMeunier
1570+data-spacepart CoreyOConnor
1571+data-store PetrPilar
1572+data-structure-inferrer AleksanderBalicki
1573+data-textual MikhailVorozhtsov
1574+data-timeout MikhailVorozhtsov
1575+data-treify ConalElliott
1576+data-type IainAlexander
1577+data-util KatsutoshiItoh
1578+database-migrate MarkHibberd
1579+database-study HenningThielemann
1580+dataenc MagnusTherning
1581+datalog TristanRavitch
1582+datapacker JohnGoerzen
1583+date-cache KazuYamamoto
1584+dates IlyaPortnov
1585+datetime EricSessoms EugenyDzhurinsky
1586+dawg JakubWaszczuk
1587+dbf JamesCook
1588+dbjava CarlosGomez
1589+dbmigrations JonathanDaugherty
1590+dbus JohnMillikin
1591+dbus-client JohnMillikin
1592+dbus-core JohnMillikin
1593+dbus-qq PaoloCapriotti
1594+dbus-th IlyaPortnov
1595+dclabel DeianStefan
1596+dclabel-eci11 AlejandroRusso
1597+ddc-base BenLippmeier
1598+ddc-build BenLippmeier
1599+ddc-code BenLippmeier
1600+ddc-core BenLippmeier
1601+ddc-core-eval BenLippmeier
1602+ddc-core-llvm BenLippmeier
1603+ddc-core-salt BenLippmeier
1604+ddc-core-simpl BenLippmeier
1605+ddc-driver BenLippmeier
1606+ddc-tools BenLippmeier
1607+ddc-war BenLippmeier
1608+ddci-core BenLippmeier
1609+dead-simple-json JulianFleischer
1610+debian DavidFox JeremyShaw MarcoSilva
1611+debian-binary MarcoSilva
1612+debug-diff KeeganMcAllister
1613+decepticons JoeQuinn
1614+dedukti MathieuBoespflug
1615+deepseq DonaldStewart IanLynagh SimonMarlow
1616+deepseq-generics HerbertValerioRiedel
1617+deepseq-th HerbertValerioRiedel
1618+deepzoom MatthewPanetta
1619+delaunay MarcelRuegenberg
1620+delicious SigbjornFinne
1621+delimited-text DonaldStewart StefanKersten
1622+delta-h GrzegorzChrupala
1623+denominate CalvinSmith
1624+dependent-map JamesCook
1625+dependent-sum JamesCook
1626+dependent-sum-template JamesCook
1627+dephd GwernBranwen KetilMalde
1628+dequeue HenryBucklow
1629+derangement DennisGriffith
1630+derivation-trees JeanPhilippeBernardy
1631+derive AustinSeipp NeilMitchell StefanORear
1632+derive-IG HiromiIshii
1633+derive-gadt MattMorrow
1634+derive-trie AndreasBaldeau
1635+derp DavidDarais
1636+derp-lib KiYungAhn
1637+detrospector KeeganMcAllister
1638+deunicode BenFranksen
1639+dewdrop KeeganMcAllister
1640+dfsbuild JohnGoerzen
1641+dgs DanielWagner
1642+dia-base PeterDivianszky
1643+dia-functions PeterDivianszky
1644+diagrams AdamVogt BrentYorgey
1645+diagrams-builder BrentYorgey
1646+diagrams-cairo BrentYorgey
1647+diagrams-contrib BrentYorgey
1648+diagrams-core BrentYorgey
1649+diagrams-gtk BrentYorgey
1650+diagrams-haddock BrentYorgey
1651+diagrams-lib BrentYorgey
1652+diagrams-postscript RyanYates BrentYorgey
1653+diagrams-qrcode FelipeLessa
1654+diagrams-svg BrentYorgey DeepakJois
1655+diagrams-tikz AriePeterson
1656+dice JamesCook
1657+diet TonyMorris
1658+diff3 OliverCharles
1659+diffarray IanLynagh AndreasAbel
1660+diffcabal DonaldStewart
1661+diffdump GregFitzgerald
1662+digamma BenGamari
1663+digest EugeneKirpichov
1664+digest-pure DanielDeKok
1665+digestive-functors JasperVanDerJeugt
1666+digestive-functors-aeson OliverCharles
1667+digestive-functors-blaze JasperVanDerJeugt
1668+digestive-functors-happstack JasperVanDerJeugt
1669+digestive-functors-heist JasperVanDerJeugt
1670+digestive-functors-hsp JeremyShaw
1671+digestive-functors-snap JasperVanDerJeugt
1672+digits HenryBucklow
1673+dimensional BjornBuckwalter
1674+dimensional-tf BjornBuckwalter
1675+dingo-core BardurArantsson
1676+dingo-example BardurArantsson
1677+dingo-widgets BardurArantsson
1678+direct-binary-files IreneKnapp
1679+direct-daemonize IreneKnapp
1680+direct-fastcgi IreneKnapp
1681+direct-http IreneKnapp
1682+direct-murmur-hash IreneKnapp
1683+direct-plugins IreneKnapp
1684+direct-sqlite IreneKnapp
1685+directory IanLynagh RossPaterson
1686+directory-layout MatveyAksenov
1687+directory-tree BrandonSimmons
1688+disassembler DirkKleeblatt MartinGrabmueller
1689+discordian-calendar AdamCurtis
1690+discount PatrickHurst
1691+discrete-space-map SjoerdVisscher
1692+disjoint-set MaxwellSayles
1693+dist-upload AndyStewart
1694+distributed-process EdskoDeVries TimWatson
1695+distributed-process-azure EdskoDeVries
1696+distributed-process-p2p AlexanderBondarenko
1697+distributed-process-simplelocalnet EdskoDeVries TimWatson
1698+distributed-static EdskoDeVries
1699+distributive EdwardKmett
1700+djinn LennartAugustsson
1701+djinn-th ClaudeHeilandAllen
1702+dlist DonaldStewart
1703+dns KazuYamamoto
1704+dnscache ErtugrulSoeylemez
1705+dnsrbl HoldenKarau
1706+doc-review JoshHoyt
1707+docidx AndyGimblett
1708+doctest SimonHengel
1709+doctest-prop TakayukiMuranushi
1710+dom-lt MattMorrow
1711+dom-selector nebuta
1712+domain-auth KazuYamamoto
1713+dot2graphml IlyaPortnov
1714+dotfs PaulVanDerWalt
1715+dotgen AndyGill
1716+double-conversion BryanOSullivan
1717+dow GergelyPatai
1718+download DonaldStewart MagnusTherning
1719+download-curl DonaldStewart SoenkeHahn
1720+download-media-content JasperVanDerJeugt
1721+dph-base BenLippmeier
1722+dph-examples BenLippmeier
1723+dph-lifted-base BenLippmeier
1724+dph-lifted-copy BenLippmeier
1725+dph-lifted-vseg BenLippmeier
1726+dph-par BenLippmeier
1727+dph-prim-interface BenLippmeier
1728+dph-prim-par BenLippmeier
1729+dph-prim-seq BenLippmeier
1730+dph-seq BenLippmeier
1731+dpkg ClintAdams
1732+dropbox-sdk KannanGoundan
1733+dropsolve DanielTrstenjak
1734+dsmc DmitryDzhus
1735+dsmc-tools DmitryDzhus
1736+dsp HenningThielemann
1737+dstring BasVanDijk
1738+dtd MichaelSnoyman
1739+dtd-text YitzGale
1740+dtd-types YitzGale
1741+dtrace AaronTomb
1742+dual-tree BrentYorgey
1743+dvda GregHorn
1744+dvdread NicolaSquartini
1745+dvi-processing AaronBlack
1746+dwarf ErikCharlebois
1747+dwarf-el EyalLotem
1748+dwarfadt EyalLotem
1749+dx9base KidoTakahiro
1750+dx9d3d KidoTakahiro
1751+dx9d3dx KidoTakahiro
1752+dynamic-linker-template SylvainHenry
1753+dynamic-loader GaborGreif
1754+dynamic-object TakayukiMuranushi
1755+dyre WillDonnelly
1756+dzen-utils FelipeLessa
1757+easy-file KazuYamamoto
1758+easyplot JulianFleischer
1759+ebeats BrianLewis
1760+ecu TomHawkins
1761+eddie MikeMeyer
1762+edenmodules MischaDieterle
1763+edenskel MischaDieterle
1764+edentv MischaDieterle
1765+edge ChristopherHoward
1766+edit-distance MaxBolingbroke
1767+edit-lenses DanielWagner
1768+edit-lenses-demo DanielWagner
1769+editline JudahJacobson
1770+effects SjoerdVisscher
1771+egison SatoshiEgi
1772+egison-quote TakuyaKuwahara
1773+ehaskell YoshikuniJujo
1774+eigen OlegSidorkin
1775+either EdwardKmett
1776+either-unwrap GregoryCrosswhite
1777+ekg JohanTibell
1778+elerea GergelyPatai
1779+elerea-examples GergelyPatai
1780+elerea-sdl StephenWeber
1781+elf ErikCharlebois
1782+elm-server EvanCzaplicki
1783+elm-yesod VincentAmbo
1784+email JohannesWeiss
1785+email-postmark DanielPatterson
1786+email-validate DonaldStewart GeorgePollard
1787+embeddock TakayukiMuranushi
1788+embroidery JimSnavely
1789+emgm SeanLeather
1790+empty JohnMillikin
1791+encoding DanielWagner HenningGuenther KangyuanNiu
1792+entropy ThomasDuBuisson
1793+enumerable DanielPeebles
1794+enumerator JohnMillikin
1795+enumerator-fd JohnMillikin
1796+enumerator-tf JohnMillikin
1797+enumfun LiyangHu
1798+enummapmap MatthewWest
1799+enummapset MichalTerepeta
1800+enummapset-th LiyangHu
1801+enumset HenningThielemann
1802+epass AndreasBaldeau
1803+epic EdwinBrady
1804+epoll ToralfWittner
1805+eprocess FernandoBenavides CorentinDupont
1806+epub RadoslavDorcik
1807+epub-metadata DinoMorelli
1808+epub-tools DinoMorelli
1809+epubname DinoMorelli
1810+eq EdwardKmett
1811+equal-files HenningThielemann
1812+equivalence PatrickBahr
1813+erf LennartAugustsson
1814+erf-native JamesCook
1815+erlang EricSessoms
1816+errno CreightonHogg
1817+error-location GregWeber
1818+error-message GregoryCrosswhite
1819+errors GabrielGonzalez
1820+ersatz EdwardKmett
1821+esotericbot JohnnyMorrice
1822+esqueleto FelipeLessa
1823+estimators SashaRush
1824+estreps GwernBranwen KetilMalde
1825+ety ChrisDone
1826+eurofxref StephenBlackheath
1827+event-driven YoshikuniJujo
1828+event-handlers JamesCook
1829+event-list HenningThielemann
1830+event-monad JamesCook
1831+every-bit-counts DonaldStewart
1832+exact-combinatorics WrenThornton
1833+exception-mailer DavidPowell
1834+exception-monads-fd GeoffreyMainland
1835+exception-monads-tf GeoffreyMainland
1836+exception-mtl GeoffreyMainland
1837+exception-transformers GeoffreyMainland
1838+executable-path BalazsKomuves
1839+exif BjornBringert
1840+exists GaborLehel
1841+expat-enumerator JohnMillikin
1842+expiring-mvar JeffShaw
1843+explicit-exception HenningThielemann
1844+explicit-iomodes BasVanDijk
1845+explicit-iomodes-bytestring BasVanDijk
1846+explicit-iomodes-text BasVanDijk
1847+explicit-sharing SebastianFischer
1848+explore CetinSert
1849+expression-parser SebastiaanVisser
1850+extcore TimChevalier
1851+extemp SamAnklesaria
1852+extensible-data AaronBlack
1853+extensible-exceptions IanLynagh RossPaterson
1854+external-sort ThomasHartman
1855+ez-couch NikitaVolkov
1856+factory AlistairWard LennartAugustsson
1857+factual-api RudigerLippert
1858+fad BjornBuckwalter
1859+failable-list JohnMillikin
1860+failure MichaelSnoyman
1861+fair-predicates SebastianFischer
1862+falling-turnip TranMa
1863+fallingblocks BenSanders
1864+family-tree NathanVanDoorn
1865+fast-logger KazuYamamoto
1866+fast-math LiyangHu
1867+fast-tags EvanLaforge
1868+fast-tagsoup VladimirShabanov
1869+fast-tagsoup-utf8-only MikhailKuddah
1870+fastcgi BjornBringert ChrisDone DonaldStewart
1871+fastirc ErtugrulSoeylemez
1872+fault-tree TomHawkins
1873+fay AdamBergmark ChrisDone
1874+fay-base AdamBergmark ChrisDone
1875+fay-dom ChrisDone AdamBergmark
1876+fay-hsx JeremyShaw
1877+fay-jquery ChrisDone AdamBergmark
1878+fay-ref AndrewMiller
1879+fay-uri ChrisDone AdamBergmark
1880+fb FelipeLessa
1881+fb-persistent FelipeLessa
1882+fckeditor PeterGammie
1883+fclabels ErikHesselink SebastiaanVisser
1884+fclabels-monadlib BardurArantsson
1885+fdo-notify MaxRabkin
1886+fdo-trash EmilKarlson
1887+fec AdamLangley
1888+feed DonaldStewart IavorDiatchki SigbjornFinne
1889+feed-cli IsaacJones
1890+feed2lj SergeyAstanin
1891+feed2twitter TomLokhorst
1892+feldspar-compiler AndersPersson EmilAxelsson
1893+feldspar-language AndersPersson EmilAxelsson
1894+fenfire BenjaFallenstein
1895+fez-conf DinoMorelli
1896+ffeed SigbjornFinne
1897+ffmpeg-tutorials VasylPasternak
1898+fft HenningThielemann JedBrown
1899+fgl IvanMiljenovic MartinErwig RossPaterson
1900+fgl-extras-decompositions ChristianHoener
1901+fgl-visualize ThomasDuBuisson
1902+fibon DavidPeixotto
1903+fibonacci SebastianFischer
1904+fields JussiKnuuttila
1905+fields-json MagnusCarlsson MariuszRak
1906+fig AndersLauOlsen
1907+file-embed MichaelSnoyman
1908+file-location GregWeber
1909+filemanip BryanOSullivan
1910+filepath DuncanCoutts IanLynagh RossPaterson
1911+filestore GwernBranwen JohnMacFarlane
1912+filesystem-conduit MichaelSnoyman
1913+filesystem-enumerator JohnMillikin
1914+filesystem-trees AdamCurtis
1915+fingertree RossPaterson
1916+fingertree-psqueue CaleGibbard
1917+finite-field MasahiroSakai
1918+first-class-patterns ReinerPope BrentYorgey
1919+firstify NeilMitchell
1920+fitsio EricSessoms
1921+fix-imports EvanLaforge
1922+fix-parser-simple MatthewFarkasDyck
1923+fix-symbols-gitit ConalElliott
1924+fixed-list JobVranish
1925+fixed-point JakeMcArthur
1926+fixed-point-vector JakeMcArthur
1927+fixed-point-vector-space JakeMcArthur
1928+fixed-precision EdwardKmett
1929+fixed-vector AlexeyKhudyakov
1930+fixhs ArvinMoezzi
1931+fixplate BalazsKomuves
1932+fixpoint RomanLeshchinskiy
1933+flaccuraterip NicolaSquartini
1934+flat-mcmc JaredTobin
1935+flexible-defaults JamesCook
1936+flexiwrap IainAlexander
1937+flexiwrap-smallcheck IainAlexander
1938+flickr SigbjornFinne
1939+flite JasonReich
1940+flo ChrisDone
1941+floatshow DanielFischer
1942+flock ErikHesselink IanLynagh
1943+flow2dot DmitryAstapov
1944+flower KetilMalde
1945+flowsim KetilMalde
1946+fluent-logger NoriyukiOhkawa
1947+fluent-logger-conduit NoriyukiOhkawa
1948+fluidsynth CorbinSimpson
1949+fmark JoseLopes
1950+fmlist SjoerdVisscher
1951+follower EmreBasar
1952+font-opengl-basic4x6 BrianLewis
1953+foo DonaldStewart
1954+for-free AaronBlack
1955+force-layout BrentYorgey
1956+fordo ChengqiSong
1957+foreign-storable-asymmetric AndrewMiller
1958+forkable-monad DavidAnderson
1959+formal AndrewStein
1960+format ScottLawrence
1961+forml AndrewStein
1962+formlets ChrisEidhof DougBeardsley
1963+formlets-hsp JeremyShaw
1964+forth-hll TikhonJelvis
1965+fountain RubenAstudillo TomHawkins
1966+fpipe BenSchulz
1967+fquery SergeiTrofimovich
1968+fractal MaxRabkin
1969+fraction WolfgangJeltsch
1970+frag DonaldStewart GwernBranwen
1971+frame AdamDunkley
1972+frame-markdown AdamDunkley
1973+franchise DavidRoundy
1974+free EdwardKmett
1975+free-functors SjoerdVisscher
1976+free-game FumiakiKinoshita
1977+free-operational LuisCasillas
1978+free-theorems DanielSeidel JanisVoigtlaender JoachimBreitner
1979+free-theorems-counterexamples DanielSeidel
1980+free-theorems-seq DanielSeidel
1981+free-theorems-seq-webui DanielSeidel
1982+free-theorems-webui DanielSeidel MatthiasBartsch
1983+freekick2 AnttiSalonen
1984+freenect ChrisDone
1985+freesect AndrewSeniuk
1986+freesound StefanKersten
1987+freetype2 JasonDagit
1988+fresh DavidLazar
1989+friendly-time PatrickBrisbin
1990+frisby ChrisDone
1991+frquotes NicolasPouillard
1992+fs-events NickPartridge
1993+fsmActions AndyGimblett
1994+fsnotify GregWeber MarkDittmer RaphaelJavaux
1995+fst GwernBranwen JohnCamilleri ThomasHallgren
1996+fsutils AnthonyGrimes
1997+ftdi RoelVanDijk
1998+ftp-conduit MylesMaxfield
1999+ftphs JohnGoerzen
2000+ftshell JanisVoigtlaender JoachimBreitner MatthiasBartsch
2001+fugue AlecHeller
2002+full-sessions KeigoImai
2003+fullstop EricKow
2004+funcmp PeterSimons
2005+function-combine IainAlexander
2006+function-instances-algebra TobiasBrandt
2007+functional-arrow HenningThielemann
2008+functor-apply EdwardKmett
2009+functor-combo ConalElliott
2010+functorm StefanORear
2011+functors AristidBreitkreuz
2012+funion NathanWiegand
2013+funpat GergelyDevai
2014+funsat DenisBueno
2015+future ChrisKuklewicz
2016+fuzzytime KamilStachowski
2017+gact KetilMalde
2018+game-probability NeilBrown
2019+game-tree ColinAdams
2020+gameclock AbramClark
2021+gamma JamesCook
2022+garsia-wachs NicolasPouillard
2023+gbu DaneelYaitksov
2024+gc-monitoring-wai YiHuang
2025+gconf AndyStewart AxelSimon DanielWagner DuncanCoutts
2026+gd BjornBringert ChrisDone
2027+gdiff EelcoLempsink
2028+gdiff-ig JosePedroMagalhaes
2029+gdiff-th JonathanFischoff
2030+gearbox ClaudeHeilandAllen
2031+gemstone CorbinSimpson
2032+gencheck JacquesCarette
2033+gender KraniumGikos
2034+general-prelude JohnWiegley
2035+generator YairChuchem
2036+generators LiamOConnorDavis
2037+generic-binary SebastiaanVisser
2038+generic-deepseq MaximeHenrion
2039+generic-deriving JosePedroMagalhaes
2040+generic-server IlyaPortnov
2041+generic-storable HideyukiTanaka
2042+generic-tree MatthewFarkasDyck
2043+generic-xml ShaeErisson
2044+genericserialize GwernBranwen
2045+geni-gui EricKow
2046+geniconvert EricKow
2047+geniplate LennartAugustsson
2048+genprog JanSnajder
2049+gentlemark AndriyPolishchuk
2050+geocalc GeroKriependorf
2051+geohash MariusEriksen
2052+getemx BenWolfson
2053+getflag TroelsHenriksen
2054+getopt-simple AlexanderBondarenko
2055+gf KrasimirAngelov ThomasHallgren
2056+ghc-core DonaldStewart ShachafBenKiki
2057+ghc-core-html VincentHanquez
2058+ghc-datasize DennisFelsing
2059+ghc-dup JoachimBreitner
2060+ghc-events DuncanCoutts MikolajKonarski SimonMarlow
2061+ghc-events-parallel MischaDieterle
2062+ghc-gc-tune DonaldStewart
2063+ghc-heap-view JoachimBreitner
2064+ghc-man-completion JoeQuinn
2065+ghc-mod KazuYamamoto
2066+ghc-mtl DanielGorin
2067+ghc-parmake MikhailGlushenkov
2068+ghc-paths SimonMarlow
2069+ghc-pkg-autofix HiromiIshii
2070+ghc-syb ThomasSchilling
2071+ghc-syb-utils ThomasSchilling
2072+ghc-vis DennisFelsing
2073+ghci-diagrams PeterDivianszky
2074+ghci-haskeline JudahJacobson
2075+ghclive ShaeErisson
2076+ghczdecode EyalLotem
2077+ght ConradParker
2078+ginsu DylanSimon
2079+gio AndyStewart AxelSimon DanielWagner DuncanCoutts
2080+gist SimonMichael
2081+git-all JohnWiegley
2082+git-annex JoeyHess
2083+git-date StephenWeber
2084+git-object KazuYamamoto
2085+github JohnWiegley MikeBurns
2086+github-backup JoeyHess
2087+gitit JohnMacFarlane
2088+gitlib JohnWiegley
2089+gitlib-s3 JohnWiegley
2090+gl-capture ClaudeHeilandAllen
2091+glade AndyStewart AxelSimon DuncanCoutts
2092+gladexml-accessor YakovZaytsev
2093+glib AndyStewart AxelSimon DanielWagner DuncanCoutts
2094+glintcollider ColinHill
2095+global-config AlexanderDorofeev
2096+global-lock KeeganMcAllister
2097+global-variables JeanMarieGaillourdet
2098+glome-hs DonaldStewart JimSnow
2099+gloss BenLippmeier
2100+gloss-devil ThomasDuBuisson
2101+gloss-examples BenLippmeier
2102+gloss-juicy AlpMestanogullari
2103+gloss-raster BenLippmeier
2104+glpk-hs LouisWasserman
2105+gluturtle YoshikuniJujo
2106+gmap JamieBrandon
2107+gmndl ClaudeHeilandAllen
2108+gnome-desktop ColinAdams
2109+gnome-keyring JohnMillikin
2110+gnomevfs AxelSimon
2111+gnuidn JohnMillikin
2112+gnuplot HenningThielemann
2113+gnutls JohnMillikin
2114+goa ChrisDone GwernBranwen
2115+gofer-prelude DonaldStewart
2116+google-html5-slide HideyukiTanaka
2117+googleplus MichaelXavier
2118+gopherbot JohnGoerzen
2119+gpcsets BruceMcCosa
2120+gps ThomasDuBuisson
2121+gps2htmlReport RobStewart
2122+gpx-conduit ThomasDuBuisson
2123+grammar-combinators DominiqueDevriese
2124+grapefruit-examples WolfgangJeltsch
2125+grapefruit-frp WolfgangJeltsch
2126+grapefruit-records WolfgangJeltsch
2127+grapefruit-ui WolfgangJeltsch
2128+grapefruit-ui-gtk WolfgangJeltsch
2129+graph-rewriting JanRochel
2130+graph-rewriting-cl JanRochel
2131+graph-rewriting-gl JanRochel
2132+graph-rewriting-lambdascope JanRochel
2133+graph-rewriting-layout JanRochel
2134+graph-rewriting-ski JanRochel
2135+graph-rewriting-strategies JanRochel
2136+graph-rewriting-trs JanRochel
2137+graph-rewriting-ww JanRochel
2138+graph-serialize ThomasSchilling
2139+graph-utils HiromiIshii
2140+graph-visit AtzeDijkstra
2141+graph-wrapper MaxBolingbroke
2142+graphbuilder JosephAbrahamson
2143+graphics-drawingcombinators EyalLotem LukePalmer
2144+graphics-formats-collada LukePalmer
2145+graphicsFormats ConalElliott
2146+graphicstools VilleTirronen
2147+graphmod IavorDiatchki
2148+graphs EdwardKmett
2149+graphtype DmitryAstapov MaxDesyatov
2150+graphviz IvanMiljenovic MatthewSackman
2151+gravatar DonaldStewart PatrickBrisbin
2152+gray-code SergeyAstanin
2153+gray-extended AmyDeBuitleir
2154+greencard GwernBranwen SigbjornFinne
2155+greencard-lib GwernBranwen
2156+greg-client EugeneKirpichov
2157+grid AmyDeBuitleir
2158+grm BrettLetner
2159+groom EdwardYang
2160+groundhog BorisLykah
2161+groundhog-mysql BorisLykah
2162+groundhog-postgresql BorisLykah
2163+groundhog-sqlite BorisLykah
2164+groundhog-th BorisLykah
2165+groupoid StephenTetley
2166+groupoids EdwardKmett
2167+groups NathanVanDoorn
2168+gruff ClaudeHeilandAllen
2169+gruff-examples ClaudeHeilandAllen
2170+gsasl JohnMillikin
2171+gsc-weighting FelipeLessa
2172+gsl-random PatrickPerry
2173+gsl-random-fu JamesCook
2174+gsmenu TroelsHenriksen
2175+gstreamer AndyStewart AxelSimon DanielWagner DuncanCoutts
2176+gt-tools MikhailPobolovets SergeiTrofimovich
2177+gtfs KeeganMcAllister
2178+gtk AndyStewart AxelSimon DanielWagner DuncanCoutts
2179+gtk-jsinput TimothyHobbs
2180+gtk-mac-integration HamishMackenzie
2181+gtk-serialized-event AndyStewart
2182+gtk-simple-list-view TimothyHobbs
2183+gtk-toggle-button-list TimothyHobbs
2184+gtk-toy MichaelSloan
2185+gtk-traymanager TristanRavitch
2186+gtk2hs-buildtools AndyStewart AxelSimon DanielWagner DuncanCoutts
2187+gtk2hs-cast-glade MarcoSilva
2188+gtk2hs-cast-glib MarcoSilva
2189+gtk2hs-cast-gnomevfs MarcoSilva
2190+gtk2hs-cast-gtk MarcoSilva
2191+gtk2hs-cast-gtkglext MarcoSilva
2192+gtk2hs-cast-gtksourceview2 MarcoSilva
2193+gtk2hs-cast-th MarcoSilva
2194+gtk2hs-rpn MauricioAntunes
2195+gtkglext AndyStewart AxelSimon DuncanCoutts
2196+gtkimageview AndyStewart
2197+gtkrsync JohnGoerzen
2198+gtksourceview2 AndyStewart AxelSimon DanielWagner DuncanCoutts
2199+guarded-rewriting JosePedroMagalhaes
2200+guess-combinator EtienneLaurin
2201+gulcii ClaudeHeilandAllen
2202+gutenberg-fibonaccis JustinHanekom
2203+hArduino LeventErkok
2204+hBDD PeterGammie
2205+hBDD-CUDD PeterGammie
2206+hCsound JohnLato
2207+hDFA PeterGammie
2208+hF2 MarcelFourne
2209+hGelf AndyGeorges
2210+hMollom AndyGeorges
2211+hOpenPGP ClintAdams
2212+hR DylanSimon
2213+hS3 GergelyRisko GregHeartsfield
2214+hSimpleDB DavidHimmelstrup
2215+hTensor AlbertoRuiz
2216+hVOIDP QiQi
2217+hacanon-light DavidHimmelstrup
2218+hack AlbertoCorona JinjingWang
2219+hack-contrib JinjingWang
2220+hack-contrib-press BrandonBickford
2221+hack-frontend-happstack JinjingWang
2222+hack-frontend-monadcgi MichaelSnoyman
2223+hack-handler-cgi MichaelSnoyman
2224+hack-handler-epoll ToralfWittner
2225+hack-handler-evhttp BrandonBickford
2226+hack-handler-fastcgi MichaelSnoyman
2227+hack-handler-happstack JinjingWang
2228+hack-handler-hyena JinjingWang
2229+hack-handler-kibro JinjingWang
2230+hack-handler-simpleserver AlbertoCorona MichaelSnoyman UweSchmidt
2231+hack-middleware-cleanpath MichaelSnoyman
2232+hack-middleware-clientsession MichaelSnoyman
2233+hack-middleware-gzip MichaelSnoyman
2234+hack-middleware-jsonp MichaelSnoyman
2235+hack2 JinjingWang
2236+hack2-contrib JinjingWang
2237+hack2-handler-happstack-server JinjingWang
2238+hack2-handler-mongrel2-http JinjingWang
2239+hack2-handler-snap-server JinjingWang
2240+hack2-handler-warp JinjingWang
2241+hack2-interface-wai JinjingWang
2242+hackage-db PeterSimons
2243+hackage-plot DonaldStewart
2244+hackage-proxy MichaelSnoyman
2245+hackage-sparks DonaldStewart
2246+hackage2hwn DonaldStewart
2247+hackage2twitter TomLokhorst
2248+hackager DavidTerei
2249+hackport LennartKolmodin SergeiTrofimovich
2250+hactors HekaTreep
2251+haddock DavidWaern RossPaterson SimonHengel SimonMarlow
2252+haddock-leksah JuergenNicklischFranken
2253+haggis TychoAndersen
2254+haha ErikHesselink SebastiaanVisser
2255+hails AmitLevy DeianStefan
2256+hails-bin DeianStefan
2257+hake YoshikuniJujo
2258+hakismet NilsSchweinsberg
2259+hako TobiasDammers
2260+hakyll JasperVanDerJeugt
2261+hakyll-agda FrancescoMazzoli
2262+hakyll-blaze-templates SimonasKazlauskas
2263+hakyll-contrib JasperVanDerJeugt
2264+hakyll-contrib-links PiyushKurur
2265+hakyll-convert EricKow
2266+halfs GwernBranwen JoelStanley
2267+halipeto PeterSimons
2268+haltavista PaulBrauner
2269+hamlet FelipeLessa GregWeber MichaelSnoyman
2270+hampp AaronBlack
2271+hamtmap KevinWuWon
2272+hamusic SamuelSilva
2273+handa-gdata BrianBush
2274+hangman HokShunPoon
2275+hans TrevorElliott
2276+happindicator AndrewMiller
2277+happraise AllanClark
2278+happs-hsp DavidHimmelstrup
2279+happs-hsp-template DavidHimmelstrup
2280+happs-tutorial CreightonHogg ThomasHartman
2281+happstack JeremyShaw MatthewElder
2282+happstack-auth NilsSchweinsberg
2283+happstack-authenticate JeremyShaw
2284+happstack-clientsession JeremyShaw
2285+happstack-contrib MatthewElder
2286+happstack-data JeremyShaw MatthewElder
2287+happstack-dlg ChrisSmith
2288+happstack-facebook JeremyShaw
2289+happstack-fastcgi ChrisEidhof EelcoLempsink
2290+happstack-fay JeremyShaw
2291+happstack-fay-ajax JeremyShaw
2292+happstack-foundation JeremyShaw
2293+happstack-hamlet JeremyShaw
2294+happstack-heist JeremyShaw
2295+happstack-helpers CreightonHogg RussellOConnor ThomasHartman
2296+happstack-hsp JeremyShaw
2297+happstack-hstringtemplate JeremyShaw
2298+happstack-ixset JeremyShaw MatthewElder
2299+happstack-jmacro JeremyShaw
2300+happstack-lite JeremyShaw
2301+happstack-monad-peel NilsSchweinsberg
2302+happstack-plugins JeremyShaw
2303+happstack-server JeremyShaw MatthewElder
2304+happstack-server-tls JeremyShaw
2305+happstack-state JeremyShaw MatthewElder
2306+happstack-static-routing MagnusCarlsson
2307+happstack-util JeremyShaw MatthewElder
2308+happstack-yui DagOdenhall
2309+happy IavorDiatchki RossPaterson SimonMarlow
2310+happy-meta JonasDuregard
2311+harchive DavidBrown
2312+hark MarkusDittrich
2313+harp GwernBranwen NiklasBroberg
2314+harpy DirkKleeblatt MartinGrabmueller
2315+has YusakuHashimoto
2316+has-th ChrisDone
2317+hascal DagOdenhall MekeorMelire
2318+hascat FlorianMicheler
2319+hascat-lib FlorianMicheler
2320+hascat-setup FlorianMicheler
2321+hascat-system FlorianMicheler
2322+hash EdwardKmett
2323+hashable BryanOSullivan JohanTibell MilanStraka
2324+hashable-extras EdwardKmett
2325+hashable-generics ClarkGaebel
2326+hashed-storage EricKow PetrRockai
2327+hashmap MilanStraka
2328+hashring MichaelCraig
2329+hashtables GregoryCollins
2330+hasim JochemBerndsen
2331+hask-home BjornBringert IsaacJones SimonHengel
2332+haskades StephenWeber
2333+haskarrow TimothyHobbs
2334+haskdeep MauroTaraborelli
2335+haskdogs SergeyMironov
2336+haskeem UweHollerbach
2337+haskeline JudahJacobson LennartAugustsson
2338+haskeline-class AntoineLatter
2339+haskell-aliyun YiHuang
2340+haskell-bcrypt BrettCarter
2341+haskell-cnc RyanNewton
2342+haskell-coffee KevinVanRooijen
2343+haskell-docs ChrisDone
2344+haskell-ftp YiHuang
2345+haskell-in-space GwernBranwen
2346+haskell-lexer IavorDiatchki
2347+haskell-modbus JasonHickner
2348+haskell-mpi DmitryAstapov
2349+haskell-openflow BrianBrooks
2350+haskell-platform-test DonaldStewart
2351+haskell-qrencode JamesSanders
2352+haskell-src ConradParker DonaldStewart IanLynagh RossPaterson
2353+haskell-src-exts GwernBranwen NiklasBroberg
2354+haskell-src-exts-qq MathieuBoespflug
2355+haskell-src-meta BenMillwood JonasDuregard MattMorrow
2356+haskell-src-meta-mwotton MarkWotton
2357+haskell-type-exts NiklasBroberg
2358+haskell-tyrant PeterScott TravisBrady
2359+haskell-updater IvanMiljenovic SergeiTrofimovich AlexanderVershilov
2360+haskell-xmpp DmitryAstapov
2361+haskell2010 IanLynagh
2362+haskell98 IanLynagh RossPaterson
2363+haskelldb BjornBringert JustinBailey
2364+haskelldb-connect-hdbc KeiHibino
2365+haskelldb-connect-hdbc-catchio-mtl KeiHibino
2366+haskelldb-connect-hdbc-catchio-tf KeiHibino
2367+haskelldb-connect-hdbc-catchio-transformers KeiHibino
2368+haskelldb-connect-hdbc-lifted KeiHibino
2369+haskelldb-dynamic BjornBringert JustinBailey
2370+haskelldb-flat BjornBringert JustinBailey
2371+haskelldb-hdbc BjornBringert JustinBailey
2372+haskelldb-hdbc-mysql AndrewMiller
2373+haskelldb-hdbc-odbc BjornBringert JustinBailey
2374+haskelldb-hdbc-postgresql BjornBringert JustinBailey
2375+haskelldb-hdbc-sqlite3 BjornBringert JustinBailey
2376+haskelldb-hsql BjornBringert JustinBailey
2377+haskelldb-hsql-mysql BjornBringert JustinBailey
2378+haskelldb-hsql-odbc BjornBringert JustinBailey
2379+haskelldb-hsql-oracle JustinBailey
2380+haskelldb-hsql-postgresql BjornBringert JustinBailey
2381+haskelldb-hsql-sqlite BjornBringert JustinBailey
2382+haskelldb-hsql-sqlite3 BjornBringert JustinBailey
2383+haskelldb-th JustinBailey
2384+haskelldb-wx JustinBailey
2385+haskgame EyalLotem
2386+haskheap AnthonyGrimes
2387+haskoon DavidLeuschner StefanWehr
2388+haskoon-httpspec StefanWehr
2389+haskoon-salvia StefanWehr
2390+haskore HenningThielemann
2391+haskore-realtime HenningThielemann
2392+haskore-supercollider HenningThielemann
2393+haskore-synthesizer HenningThielemann
2394+haskore-vintage IavorDiatchki
2395+hasktags IanLynagh MarcWeber
2396+haslo BartoszWojcik
2397+hasloGUI BartoszWojcik
2398+hasparql-client LuizDamascena
2399+haspell JoelTaylor
2400+hastache SergeyLymar
2401+haste DavidSiegel
2402+hat OlafChitil
2403+hatt BenedictEastaugh
2404+hawitter DaikiHanda
2405+haxr BjornBringert BrentYorgey GracjanPolak SigbjornFinne
2406+haxr-th BjornBringert GracjanPolak
2407+hback NorbertWojtowicz
2408+hbayes alpheccar
2409+hbcd AndrewKay
2410+hbeanstalk GregHeartsfield
2411+hbeat TimDocker
2412+hbro koral
2413+hbro-contrib koral
2414+hburg IgorBohm
2415+hcc TomHawkins
2416+hcg-minus RohanDrape
2417+hcg-minus-cairo RohanDrape
2418+hcheat JinjingWang
2419+hcron TimoHuebel
2420+hcube ToddWegner
2421+hcwiid KiwamuOkabe
2422+hdaemonize AntonTayanovskyy FrederickRoss
2423+hdaemonize-buildfix MarkWotton
2424+hdbc-postgresql-hstore AlexanderBondarenko
2425+hdbc-tuple RickKaudewitz
2426+hdevtools BitConnor
2427+hdf RohanDrape
2428+hdigest JameySharp
2429+hdirect DonaldStewart
2430+hdis86 KeeganMcAllister
2431+hdiscount JamieTurner
2432+hdm TimothyHobbs
2433+hdph PatrickMaier
2434+hdph-closure PatrickMaier
2435+heap StephanFriedrichs
2436+heaps EdwardKmett
2437+heapsort BartonMassey
2438+hebrew-time MichaelSnoyman
2439+hecc MarcelFourne
2440+hedis FalkoPeters
2441+hedis-pile AlexanderDorofeev
2442+hedis-tags AlexanderDorofeev
2443+hedn AlexanderBondarenko
2444+heist DougBeardsley GregoryCollins
2445+heist-aeson DavidHimmelstrup
2446+heist-async DanielPatterson
2447+helisp GwernBranwen
2448+hellage JaroslavGridin
2449+hellnet JaroslavGridin
2450+hello SimonMarlow
2451+hemkay GergelyPatai
2452+hemkay-core GergelyPatai
2453+hen FedorGogolev
2454+hepevt ScottLawrence
2455+her-lexer TimothyHobbs
2456+her-lexer-parsec TimothyHobbs
2457+herbalizer DanielChoi
2458+here TaylorHedberg
2459+heredoc JamesFisher
2460+hermit AndrewFarmer AndyGill
2461+heroku GregWeber
2462+hesql ChristophBauer
2463+hetero-map LukePalmer
2464+hetris GwernBranwen
2465+hevolisa DanielNeun
2466+hevolisa-dph DanielNeun
2467+hex TaruKarttunen
2468+hexdump TimNewsham
2469+hexpat EvanMartin StephenBlackheath
2470+hexpat-iteratee StephenBlackheath
2471+hexpat-pickle StephenBlackheath
2472+hexpat-tagsoup StephenBlackheath
2473+hexquote KeeganMcAllister
2474+hfann DavidHimmelstrup OlivierBoudry
2475+hfd YurasShumovich
2476+hfiar FernandoBenavides
2477+hflags GergelyRisko
2478+hfoil GregHorn
2479+hfov JeremyApthorp
2480+hfractal ChrisHoldsworth
2481+hfsevents LuiteStegeman
2482+hfusion FacundoDominguez
2483+hg-buildpackage JohnGoerzen
2484+hgal JeanPhilippeBernardy
2485+hgalib KevinEllis
2486+hgdbmi AlexanderBernauer EvanMartin
2487+hgen GuillaumeHoffmann
2488+hgeometric DonaldStewart GwernBranwen MarcoSilva
2489+hgeometry FrankStaals
2490+hgettext VasylPasternak
2491+hgithub VoMinhThu
2492+hgl-example HenningThielemann
2493+hgom PaulBrauner
2494+hiccup KyleConsalus
2495+hichi SergeiTrofimovich
2496+hieraclus PhilippPribbernow
2497+hierarchical-clustering FelipeLessa
2498+hierarchical-clustering-diagrams FelipeLessa
2499+hiernotify PaoloVeronelli
2500+highWaterMark GwernBranwen
2501+higherorder ChrisDone
2502+highlight-versions BrentYorgey
2503+highlighter AlexSuraci GuillaumeHoffmann
2504+highlighting-kate JohnMacFarlane
2505+himerge LuisAraujo
2506+hinduce-associations-apriori RobertHensing
2507+hinduce-classifier RobertHensing
2508+hinduce-classifier-decisiontree RobertHensing
2509+hinduce-examples RobertHensing
2510+hinduce-missingh RobertHensing
2511+hinotify DonaldStewart LennartKolmodin
2512+hinstaller GwernBranwen MatthewSackman
2513+hint DanielGorin
2514+hint-server FernandoBenavides CorentinDupont
2515+hinvaders GwernBranwen
2516+hinze-streams DonaldStewart
2517+hipe FrankStaals
2518+hips PatrickPalka
2519+hircules JensPetersen
2520+hirt IvanLabath
2521+hissmetrics FelipeLessa
2522+hist-pl JakubWaszczuk
2523+hist-pl-dawg JakubWaszczuk
2524+hist-pl-fusion JakubWaszczuk
2525+hist-pl-lexicon JakubWaszczuk
2526+hist-pl-lmf JakubWaszczuk
2527+hist-pl-transliter JakubWaszczuk
2528+hist-pl-types JakubWaszczuk
2529+histogram-fill AlexeyKhudyakov
2530+histogram-fill-cereal AlexeyKhudyakov
2531+historian MaxRabkin
2532+hit VincentHanquez
2533+hjpath JaroslavGridin
2534+hjs GwernBranwen MarkWassell
2535+hjsmin AlanZimmerman
2536+hjson JaroslavGridin
2537+hjson-query YuriyIskra
2538+hlatex NicolasPouillard
2539+hlbfgsb IvanLabath
2540+hlcm AlexandreTermier
2541+hledger SimonMichael
2542+hledger-chart SimonMichael
2543+hledger-interest PeterSimons
2544+hledger-irr JoachimBreitner
2545+hledger-lib SimonMichael
2546+hledger-vty SimonMichael
2547+hledger-web SimonMichael
2548+hlibev AycanIrican
2549+hlibfam AycanIrican
2550+hlibgit2 JohnWiegley SakariJokinen
2551+hlint NeilMitchell
2552+hlogger JonKristensen
2553+hlongurl RobinGreen
2554+hls RohanDrape
2555+hly RohanDrape
2556+hmark JaroslavGridin
2557+hmarkup BjornBringert
2558+hmatrix AlbertoRuiz
2559+hmatrix-glpk AlbertoRuiz
2560+hmatrix-gsl-stats VivianMcPhail
2561+hmatrix-mmap AlanFalloon
2562+hmatrix-nipals AlanFalloon
2563+hmatrix-quadprogpp AkioTakano
2564+hmatrix-repa VivianMcPhail
2565+hmatrix-special AlbertoRuiz
2566+hmatrix-static ReinerPope
2567+hmatrix-svdlibc BenGamari
2568+hmatrix-syntax ReinerPope
2569+hmatrix-tests AlbertoRuiz
2570+hmeap RohanDrape
2571+hmeap-utils RohanDrape
2572+hmemdb MiguelMitrofanov
2573+hmidi BalazsKomuves
2574+hmk MathieuBoespflug
2575+hmm MaxRabkin MikeIzbicki
2576+hmp3 DonaldStewart IsaacJones
2577+hmpfr AlesBizjak MichalKonecny
2578+hmt RohanDrape
2579+hmt-diagrams RohanDrape
2580+hmumps AntoineLatter
2581+hnn AlpMestanogullari
2582+hnop IsaacJones
2583+hoauth DiegoSouza
2584+hoauth2 HaishengWu
2585+hobbes JasonHickner
2586+hobbits EddyWestbrook
2587+hoe HideyukiTanaka
2588+hofix-mtl NicolasFrisby
2589+hog ChrisDone
2590+hogg ConradParker
2591+hogre AnttiSalonen
2592+hogre-examples AnttiSalonen
2593+hois DavidEichmann
2594+homeomorphic NeilMitchell
2595+hommage DanielVanDenEijkel DonaldStewart
2596+hommage-ds DanielVanDenEijkel
2597+honk ChrisWong
2598+hood AndyGill
2599+hoodle IanWooKim
2600+hoodle-builder IanWooKim
2601+hoodle-core IanWooKim
2602+hoodle-parser IanWooKim
2603+hoodle-publish IanWooKim
2604+hoodle-render IanWooKim
2605+hoodle-types IanWooKim
2606+hoogle NeilMitchell
2607+hoopl IanLynagh NormanRamsey
2608+hoovie PeterVanDenBrand
2609+hopencc PaulMeng
2610+hopencl MartinDybdal
2611+hopenssl GwernBranwen PeterSimons
2612+hosc HenningThielemann PaoloVeronelli RohanDrape
2613+hosc-json RohanDrape
2614+hosc-utils RohanDrape
2615+hostname MaxBolingbroke
2616+hosts-server YiHuang
2617+hothasktags JohnLato LukePalmer
2618+hotswap MikeLedger
2619+hp2any-core GergelyPatai
2620+hp2any-graph GergelyPatai
2621+hp2any-manager GergelyPatai
2622+hp2html IavorDiatchki
2623+hp2pretty ClaudeHeilandAllen
2624+hpaco TobiasDammers
2625+hpaco-lib TobiasDammers
2626+hpage FernandoBenavides
2627+hpapi MichaelAdams
2628+hpaste DonaldStewart ChrisDone
2629+hpasteit PatrickPalka
2630+hpc IanLynagh RossPaterson
2631+hpc-strobe ThorkilNaur
2632+hpc-tracer AndyGill
2633+hplaylist TimChevalier
2634+hpodder JohnGoerzen
2635+hprotoc ChrisKuklewicz DavidFeng-2.0.15
2636+hps RohanDrape
2637+hps-cairo RohanDrape
2638+hps-kmeans RodrigoGadea
2639+hpuz ChrisCasinghino
2640+hpygments DavidLazar
2641+hpylos BartoszWojcik
2642+hpyrg MatveyAksenov
2643+hquantlib PavelRyzhov
2644+hquery TychoAndersen
2645+hranker RobinGreen
2646+hricket AnthonyGrimes
2647+hs-GeoIP OzgunAtaman
2648+hs-bibutils AndreaRossato
2649+hs-captcha IreneKnapp
2650+hs-cdb AdamSmith
2651+hs-dotnet SigbjornFinne
2652+hs-excelx MarkBaran
2653+hs-ffmpeg VasylPasternak
2654+hs-fltk GwernBranwen
2655+hs-gchart DeepakJois
2656+hs-gizapp EricKow
2657+hs-java IlyaPortnov
2658+hs-json-rpc LoicArjanen
2659+hs-logo DeepakJois
2660+hs-pgms BertramFelgenhauer
2661+hs-pkpass VincentAmbo
2662+hs-twitter SigbjornFinne
2663+hs-twitterarchiver DeepakJois
2664+hs-vcard MichaelSchade
2665+hs2bf DaikiHanda
2666+hs2dot OscarFinnsson
2667+hsConfigure YoshikuniJujo
2668+hsSqlite3 EvgenyJukov MauricioAntunes
2669+hsXenCtrl ThomasDuBuisson
2670+hsb2hs JohnMacFarlane
2671+hsbackup PetrRockai
2672+hsc2hs RossPaterson ThomasDuBuisson
2673+hsc3 HenningThielemann RohanDrape
2674+hsc3-auditor RohanDrape
2675+hsc3-cairo RohanDrape
2676+hsc3-db RohanDrape
2677+hsc3-dot RohanDrape
2678+hsc3-graphs RohanDrape
2679+hsc3-lang RohanDrape
2680+hsc3-plot RohanDrape
2681+hsc3-process StefanKersten
2682+hsc3-rec RohanDrape
2683+hsc3-rw RohanDrape
2684+hsc3-server StefanKersten
2685+hsc3-sf RohanDrape
2686+hsc3-sf-hsndfile RohanDrape
2687+hsc3-unsafe RohanDrape
2688+hsc3-utils RohanDrape
2689+hscamwire FrederickRoss
2690+hscassandra KirkPeterson
2691+hscd SebastianMagri
2692+hsclock DonaldStewart
2693+hscolour DonaldStewart MalcolmWallace
2694+hscope BorisSukholitko
2695+hscrtmpl DinoMorelli
2696+hscurses AndreaVezzosi BertramFelgenhauer DinoMorelli GwernBranwen StefanWehr
2697+hscurses-fish-ex DinoMorelli
2698+hsdif RohanDrape
2699+hsdip GwernBranwen
2700+hsdns GwernBranwen PeterSimons
2701+hsdns-cache VladimirShabanov
2702+hsemail GwernBranwen PeterSimons
2703+hsemail-ns JoeFredette
2704+hsenv TaylorHedberg
2705+hsfacter SimonMarechal
2706+hsfcsh YurasShumovich
2707+hsgnutls AustinSeipp GwernBranwen
2708+hsgsom StephanGuenther
2709+hsgtd MichaelLesniak
2710+hsharc RohanDrape
2711+hsignal VivianMcPhail
2712+hsini MagnusTherning
2713+hskeleton RobinGreen
2714+hslackbuilder AndreaRossato
2715+hslibsvm StephanGuenther
2716+hslogger JohnGoerzen
2717+hslogger-template BrianLewis
2718+hslogger4j BjornBuckwalter
2719+hslogstash SimonMarechal
2720+hslua GracjanPolak OmerAgacan
2721+hsmagick TimChevalier VincentGerard
2722+hsmtpclient MassimoZaniboni
2723+hsndfile StefanKersten
2724+hsndfile-storablevector StefanKersten
2725+hsndfile-vector StefanKersten
2726+hsnoise ColinHill
2727+hsns AustinSeipp
2728+hsntp GwernBranwen
2729+hsp GwernBranwen JeremyShaw NiklasBroberg
2730+hsp-cgi NiklasBroberg
2731+hsparklines HiteshJasani
2732+hsparql JeffWheeler RobStewart
2733+hspear RohanDrape
2734+hspec GregWeber SimonHengel TrystanSpangler
2735+hspec-discover SimonHengel
2736+hspec-expectations SimonHengel
2737+hspec-experimental SimonHengel
2738+hspec-jenkins KoheiSuzuki
2739+hspec-meta SimonHengel
2740+hspec-shouldbe SimonHengel
2741+hspr-sh GwernBranwen
2742+hspread AndreaVezzosi DavidHimmelstrup
2743+hspresent EvanKlitzke
2744+hsql BjornBringert ChrisDone NickRudnick
2745+hsql-mysql BjornBringert ChrisDone NickRudnick
2746+hsql-odbc BjornBringert NickRudnick
2747+hsql-postgresql BjornBringert NickRudnick
2748+hsql-sqlite3 BjornBringert NickRudnick
2749+hsqml RobinKay
2750+hsqml-morris RobinKay
2751+hsshellscript VolkerWysk
2752+hssourceinfo YoshikuniJujo
2753+hssqlppp JakeWheat
2754+hstatistics VivianMcPhail
2755+hstats MarshallBeddoe
2756+hstatsd JamesCook
2757+hstest DaveHinton
2758+hstidy MattMorrow
2759+hstyle DougBeardsley JasperVanDerJeugt
2760+hstzaar PedroVasconcelos
2761+hsubconvert JohnWiegley
2762+hswip EvgenyTarasov
2763+hsx NiklasBroberg
2764+hsx-jmacro JeremyShaw
2765+hsx-xhtml NiklasBroberg
2766+hsx2hs NiklasBroberg JeremyShaw
2767+hsyscall AycanIrican
2768+hsyslog PeterSimons
2769+hszephyr NelsonElhage
2770+htags DavidSankel
2771+htar BjornBringert DuncanCoutts
2772+htiled ChristianRoedliAmble
2773+htime JosePedroMagalhaes
2774+html DonaldStewart RossPaterson
2775+html-conduit MichaelSnoyman
2776+html-kure AndyGill
2777+html-minimalist RohanDrape
2778+html-truncate MarcelRuegenberg
2779+html2hamlet HideyukiTanaka
2780+htodo YoichiHirai
2781+htrace EugeneKirpichov
2782+hts RohanDrape
2783+http-accept StephenWeber
2784+http-client-auth MiguelMitrofanov
2785+http-conduit MichaelSnoyman
2786+http-conduit-browser MikhailKuddah MylesMaxfield
2787+http-conduit-downloader VladimirShabanov
2788+http-date KazuYamamoto
2789+http-enumerator MichaelSnoyman
2790+http-monad HenningThielemann
2791+http-proxy ErikDeCastroLopo
2792+http-reverse-proxy MichaelSnoyman
2793+http-server IavorDiatchki TrevorElliott
2794+http-shed AndyGill
2795+http-streams AndrewCowie
2796+http-types AristidBreitkreuz
2797+http-wget MichaelSnoyman
2798+httpd-shed AndyGill
2799+httpspec DavidLeuschner StefanWehr
2800+htune PetrRockai
2801+htzaar TomHawkins
2802+hub ChrisDornan
2803+hubigraph KoheiOzaki
2804+hubris MarkWotton
2805+huffman MaximeHenrion
2806+hugs2yc DmitryGolubovsky
2807+hulk ChrisDone
2808+hums BardurArantsson
2809+hunit-gui KimWallmark
2810+hunit-parsec NathanWilcox
2811+hunit-rematch TomCrayford
2812+hunp DenizDogan
2813+hurdle StephenTetley
2814+husk-scheme JustinEthier
2815+husk-scheme-libs JustinEthier
2816+husky MarkusDittrich
2817+hweblib AycanIrican
2818+hws SimonMarlow
2819+hxmppc NicolasPouillard
2820+hxournal IanWooKim
2821+hxt IsaacJones UweSchmidt
2822+hxt-binary UweSchmidt
2823+hxt-cache UweSchmidt
2824+hxt-charproperties UweSchmidt
2825+hxt-curl UweSchmidt
2826+hxt-expat UweSchmidt
2827+hxt-extras ThomasDuBuisson TonyMorris
2828+hxt-filter UweSchmidt
2829+hxt-http UweSchmidt
2830+hxt-regex-xmlschema UweSchmidt
2831+hxt-relaxng UweSchmidt
2832+hxt-tagsoup UweSchmidt
2833+hxt-unicode UweSchmidt
2834+hxt-xpath UweSchmidt
2835+hxt-xslt UweSchmidt
2836+hxthelper StefanWehr
2837+hxweb DavidHimmelstrup
2838+hyahtzee DamienCassou
2839+hyakko JeremyHull
2840+hybrid GwernBranwen
2841+hydra-print RyanNewton
2842+hyena JohanTibell
2843+hylolib GuillaumeHoffmann
2844+hylotab GuillaumeHoffmann
2845+hyloutils GuillaumeHoffmann
2846+hyperdrive JeremyShaw
2847+hyperloglog EdwardKmett
2848+hyperpublic MichaelCraig
2849+hyphenate RohanDrape
2850+hyphenation EdwardKmett
2851+i18n EugeneGrigoriev
2852+iCalendar ChristianRoedliAmble ClintAdams EelcoLempsink
2853+iException MarcoSilva
2854+iconv DuncanCoutts IanLynagh
2855+ideas AlexGerdes JohanJeuring BastiaanHeeren
2856+idiii AlexeyAlekhin BartonMassey ChrisWagner
2857+idna GeorgePollard
2858+idna2008 JonKristensen
2859+idris EdwinBrady
2860+ieee PatrickPerry
2861+ieee-utils MattMorrow
2862+ieee754 PatrickPerry
2863+ieee754-parser JohnMillikin
2864+iff HenningThielemann
2865+ige-mac-integration HamishMackenzie
2866+igraph NilsSchweinsberg
2867+ihttp ErtugrulSoeylemez
2868+illuminate JohnMacFarlane
2869+imagefilters TimChannell
2870+imagemagick AlexanderVershilov
2871+imagepaste YuriBochkarev
2872+imagesize-conduit MichaelSnoyman
2873+imapget FacundoDominguez
2874+imbib JeanPhilippeBernardy
2875+imgurder DanColish
2876+imm koral
2877+implicit ChristopherOlah
2878+implicit-params ShaneOBrien
2879+improve TomHawkins
2880+inch AdamGundry
2881+incremental-parser MarioBlazevic
2882+incremental-sat-solver SebastianFischer
2883+indentparser PiyushKurur
2884+indents SamAnklesaria
2885+index-core GabrielGonzalez
2886+indexed ReinerPope
2887+indexed-do-notation FumiakiKinoshita
2888+indexed-extras ReinerPope
2889+indexed-free FumiakiKinoshita
2890+infinite-search LukePalmer
2891+infinity AustinSeipp
2892+infix GwernBranwen
2893+inflist JamesFisher
2894+instant-generics JosePedroMagalhaes
2895+instant-zipper BramSchuur
2896+instinct ErtugrulSoeylemez
2897+integration EdwardKmett
2898+intel-aes RyanNewton
2899+interleavableGen MarcoSilva
2900+interleavableIO MarcoSilva
2901+interleave NeilBrown
2902+interlude GwernBranwen KetilMalde
2903+intern EdwardKmett
2904+internetmarke HenningThielemann
2905+interpol AlexandruScvortov
2906+interpolatedstring-perl6 AudreyTang
2907+interpolatedstring-qq ErikCharlebois
2908+interpolatedstring-qq-mwotton MarkWotton
2909+intervals EdwardKmett
2910+invariant NicolasFrisby
2911+invertible-syntax TillmannRendel
2912+io-capture YusakuHashimoto
2913+io-choice KazuYamamoto
2914+io-memoize DanBurton
2915+io-reactive AndyGill
2916+io-storage WillDonnelly
2917+io-streams GregoryCollins
2918+ioctl MaciejPiechotka
2919+iotransaction DylanShearer
2920+ip6addr MichelBoucey
2921+ipatch JoachimBreitner
2922+ipc ThomasDuBuisson
2923+ipopt-hs AdamVogt
2924+ipprint GlebAlexeyev SpencerJanssen
2925+iproute KazuYamamoto
2926+iptables-helpers EvgenyTarasov
2927+iptadmin EvgenyTarasov
2928+irc TrevorElliott
2929+irc-bytestring AdamCurtis
2930+ircbot JeremyShaw
2931+ircbouncer ChrisDone
2932+isevaluated BertramFelgenhauer SveinOveAas
2933+ismtp ErtugrulSoeylemez
2934+iso3166-country-codes JonFairbairn
2935+isohunt ReinerPope
2936+iterIO AmitLevy DavidMazieres
2937+iteratee JohnLato
2938+iteratee-compress JohnLato MaciejPiechotka
2939+iteratee-mtl JohnLato
2940+iteratee-parsec MaciejPiechotka
2941+iteratee-stm JohnLato
2942+iterio-server AmitLevy
2943+ivar-simple BertramFelgenhauer
2944+ivor EdwinBrady GwernBranwen
2945+ivy-web JamesDeng
2946+ix-shapable TracyWadleigh
2947+ixdopp JesseTov
2948+ixset JeremyShaw
2949+iyql DiegoSouza
2950+jack HenningThielemann
2951+jack-bindings PhilippBalzarek
2952+jackminimix RenickBell
2953+jail SebastiaanVisser
2954+jailbreak-cabal PeterSimons
2955+jalla ChristianGosch
2956+jarfind EugeneKirpichov
2957+java-character TonyMorris
2958+jdi VictorDenisov
2959+jmacro GershomBazerman SterlingClover
2960+jmacro-rpc GershomBazerman
2961+jmacro-rpc-happstack GershomBazerman
2962+jmacro-rpc-snap GershomBazerman
2963+join MartinSulzmann
2964+joinlist StephenTetley
2965+jonathanscard MichaelSchade
2966+jort JeanPhilippeBernardy
2967+jpeg AtzeDijkstra
2968+js-good-parts SeanSeefried
2969+jsmw DmitryGolubovsky
2970+json DonaldStewart IavorDiatchki SigbjornFinne
2971+json-b JasonDusek
2972+json-builder LeonSmith
2973+json-enumerator MichaelSnoyman
2974+json-fu SimonHengel
2975+json-qq OscarFinnsson
2976+json-tools NicolasPouillard
2977+json-types JohnMillikin
2978+json2 YuriyIskra
2979+json2-hdbc YuriyIskra
2980+json2-types YuriyIskra
2981+json2yaml MichaelSnoyman
2982+jsonrpc-conduit GabrieleSales
2983+jspath KeeganMcAllister
2984+judy DonaldStewart
2985+kan-extensions EdwardKmett
2986+kangaroo StephenTetley
2987+kansas-comet AndyGill
2988+kansas-lava AndyGill
2989+kansas-lava-cores AndyGill
2990+kbq-gu AndriiZvorygin
2991+keter MichaelSnoyman
2992+kevin JoelTaylor
2993+keys EdwardKmett
2994+keyvaluehash EyalLotem
2995+kibro ChrisDone
2996+kickass-torrents-dump-parser MichaelXavier
2997+kinds WolfgangJeltsch
2998+kit NickPartridge
2999+kmeans GershomBazerman MaxRabkin
3000+kmeans-vector AlpMestanogullari
3001+knob JohnMillikin
3002+korfu KetilMalde
3003+kqueue ErikHesselink
3004+ks-test JamesCook
3005+kure AndyGill NeilSculthorpe
3006+kure-your-boilerplate AndyGill
3007+kyotocabinet FrancescoMazzoli
3008+l-bfgs-b GardSpreemann
3009+labeled-graph JeanPhilippeBernardy
3010+labeled-tree JeanPhilippeBernardy
3011+labyrinth AlexeyKotlyarov
3012+lagrangian JonathanFischoff
3013+lambda-ast JonathanFischoff
3014+lambda-bridge AndyGill
3015+lambda-canvas DimitrySolovyov
3016+lambda-toolbox JulianFleischer
3017+lambda2js MatejKollar
3018+lambdaFeed DonaldStewart
3019+lambdabot DmitryMalikov GwernBranwen IsaacJones JamesCook
3020+lambdabot-utils GwernBranwen JanStolarek
3021+lambdacat AndreasBaldeau
3022+lambdacube LennartAugustsson
3023+lambdacube-bullet CsabaHruska
3024+lambdacube-engine CsabaHruska GergelyPatai
3025+lambdacube-examples CsabaHruska
3026+lambdiff JamieTurner
3027+language-asn1 DmitryAstapov
3028+language-boogie NadiaPolikarpova
3029+language-c BenediktHuber
3030+language-c-comments GeoffHulette MatthewSottile
3031+language-c-quote GeoffreyMainland
3032+language-cil TomLokhorst
3033+language-css AntonKholomiov
3034+language-dot BrianLewis
3035+language-ecmascript AndreyChudnov ArjunGuha
3036+language-eiffel ScottWest
3037+language-glsl VoMinhThu
3038+language-go AndrewRobbins
3039+language-guess ChristianRoedliAmble
3040+language-haskell-extract OscarFinnsson
3041+language-java NiklasBroberg VincentHanquez
3042+language-java-classfile GergoErdi
3043+language-javascript AlanZimmerman
3044+language-lua OmerAgacan
3045+language-objc JohnLato
3046+language-puppet SimonMarechal
3047+language-python BerniePope
3048+language-python-colour BerniePope
3049+language-sh StephenHicks
3050+language-slice PaulKoerbitz
3051+language-spelling FrancescoMazzoli
3052+language-sqlite IreneKnapp
3053+largeword DominicSteinitz
3054+lat MagnusTherning
3055+latex HenningThielemann
3056+lattices MaxBolingbroke
3057+lax WolfgangJeltsch
3058+layers ShaneOBrien
3059+layout RobertHensing
3060+layout-bootstrap AlexanderBondarenko
3061+lazy-csv MalcolmWallace
3062+lazy-io JakubWaszczuk
3063+lazyarray MilanStraka
3064+lazyio HenningThielemann
3065+lazysmallcheck GwernBranwen MatthewNaylor
3066+lazysplines GershomBazerman
3067+lbfgs DanielDeKok
3068+lca EdwardKmett
3069+lcs IanLynagh
3070+lda GrzegorzChrupala
3071+ldif RadoslavDorcik
3072+leaf DimitriSabadie
3073+leapseconds-announced BjornBuckwalter
3074+learn AugustusOdena
3075+leksah HamishMackenzie JuergenNicklischFranken
3076+leksah-server HamishMackenzie JuergenNicklischFranken
3077+lens EdwardKmett
3078+lens-aeson EdwardKmett
3079+lens-family RussellOConnor
3080+lens-family-core RussellOConnor
3081+lens-family-th DanBurton
3082+lenses JobVranish
3083+level-monad SebastianFischer
3084+leveldb-haskell KimAltintop
3085+levmar BasVanDijk
3086+levmar-chart RoelVanDijk
3087+lgtk PeterDivianszky
3088+lha ScottLawrence
3089+lhae AlexanderBau
3090+lhc AustinSeipp DavidHimmelstrup
3091+lhe ScottLawrence
3092+lhs2TeX-hl AlessandroVermeulen
3093+lhs2tex AndresLoeh
3094+libGenI EricKow
3095+libcspm ThomasGibsonRobinson
3096+libexpect StephenRoantree
3097+libffi RemiTurk
3098+libgit VincentHanquez
3099+liblastfm DmitryMalikov MatveyAksenov
3100+liblinear-enumerator NathanHowell
3101+libltdl GeoffreyMainland
3102+libmpd BenSinclair JoachimFasting SimonHengel
3103+libnotify MatveyAksenov
3104+liboleg DonaldStewart
3105+libpq GrantMonroe
3106+librandomorg MatveyAksenov
3107+libssh2 IlyaPortnov
3108+libssh2-conduit IlyaPortnov
3109+libstackexchange MatveyAksenov
3110+libsystemd-daemon CedricStaub
3111+libtagc AndyStewart
3112+libvirt-hs IlyaPortnov
3113+libxml DavidHimmelstrup DonaldStewart
3114+libxml-enumerator JohnMillikin
3115+libxml-sax JohnMillikin
3116+libxslt ChrisDone
3117+life ChuckAdams
3118+lifted-async MitsutoshiAoe
3119+lifted-base BasVanDijk
3120+lifter EdwinBrady
3121+ligd SeanLeather
3122+lighttpd-conf MattMorrow
3123+lighttpd-conf-qq MattMorrow
3124+lin-alg JasonDagit
3125+linda LennartSchmitt
3126+line2pdf AudreyTang
3127+linear AnthonyCowley EdwardKmett
3128+linear-algebra-cblas CarterSchonwald
3129+linear-maps PeterDivianszky ZsoltDollenstein
3130+linearEqSolver LeventErkok
3131+linkchk GwernBranwen
3132+linkcore TimChevalier
3133+linux-blkid NicolaSquartini
3134+linux-kmod NicolaSquartini
3135+linux-mount NicolaSquartini
3136+linux-perf MikolajKonarski
3137+linux-ptrace RichardSmith
3138+linux-xattr NicolaSquartini
3139+lio AmitLevy DeianStefan
3140+lio-eci11 AlejandroRusso
3141+lispparser EricKow
3142+list-extras WrenThornton
3143+list-grouping BrandonSimmons
3144+list-mux ChrisHeller
3145+list-tries MattiNiemenmaa
3146+listlike-instances JohnLato
3147+literals JulianFleischer
3148+live-sequencer HenningThielemann
3149+llrbtree KazuYamamoto
3150+llsd BryanOSullivan
3151+llvm BenjaminSaunders BryanOSullivan HenningThielemann LennartAugustsson CarterSchonwald
3152+llvm-base BenjaminSaunders BryanOSullivan CarterSchonwald
3153+llvm-base-util PaulMeng
3154+llvm-extra HenningThielemann
3155+llvm-ht HenningThielemann
3156+llvm-tf HenningThielemann
3157+loadavg KrzysztofSkrzetnicki
3158+local-address KeiHibino
3159+local-search RichardSenington
3160+loch DonaldStewart
3161+loch-th TomasJanousek
3162+lockfree-queue RyanNewton
3163+log-domain EdwardKmett
3164+log2json HaroldLee
3165+logfloat WrenThornton
3166+logic-TPTP DanielSchuessler KiYungAhn
3167+logic-classes DavidFox
3168+logicst AndySonnenburg
3169+logict DanDoel
3170+lojban ChrisDone
3171+lojbanParser YoshikuniJujo
3172+lojbanXiragan YoshikuniJujo
3173+lojysamban YoshikuniJujo
3174+loli JinjingWang
3175+loop-while NeilBrown
3176+loopy EmilyMitchell
3177+loris JohnLato
3178+lostcities PedroVasconcelos
3179+lrucache CarlHowells
3180+ls-usb RoelVanDijk
3181+lscabal DonaldStewart
3182+lsystem CarlosGomez
3183+ltk HamishMackenzie JuergenNicklischFranken
3184+ltl TomHawkins
3185+luachunk AnupamJain
3186+luautils AnupamJain
3187+lub ConalElliott
3188+lucienne AlexanderBau
3189+luhn HenryBucklow
3190+lui EyalLotem
3191+luka JinjingWang
3192+lushtags BitConnor
3193+lvmlib JurriaanHage
3194+lye CorbinSimpson
3195+lz4 MarkWotton
3196+lzma-conduit NathanHowell
3197+lzma-enumerator NathanHowell
3198+maccatcher JasonDusek
3199+machines EdwardKmett
3200+macho ErikCharlebois
3201+macosx-make-standalone AtzeDijkstra
3202+mage GwernBranwen
3203+magic JohnGoerzen
3204+mahoro OlegIvanov
3205+maid JinjingWang
3206+mainland-pretty GeoffreyMainland
3207+majordomo MarkWotton
3208+majority NisWegmann
3209+make-hard-links FelipeLessa
3210+makedo EricKow
3211+manatee AndyStewart
3212+manatee-all AndyStewart
3213+manatee-anything AndyStewart
3214+manatee-browser AndyStewart
3215+manatee-core AndyStewart
3216+manatee-curl AndyStewart
3217+manatee-editor AndyStewart
3218+manatee-filemanager AndyStewart
3219+manatee-imageviewer AndyStewart
3220+manatee-ircclient AndyStewart
3221+manatee-mplayer AndyStewart
3222+manatee-pdfviewer AndyStewart
3223+manatee-processmanager AndyStewart
3224+manatee-reader AndyStewart
3225+manatee-template AndyStewart
3226+manatee-terminal AndyStewart
3227+manatee-welcome AndyStewart
3228+mancala JulianaLucena
3229+mandulia ClaudeHeilandAllen
3230+marionetta PaoloVeronelli
3231+markdown MichaelSnoyman
3232+markdown-unlit SimonHengel
3233+marked-pretty AndyGill
3234+markov IlyaPortnov
3235+markov-chain HenningThielemann
3236+marxup JeanPhilippeBernardy
3237+mastermind PaoloVeronelli
3238+matchers OmariNorman
3239+math-functions BryanOSullivan
3240+mathblog JonathanDaugherty
3241+mathgenealogy PeterRobinson
3242+mathlink TracyWadleigh
3243+matlab DylanSimon
3244+matrix DanielDiaz
3245+matrix-market PatrickPerry
3246+matrix-market-pure SergeyAstanin
3247+matsuri OlegIvanov
3248+maude DavidLazar
3249+maxent JonathanFischoff
3250+maximal-cliques GershomBazerman
3251+maybench EricKow
3252+mbox GershomBazerman
3253+mbox-tools NicolasPouillard
3254+mcmc-synthesis TikhonJelvis
3255+mcpi DouglasBurke
3256+mdo AudreyTang
3257+mecab HideyukiTanaka
3258+mecha TomHawkins
3259+mediawiki SigbjornFinne
3260+mega-sdist MichaelSnoyman
3261+meldable-heap JimApple
3262+memcached AlsonKemp OlegKatsitadze
3263+memo-sqlite ClaudeHeilandAllen
3264+memoize JesseTov
3265+memscript KiYungAhn
3266+mersenne-random DonaldStewart
3267+mersenne-random-pure64 DonaldStewart
3268+meta-par RyanNewton
3269+meta-par-accelerate RyanNewton
3270+metadata KatsutoshiItoh
3271+metamorphic DrewDay
3272+metaplug AustinSeipp
3273+metronome PaoloVeronelli
3274+microbench EvanMartin
3275+microtimer AustinSeipp
3276+midi HenningThielemann
3277+midi-alsa HenningThielemann
3278+midimory HenningThielemann
3279+mighttpd KazuYamamoto
3280+mighttpd2 KazuYamamoto
3281+miku JinjingWang
3282+mime DonaldStewart IavorDiatchki SigbjornFinne
3283+mime-directory MathieuBoespflug
3284+mime-mail MichaelSnoyman
3285+mime-mail-ses MichaelSnoyman
3286+mime-string IanLynagh
3287+mime-types MichaelSnoyman
3288+mines AnttiSalonen
3289+minesweeper PeterDivianszky
3290+miniball GardSpreemann
3291+minimorph EricKow
3292+minimung YakovZaytsev
3293+minions JasonHickner
3294+miniplex LukasMai
3295+minirotate KrzysztofSkrzetnicki
3296+ministg BerniePope
3297+miniutter MikolajKonarski
3298+misfortune JamesCook
3299+missing-foreign JasonDagit
3300+mix-arrows MiguelMitrofanov
3301+mixed-strategies BartonMassey
3302+mkbndl ThomasDavie
3303+mkcabal DonaldStewart
3304+ml-w FrancescoMazzoli
3305+mlist EyalLotem
3306+mmap GracjanPolak
3307+mmorph GabrielGonzalez
3308+mmtl MauroJaskelioff
3309+mmtl-base MatthewFarkasDyck
3310+modsplit DmitryGolubovsky
3311+modular-arithmetic TikhonJelvis
3312+modular-prelude DanBurton
3313+modular-prelude-classy DanBurton
3314+moe JinjingWang
3315+mohws GwernBranwen HenningThielemann
3316+monad-abort-fd MikhailVorozhtsov
3317+monad-atom GrzegorzChrupala
3318+monad-atom-simple GrzegorzChrupala
3319+monad-bool JohnWiegley
3320+monad-codec JakubWaszczuk
3321+monad-control BasVanDijk
3322+monad-coroutine MarioBlazevic
3323+monad-exception ShaneOBrien
3324+monad-fork ShaneOBrien
3325+monad-interleave PatrickPerry
3326+monad-logger MichaelSnoyman
3327+monad-loops JamesCook
3328+monad-lrs BinJin
3329+monad-memo EduardSergeev
3330+monad-mersenne-random DonaldStewart
3331+monad-ox JakubWaszczuk
3332+monad-par RyanNewton SimonMarlow
3333+monad-par-extras RyanNewton
3334+monad-parallel MarioBlazevic
3335+monad-param DominiqueDevriese EdwardKmett
3336+monad-peel AndersKaseorg
3337+monad-primitive AlexeyKhudyakov
3338+monad-products EdwardKmett
3339+monad-ran EdwardKmett
3340+monad-st EdwardKmett
3341+monad-state ByronJohnson
3342+monad-statevar JoeyAdams
3343+monad-stlike-io TaruKarttunen
3344+monad-stlike-stm TaruKarttunen
3345+monad-stm MiguelMitrofanov
3346+monad-supply GeoffHulette
3347+monad-task PaulLiu
3348+monad-tx MattMorrow
3349+monad-wrap DavidMazieres
3350+monadIO ThomasDuBuisson TrevorElliott
3351+monadLib IavorDiatchki IsaacJones
3352+monadLib-compose AristidBreitkreuz
3353+monadacme ThomasEding
3354+monadbi AnupamJain
3355+monadcryptorandom ThomasDuBuisson
3356+monadenv GwernBranwen
3357+monadfibre AnupamJain
3358+monadic-arrays EdwardKmett
3359+monadiccp MaikRiechert PieterWuille TomSchrijvers
3360+monadio-unwrappable AndrewMiller
3361+monadlist ThomasEding
3362+monadloc PepeIborra
3363+monadloc-pp PepeIborra
3364+monads-fd RossPaterson
3365+monads-tf RossPaterson
3366+monadtransform TonyMorris
3367+monarch NoriyukiOhkawa
3368+mongoDB FedorGogolev ScottParish TonyHannan
3369+mongrel2-handler BardurArantsson
3370+monitor MartinStensgard
3371+monoid-extras BrentYorgey
3372+monoid-owns JinjingWang
3373+monoid-record RobinGreen
3374+monoid-statistics AlexeyKhudyakov
3375+monoid-subclasses MarioBlazevic
3376+monoid-transformer HenningThielemann
3377+monoidplus AaronBlack
3378+monoids DanielWagner EdwardKmett
3379+monomorphic HiromiIshii
3380+montage ErinDahlgren
3381+montage-client ErinDahlgren
3382+monte-carlo PatrickPerry
3383+morfette GrzegorzChrupala
3384+morfeusz JakubWaszczuk
3385+mount NicolaSquartini
3386+mp3decoder BjornEdstrom
3387+mpdmate GwernBranwen
3388+mpppc DarinMorrison
3389+mprover AdamProcter
3390+mps JinjingWang
3391+msgpack HideyukiTanaka
3392+msgpack-idl HideyukiTanaka
3393+msgpack-rpc HideyukiTanaka
3394+mstate NilsSchweinsberg
3395+mtl DonaldStewart EdwardKmett IanLynagh RossPaterson
3396+mtl-evil-instances ShaneOBrien
3397+mtl-tf TrevorElliott
3398+mtlparse YoshikuniJujo
3399+mtlx MarkSnyder
3400+mtp JoachimFasting
3401+mtree RahulGopinath
3402+mucipher AndrewRobbins
3403+mueval GwernBranwen
3404+multiarg OmariNorman
3405+multifocal HugoPacheco
3406+multipass EdwardKmett
3407+multiplate RussellOConnor
3408+multiplate-simplified BalazsEndresz
3409+multiplicity DinoMorelli
3410+multirec AndresLoeh JosePedroMagalhaes
3411+multirec-alt-deriver DanielSchuessler
3412+multirec-binary SebastiaanVisser
3413+multiset TwanVanLaarhoven
3414+multiset-comb BrentYorgey
3415+multisetrewrite MartinSulzmann
3416+murder MarcosViera
3417+murmur-hash ThomasSchilling
3418+murmurhash3 NisWegmann
3419+music-diatonic PatrickLeBoutillier
3420+music-pitch-literal HansHoglund
3421+musicbrainz-email OliverCharles
3422+musicxml SamuelSilva
3423+mustache2hs StephenWeber
3424+mutable-iter JohnLato
3425+mute-unmute KrzysztofSkrzetnicki
3426+mvclient ChrisSmith
3427+mwc-random BryanOSullivan
3428+mwc-random-monad AlexeyKhudyakov
3429+mybitcoin-sci DavidHimmelstrup
3430+mysnapsession ChrisSmith
3431+mysnapsession-example ChrisSmith
3432+mysql BryanOSullivan
3433+mysql-simple BryanOSullivan
3434+n-m MarcoSilva
3435+named-formlet ChrisDone
3436+named-lock ThomasSchilling
3437+named-records JulianFleischer
3438+names JulianFleischer
3439+nano-cryptr CarlHowells
3440+nano-hmac HiteshJasani
3441+nano-md5 DonaldStewart
3442+nanoAgda JeanPhilippeBernardy
3443+nanocurses GwernBranwen
3444+nanoparsec MaciejPiechotka
3445+nanospec SimonHengel
3446+narc EzraCooper
3447+nat JanChristiansen
3448+nats EdwardKmett
3449+natural-number GregoryCrosswhite
3450+natural-numbers WolfgangJeltsch
3451+natural-sort JohnMillikin
3452+naturals ChristopherHoward
3453+nbt AdamFoltzer
3454+ncurses JohnMillikin
3455+neat-interpolation NikitaVolkov
3456+nehe-tuts JasonDagit
3457+neither MichaelSnoyman
3458+nemesis JinjingWang
3459+nerf JakubWaszczuk
3460+net-concurrent PaulSonkoly
3461+netclock AlexMcLean
3462+netcore ArjunGuha
3463+netlines ErtugrulSoeylemez
3464+netlink MaximTreskin
3465+netlist AndyGill PhilipWeaver
3466+netlist-to-vhdl AndyGill PhilipWeaver
3467+netpbm NiklasHambuechen
3468+netspec DanBurton
3469+netstring-enumerator JohnMillikin
3470+nettle-frp AndreasVoellmy
3471+nettle-netkit AndreasVoellmy
3472+nettle-openflow AndreasVoellmy
3473+netwire ErtugrulSoeylemez
3474+network BryanOSullivan DuncanCoutts IanLynagh JohanTibell RossPaterson
3475+network-address SebastianNowicki
3476+network-api-support MarkHibberd
3477+network-bitcoin ClarkGaebel MichaelHendricks
3478+network-bytestring JohanTibell
3479+network-conduit MichaelSnoyman
3480+network-conduit-tls MichaelSnoyman
3481+network-connection AdamLangley
3482+network-data ThomasDuBuisson
3483+network-dbus DafyddHarries
3484+network-dns AdamLangley
3485+network-enumerator JohnMillikin
3486+network-fancy MarkWotton TaruKarttunen
3487+network-house NiklasHambuechen
3488+network-info JacobStanley
3489+network-interfacerequest AndrewMiller
3490+network-ip MikhailVorozhtsov
3491+network-metrics BrendanHay KimAltintop
3492+network-minihttp AdamLangley
3493+network-multicast AudreyTang
3494+network-netpacket AndrewMiller
3495+network-pgi HarryTerkelsen
3496+network-protocol-xmpp JohnMillikin
3497+network-rpca AdamLangley
3498+network-server RickKaudewitz
3499+network-simple RenzoCarbonara
3500+network-socket-options JoeyAdams
3501+network-stream JaredHance
3502+network-topic-models BenGamari
3503+network-transport EdskoDeVries
3504+network-transport-tcp EdskoDeVries
3505+network-transport-tests EdskoDeVries
3506+network-websocket MichaelMelanson
3507+newports BradClawsie
3508+newt RoganCreswick
3509+newtype DariusJahandarie
3510+newtype-th MichaelSloan
3511+newtyper DylanJust
3512+nextstep-plist JanChristiansen
3513+nikepub UweHoffmann
3514+nimber PatrickHurst
3515+nixos-types PeterSimons
3516+nkjp JakubWaszczuk
3517+nlp-scores GrzegorzChrupala
3518+nme StephenWeber
3519+nntp MaciejPiechotka
3520+non-empty HenningThielemann
3521+non-negative HenningThielemann
3522+nonlinear-optimization FelipeLessa
3523+noodle JesseRudolph
3524+normaldistribution BjornBuckwalter
3525+not-gloss GregHorn
3526+not-gloss-examples GregHorn
3527+not-in-base OscarFinnsson
3528+notcpp BenMillwood
3529+notmuch-haskell BartonMassey
3530+notmuch-web JohnLenz
3531+np-extras BrentYorgey
3532+nptools NicolasPouillard
3533+nsis NeilMitchell
3534+nthable GeorgePollard
3535+numbering DanielSchuessler
3536+numbers DanBurton DanielWagner LennartAugustsson RichardSmith RussellOConnor
3537+numerals RoelVanDijk
3538+numerals-base RoelVanDijk
3539+numeric-extras EdwardKmett
3540+numeric-limits LennartAugustsson
3541+numeric-prelude HenningThielemann
3542+numeric-quest HenningThielemann
3543+numeric-tools AlexeyKhudyakov
3544+numtype BjornBuckwalter
3545+numtype-tf BjornBuckwalter
3546+nyan ChrisDone
3547+nymphaea CaleGibbard GwernBranwen
3548+obdd JohannesWaldmann
3549+oberon0 MarcosViera
3550+obj ThomasDavie
3551+oeis BrentYorgey BrianLewis
3552+off-simple AdamFoltzer
3553+ofx OmariNorman
3554+ohloh-hs FrankThomas
3555+oi NobuoYamashita
3556+ois-input-manager GregHorn
3557+old-locale IanLynagh RossPaterson
3558+old-time IanLynagh RossPaterson
3559+omega GaborGreif
3560+omnicodec MagnusTherning
3561+on-a-horse JasonPriestley
3562+one-liner SjoerdVisscher
3563+oneOfN JamesCook
3564+only AndrewRobbins
3565+onu-course RomanCheplyaka
3566+open-pandoc PeterSimons
3567+open-witness AshleyYakeley
3568+openid TrevorElliott
3569+openpgp StephenWeber
3570+openpgp-Crypto StephenWeber
3571+openpgp-asciiarmor ClintAdams
3572+openpgp-crypto-api StephenWeber
3573+opensoundcontrol-ht HenningThielemann
3574+openssl-createkey TaruKarttunen
3575+openssl-streams GregoryCollins
3576+opentheory JoeHurd
3577+opentheory-char JoeHurd
3578+opentheory-parser JoeHurd
3579+opentheory-prime JoeHurd
3580+opentheory-primitive JoeHurd
3581+operational HeinrichApfelmus
3582+opml DonaldStewart
3583+optimusprime JasonReich
3584+options JohnMillikin
3585+optparse-applicative PaoloCapriotti
3586+orc TrevorElliott
3587+orchid SebastiaanVisser
3588+orchid-demo SebastiaanVisser
3589+ord-adhoc FumiakiKinoshita
3590+order-statistics EdwardKmett
3591+ordered MiguelPagano
3592+osm-download ThomasDuBuisson
3593+osx-ar ErikCharlebois
3594+ot TimBaumann
3595+ottparse-pretty BrentYorgey
3596+package-o-tron JakeWheat
3597+package-vt KrzysztofSkrzetnicki
3598+packdeps MichaelSnoyman
3599+packed-dawg AndrasKovacs
3600+packedstring IanLynagh RossPaterson
3601+packer VincentHanquez
3602+packunused HerbertValerioRiedel
3603+pacman-memcache KrzysztofSkrzetnicki
3604+palindromes JohanJeuring
3605+pam EvgenyTarasov
3606+panda JinjingWang
3607+pandoc JohnMacFarlane
3608+pandoc-types JohnMacFarlane
3609+pandoc-unlit SimonHengel
3610+pango AndyStewart AxelSimon DanielWagner DuncanCoutts
3611+pappy ChrisDone
3612+para KevinQuick
3613+paragon NiklasBroberg
3614+parallel IanLynagh RossPaterson SimonMarlow
3615+parallel-io MaxBolingbroke
3616+parallel-tree-search SebastianFischer
3617+parameterized-data AlfonsoAcosta HoseinAttarzadeh
3618+parconc-examples SimonMarlow
3619+parport RickKaudewitz
3620+parse-dimacs DenisBueno
3621+parse-help GregWeber
3622+parseargs BartonMassey
3623+parsec AntoineLatter DerekElkins IanLynagh RossPaterson
3624+parsec-extra AriePeterson
3625+parsec-numbers ChristianMaeder
3626+parsec-parsers EdwardKmett
3627+parsec-permutation SamuelHoffstaetter
3628+parsec-tagsoup PepeIborra
3629+parsec-utils RemcoNiemeijer
3630+parsec1 ChristianMaeder
3631+parsec2 AntoineLatter
3632+parsec3 ChristianMaeder
3633+parsedate BjornBringert IsaacJones
3634+parsely SamuelBronson
3635+parsergen JasperVanDerJeugt
3636+parsers EdwardKmett
3637+parsimony IavorDiatchki
3638+partial-isomorphisms TillmannRendel
3639+partial-lens RussellOConnor
3640+partial-uri StephenWeber
3641+partly TimDixon
3642+passage ChadScherrer
3643+pastis AlpMestanogullari
3644+pasty MarkusDittrich
3645+patch-combinators EmilAxelsson
3646+path-pieces MichaelSnoyman
3647+pathtype BenMoseley
3648+patience KeeganMcAllister
3649+patterns TobiasSchoofs
3650+paypal-api StephenBlackheath
3651+pb DominikPicheta
3652+pcap BryanOSullivan NicholasBurlett
3653+pcap-conduit AustinSeipp
3654+pcap-enumerator KatsutoshiItoh
3655+pcd-loader AnthonyCowley
3656+pcre-less MichaelZuo
3657+pcre-light DonaldStewart
3658+pcre-light-extra SteffenSiering
3659+pcre-utils SimonMarechal
3660+pdf-toolbox-core YurasShumovich
3661+pdf-toolbox-document YurasShumovich
3662+pdf2line AudreyTang
3663+pdfinfo ChrisDone
3664+pdfsplit DanielWagner
3665+pdynload AndyStewart
3666+peakachu YairChuchem
3667+peano-inf PeterDivianszky
3668+pec BrettLetner
3669+pecoff ErikCharlebois
3670+peg DustinDeWeese
3671+peggy HideyukiTanaka
3672+pem VincentHanquez
3673+penn-treebank EricKow
3674+penny-bin OmariNorman
3675+penny-lib OmariNorman
3676+peparser IanGraves
3677+perceptron StefanHoldermans
3678+perdure PatrickPremont
3679+perm AndySonnenburg
3680+permutation PatrickPerry
3681+permute TroelsHenriksen
3682+persistent FelipeLessa GregWeber MichaelSnoyman
3683+persistent-equivalence ChrisSmith
3684+persistent-hssqlppp IlyaPortnov
3685+persistent-map PeterRobinson
3686+persistent-mongoDB GregWeber MichaelSnoyman
3687+persistent-mysql FelipeLessa MichaelSnoyman
3688+persistent-postgresql FelipeLessa MichaelSnoyman
3689+persistent-protobuf MichaelStone
3690+persistent-refs AdamFoltzer
3691+persistent-sqlite MichaelSnoyman
3692+persistent-template FelipeLessa MichaelSnoyman
3693+persistent-vector TristanRavitch
3694+pesca GwernBranwen
3695+pez BrandonSimmons
3696+pgm FrederickRoss SergeyAstanin
3697+pgsql-simple ChrisDone
3698+phasechange GaborLehel
3699+phone-push DavidFendrich
3700+phonetic-code BartonMassey
3701+phooey ConalElliott RussellOConnor
3702+photoname DinoMorelli
3703+phraskell DimitriSabadie
3704+phybin RyanNewton
3705+pianola DanielDiazCarrete
3706+piet StephanFriedrichs
3707+piki KazuYamamoto
3708+pipes GabrielGonzalez
3709+pipes-attoparsec PaoloCapriotti RenzoCarbonara
3710+pipes-attoparsec-streaming MartinGrabmueller
3711+pipes-concurrency GabrielGonzalez
3712+pipes-conduit PaoloCapriotti
3713+pipes-core PaoloCapriotti
3714+pipes-extra PaoloCapriotti
3715+pipes-network PaoloCapriotti RenzoCarbonara
3716+pipes-safe GabrielGonzalez
3717+pipes-zlib PaoloCapriotti RenzoCarbonara
3718+pisigma AndresLoeh DarinMorrison
3719+pkcs1 GwernBranwen
3720+pkggraph RobinGreen
3721+pktree StephenWeber
3722+placeholders AndreasHammar
3723+planar-graph IvanMiljenovic
3724+plat MiguelMitrofanov
3725+plist YurasShumovich
3726+plot VivianMcPhail
3727+plot-gtk VivianMcPhail
3728+plugins DonaldStewart GwernBranwen IsaacJones JeremyShaw SpencerJanssen
3729+plugins-auto FacundoDominguez
3730+plumbers MichaelSloan
3731+ply-loader AnthonyCowley
3732+pngload MarkoLauronen
3733+pnm ClaudeHeilandAllen
3734+pointed EdwardKmett
3735+pointedlist JeffWheeler RussellOConnor
3736+pointfree BenMillwood FelixMartini SimonHengel
3737+pointful MikhailGlushenkov
3738+pointless-fun WrenThornton
3739+pointless-haskell HugoPacheco
3740+pointless-lenses HugoPacheco
3741+pointless-rewrite HugoPacheco
3742+poker-eval DavidHimmelstrup
3743+polar StefanKersten
3744+polh-lexicon JakubWaszczuk
3745+polimorf JakubWaszczuk
3746+poll HenningThielemann
3747+polyToMonoid KevinJardine
3748+polynomial JamesCook
3749+polynomials-bernstein PierreEtienneMeunier
3750+polyparse MalcolmWallace
3751+polyseq DanielSeidel
3752+polysoup JakubWaszczuk
3753+polytypeable LennartAugustsson
3754+polytypeable-utils KiYungAhn
3755+pontarius-mediaserver JonKristensen
3756+pontarius-xmpp JonKristensen
3757+pontarius-xpmn JonKristensen
3758+pony DonaldStewart
3759+pool MichaelSnoyman
3760+pool-conduit MichaelSnoyman
3761+pop3-client PeterVanDenBrand TomRudick
3762+popenhs GwernBranwen
3763+poppler AndyStewart IanWooKim
3764+portable-lines JoeyAdams
3765+portaudio AnilVaitla JohnVanEnk
3766+porte SamyAlBahra
3767+porter MarkWotton
3768+ports DonaldStewart
3769+posix-acl NicolaSquartini
3770+posix-escape KeeganMcAllister
3771+posix-filelock StephenWeber
3772+posix-realtime VasiliGalchin
3773+posix-timer MikhailVorozhtsov
3774+posix-waitpid RichardSmith
3775+postgresql-copy-escape JoeyAdams
3776+postgresql-libpq LeonSmith
3777+postgresql-simple LeonSmith
3778+postmark MarkHibberd
3779+postmaster PeterSimons
3780+powermate GwernBranwen
3781+powerpc TomHawkins
3782+ppm JinjingWang
3783+pqc DonaldStewart KidoTakahiro
3784+pqueue LouisWasserman
3785+pqueue-mtl LouisWasserman
3786+practice-room JinjingWang
3787+precis StephenTetley
3788+predicates GeorgePollard
3789+prednote OmariNorman
3790+prefix-units IustinPop
3791+prelude-extras EdwardKmett
3792+prelude-generalize AaronBlack
3793+prelude-plus YusakuHashimoto
3794+preprocessor-tools JesseTov
3795+presburger IavorDiatchki
3796+press BrandonBickford
3797+pretty DavidTerei IanLynagh RossPaterson
3798+pretty-class DavidFox
3799+pretty-hex IavorDiatchki
3800+pretty-ncols JoeFredette
3801+pretty-show IavorDiatchki
3802+pretty-tree IvanMiljenovic
3803+prettyclass LennartAugustsson
3804+prim-uniq JamesCook
3805+primes SebastianFischer
3806+primitive RomanLeshchinskiy
3807+primula-board OlegIvanov
3808+primula-bot OlegIvanov
3809+printf-mauke LukasMai
3810+printxosd DonaldStewart
3811+priority-queue JamesCook
3812+priority-sync ChristopherLaneHinson
3813+privileged-concurrency JeffShaw
3814+prizm ParnellSpringmeyer
3815+probability HenningThielemann
3816+proc AndyStewart
3817+process IanLynagh RossPaterson SimonMarlow
3818+process-conduit HideyukiTanaka
3819+process-extras DavidLazar
3820+process-iterio GregFitzgerald
3821+process-leksah HamishMackenzie
3822+process-qq HideyukiTanaka
3823+procrastinating-structure JakeMcArthur
3824+procrastinating-variable GregoryCrosswhite
3825+procstat PatrickPalka
3826+proctest NiklasHambuechen
3827+prof2dot GregoryWright
3828+prof2pretty ClaudeHeilandAllen
3829+profunctor-extras EdwardKmett
3830+profunctors EdwardKmett
3831+progress MariusEriksen
3832+progressbar AustinSeipp
3833+progression KidoTakahiro NeilBrown
3834+project-template MichaelSnoyman
3835+prolog DanielSeidel MatthiasBartsch
3836+prolog-graph MatthiasBartsch
3837+prolog-graph-lib DanielSeidel MatthiasBartsch
3838+propane KeeganMcAllister
3839+properties AlbertoCorona
3840+property-list JamesCook
3841+proplang NeilMitchell
3842+protobuf NathanHowell
3843+protocol-buffers ChrisKuklewicz
3844+protocol-buffers-descriptor ChrisKuklewicz
3845+prototype YoshikuniJujo
3846+pseudomacros LukasMai
3847+publicsuffixlist MylesMaxfield
3848+publicsuffixlistcreate MylesMaxfield
3849+pubsub SigbjornFinne
3850+pugs-DrIFT AudreyTang JeffShaw
3851+pugs-HsSyck GwernBranwen
3852+pugs-compat AudreyTang JeffShaw
3853+pugs-hsregex GwernBranwen
3854+pulse-simple DaikiHanda
3855+punycode JonKristensen MylesMaxfield
3856+puppetresources SimonMarechal
3857+pure-cdb BorisSukholitko
3858+pure-fft MattMorrow
3859+pure-priority-queue BradLarsen
3860+pure-priority-queue-tests BradLarsen
3861+pureMD5 ThomasDuBuisson
3862+pushme JohnWiegley
3863+putlenses HugoPacheco
3864+pvd RickardNilsson
3865+pwstore-cli RobertHelgesson
3866+pwstore-fast PeterScott
3867+pwstore-purehaskell PeterScott CorentinDupont
3868+pxsl-tools TomMoertel
3869+python-pickle VoMinhThu
3870+qd ClaudeHeilandAllen
3871+qd-vec ClaudeHeilandAllen
3872+qrcode ChrisYuen
3873+quantum-arrow LukePalmer
3874+qudb JanStepien
3875+queue JamesCook
3876+queuelike LouisWasserman
3877+quick-generator YuriyIskra
3878+quickcheck-assertions AlekseyUymanov
3879+quickcheck-instances AntoineLatter
3880+quickcheck-io SimonHengel
3881+quickcheck-poly KiYungAhn
3882+quickcheck-properties AlexeyKhudyakov
3883+quickcheck-rematch TomCrayford
3884+quickcheck-script KidoTakahiro
3885+quicklz AustinSeipp
3886+quickset ErtugrulSoeylemez
3887+quickspec NickSmallbone
3888+quicktest DavidSiegel
3889+rabocsv2qif SanderVenema
3890+rad EdwardKmett
3891+rainbow OmariNorman
3892+ralist LennartAugustsson
3893+rallod MattParker
3894+rand-vars RomainEdelmann
3895+randfile JoeyAdams
3896+random IanLynagh RossPaterson RyanNewton
3897+random-access-list StephanFriedrichs
3898+random-extras AristidBreitkreuz
3899+random-fu JamesCook
3900+random-shuffle AndrasSlemmer ManlioPerillo PatrickPalka
3901+random-source JamesCook
3902+random-stream ManlioPerillo
3903+randomgen DonaldStewart
3904+randproc DavidBanas
3905+randsolid JohannesMartinsson
3906+range-space JohnLato
3907+rangemin LouisWasserman
3908+ranges GeorgePollard
3909+rank1dynamic EdskoDeVries
3910+rate-limit AdamWick
3911+raven-haskell AlexanderBondarenko
3912+raven-haskell-scotty AlexanderBondarenko
3913+raw-strings-qq MikhailGlushenkov
3914+rbr GwernBranwen KetilMalde
3915+rclient TomDoris
3916+rdf4h RobStewart
3917+rdioh AdityaBhargava
3918+rdtsc DonaldStewart MartinGrabmueller
3919+rdtsc-enolan EchoNolan
3920+reaction-logic PaoloVeronelli
3921+reactive ConalElliott RussellOConnor
3922+reactive-bacon JuhaPaananen
3923+reactive-balsa HenningThielemann
3924+reactive-banana HeinrichApfelmus
3925+reactive-banana-wx HeinrichApfelmus
3926+reactive-fieldtrip ConalElliott
3927+reactive-glut ConalElliott
3928+reactive-thread MattGlazar
3929+reactor EdwardKmett
3930+readable DougBeardsley
3931+readline JanStolarek RossPaterson
3932+readline-statevar KrzysztofSkrzetnicki
3933+readpyc BerniePope
3934+really-simple-xml-parser KashyapChatamballi
3935+recaptcha JohnMacFarlane
3936+records WolfgangJeltsch
3937+records-th SamAnklesaria
3938+recursion-schemes EdwardKmett
3939+recursive-line-count JoeyAdams
3940+redHandlers SergioUrinovsky
3941+redis AlexanderBogdanov
3942+redis-hs WillLangstroth
3943+redis-simple JasperVanDerJeugt
3944+reducers EdwardKmett
3945+ref AndySonnenburg CarterSchonwald
3946+ref-fd GeoffreyMainland
3947+ref-mtl GeoffreyMainland
3948+ref-tf GeoffreyMainland
3949+reference MaciejPiechotka
3950+refh AnthonyGrimes
3951+reflection EdwardKmett
3952+reform JeremyShaw
3953+reform-blaze JeremyShaw
3954+reform-happstack JeremyShaw
3955+reform-hsp JeremyShaw
3956+regex-applicative RomanCheplyaka
3957+regex-base ChrisKuklewicz DonaldStewart RossPaterson
3958+regex-compat ChrisKuklewicz RossPaterson
3959+regex-compat-tdfa KidoTakahiro
3960+regex-deriv KennyLu
3961+regex-dfa ChrisKuklewicz
3962+regex-genex AudreyTang
3963+regex-parsec ChrisKuklewicz
3964+regex-pcre ChrisKuklewicz
3965+regex-pcre-builtin AudreyTang JeffShaw TimothyHobbs
3966+regex-pderiv KennyLu
3967+regex-posix ChrisKuklewicz DonaldStewart DuncanCoutts RossPaterson
3968+regex-posix-unittest ChrisKuklewicz
3969+regex-tdfa AudreyTang ChrisKuklewicz
3970+regex-tdfa-text KidoTakahiro
3971+regex-tdfa-unittest ChrisKuklewicz
3972+regex-tdfa-utf8 ChrisKuklewicz
3973+regex-tre ChrisKuklewicz
3974+regex-xmlschema UweSchmidt
3975+regexchar AlistairWard
3976+regexdot AlistairWard
3977+regexp-tries AndreasBaldeau
3978+regexpr YoshikuniJujo
3979+regexpr-symbolic MartinSulzmann
3980+regexqq MattMorrow
3981+regional-pointers BasVanDijk
3982+regions BasVanDijk
3983+regions-monadsfd BasVanDijk
3984+regions-monadstf BasVanDijk
3985+regions-mtl BasVanDijk
3986+regular JosePedroMagalhaes
3987+regular-extras JosePedroMagalhaes
3988+regular-web ChrisEidhof
3989+regular-xmlpickler ErikHesselink
3990+rehoo JohnWiegley
3991+reify GwernBranwen
3992+relacion LeonelFonseca
3993+relation DrewDay
3994+relative-date SamAnklesaria
3995+relit KazuYamamoto
3996+rematch TomCrayford
3997+rematch-text TomCrayford
3998+remote JeffEpstein
3999+reord JamesCook
4000+repa BenLippmeier
4001+repa-algorithms BenLippmeier
4002+repa-bytestring BenLippmeier
4003+repa-devil DonaldStewart RaphaelJavaux ThomasDuBuisson
4004+repa-examples BenLippmeier
4005+repa-io BenLippmeier
4006+repa-v4l2 ChristianGosch
4007+repl MikeLedger
4008+repr BasVanDijk
4009+repr-tree-syb NikitaVolkov
4010+representable-functors EdwardKmett
4011+representable-profunctors EdwardKmett
4012+representable-tries EdwardKmett
4013+resource-pool BryanOSullivan
4014+resource-pool-catchio JurrienStutterheim
4015+resource-simple ShaneOBrien
4016+resourcet MichaelSnoyman
4017+restyle DanielFischer
4018+resumable-exceptions NicolasFrisby
4019+rethinkdb EtienneLaurin
4020+retry OzgunAtaman
4021+rev-state DanBurton
4022+revdectime KamilStachowski
4023+reverse-apply HansHoglund
4024+reversi GuilhermeCavalcanti
4025+rewriting JosePedroMagalhaes ThomasVanNoort
4026+rex MichaelSloan
4027+rezoom JoelTaylor
4028+rfc3339 HugoGomes
4029+riak BryanOSullivan NathanHunter
4030+riak-protobuf BryanOSullivan
4031+riot DonaldStewart
4032+rivers DrewDay
4033+rmonad GaneshSittampalam
4034+robot ChrisWong
4035+roguestar ChristopherLaneHinson
4036+roguestar-engine ChristopherLaneHinson GwernBranwen
4037+roguestar-gl ChristopherLaneHinson GwernBranwen
4038+roguestar-glut ChristopherLaneHinson
4039+rolling-queue JoeyAdams
4040+roman-numerals RoelVanDijk
4041+roots JamesCook
4042+rope EdwardKmett
4043+rosezipper EricKow IavorDiatchki
4044+rosso RobertHenderson
4045+rounding EdwardKmett
4046+roundtrip StefanWehr
4047+roundtrip-string StefanWehr
4048+roundtrip-xml StefanWehr
4049+route-generator StephenWeber
4050+rowrecord KeeganMcAllister
4051+rpc SamAnklesaria
4052+rpc-framework MatthewMirman
4053+rpf KazuYamamoto
4054+rpm EricStolten
4055+rsagl ChristopherLaneHinson GwernBranwen
4056+rsagl-frp ChristopherLaneHinson
4057+rsagl-math ChristopherLaneHinson
4058+rss BasVanDijk BjornBringert
4059+rss2irc DonaldStewart SimonMichael
4060+ruff ClaudeHeilandAllen
4061+ruler JeroenBransen
4062+ruler-core ArieMiddelkoop
4063+rungekutta UweHollerbach
4064+runghc MikeZuser
4065+runmemo DanBurton
4066+rvar JamesCook
4067+rwlock JamesCook
4068+safe NeilMitchell
4069+safe-failure MichaelSnoyman PepeIborra
4070+safe-failure-cme PepeIborra
4071+safe-freeze ReinerPope
4072+safe-globals KeeganMcAllister
4073+safe-lazy-io NicolasPouillard
4074+safe-plugins IlyaPortnov
4075+safecopy DavidHimmelstrup
4076+safeint AndresLoeh
4077+safer-file-handles BasVanDijk
4078+safer-file-handles-bytestring BasVanDijk
4079+safer-file-handles-text BasVanDijk
4080+salvia SebastiaanVisser
4081+salvia-demo SebastiaanVisser
4082+salvia-extras SebastiaanVisser
4083+salvia-protocol SebastiaanVisser
4084+salvia-sessions SebastiaanVisser
4085+salvia-websocket SebastiaanVisser
4086+sample-frame HenningThielemann
4087+sample-frame-np HenningThielemann
4088+samtools NicholasIngolia
4089+samtools-enumerator NicholasIngolia
4090+samtools-iteratee NicholasIngolia
4091+sandi MagnusTherning
4092+sandlib MahmutBulut
4093+sat AndriiZvorygin
4094+sat-micro-hs DenisBueno
4095+satchmo JohannesWaldmann
4096+satchmo-backends JohannesWaldmann
4097+satchmo-examples JohannesWaldmann
4098+satchmo-funsat JohannesWaldmann
4099+satchmo-minisat JohannesWaldmann
4100+sbv LeventErkok
4101+sc3-rdu RohanDrape
4102+scalable-server JamieTurner
4103+scaleimage DonaldStewart
4104+scan ChristianMaeder
4105+scan-vector-machine AdamMegacz
4106+scc MarioBlazevic
4107+scenegraph MarkWassell
4108+scgi ChrisForno EricSessoms StephenBlackheath
4109+schedyield MichalGajda
4110+schonfinkeling DenisDefreyne
4111+scion ThomasSchilling
4112+scion-browser AlejandroSerrano JeanPhilippeMoresmau
4113+scons2dot LeandroPenz
4114+scope ConradParker
4115+scope-cairo ConradParker
4116+scotty AndrewFarmer
4117+scrabble-bot AndrasKovacs
4118+scrobble ChrisDone
4119+scrypt FalkoPeters
4120+scyther-proof SimonMeier
4121+sde-solver DavidNilsson
4122+seal-module JoachimBreitner
4123+sec SteffenSiering
4124+secdh PeterGavin
4125+seclib AlejandroRusso
4126+secret-santa RodrigoSetti
4127+secrm JonSlenk
4128+secure-sockets DavidAnderson IavorDiatchki ThomasDuBuisson
4129+sednaDBXML EricJones
4130+select GardSpreemann
4131+selenium AaronTomb DonaldStewart
4132+selinux LuiteStegeman
4133+semaphore-plus RobinGreen
4134+semigroupoid-extras EdwardKmett
4135+semigroupoids EdwardKmett
4136+semigroups EdwardKmett
4137+semigroups-actions PetrPudlak
4138+semiring SashaRush
4139+sendfile JeremyShaw MatthewElder
4140+sentry VoMinhThu
4141+seqloc NicholasIngolia
4142+seqloc-datafiles NicholasIngolia
4143+sequential-index AristidBreitkreuz
4144+sequor GrzegorzChrupala
4145+serial FrederickRoss
4146+serialport JorisPutcuyps
4147+servius MichaelSnoyman
4148+sessions MatthewSackman
4149+set-extra DavidFox
4150+set-monad GeorgeGiorgidze
4151+setenv SimonHengel
4152+setlocale LukasMai
4153+setops eelis
4154+setters IlyaPortnov
4155+sexp AlexandruScvortov
4156+sexp-show ChrisDone
4157+sexpr BrianSniffen
4158+sfml-audio SoenkeHahn
4159+sgd JakubWaszczuk
4160+sgf DanielWagner
4161+sgrep KetilMalde
4162+shady-gen ConalElliott
4163+shady-graphics ConalElliott
4164+shake NeilMitchell
4165+shake-extras AustinSeipp
4166+shaker AnthoninBonnefoy
4167+shakespeare GregWeber MichaelSnoyman
4168+shakespeare-css GregWeber MichaelSnoyman
4169+shakespeare-i18n GregWeber MichaelSnoyman
4170+shakespeare-js GregWeber MichaelSnoyman
4171+shakespeare-text GregWeber MichaelSnoyman
4172+shana JinjingWang
4173+shapefile JamesCook
4174+shapely-data BrandonSimmons
4175+she ConorMcBride
4176+shell-escape JasonDusek
4177+shell-pipe HenningThielemann
4178+shellish PetrRockai
4179+shelltestrunner SimonMichael
4180+shelly GregWeber
4181+shelly-extra GregWeber
4182+shivers-cfg JoachimBreitner
4183+shoap RichardFergie
4184+shortcircuit AristidBreitkreuz
4185+shorten-strings ArashRouhani
4186+show CaleGibbard GwernBranwen JamesCook JasonDagit TwanVanLaarhoven
4187+showdown AnthonyGrimes
4188+shpider JohnnyMorrice OzgunAtaman
4189+shplit ConorMcBride
4190+shqq KeeganMcAllister
4191+shuffle JeroenBransen
4192+sieve JohnSingleton
4193+sifflet GregoryWeber
4194+sifflet-lib GregoryWeber
4195+signed-multiset StefanHoldermans
4196+silently SimonHengel TrystanSpangler
4197+simgi MarkusDittrich
4198+simple AmitLevy
4199+simple-actors BrandonSimmons
4200+simple-atom ThomasSchilling
4201+simple-c-value JonathanFischoff
4202+simple-config YusukeNomura
4203+simple-css AntonKholomiov
4204+simple-firewire VilleTirronen
4205+simple-log AlexandrRuchkin
4206+simple-log-syslog AlexandrRuchkin
4207+simple-observer AndyGimblett
4208+simple-pascal IlyaPortnov
4209+simple-reflect TwanVanLaarhoven
4210+simple-rope EugeneKirpichov
4211+simple-sendfile KazuYamamoto
4212+simple-server JosephCollard
4213+simple-sessions JesseTov
4214+simple-stacked-vm IlyaPortnov
4215+simple-tabular BartonMassey
4216+simple-vec3 DmitryDzhus
4217+simpleargs KetilMalde
4218+simpleirc DominikPicheta
4219+simplenote MariusEriksen
4220+simpleprelude JeanMarieGaillourdet
4221+simplesmtpclient ChrisDone
4222+simplex JulianFleischer
4223+simseq GwernBranwen
4224+sindre TroelsHenriksen
4225+singletons RichardEisenberg
4226+sink JakeMcArthur
4227+siphash VincentHanquez
4228+sirkel MortenLysgaard
4229+sized-types AndyGill
4230+sized-vector HiromiIshii
4231+sizes JohnWiegley
4232+skein FelipeLessa
4233+skypelogexport EugenyDzhurinsky
4234+slice-cpp-gen PaulKoerbitz
4235+sloane AndersClaesson
4236+sloth JanChristiansen
4237+smallarray AntoineLatter
4238+smallcheck ColinRunciman GwernBranwen RomanCheplyaka
4239+smallpt-hs VoMinhThu
4240+smallstring AntoineLatter
4241+smartGroup SamAnklesaria
4242+smartword KiYungAhn
4243+sme AlejandroRusso
4244+smt-lib TomHawkins
4245+smtLib IavorDiatchki
4246+smtp-mail JasonHickner
4247+smtp2mta StephenWeber
4248+snap DougBeardsley GregoryCollins
4249+snap-app ChrisDone
4250+snap-auth-cli DmitryDzhus
4251+snap-blaze JasperVanDerJeugt
4252+snap-blaze-clay DecebalPopa
4253+snap-core DougBeardsley GregoryCollins
4254+snap-extras DougBeardsley OzgunAtaman
4255+snap-loader-dynamic DougBeardsley
4256+snap-loader-static DougBeardsley
4257+snap-predicates ToralfWittner
4258+snap-server DougBeardsley GregoryCollins
4259+snaplet-acid-state DougBeardsley
4260+snaplet-actionlog DougBeardsley
4261+snaplet-coffee KevinVanRooijen
4262+snaplet-environments KamilCiemniewski
4263+snaplet-fay AdamBergmark
4264+snaplet-hdbc JurrienStutterheim
4265+snaplet-i18n HaishengWu
4266+snaplet-mongoDB KamilCiemniewski
4267+snaplet-mongodb-minimalistic PetrPilar
4268+snaplet-oauth HaishengWu
4269+snaplet-persistent DougBeardsley
4270+snaplet-postgresql-simple DougBeardsley
4271+snaplet-recaptcha LarsPetersen
4272+snaplet-redis DmitryDzhus
4273+snaplet-redson DmitryDzhus
4274+snaplet-riak PaulWilson
4275+snaplet-sedna EricJones
4276+snaplet-sqlite-simple JanneHellsten
4277+snaplet-tasks KamilCiemniewski
4278+snaplet-typed-sessions ChrisSmith
4279+snappy BryanOSullivan
4280+snappy-iteratee IanDuncan
4281+sndfile-enumerators JohnLato
4282+snippet-extractor JasonDagit
4283+snm JohnnyMorrice
4284+snow-white JinjingWang
4285+snowball DagOdenhall
4286+snowglobe ClaudeHeilandAllen
4287+soap AlexanderBondarenko
4288+sock2stream StephenWeber
4289+socks VincentHanquez
4290+sodium StephenBlackheath
4291+soegtk AndyStewart AxelSimon DuncanCoutts
4292+som AmyDeBuitleir
4293+sonic-visualiser StefanKersten
4294+sort-by-pinyin JinjingWang
4295+sorty KrzysztofSkrzetnicki
4296+source-code-server JinjingWang
4297+sourcemap ChrisDone
4298+sousit MarioSiegenthaler
4299+sox HenningThielemann
4300+soxlib HenningThielemann
4301+soyuz AlexKropivny
4302+spacepart CoreyOConnor
4303+sparse-lin-alg AlexeyAlekhin
4304+sparsebit KiYungAhn
4305+sparsecheck KidoTakahiro MatthewNaylor
4306+spata JinjingWang
4307+spatial-math GregHorn
4308+spawn KeeganMcAllister
4309+special-functors HenningThielemann
4310+specialize-th JonathanFischoff
4311+species BrentYorgey
4312+speculation EdwardKmett
4313+speculation-transformers EdwardKmett
4314+spelling-suggest BartonMassey GregWeber
4315+sphinx ChrisEidhof GregWeber
4316+sphinx-cli EelcoLempsink
4317+spike KrzysztofSkrzetnicki
4318+spine SeanLeather
4319+splaytree JohnLato
4320+splice CetinSert
4321+splines JamesCook
4322+split BrentYorgey
4323+split-channel LeonSmith
4324+split-record HenningThielemann
4325+splot EugeneKirpichov
4326+spool KeeganMcAllister
4327+spoon DanielPeebles LiyangHu
4328+spoonutil JohnnyMorrice
4329+spreadsheet HenningThielemann
4330+spy StefanSaasen
4331+sqlite AdamWick AudreyTang DonaldStewart
4332+sqlite-simple JanneHellsten
4333+sqlvalue-list YuriyIskra
4334+squeeze AlistairWard
4335+srcinst JohnGoerzen
4336+srcloc GeoffreyMainland
4337+srec TomHawkins
4338+sscgi ChrisForno
4339+ssh AlexSuraci GuillaumeHoffmann SimonMichael
4340+sshtun DinoMorelli
4341+sssp JasonDusek
4342+sstable MariusEriksen
4343+ssv BartonMassey
4344+stable-maps EdwardKmett
4345+stable-memo JakeMcArthur
4346+star-to-star NicolasFrisby
4347+star-to-star-contra NicolasFrisby
4348+starling AntoineLatter
4349+starrover2 AnttiSalonen
4350+state EvgenyJukov MauricioAntunes
4351+state-plus BorisSukholitko
4352+state-record KarlVoelker
4353+statechart TomHawkins
4354+stateful-mtl LouisWasserman
4355+stateref JamesCook
4356+statestack BrentYorgey
4357+statethread HenningThielemann
4358+static-hash KazuYamamoto
4359+static-resources MariuszRak
4360+statistics BryanOSullivan
4361+statistics-dirichlet FelipeLessa
4362+statistics-fusion DonaldStewart
4363+statistics-linreg AlpMestanogullari
4364+stb-image BalazsKomuves
4365+stb-truetype BalazsKomuves
4366+stdata DavidDarais
4367+steeloverseer SchellScivally
4368+stemmer BenGamari EelcoLempsink
4369+stepwise ArieMiddelkoop
4370+stickyKeysHotKey SoenkeHahn
4371+stm DuncanCoutts RossPaterson SimonMarlow
4372+stm-channelize JoeyAdams
4373+stm-chans WrenThornton
4374+stm-conduit ClarkGaebel
4375+stm-delay JoeyAdams
4376+stm-io-hooks PeterRobinson
4377+stm-linkedlist JoeyAdams
4378+stm-orelse-io GardSpreemann
4379+stm-promise DanRosen
4380+stm-sbchan JoeyAdams
4381+stm-split HenningThielemann
4382+stm-stats JoachimBreitner
4383+stm-tlist JoeyAdams
4384+stmcontrol MartinSulzmann
4385+stomp-queue TobiasSchoofs
4386+stompl TobiasSchoofs
4387+storable TomasJanousek
4388+storable-complex JedBrown
4389+storable-endian EugeneKirpichov
4390+storable-record HenningThielemann
4391+storable-tuple HenningThielemann
4392+storablevector HenningThielemann
4393+storablevector-carray HenningThielemann
4394+storablevector-streamfusion HenningThielemann
4395+stream-fusion DonaldStewart KidoTakahiro
4396+stream-monad SebastianFischer
4397+streamed HenningThielemann
4398+streamproc PeterSimons
4399+streams EdwardKmett
4400+strict DonaldStewart RomanLeshchinskiy
4401+strict-base-types SimonMeier
4402+strict-concurrency DonaldStewart
4403+strict-ghc-plugin AustinSeipp
4404+strict-io NicolasPouillard
4405+strictify SterlingClover
4406+string-class ByronJohnson
4407+string-combinators BasVanDijk
4408+string-conversions SoenkeHahn
4409+string-qq AudreyTang
4410+string-quote AudreyTang
4411+stringable JohnWiegley KetilMalde-0.1.1.1
4412+stringbuilder SimonHengel
4413+stringlike FedorGogolev
4414+stringprep GeorgePollard
4415+strings JulianFleischer
4416+stringsearch BryanOSullivan DanielFischer
4417+stringtable-atom AudreyTang JeffShaw
4418+stripe MichaelSchade
4419+strptime EugeneKirpichov
4420+structural-induction DanRosen
4421+structured-mongoDB DeianStefan
4422+stunts CsabaHruska
4423+stylish-haskell JasperVanDerJeugt
4424+stylized LucaMolari
4425+subtitleParser RubenAstudillo
4426+subtitles SebastiaanVisser
4427+suffixarray DanielDeKok VictorDenisov
4428+suffixtree BryanOSullivan
4429+sugarhaskell SebastianErdweg
4430+suitable GaneshSittampalam
4431+sundown FrancescoMazzoli
4432+sunroof-compiler JanBracker
4433+sunroof-examples JanBracker
4434+sunroof-server JanBracker
4435+supercollider-ht HenningThielemann
4436+supercollider-midi HenningThielemann
4437+supero NeilMitchell
4438+suspend PetrPilar
4439+svg2q JanGreve
4440+svgcairo AndyStewart AxelSimon DanielWagner DuncanCoutts
4441+svgutils NeilBrown
4442+svm AndrewDougherty
4443+svm-simple VilleTirronen
4444+svndump JohnWiegley
4445+swapper RomanSmrz
4446+swf AudreyTang JeremyShaw
4447+swift-lda GrzegorzChrupala
4448+swish DouglasBurke VasiliGalchin
4449+syb IanLynagh JosePedroMagalhaes RossPaterson
4450+syb-extras EdwardKmett
4451+syb-with-class AndreaVezzosi DavidHimmelstrup IanLynagh
4452+syb-with-class-instances-text JeremyShaw
4453+sylvia ChrisWong
4454+sym AndersClaesson
4455+sym-plot AndersClaesson
4456+symbol GeoffreyMainland
4457+sync NeilBrown
4458+synchronous-channels JesseTov
4459+syntactic EmilAxelsson
4460+syntactical VoMinhThu
4461+syntax-trees DominicOrchard GeorgeGiorgidze
4462+synthesizer HenningThielemann
4463+synthesizer-alsa HenningThielemann
4464+synthesizer-core HenningThielemann
4465+synthesizer-dimensional HenningThielemann
4466+synthesizer-inference HenningThielemann
4467+synthesizer-llvm HenningThielemann
4468+synthesizer-midi HenningThielemann
4469+system-argv0 JohnMillikin
4470+system-fileio JohnMillikin
4471+system-filepath JohnMillikin
4472+system-gpio KennyLu
4473+system-inotify AdamLangley
4474+system-posix-redirect EdwardYang LiyangHu
4475+system-time-monotonic JoeyAdams
4476+system-uuid JasonDusek
4477+syz MichaelAdams
4478+ta LeonelFonseca
4479+tableaux PedroVasconcelos
4480+tables EdwardKmett
4481+tablestorage PhilFreeman
4482+tabloid SvenHeyll
4483+tabular EricKow
4484+taffybar TristanRavitch
4485+tag-bits EdwardKmett
4486+tag-stream YiHuang
4487+tagchup HenningThielemann
4488+tagged EdwardKmett
4489+tagged-list GregoryCrosswhite
4490+tagged-th NicolasFrisby
4491+tagged-transformer EdwardKmett MatveyAksenov
4492+tagging JosephRe
4493+taglib BrandonBickford
4494+taglib-api KyleCarter
4495+tagset-positional JakubWaszczuk
4496+tagshare JonasDuregard
4497+tagsoup NeilMitchell
4498+tagsoup-ht HenningThielemann
4499+tagsoup-parsec JohnnyMorrice OzgunAtaman
4500+tagstream-conduit MichaelSnoyman YiHuang
4501+tamarin-prover BenediktSchmidt SimonMeier
4502+tamarin-prover-term BenediktSchmidt SimonMeier
4503+tamarin-prover-theory BenediktSchmidt SimonMeier
4504+tamarin-prover-utils BenediktSchmidt SimonMeier
4505+tar BjornBringert DuncanCoutts
4506+tardis DanBurton
4507+task SeanSeefried
4508+tau BrentYorgey
4509+tbox PeterRobinson
4510+tccli JaroslavGridin
4511+tconfig AnthonyGrimes MariusGhita-0.5.2
4512+tcp DonaldStewart
4513+tdd-util ByronJohnson
4514+tdoc NicolasPouillard
4515+teams AdityaMahajan
4516+template JohanTibell
4517+template-default DanielWagner GregoryCollins
4518+template-haskell IanLynagh RossPaterson
4519+template-hsml PetrPilar
4520+templatepg ChrisForno
4521+temporal-csound AntonKholomiov
4522+temporal-media AntonKholomiov
4523+temporal-music-notation AntonKholomiov
4524+temporal-music-notation-demo AntonKholomiov
4525+temporal-music-notation-western AntonKholomiov
4526+temporary MaxBolingbroke
4527+tempus MatthiasReisner
4528+tensor NicolaSquartini
4529+terminal-progress-bar PetrRockai RoelVanDijk
4530+terminal-size MatveyAksenov
4531+termination-combinators MaxBolingbroke
4532+terminfo JudahJacobson
4533+terrahs SergioCosta
4534+test-framework MaxBolingbroke
4535+test-framework-doctest SakariJokinen SimonHengel
4536+test-framework-golden RomanCheplyaka
4537+test-framework-hunit MaxBolingbroke
4538+test-framework-program AdamWick
4539+test-framework-quickcheck MaxBolingbroke
4540+test-framework-quickcheck2 MaxBolingbroke
4541+test-framework-skip GregoryCrosswhite
4542+test-framework-smallcheck RomanCheplyaka
4543+test-framework-testing-feat JonathanFischoff
4544+test-framework-th OscarFinnsson
4545+test-framework-th-prime KazuYamamoto
4546+test-shouldbe SimonHengel
4547+test-simple BorisSukholitko
4548+testing-feat JonasDuregard
4549+testpack JohnGoerzen PeterSimons
4550+testpattern DonaldStewart
4551+testrunner ReinierLamers
4552+tetris GwernBranwen
4553+texmath JohnMacFarlane
4554+text BryanOSullivan
4555+text-binary JakubWaszczuk
4556+text-format BryanOSullivan
4557+text-format-simple DmitryBespalov
4558+text-icu BryanOSullivan
4559+text-json-qq OscarFinnsson
4560+text-latin1 MikhailVorozhtsov
4561+text-locale-encoding MikhailKuddah
4562+text-printer MikhailVorozhtsov
4563+text-register-machine AdamFoltzer
4564+text-xml-generic OscarFinnsson
4565+text-xml-qq OscarFinnsson
4566+textPlot WilliamMurphy
4567+textmatetags AlessandroVermeulen
4568+tfp HenningThielemann PeterGavin
4569+tftp SvenHeyll
4570+tga TillmannVogt
4571+th-build DanielSchuessler
4572+th-expand-syns DanielSchuessler
4573+th-extras JamesCook
4574+th-fold JamesCook
4575+th-instances JonathanFischoff
4576+th-kinds LouisWasserman
4577+th-lift IanLynagh KiYungAhn MathieuBoespflug
4578+th-orphans MichaelSloan
4579+th-sccs NicolasFrisby
4580+themoviedb PeterJones
4581+theoremquest TomHawkins
4582+theoremquest-client TomHawkins
4583+these JohnWiegley
4584+thespian AlexConstandache
4585+theta-functions MarkSafronov
4586+thih GwernBranwen
4587+thimk BartonMassey
4588+threadPool BrianJaress
4589+threadmanager BrianLewis
4590+threads BasVanDijk RoelVanDijk
4591+threads-pool IlyaPortnov
4592+threadscope DuncanCoutts MikolajKonarski SatnamSingh SimonMarlow SpencerJanssen
4593+thrift ChristianLavoie
4594+thrist GaborGreif
4595+throttle ChrisDone
4596+thumbnail KatsutoshiItoh
4597+thyme LiyangHu
4598+tianbar AlexeyKotlyarov
4599+tic-tac-toe HristoAsenov
4600+tidal AlexMcLean
4601+tie-knot PetrPudlak
4602+tiger ArieMiddelkoop
4603+tilings ClaudeHeilandAllen
4604+timberc PeterJonsson
4605+time AshleyYakeley DonaldStewart IanLynagh RossPaterson
4606+time-compat DagOdenhall
4607+time-extras AshleyYakeley
4608+time-http MasatakeDaimon
4609+time-lens RomanCheplyaka
4610+time-recurrence ChrisHeller
4611+time-units AdamWick
4612+time-w3c MasatakeDaimon
4613+timecalc ChrisEidhof
4614+timeit LennartAugustsson
4615+timeout-control NathanHowell
4616+timeout-with-results PetrPudlak
4617+timeparsers NathanHunter PhilipWeaver
4618+timeplot EugeneKirpichov
4619+timerep HugoGomes
4620+timers PetrPilar
4621+timers-updatable PaoloVeronelli
4622+timestamp-subprocess-lines EyalLotem
4623+timezone-olson YitzGale
4624+timezone-series YitzGale
4625+timing-convenience MikeBurns
4626+tkhs YusakuHashimoto
4627+tkyprof MitsutoshiAoe
4628+tls VincentHanquez
4629+tls-debug VincentHanquez
4630+tls-extra MikhailKuddah VincentHanquez
4631+tnet HarryTerkelsen
4632+to-haskell ConalElliott
4633+to-string-class BasVanDijk
4634+to-string-instances BasVanDijk
4635+todos IlyaPortnov
4636+toilet HenningThielemann
4637+tokenize GrzegorzChrupala
4638+toktok GregoireDetrez
4639+tokyocabinet-haskell TomTsuruhara
4640+tokyotyrant-haskell GregoryCollins
4641+tomato-rubato-openal HeinrichApfelmus
4642+toolshed AlistairWard
4643+topkata ChristophBauer
4644+torch YusakuHashimoto
4645+torrent DavidHimmelstrup
4646+total-map ConalElliott
4647+toysolver MasahiroSakai
4648+tpdb JohannesWaldmann
4649+trace-call BramSchuur
4650+trace-function-call DaveHinton
4651+traced LennartAugustsson MaxBolingbroke
4652+tracker WillThompson
4653+trajectory MikeBurns
4654+transactional-events RyanIngram
4655+transformers RossPaterson
4656+transformers-abort MikhailVorozhtsov
4657+transformers-base MikhailVorozhtsov
4658+transformers-compat EdwardKmett
4659+transformers-compose AristidBreitkreuz
4660+transformers-free GabrielGonzalez
4661+transformers-runnable JanBessai
4662+translatable-intset JannisHarder
4663+translate JinjingWang
4664+traverse-with-class RomanCheplyaka
4665+traypoweroff LuisCabellos
4666+tree-monad SebastianFischer
4667+treemap-html RadoslavDorcik
4668+treemap-html-tools RadoslavDorcik
4669+tremulous-query ChristofferOjeling
4670+trhsx GwernBranwen NiklasBroberg
4671+triangulation TillmannVogt
4672+trifecta EdwardKmett
4673+trimpolya KetilMalde
4674+truelevel BartonMassey
4675+tskiplist PeterRobinson
4676+tsp-viz DavidNilsson
4677+tst FrancescoMazzoli
4678+tuntap JohnVanEnk
4679+tup-functor BalazsKomuves
4680+tuple LennartAugustsson
4681+tuple-gen TillmannVogt
4682+tuple-hlist NicolasDudebout
4683+tuple-lenses JonathanFischoff
4684+tuple-th DanielSchuessler
4685+tupleinstances DiegoEcheverri
4686+turing-music PeterDivianszky
4687+turni PaoloVeronelli
4688+twentefp ChristiaanBaaij
4689+twidge JohnGoerzen
4690+twilight-stm AnnetteBieniusa
4691+twill JosephAbrahamson
4692+twine JamesSanders
4693+twisty LukeBlanshard
4694+twitter ChrisEidhof
4695+twitter-enumerator TakahiroHimura
4696+txt-sushi KeithSheppard
4697+txt2rtf JohnGoerzen
4698+ty ConalElliott
4699+typalyze MatthewDanish
4700+type TopiKarvonen
4701+type-booleans NicolasFrisby
4702+type-cereal NicolasFrisby
4703+type-digits NicolasFrisby
4704+type-eq GaborLehel
4705+type-equality ErikHesselink
4706+type-equality-check GwernBranwen WolfgangJeltsch
4707+type-functions WolfgangJeltsch
4708+type-int EdwardKmett
4709+type-level AlfonsoAcosta HoseinAttarzadeh LennartAugustsson
4710+type-level-natural-number GregoryCrosswhite
4711+type-level-natural-number-induction GregoryCrosswhite
4712+type-level-natural-number-operations GregoryCrosswhite
4713+type-level-numbers AlexeyKhudyakov
4714+type-level-tf CoreyOConnor
4715+type-ord NicolasFrisby
4716+type-ord-spine-cereal NicolasFrisby
4717+type-prelude EtienneLaurin
4718+type-settheory DanielSchuessler
4719+type-spine NicolasFrisby
4720+type-sub-th JonathanFischoff
4721+type-unary ConalElliott
4722+typehash LennartAugustsson
4723+typelevel-tensor TakayukiMuranushi
4724+typeof DonaldStewart KangyuanNiu
4725+typical RickKaudewitz
4726+typography-geometry PierreEtienneMeunier
4727+uAgda JeanPhilippeBernardy
4728+ua-parser OzgunAtaman
4729+uacpid DinoMorelli
4730+uconv AudreyTang
4731+udbus MichaelSnoyman VincentHanquez
4732+udbus-model VincentHanquez
4733+udcode WaltBaety
4734+uglymemo LennartAugustsson
4735+uhc-util AtzeDijkstra
4736+uhexdump EricKow
4737+ui-command ConradParker
4738+una JohnWiegley
4739+unamb ConalElliott
4740+unamb-custom LukePalmer
4741+unbound BrentYorgey
4742+unbounded-delays BasVanDijk
4743+unboxed-containers EdwardKmett
4744+unfoldable SjoerdVisscher
4745+ungadtagger AndriyPolishchuk
4746+uni-events ChristianMaeder
4747+uni-graphs ChristianMaeder
4748+uni-htk ChristianMaeder
4749+uni-posixutil ChristianMaeder
4750+uni-reactor ChristianMaeder
4751+uni-uDrawGraph ChristianMaeder
4752+uni-util ChristianMaeder
4753+unicode-names AshleyYakeley
4754+unicode-normalization ReinierLamers
4755+unicode-prelude PeterDivianszky
4756+unicode-properties AshleyYakeley
4757+unicode-symbols RoelVanDijk
4758+unification-fd WrenThornton
4759+union-find ThomasSchilling
4760+uniplate NeilMitchell
4761+uniqueid SebastianFischer
4762+unittyped ThijsAlkemade
4763+universal-binary ErikCharlebois
4764+universe DanielWagner
4765+universe-th JonathanFischoff
4766+unix IanLynagh PaoloCapriotti RossPaterson
4767+unix-bytestring WrenThornton
4768+unix-compat BjornBringert BryanOSullivan DuncanCoutts JacobStanley
4769+unix-handle AndersKaseorg
4770+unix-io-extra TaruKarttunen
4771+unix-process-conduit MichaelSnoyman
4772+unix-pty-light StuartCook
4773+unix-time KazuYamamoto
4774+unlambda GwernBranwen
4775+unm-hip JosephCollard
4776+unordered-containers JohanTibell
4777+unpack-funcs LouisWasserman
4778+unroll-ghc-plugin AustinSeipp
4779+unsafe HenningThielemann
4780+unsafe-promises AdamCurtis
4781+unscramble JoelTaylor
4782+unusable-pkg YuriyIskra
4783+up ThomasEding
4784+uploadcare DimitrySolovyov
4785+upskirt FrancescoMazzoli
4786+uri JaroslavGridin
4787+uri-conduit MichaelSnoyman
4788+uri-enumerator MichaelSnoyman
4789+uri-enumerator-file MichaelSnoyman
4790+uri-template SigbjornFinne
4791+url IavorDiatchki
4792+url-generic ChrisDone
4793+urlcheck DonaldStewart
4794+urldecode BenedictEastaugh
4795+urldisp-happstack SterlingClover
4796+urlencoded JoshHoyt PhilipWeaver
4797+usb BasVanDijk
4798+usb-enumerator BasVanDijk
4799+usb-id-database RoelVanDijk
4800+usb-iteratee BasVanDijk
4801+usb-safe BasVanDijk
4802+utf8-env DmitryGolubovsky
4803+utf8-light MattMorrow PatrickPalka
4804+utf8-prelude PeterDivianszky
4805+utf8-string DonaldStewart EricMertens IanLynagh
4806+utility-ht HenningThielemann
4807+uu-interleaved DoaitseSwierstra
4808+uu-options DoaitseSwierstra
4809+uu-parsinglib DoaitseSwierstra
4810+uu-tc JurrienStutterheim
4811+uuagc ArieMiddelkoop DoaitseSwierstra JeroenBransen
4812+uuagc-bootstrap ArieMiddelkoop JeroenBransen
4813+uuagc-cabal ArieMiddelkoop JeroenBransen
4814+uuid AntoineLatter
4815+uuid-quasi LarsPetersen
4816+uulib ArieMiddelkoop DoaitseSwierstra JeroenBransen
4817+uvector BryanOSullivan DonaldStewart
4818+uvector-algorithms DanDoel
4819+v4l2 ClaudeHeilandAllen
4820+v4l2-examples ClaudeHeilandAllen
4821+vacuum AustinSeipp ConradParker DonaldStewart MattMorrow
4822+vacuum-cairo DonaldStewart
4823+vacuum-graphviz AustinSeipp
4824+vacuum-opengl BalazsKomuves
4825+vacuum-ubigraph GlebAlexeyev
4826+validate ChrisDone
4827+value-supply IavorDiatchki
4828+variable-precision ClaudeHeilandAllen
4829+vault HeinrichApfelmus
4830+vcard MathieuBoespflug
4831+vcd TomHawkins
4832+vcs-revision EugeneKirpichov
4833+vcsgui StephanFortelny
4834+vcswrapper StephanFortelny
4835+vect BalazsKomuves
4836+vect-opengl BalazsKomuves
4837+vector RomanLeshchinskiy
4838+vector-algorithms BryanOSullivan DanDoel
4839+vector-binary JakubWaszczuk
4840+vector-binary-instances BryanOSullivan DonaldStewart
4841+vector-buffer VivianMcPhail
4842+vector-bytestring BasVanDijk
4843+vector-clock AlexandruScvortov
4844+vector-conduit JaredHance
4845+vector-fftw JudahJacobson
4846+vector-heterogenous MikeIzbicki
4847+vector-instances EdwardKmett
4848+vector-instances-collections TobiasBrandt
4849+vector-mmap DanielPeebles
4850+vector-random DonaldStewart
4851+vector-read-instances ChristianHoener
4852+vector-space ConalElliott
4853+vector-space-map ChristianConkle
4854+vector-space-opengl AdamFoltzer
4855+vector-space-points BrentYorgey
4856+vector-static DanielPeebles JakeMcArthur
4857+vector-strategies ThomasDuBuisson
4858+vector-th-unbox LiyangHu
4859+verilog TomHawkins
4860+vhd JonathanKnowles VincentHanquez
4861+vhdl ChristiaanBaaij
4862+views MarcCoiffier
4863+vintage-basic LyleKopnicky
4864+vinyl JonSterling
4865+virthualenv BartoszCwiklowski
4866+vision OlegBelozeorov
4867+visual-graphrewrite ZsoltDollenstein
4868+visual-prof DanielVelkov
4869+void EdwardKmett
4870+vorbiscomment ChrisWagner
4871+vowpal-utils CarterSchonwald
4872+vte AndyStewart AxelSimon DuncanCoutts
4873+vty CoreyOConnor DonaldStewart GwernBranwen PeterSimons
4874+vty-menu TimothyHobbs
4875+vty-ui JonathanDaugherty
4876+vty-ui-extras JonathanDaugherty
4877+wai MichaelSnoyman
4878+wai-app-file-cgi KazuYamamoto
4879+wai-app-static MichaelSnoyman
4880+wai-dispatch StephenWeber
4881+wai-eventsource FelipeLessa MichaelSnoyman
4882+wai-extra FelipeLessa MichaelSnoyman
4883+wai-frontend-monadcgi MichaelSnoyman
4884+wai-handler-devel MichaelSnoyman
4885+wai-handler-fastcgi MichaelSnoyman
4886+wai-handler-launch MichaelSnoyman
4887+wai-handler-scgi MichaelSnoyman
4888+wai-handler-snap MichaelSnoyman
4889+wai-handler-webkit MichaelSnoyman
4890+wai-hastache StephenWeber
4891+wai-lite AmitLevy
4892+wai-logger KazuYamamoto
4893+wai-logger-prefork KazuYamamoto
4894+wai-middleware-cache AlexanderDorofeev
4895+wai-middleware-cache-redis AlexanderDorofeev
4896+wai-middleware-catch AlexanderDorofeev
4897+wai-middleware-headers SeanHess
4898+wai-middleware-route AlexanderDorofeev
4899+wai-middleware-static AndrewFarmer
4900+wai-router MarekDolgos
4901+wai-routes AnupamJain
4902+wai-session StephenWeber
4903+wai-session-clientsession StephenWeber
4904+wai-session-tokyocabinet StephenWeber
4905+wai-static-pages GregWeber
4906+wai-test MichaelSnoyman GregWeber
4907+wai-util StephenWeber
4908+wai-websockets MichaelSnoyman
4909+waitfree YoichiHirai
4910+warp KazuYamamoto MichaelSnoyman
4911+warp-dynamic HideyukiTanaka
4912+warp-static MichaelSnoyman
4913+warp-tls MichaelSnoyman
4914+wavconvert TimChevalier
4915+wavesurfer StefanKersten
4916+wcwidth JasonDusek
4917+weather-api PeterGoncharov
4918+web-css BardurArantsson
4919+web-encodings MichaelSnoyman
4920+web-fpco MichaelSnoyman
4921+web-mongrel2 ClintMoore
4922+web-plugins JeremyShaw
4923+web-routes JeremyShaw
4924+web-routes-boomerang JeremyShaw
4925+web-routes-happstack JeremyShaw
4926+web-routes-hsp JeremyShaw
4927+web-routes-mtl JeremyShaw
4928+web-routes-quasi MichaelSnoyman
4929+web-routes-regular JeremyShaw
4930+web-routes-th JeremyShaw
4931+web-routes-transformers JeremyShaw
4932+web-routes-wai JeremyShaw
4933+webdriver AdamCurtis
4934+webidl DmitryGolubovsky
4935+webkit AndyStewart AxelSimon DanielWagner DuncanCoutts
4936+webserver JohnLato KazuYamamoto
4937+websockets JasperVanDerJeugt SinisaBidin
4938+websockets-snap JasperVanDerJeugt
4939+webwire ErtugrulSoeylemez
4940+wedding-announcement PetrRockai
4941+weighted-regexp SebastianFischer
4942+weighted-search LukePalmer
4943+whim GwernBranwen
4944+whitespace HaroldLee
4945+wikipedia4epub RadoslavDorcik
4946+windowslive JoshHoyt
4947+winerror FelixMartini
4948+winio FelixMartini
4949+witness AshleyYakeley
4950+wizards LiamOConnorDavis
4951+wl-pprint OtakarSmrz StefanORear
4952+wl-pprint-extras EdwardKmett
4953+wl-pprint-terminfo EdwardKmett
4954+wl-pprint-text IvanMiljenovic
4955+woffex AndrewDrake
4956+wol TomLokhorst
4957+word24 JohnLato
4958+word8 KazuYamamoto
4959+wordcloud ChrisDone
4960+wordexp MatveyAksenov
4961+words ChrisSmith
4962+wordsearch ByronJohnson
4963+wordsetdiff RyanNewton
4964+wp-archivebot GwernBranwen
4965+wraparound ChristopherHoward
4966+wraxml HenningThielemann
4967+wsedit LinusLuessing
4968+wtk BartoszWojcik
4969+wtk-gtk BartoszWojcik
4970+wumpus-basic StephenTetley
4971+wumpus-core StephenTetley
4972+wumpus-drawing StephenTetley
4973+wumpus-microprint StephenTetley
4974+wumpus-tree StephenTetley
4975+wx DanielFischer EricKow JeremyODonoghue KidoTakahiro
4976+wxAsteroids HenkJanVanTuyl
4977+wxFruit HenkJanVanTuyl KidoTakahiro
4978+wxc JeremyODonoghue
4979+wxcore DanielFischer EricKow JeremyODonoghue KidoTakahiro
4980+wxdirect DanielFischer EricKow JeremyODonoghue KidoTakahiro
4981+wxhnotepad FernandoBenavides
4982+wxturtle YoshikuniJujo
4983+wyvern DanielWagner
4984+x-dsp JohnLato
4985+x11-xim YoshikuniJujo
4986+x11-xinput IlyaPortnov
4987+x509 VincentHanquez
4988+x509-store VincentHanquez
4989+x509-system VincentHanquez
4990+x509-util VincentHanquez
4991+x509-validation VincentHanquez
4992+xattr DeianStefan EvanKlitzke
4993+xbattbar AlexanderPolakov
4994+xcb-types AntoineLatter
4995+xchat-plugin CedricAuger
4996+xdg-basedir WillDonnelly
4997+xdg-userdirs IlyaPortnov
4998+xdot DennisFelsing
4999+xenstore VincentHanquez
5000+xfconf JohnObbele
5001+xformat SeanLeather
5002+xhaskell-library KennyLu
5003+xhb AntoineLatter
5004+xhtml BjornBringert ChrisDornan IanLynagh RossPaterson
5005+xhtml-combinators AlasdairArmstrong
5006+xilinx-lava SatnamSingh
5007+xine JoachimFasting
5008+xkcd RobertSelvek
5009+xlsx KirillZaborsky
5010+xlsx-templater KirillZaborsky
5011+xml DonaldStewart IavorDiatchki
5012+xml-basic HenningThielemann
5013+xml-catalog MichaelSnoyman
5014+xml-conduit MichaelSnoyman
5015+xml-conduit-writer AlexanderBondarenko
5016+xml-enumerator MichaelSnoyman
5017+xml-enumerator-combinators AristidBreitkreuz
5018+xml-hamlet MichaelSnoyman
5019+xml-helpers AdamWick
5020+xml-monad AristidBreitkreuz
5021+xml-parsec GwernBranwen StephanFriedrichs
5022+xml-picklers PhilippBalzarek
5023+xml-prettify DavidRosenberg
5024+xml-to-json NoamLewis
5025+xml-types JohnMillikin
5026+xml2html MichaelSnoyman
5027+xml2json YiHuang
5028+xml2x GwernBranwen KetilMalde
5029+xmlgen StefanWehr
5030+xmlhtml ChrisSmith DougBeardsley GregoryCollins JasperVanDerJeugt
5031+xmms2-client OlegBelozeorov
5032+xmms2-client-glib OlegBelozeorov
5033+xmobar AndreaRossato JoseAntonioOrtegaRuiz
5034+xmonad AdamVogt DonaldStewart SpencerJanssen
5035+xmonad-bluetilebranch JanVornberger
5036+xmonad-contrib AdamVogt RossPaterson SpencerJanssen
5037+xmonad-contrib-bluetilebranch JanVornberger
5038+xmonad-eval DanielSchoepe
5039+xmonad-extras AdamVogt DanielSchoepe DanielWagner
5040+xmonad-screenshot DmitryMalikov
5041+xmonad-utils AndreaRossato GwernBranwen LeifWarner
5042+xorshift RobertClausecker
5043+xosd DonaldStewart
5044+xournal-builder IanWooKim
5045+xournal-convert IanWooKim
5046+xournal-parser IanWooKim
5047+xournal-render IanWooKim
5048+xournal-types IanWooKim
5049+xsact GwernBranwen KetilMalde
5050+xsd StefanWehr ThomasDuBuisson TonyMorris
5051+xsha1 AlexKropivny
5052+xslt DavidHimmelstrup
5053+xss-sanitize GregWeber MichaelSnoyman
5054+xtc AlanZimmerman EricKow
5055+xtest IlyaPortnov
5056+xturtle YoshikuniJujo
5057+yackage MichaelSnoyman
5058+yahoo-web-search GordonStewart
5059+yajl JohnMillikin
5060+yajl-enumerator JohnMillikin
5061+yall BrandonSimmons
5062+yaml MichaelSnoyman
5063+yaml-config FedorGogolev MaximMitroshin
5064+yaml-light MichaelIlseman
5065+yaml-rpc IlyaPortnov
5066+yampa-glut NikolayOrlyuk
5067+yaop EugeneSmolanka
5068+yap RossPaterson
5069+yarr RomanLeventov
5070+yarr-image-io RomanLeventov
5071+yavie YoshikuniJujo
5072+ycextra DmitryGolubovsky
5073+yeganesh DanielWagner
5074+yesod GregWeber MichaelSnoyman
5075+yesod-auth FelipeLessa MichaelSnoyman RaphaelJavaux
5076+yesod-auth-account JohnLenz
5077+yesod-auth-deskcom FelipeLessa
5078+yesod-auth-fb FelipeLessa
5079+yesod-auth-kerberos ArashRouhani
5080+yesod-auth-ldap MichaelLitchard
5081+yesod-auth-oauth HiromiIshii
5082+yesod-auth-zendesk FelipeLessa
5083+yesod-bin MichaelSnoyman
5084+yesod-comments PatrickBrisbin
5085+yesod-continuations MattBrown
5086+yesod-core FelipeLessa GregWeber MichaelSnoyman
5087+yesod-datatables TeroLaitinen
5088+yesod-default MichaelSnoyman
5089+yesod-eventsource FelipeLessa
5090+yesod-examples MichaelSnoyman
5091+yesod-fay MichaelSnoyman
5092+yesod-fb FelipeLessa
5093+yesod-form FelipeLessa GregWeber MichaelSnoyman
5094+yesod-goodies PatrickBrisbin
5095+yesod-json FelipeLessa MichaelSnoyman
5096+yesod-links PatrickBrisbin
5097+yesod-markdown AlexanderDunlap PatrickBrisbin
5098+yesod-newsfeed MichaelSnoyman PatrickBrisbin
5099+yesod-paginate AlexanderDunlap
5100+yesod-paginator PatrickBrisbin
5101+yesod-persistent MichaelSnoyman
5102+yesod-platform MichaelSnoyman
5103+yesod-pnotify KatsutoshiItoh
5104+yesod-pure MichaelSnoyman
5105+yesod-recaptcha FelipeLessa
5106+yesod-routes MichaelSnoyman
5107+yesod-rst PascalWittmann
5108+yesod-sitemap MichaelSnoyman
5109+yesod-static FelipeLessa MichaelSnoyman
5110+yesod-tableview ErtugrulSoeylemez
5111+yesod-test GregWeber MichaelSnoyman
5112+yesod-test-json SamAnklesaria
5113+yesod-text-markdown ArashRouhani
5114+yesod-vend KrzysztofSkrzetnicki
5115+yhccore DmitryGolubovsky NeilMitchell
5116+yi CoreyOConnor DmitryIvanov JeanPhilippeBernardy JeffWheeler
5117+yi-contrib CoreyOConnor DmitryIvanov JeffWheeler
5118+yi-gtk GwernBranwen JeanPhilippeBernardy
5119+yi-vty GwernBranwen JeanPhilippeBernardy
5120+yices KiYungAhn
5121+yices-easy KeeganMcAllister
5122+yices-painless DonaldStewart
5123+yjftp YoshikuniJujo
5124+yjftp-libs YoshikuniJujo
5125+yjsvg YoshikuniJujo
5126+yjtools YoshikuniJujo
5127+yoko NicolasFrisby
5128+york-lava MatthewNaylor
5129+youtube HenningThielemann
5130+yst JohnMacFarlane
5131+yuiGrid SergioUrinovsky
5132+yuuko JinjingWang
5133+z3 IagoAbal
5134+zampolit BrianSniffen
5135+zcache SamAnklesaria
5136+zenc JasonDagit
5137+zeno WilliamSonnex
5138+zeromq-haskell ToralfWittner
5139+zeromq3-conduit NicolasTrangez
5140+zeromq3-haskell ToralfWittner
5141+zeroth DavidHimmelstrup RobinGreen
5142+zigbee-znet25 DavidJoyner
5143+zip-archive JohnMacFarlane
5144+zip-conduit TimCherganov
5145+zipedit BrentYorgey
5146+zipper AndresLoeh
5147+zippo BrandonSimmons
5148+zlib DuncanCoutts RossPaterson
5149+zlib-bindings MichaelSnoyman
5150+zlib-conduit MichaelSnoyman
5151+zlib-enum MalteSommerkorn
5152+zmcat LucasDiCioccio
5153+zmidi-core StephenTetley
5154+zmqat koral
5155+zoneinfo MarkAylett
5156+zoom IanDuncan
5157+zoom-cache ConradParker
5158+zoom-cache-pcm ConradParker
5159+zoom-cache-sndfile ConradParker
5160+zot YoshikuniJujo
5161+zsh-battery MatsRauhala
5162+ztail DylanSimon
5163+inspection-proxy MariusGhita
5164+tfp-th HenningThielemann
5165+unordered-containers-rematch TomCrayford
5166+Clean MarcCoiffier
5167+black-jewel DmitryBogatov
5168+fixedprec PeterSelinger
5169+futun JussiMaki
5170+hamid HansHoglund
5171+hse-cpp RomanCheplyaka
5172+iter-stats JohnLato
5173+minioperational FumiakiKinoshita
5174+moo SergeyAstanin
5175+multimap JulianFleischer
5176+music-articulation HansHoglund
5177+music-dynamics HansHoglund
5178+music-dynamics-literal HansHoglund
5179+music-parts HansHoglund
5180+music-pitch HansHoglund
5181+music-preludes HansHoglund
5182+music-score HansHoglund
5183+musicxml2 HansHoglund
5184+network-simple-tls RenzoCarbonara
5185+noise TomBrow
5186+prelude-prime RomanCheplyaka
5187+process-listlike DavidFox
5188+reenact HansHoglund
5189+while-lang-parser DavidNilsson
5190+yamemo NobuoYamashita
5191+yesod-dsl TeroLaitinen
5192+Nomyx-Language CorentinDupont
5193+haskell-packages RomanCheplyaka
5194+hsbencher RyanNewton
5195+markdown-kate JoelTaylor
5196+pipes-network-tls RenzoCarbonara
5197+restful-snap DougBeardsley
5198+robots-txt MarkWotton
5199+disjoint-sets-st PetrPudlak
5200+haskell-spacegoo JoachimBreitner
5201+prelude-safeenum WrenThornton
5202+testloop RomanGonzalez
5203+var AndySonnenburg
5204+colors FumiakiKinoshita
5205+embeddock-example TakayukiMuranushi
5206+equational-reasoning HiromiIshii
5207+hruby SimonMarechal
5208+katt DavidNilsson
5209+monadplus HansHoglund
5210+null-canvas KrzysztofSkrzetnicki
5211+type-natural HiromiIshii
5212+avr-shake JamesCook
5213+kontrakcja-templates MariuszRak
5214+pipes-parse GabrielGonzalez
5215+posix-pty MerijnVerstraaten
5216+prettify HansHoglund
5217+BigPixel ManuelChakravarty
5218+azurify ArnoVanLumig
5219+chesshs ArnoVanLumig
5220+control-bool FumiakiKinoshita
5221+hath MichaelOrlitzky
5222+ig JeanPhilippeMoresmau
5223+intset SamTruzjan
5224+java-bridge JulianFleischer
5225+magma KatsutoshiItoh
5226+modbus-tcp RoelVanDijk
5227+modulo HansHoglund
5228+mongodb-queue GregWeber
5229+pipes-aeson RenzoCarbonara
5230+pipes-binary RenzoCarbonara
5231+saltine JosephAbrahamson
5232+standalone-haddock RomanCheplyaka
5233+term-rewriting BertramFelgenhauer
5234+transf HansHoglund
5235+union-find-array BertramFelgenhauer
5236+BerlekampAlgorithm AbdelwahebMiled
5237+Control-Monad-ST2 KevinBackhouse
5238+atom-msp430 DanielBuckmaster
5239+bencoding SamTruzjan
5240+cassandra-cql StephenBlackheath
5241+email-validator MichaelOrlitzky
5242+fficxx IanWooKim
5243+fficxx-runtime IanWooKim
5244+http-attoparsec TeroLaitinen
5245+inject SimonHengel
5246+krpc SamTruzjan
5247+monad-loops-stm JamesCook
5248+nicify JulianFleischer
5249+padKONTROL FumiakiKinoshita
5250+rws KarlKnutsson
5251+xing-api JanAhrens
5252+haskell-reflect JulianFleischer
5253+Control-Monad-MultiPass KevinBackhouse
5254+genetics AndrewPennebaker
5255+ghc-make NeilMitchell
5256+gpah JohanJeuring
5257+hack2-contrib-extra JinjingWang
5258+nemesis-titan JinjingWang
5259+nitro ErinDahlgren
5260+sys-auth-smbclient KazuoKoga
5261+transformations JosePedroMagalhaes JeroenBransen
5262+yesod-auth-pam KazuoKoga
5263+Win32-services-wrapper GaneshSittampalam
5264+exceptions EdwardKmett
5265+j2hs JulianFleischer
5266+java-bridge-extras JulianFleischer
5267+java-reflect JulianFleischer
5268+karver JeremyHull
5269+papillon YoshikuniJujo
5270+stunclient PhilippBalzarek
5271+unique-logic HenningThielemann
5272+unique-logic-tf HenningThielemann
5273+xml-lens FumiakiKinoshita
5274+yesod-auth-smbclient KazuoKoga
5275+cascading ErtugrulSoeylemez
5276+hemokit NiklasHambuechen
5277+lua-bytecode JeffShaw
5278+pipes-vector BenGamari
5279+watcher NateSoares
5280+Dung BasVanGijzel
5281+haskell-names RomanCheplyaka
5282+hidapi PatrickChilton NiklasHambuechen
5283+hx JulianFleischer
5284+language-ecmascript-analysis AndreyChudnov
5285+llvm-general BenjaminScarlet
5286+playlists PeterJones
5287+github-post-receive ShoheiYasutake
5288+GiST MihailBogojeski
5289+byteable VincentHanquez
5290+module-management DavidFox
5291+risc386 AndreasAbel
5292+securemem VincentHanquez
5293+NXTDSL AlexanderThiemann
5294+afis VincentHanquez
5295+air-spec JinjingWang
5296+git-monitor JohnWiegley
5297+gitlib-cmdline JohnWiegley
5298+gitlib-cross JohnWiegley
5299+gitlib-libgit2 JohnWiegley
5300+gitlib-sample JohnWiegley
5301+gitlib-test JohnWiegley
5302+hdocs AlexandrRuchkin
5303+ideas-math BastiaanHeeren
5304+range RobertMassaioli
5305+splitter RobertMassaioli
5306+vinyl-gl AnthonyCowley
5307+hatex-guide DanielDiaz
5308+rollbar GregWeber
5309+Commando LyndonMaydwell
5310+Conscript LyndonMaydwell
5311+Hclip JensThomas
5312+ghci-ng HerbertValerioRiedel
5313+git-gpush JohnWiegley
5314+gitlib-utils JohnWiegley
5315+posix-paths JohnLato
5316+qhull-simple GardSpreemann
5317+reactive-io RomanCheplyaka
5318+special-keys HugoGomes
5319+transformers-supply MerijnVerstraaten
5320+vector-functorlazy MikeIzbicki
5321+chaselev-deque RyanNewton
5322+constructible AndersKaseorg
5323+hPDB MichalGajda
5324+hPDB-examples MichalGajda
5325+haste-compiler AntonEkblad
5326+redo ChrisForno
5327+rewrite OmariNorman
5328+HLearn-approximation MikeIzbicki
5329+HLearn-datastructures MikeIzbicki
5330+bindings-GLFW BrianLewis
5331+hastache-aeson VladimirKirillov
5332+helm ZackCorr
5333+hopfield NiklasHambuechen
5334+persistent-redis PavelRyzhov
5335+typeable-th BennoFuenfstueck
5336+typesafe-endian JohnEricson
5337+acme-lookofdisapproval AntonNikishaev
5338+data-ref HenningThielemann
5339+fishfood AlistairWard
5340+fswatcher ErlendHamberg
5341+g-npm JesusRivero
5342+terminfo-hs BryanRichter
5343+units RichardEisenberg
5344+geek JinjingWang
5345+geek-server JinjingWang
5346+scotty-session AlexanderThiemann
5347+supervisor AlbertoCorona
5348+data-fin WrenThornton
5349+ec2-signature YusukeNomura
5350+henet JohnEricson
5351+monadiccp-gecode JanTikovsky
5352+string-similarity MarkWotton
5353+threepenny-gui HeinrichApfelmus
5354+yaml2owl LeifWarner
5355+lilypond HansHoglund
5356+music-sibelius HansHoglund
5357+apache-md5 PeterTrsko
5358+ddc-core-flow BenLippmeier
5359+ddc-core-tetra BenLippmeier
5360+ddc-interface BenLippmeier
5361+hi DaisukeFujimura
5362+hsprocess MarioPastorelli
5363+monad-extras JohnWiegley ChrisDone
5364+reform-hamlet JeremyShaw
5365+repa-plugin BenLippmeier
5366+repa-series BenLippmeier
5367+simple-index HugoGomes
5368+test-framework-sandbox BenjaminSurma
5369+test-sandbox BenjaminSurma
5370+test-sandbox-hunit BenjaminSurma
5371+test-sandbox-quickcheck BenjaminSurma
5372+tsparse OmariNorman
5373+MHask DanBurton
5374+fixed-storable-array CarlHowells
5375+hdbi AlekseyUymanov
5376+hdbi-postgresql AlekseyUymanov
5377+markup-preview MariusGhita
5378+ratio-int RaphaelJavaux
5379+witty KazuYamamoto
5380+ar-timestamp-wiper NiklasHambuechen
5381+haeredes MichaelOrlitzky
5382+heukarya HeChienTsai
5383+io-manager MihaiMaruseac
5384+mpretty DavidDarais
5385+orders DavidDarais
5386+processing DanielDiaz
5387+reactive-banana-threepenny HeinrichApfelmus
5388+storable-static-array CarlHowells
5389+tasty RomanCheplyaka
5390+tasty-golden RomanCheplyaka
5391+tasty-hunit RomanCheplyaka
5392+tasty-quickcheck RomanCheplyaka
5393+tasty-smallcheck RomanCheplyaka
5394+Capabilities BaldurBlondal
5395+compilation AndreiLapets
5396+courier PhilHargett
5397+crypto-cipher-benchmarks VincentHanquez
5398+crypto-cipher-tests VincentHanquez
5399+crypto-cipher-types VincentHanquez
5400+crypto-totp JeffShaw
5401+data-extra ChrisDone
5402+foldl GabrielGonzalez
5403+hybrid-vectors EdwardKmett
5404+imparse AndreiLapets
5405+llvm-general-pure BenjaminScarlet
5406+parcom-lib TobiasDammers
5407+parsek JeanPhilippeBernardy
5408+richreports AndreiLapets
5409+smartcheck LeePike
5410+staticanalysis AndreiLapets
5411+uxadt AndreiLapets
5412+cabal-audit JoelTaylor
5413+csp AndreiBarbu
5414+doccheck MateuszKowalczyk
5415+ewe JuanFranciscoCardonaMcCormick
5416+float-binstring AntonNikishaev
5417+haxparse JoelTaylor
5418+hdbi-sqlite AlekseyUymanov
5419+hdbi-tests AlekseyUymanov
5420+hostname-validate ChrisDone
5421+hspec-smallcheck SimonHengel
5422+lens-time TatsuyaTouma
5423+ligature JosefSvenningsson
5424+nondeterminism AndreiBarbu
5425+restricted-workers DaniilFrumin
5426+scat RomainEdelmann
5427+strictly DanBurton
5428+uid PhilHargett
5429+filecache SimonMarechal
5430+Rlang-QQ AdamVogt
5431+SimpleH MarcCoiffier
5432+bytestring-plain HerbertValerioRiedel
5433+cipher-blowfish VincentHanquez
5434+cipher-des VincentHanquez
5435+hexpat-pickle-generic BrendanHay
5436+hspec-test-framework SimonHengel
5437+hspec-test-framework-th SimonHengel
5438+querystring-pickle BrendanHay
5439+tuples-homogenous-h98 PetrPudlak
5440+aws-route53 AmitLevy DavidTerei
5441+command-qq MatveyAksenov
5442+diagrams-pdf alpheccar
5443+graceful NoriyukiOhkawa
5444+postgresql-orm AmitLevy
5445+tasty-th BennoFuenfstueck
5446+DistanceUnits MattGambogi
5447+HaskellNet-SSL DanielWright
5448+SimpleGL MarcCoiffier
5449+abcnotation HansHoglund
5450+acme-microwave JoeQuinn
5451+aws-cloudfront-signer ChrisDornan
5452+aws-elastic-transcoder ChrisDornan
5453+aws-sign4 ChrisDornan
5454+bindings-nettle ClintAdams
5455+cloudfront-signer ChrisDornan
5456+hopenpgp-tools ClintAdams
5457+indian-language-font-converter AkashJagdhane
5458+language-mixal JonathanDaugherty
5459+lens-datetime MihalyBarasz
5460+memcache DavidTerei
5461+multext-east-msd JanSnajder
5462+penny OmariNorman
5463+sparse EdwardKmett HansHoglund
5464+sparser HansHoglund
5465+xkbcommon AukeBooij
5466+Chart-cairo TimDocker
5467+Chart-diagrams TimDocker
5468+Konf GoktugKayaalp
5469+acme-schoenfinkel ErtugrulSoeylemez
5470+camh HironaoKomatsu
5471+crypto-random VincentHanquez
5472+ctrie MichaelSchroeder
5473+damnpacket JoelTaylor
5474+fay-text AdamBergmark
5475+final GergelyRisko
5476+google-search LiyangHu
5477+kif-parser JanChristiansen
5478+set-cover HenningThielemann
5479+th-desugar RichardEisenberg
5480+halberd ErikHesselink
5481+hs-gen-iface RomanCheplyaka
5482+hspec-expectations-pretty GregWeber
5483+DrIFT KiwamuOkabe
5484+HSmarty AlexanderThiemann
5485+bindings-hdf5 MauricioAntunes
5486+cipher-camellia VincentHanquez
5487+clash-lib ChristiaanBaaij
5488+clckwrks-dot-com JeremyShaw
5489+clckwrks-theme-clckwrks JeremyShaw
5490+combinator-interactive FumiakiKinoshita
5491+conduit-extra MichaelSnoyman
5492+cubicbezier KristofBastiaensen
5493+currency StephenWeber
5494+data-fresh StijnVanDrongelen
5495+folds EdwardKmett
5496+genifunctors DanRosen
5497+google-mail-filters LiyangHu
5498+haskell98libraries ThomasHallgren
5499+hexpat-lens JosephAbrahamson
5500+holey-format ChrisDone
5501+libvorbis StephenBlackheath
5502+memexml FlorianEggenhofer
5503+openexchangerates StephenWeber
5504+scotty-blaze WilliamCasarin
5505+snappy-framing KimAltintop
5506+ureader SamTruzjan
5507+bdo ChrisDone
5508+cookbook NatePisarski
5509+hole ThomasEding
5510+minimal-configuration MariusGhita
5511+mono-foldable JohnLato
5512+statvfs GergelyRisko
5513+LogicGrowsOnTrees GregoryCrosswhite
5514+LogicGrowsOnTrees-MPI GregoryCrosswhite
5515+LogicGrowsOnTrees-network GregoryCrosswhite
5516+LogicGrowsOnTrees-processes GregoryCrosswhite
5517+inject-function DimitriSabadie
5518+jacobi-roots GregHorn
5519+pandoc-citeproc JohnMacFarlane
5520+pipes-interleave BenGamari
5521+wai-graceful AlexanderBondarenko
5522+bindings-sophia EyalLotem
5523+effects-parser JesseMcDonald
5524+pbkdf ChrisDornan
5525+sophia EyalLotem
5526+vigilance MichaelXavier
5527+expand MarcosViera
5528+haskintex DanielDiaz
5529+rfc5051 JohnMacFarlane
5530+case-conversion AlanHawkins
5531+drClickOn AtzeVanDerPloeg
5532+extractelf EyalLotem
5533+geniserver EricKow
5534+haskhol-core EvanAustin
5535+hnetcdf IanRoss
5536+pipes-bytestring GabrielGonzalez
5537+pipes-csv WilliamCasarin
5538+push-notify MarcosPividori
5539+push-notify-ccs MarcosPividori
5540+push-notify-general MarcosPividori
5541+read-bounded ThomasEding
5542+scotty-hastache DaniilFrumin
5543+sharedio NiklasHambuechen
5544+sign MasahiroSakai
5545+tf-random MichalPalka
5546+unexceptionalio StephenWeber
5547+ac-machine YutaTaniguchi
5548+cipher-rc5 FinnEspenGundersen
5549+d3js nebuta
5550+demarcate NickolayKudasov
5551+iterable MichalGajda
5552+linux-evdev BenGamari
5553+liquid-fixpoint EricSeidel
5554+liquidhaskell EricSeidel
5555+mono-traversable MichaelSnoyman
5556+proj4-hs-bindings PavelPenev
5557+Win32-extras KidoTakahiro
app/lts-major-bump.hsnew file+4
@@ -0,0 +1,4 @@
1+import Stackage2.CompleteBuild
2+
3+main :: IO ()
4+main = completeBuild (LTS Major)
app/lts-minor-bump.hsnew file+4
@@ -0,0 +1,4 @@
1+import Stackage2.CompleteBuild
2+
3+main :: IO ()
4+main = completeBuild (LTS Minor)
app/stackage-nightly.hsnew file+4
@@ -0,0 +1,4 @@
1+import Stackage2.CompleteBuild
2+
3+main :: IO ()
4+main = completeBuild Nightly
app/stackage.hsnew file+148
@@ -0,0 +1,148 @@
1+{-# LANGUAGE RecordWildCards #-}
2+import Data.Set (fromList)
3+import Stackage.Build (build, defaultBuildSettings)
4+import Stackage.BuildPlan (readBuildPlan, writeBuildPlan, writeBuildPlanCsv)
5+import Stackage.CheckPlan (checkPlan)
6+import Stackage.GhcPkg (getGhcVersion)
7+import Stackage.Init (stackageInit)
8+import Stackage.Select (defaultSelectSettings, select)
9+import Stackage.Tarballs (makeTarballs)
10+import Stackage.Test (runTestSuites)
11+import Stackage.Types
12+import Stackage.Util (allowPermissive)
13+import System.Environment (getArgs, getProgName)
14+import System.IO (hFlush, stdout)
15+
16+data SelectArgs = SelectArgs
17+ { excluded :: [String]
18+ , noPlatform :: Bool
19+ , ignoreUpgradeable :: Bool
20+ , onlyPermissive :: Bool
21+ , allowed :: [String]
22+ , buildPlanDest :: FilePath
23+ , buildPlanCsvDest :: FilePath
24+ , globalDB :: Bool
25+ }
26+
27+parseSelectArgs :: [String] -> IO SelectArgs
28+parseSelectArgs =
29+ loop SelectArgs
30+ { excluded = []
31+ , noPlatform = True
32+ , ignoreUpgradeable = False
33+ , onlyPermissive = False
34+ , allowed = []
35+ , buildPlanDest = defaultBuildPlan
36+ , buildPlanCsvDest = defaultBuildPlanCsv
37+ , globalDB = False
38+ }
39+ where
40+ loop x [] = return x
41+ loop x ("--exclude":y:rest) = loop x { excluded = y : excluded x } rest
42+ loop x ("--no-platform":rest) = loop x { noPlatform = True } rest
43+ loop x ("--platform":rest) = loop x { noPlatform = False } rest
44+ loop x ("--ignore-upgradeable":rest) = loop x { ignoreUpgradeable = True } rest
45+ loop x ("--only-permissive":rest) = loop x { onlyPermissive = True } rest
46+ loop x ("--allow":y:rest) = loop x { allowed = y : allowed x } rest
47+ loop x ("--build-plan":y:rest) = loop x { buildPlanDest = y } rest
48+ loop x ("--build-plan-csv":y:rest) = loop x { buildPlanCsvDest = y } rest
49+ loop x ("--use-global-db":rest) = loop x { globalDB = True } rest
50+ loop _ (y:_) = error $ "Did not understand argument: " ++ y
51+
52+data BuildArgs = BuildArgs
53+ { sandbox :: String
54+ , buildPlanSrc :: FilePath
55+ , extraArgs' :: [String] -> [String]
56+ , noDocs :: Bool
57+ , buildCores :: Maybe Int
58+ , testThreads :: Maybe Int
59+ }
60+
61+parseBuildArgs :: GhcMajorVersion -> [String] -> IO BuildArgs
62+parseBuildArgs version =
63+ loop BuildArgs
64+ { sandbox = sandboxRoot $ defaultBuildSettings Nothing version
65+ , buildPlanSrc = defaultBuildPlan
66+ , extraArgs' = id
67+ , noDocs = False
68+ , buildCores = Nothing
69+ , testThreads = Nothing
70+ }
71+ where
72+ loop x [] = return x
73+ loop x ("--sandbox":y:rest) = loop x { sandbox = y } rest
74+ loop x ("--build-plan":y:rest) = loop x { buildPlanSrc = y } rest
75+ loop x ("--arg":y:rest) = loop x { extraArgs' = extraArgs' x . (y:) } rest
76+ loop x ("--no-docs":rest) = loop x { noDocs = True } rest
77+ loop x ("-j":y:rest) = loop x { buildCores = Just $ read y } rest
78+ loop x ("--test-threads":y:rest) = loop x { testThreads = Just $ read y } rest
79+ loop _ (y:_) = error $ "Did not understand argument: " ++ y
80+
81+defaultBuildPlan :: FilePath
82+defaultBuildPlan = "build-plan.txt"
83+
84+defaultBuildPlanCsv :: FilePath
85+defaultBuildPlanCsv = "build-plan.csv"
86+
87+withBuildSettings :: [String] -> (BuildSettings -> BuildPlan -> IO a) -> IO a
88+withBuildSettings args f = do
89+ version <- getGhcVersion
90+ BuildArgs {..} <- parseBuildArgs version args
91+ bp <- readBuildPlan buildPlanSrc
92+ let bs = defaultBuildSettings buildCores version
93+ modTestThreads settings' =
94+ case testThreads of
95+ Nothing -> settings'
96+ Just t -> settings' { testWorkerThreads = t }
97+ settings = modTestThreads bs
98+ { sandboxRoot = sandbox
99+ , extraArgs = extraArgs' . extraArgs bs
100+ , buildDocs = not noDocs
101+ }
102+ f settings bp
103+
104+main :: IO ()
105+main = do
106+ args <- getArgs
107+ case args of
108+ "select":rest -> do
109+ SelectArgs {..} <- parseSelectArgs rest
110+ ghcVersion <- getGhcVersion
111+ bp <- select
112+ (defaultSelectSettings ghcVersion $ not noPlatform)
113+ { excludedPackages = fromList $ map PackageName excluded
114+ , requireHaskellPlatform = not noPlatform
115+ , ignoreUpgradeableCore = ignoreUpgradeable
116+ , allowedPackage =
117+ if onlyPermissive
118+ then allowPermissive allowed
119+ else const $ Right ()
120+ , useGlobalDatabase = globalDB
121+ }
122+ writeBuildPlan buildPlanDest bp
123+ writeBuildPlanCsv buildPlanCsvDest bp
124+ ("check":rest) -> withBuildSettings rest checkPlan
125+ ("build":rest) -> withBuildSettings rest build
126+ ("test":rest) -> withBuildSettings rest runTestSuites
127+ ("tarballs":rest) -> withBuildSettings rest $ const makeTarballs
128+ ["init"] -> do
129+ putStrLn "Note: init isn't really ready for prime time use."
130+ putStrLn "Using it may make it impossible to build stackage."
131+ putStr "Are you sure you want continue (y/n)? "
132+ hFlush stdout
133+ x <- getLine
134+ case x of
135+ c:_ | c `elem` "yY" -> stackageInit
136+ _ -> putStrLn "Probably a good decision, exiting."
137+ ["update"] -> stackageInit >> error "FIXME update"
138+ _ -> do
139+ pn <- getProgName
140+ putStrLn $ "Usage: " ++ pn ++ " <command>"
141+ putStrLn "Available commands:"
142+ --putStrLn " update Download updated Stackage databases. Automatically calls init."
143+ --putStrLn " init Initialize your cabal file to use Stackage"
144+ putStrLn " uploads"
145+ putStrLn " select [--no-clean] [--no-platform] [--exclude package...] [--only-permissive] [--allow package] [--build-plan file]"
146+ putStrLn " check [--build-plan file] [--sandbox rootdir] [--arg cabal-arg]"
147+ putStrLn " build [--build-plan file] [--sandbox rootdir] [--arg cabal-arg]"
148+ putStrLn " test [--build-plan file] [--sandbox rootdir] [--arg cabal-arg] [--no-docs]"
automated/.gitignoredeleted−2
@@ -1,2 +0,0 @@
1−/work/
2−/*-build.log
automated/build.shdeleted−158
@@ -1,158 +0,0 @@
1−#!/usr/bin/env bash
2−
3−set -eu +x -o pipefail
4−
5−ROOT=$(cd $(dirname $0) ; pwd)
6−TARGET=$1
7−
8−source work/aws.sh
9−
10−# For nightly-YYYY-MM-DD, tag should be nightly
11−# For lts-X.Y, tag should be ltsX
12−SHORTNAME=$(echo $TARGET | cut -d- -f 1)
13−if [ $SHORTNAME = "lts" ]
14−then
15− TAG=$(echo $TARGET | sed 's@^lts-\([0-9]*\)\.[0-9]*@lts\1@')
16− WORKDIR=$ROOT/work/$(echo $TARGET | sed 's@^lts-\([0-9]*\)\.[0-9]*@lts-\1@')
17−else
18− TAG=$SHORTNAME
19− WORKDIR=$ROOT/work/$TAG
20−fi
21−
22−#IMAGE=commercialhaskell/stackage:$TAG
23−IMAGE=ghcr.io/commercialhaskell/stackage/build:$TAG
24−
25−PANTRY_DIR=$ROOT/work/stack/pantry
26−STACK_DIR=$ROOT/work/stack
27−DOT_STACKAGE_DIR=$ROOT/work/dot-stackage
28−# ssh key is used for committing snapshots (and their constraints) to Github
29−SSH_DIR=$ROOT/work/ssh
30−USERID=$(id -u)
31−
32−mkdir -p \
33− "$PANTRY_DIR" \
34− "$STACK_DIR" \
35− "$DOT_STACKAGE_DIR" \
36− "$WORKDIR" \
37− "$SSH_DIR"
38−
39−GITCONFIG=$ROOT/work/gitconfig
40−cat >$GITCONFIG <<EOF
41−[user]
42− email = michael+stackage-build@fpcomplete.com
43− name = Stackage Build host
44−EOF
45−
46−HACKAGE_CREDS=$ROOT/work/hackage-creds
47−
48−function require_400_file {
49− if [ ! -f "$1" ]
50− then
51− echo File not found: "$1"
52− exit 1
53− fi
54−
55− chmod 400 "$1"
56−}
57−
58−require_400_file "$SSH_DIR/id_rsa"
59−require_400_file "$HACKAGE_CREDS"
60−
61−mkdir -p $ROOT/work/bin
62−BINDIR=$(cd $ROOT/work/bin ; pwd)
63−(
64−cd $BINDIR
65−rm -f curator stack *.bz2
66−
67−curl -L "https://github.com/commercialhaskell/curator/releases/download/commit-1ef870178f6a0544fe5a3fd23a83fc075aabd695/curator.bz2" | bunzip2 > curator
68−chmod +x curator
69−echo -n "curator version: "
70−docker run --rm -v $(pwd)/curator:/exe $IMAGE /exe --version
71−
72−curl -L https://github.com/commercialhaskell/stack/releases/download/v2.7.3/stack-2.7.3-linux-x86_64-bin > stack
73−chmod +x stack
74−echo -n "stack version: "
75−docker run --rm -v $(pwd)/stack:/exe $IMAGE /exe --version
76−)
77−
78−# We share pantry directory between snapshots while the other content in .stack
79−# is stored separately (because e.g. Ubuntu releases between LTS and nightly
80−# could differ). Also the order of binds is important.
81−ARGS_COMMON="--rm -v $WORKDIR:$HOME/work -w $HOME/work -v $BINDIR/curator:/usr/bin/curator:ro -v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro -v $BINDIR/stack:/usr/bin/stack:ro -v $STACK_DIR:$HOME/.stack -v $PANTRY_DIR:$HOME/.stack/pantry"
82−ARGS_PREBUILD="$ARGS_COMMON -u $USERID -e HOME=$HOME -v $DOT_STACKAGE_DIR:$HOME/.stackage"
83−ARGS_BUILD="$ARGS_COMMON"
84−# instance-data is an undocumented feature of S3 used by amazonka,
85−# see https://github.com/brendanhay/amazonka/issues/271
86−ARGS_UPLOAD="$ARGS_COMMON -u $USERID -e HOME=$HOME -v $HACKAGE_CREDS:/hackage-creds:ro -v $DOT_STACKAGE_DIR:$HOME/.stackage -v $SSH_DIR:$HOME/.ssh:ro -v $GITCONFIG:$HOME/.gitconfig:ro -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY -v $DOT_STACKAGE_DIR:/dot-stackage"
87−
88−# Make sure we actually need this snapshot. We only check this for LTS releases
89−# since, for nightlies, we'd like to run builds even if they are unnecessary to
90−# get early warning information of upcoming failures. (See the duplicate check
91−# below for why this is safe.)
92−if [ $SHORTNAME = "lts" ]
93−then
94− docker run $ARGS_UPLOAD $IMAGE /bin/bash -c "exec curator check-target-available --target $TARGET"
95−fi
96−
97−
98−# Determine the new build plan unless NOPLAN is set
99−#
100−# * Update the package index (unless LTS)
101−# * Create a new plan
102−if [ "${NOPLAN:-}x" = "1x" ]
103−then
104− docker run $ARGS_PREBUILD $IMAGE /bin/bash -c "curator snapshot-incomplete --target $TARGET && curator snapshot"
105−elif [ "${NOPLAN:-}x" = "2x" ]
106−then
107− docker run $ARGS_PREBUILD $IMAGE curator snapshot
108−elif [ $SHORTNAME = "lts" ]
109−then
110− docker run $ARGS_PREBUILD $IMAGE /bin/bash -c "curator constraints --target $TARGET && curator snapshot-incomplete --target $TARGET && curator snapshot"
111−else
112− docker run $ARGS_PREBUILD $IMAGE /bin/bash -c "curator update && curator constraints --target $TARGET && curator snapshot-incomplete --target $TARGET && curator snapshot"
113−fi
114−
115−
116−# Do the rest of the pre-build actions:
117−#
118−# * Check that the snapshot is valid
119−# * Fetch and unpack all needed tarballs (the build step does not have write access to the tarball directory)
120−docker run $ARGS_PREBUILD $IMAGE /bin/bash -c 'GHCVER=$(sed -n "s/^ghc-version: \(.*\)/\1/p" constraints.yaml) && stack setup ghc-$GHCVER --verbosity=error && stack exec --resolver=ghc-$GHCVER curator check-snapshot && curator unpack'
121−
122−case $SHORTNAME in
123− lts) JOBS=1 ;;
124− nightly) JOBS=2 ;;
125−esac
126−
127−# Now do the actual build. We need to first set the owner of the home directory
128−# correctly, so we run the command as root, change owner, and then use sudo to
129−# switch back to the current user
130−docker run $ARGS_BUILD $IMAGE nice -n 15 /bin/bash -c "chown $USER $HOME && exec sudo -E -u $USER env \"HOME=$HOME\" \"PATH=\$PATH\" curator build --jobs $JOBS" 2>&1 | tee "$SHORTNAME-build.log"
131−
132−# Make sure we actually need this snapshot. We used to perform this check
133−# exclusively before building. Now we perform it after as well for the case of
134−# nightly, where we don't perform this check beforehand. This is also slightly
135−# safer, in case someone else already uploaded a specific snapshot while we
136−# were building.
137−docker run $ARGS_UPLOAD $IMAGE /bin/bash -c "exec curator check-target-available --target $TARGET"
138−
139−# Successful build, so we need to:
140−#
141−# * Upload the docs to S3
142−# * Upload the new snapshot .yaml file to the appropriate Github repo, also upload its constraints
143−docker run $ARGS_UPLOAD $IMAGE /bin/bash -c "curator upload-docs --target $TARGET && curator upload-github --target $TARGET"
144−
145−# fixed in https://github.com/commercialhaskell/curator/pull/24
146−docker run $ARGS_UPLOAD $IMAGE /bin/bash -c "exec curator hackage-distro --target $TARGET"
147−
148−# Build and push docker image fpco/stack-build & fpco/stack-build-small for current release
149−
150−if [ $SHORTNAME = "lts" ]
151−then
152− $ROOT/dockerfiles/build.sh $TARGET
153− $ROOT/dockerfiles/build.sh --push $TARGET
154− $ROOT/dockerfiles/build.sh --push --small $TARGET
155−fi
156−
157−echo -n "Completed at "
158−date
automated/dockerfiles/README.mddeleted−33
@@ -1,33 +0,0 @@
1−dockerfiles/stack-build
2−=======================
3−
4−Build [fpco/stack-build](https://hub.docker.com/r/fpco/stack-build/) Docker
5−images. This script and its Dockerfiles are used for building images for LTS >=
6−8.0.
7−
8−Usage
9−-----
10−
11− ./build.sh [--push] [--dry-run] [--small] lts-X.Y"
12−
13−Options
14−-------
15−
16−`--help`: show this help
17−
18−`--push`: push the image after building/tagging it
19−
20−`--dry-run`: print the important commands that will be run, but don't actually
21− run them
22−
23−`--small`: build the small variant of the image
24−
25−Argument
26−---------
27−
28−The image for the selected LTS version will be built.
29−
30−This searches for a Dockerfile for the selected snapshot in
31−`lts-X.Y/Dockerfile`, and if one isn't found reuses the same image as built the
32−most recent `lts-X.Y/Dockerfile` found for earlier minor versions of the same
33−major version.
automated/dockerfiles/build.shdeleted−177
@@ -1,177 +0,0 @@
1−#!/usr/bin/env bash
2−
3−set -eu
4−cd "$(dirname "$0")"
5−
6−#
7−# Constants and defaults
8−#
9−
10−DOCKER_REPO=fpco/stack-build
11−PUSH=false
12−DRY=false
13−VARIANT=build
14−
15−#
16−# Functions
17−#
18−
19−# Print usage information and exit with failure status. First argument is an
20−# error message.
21−usage() {
22− echo "$0: $1" >&2
23− echo
24− echo "Usage: $0 [--push] [--dry-run] [--small] lts-X.Y]"
25− echo "See README.md for more information."
26− echo
27− exit 1
28−}
29−
30−# Print a command, and if --dry-run disabled also run it
31−dry() {
32− echo ">>> $*"
33− [[ $DRY = true ]] || "$@"
34−}
35−
36−# Push an image if --push is enabled (otherwise do nothing)
37−push() {
38− [[ $PUSH = false ]] || dry docker push "$1"
39−}
40−
41−# Tag an image, and then push it if --push is enabled
42−tagpush() {
43− dry docker tag "$1" "$2"
44− push "$2"
45−}
46−
47−#
48−# Parse command-line
49−#
50−
51−LTS_SLUG_ARG=
52−while [[ $# -gt 0 ]]; do
53− case "$1" in
54− --push)
55− PUSH=true
56− shift
57− ;;
58− --dry-run)
59− DRY=true
60− shift
61− ;;
62− --small)
63− VARIANT=small
64− DOCKER_REPO=fpco/stack-build-small
65− shift
66− ;;
67− -*)
68− usage "Unknown option: $1"
69− ;;
70− *)
71− if [[ -n "$LTS_SLUG_ARG" ]]; then
72− usage "Cannot specify multiple snaphots: $1"
73− fi
74− LTS_SLUG_ARG="$1"
75− shift
76− ;;
77− esac
78−done
79−
80−case "$LTS_SLUG_ARG" in
81− "")
82− usage "Missing argument: snapshot"
83− ;;
84− lts-*.*)
85− LTS_SLUG="$LTS_SLUG_ARG"
86− ;;
87− *)
88− echo "$0: Wrong snapshot format: $LTS_SLUG_ARG" >&2
89− exit 1
90− ;;
91−esac
92−
93−#
94−# Determine if lts slug is latest
95−#
96−
97−SNAPSHOTS="$(mktemp "lts-snapshots.json.XXXXXX")"
98−trap "rm -f \"$SNAPSHOTS\"" EXIT
99−wget -qO- https://www.stackage.org/download/lts-snapshots.json >"$SNAPSHOTS"
100−
101−LTS_VERSION="${LTS_SLUG#lts-}"
102−LTS_MAJOR="${LTS_VERSION%.*}"
103−LTS_MINOR="${LTS_VERSION#*.}"
104−
105−#
106−# Determine latest LTS version
107−#
108−
109−if [[ ! -x "$HOME/.local/bin/jq" ]]; then
110− mkdir -p $HOME/.local/bin
111− if [[ "$(uname)" = "Darwin" ]]; then
112− curl -o $HOME/.local/bin/jq -L https://github.com/stedolan/jq/releases/download/jq-1.6/jq-osx-amd64
113− else
114− curl -o $HOME/.local/bin/jq -L https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64
115− fi
116− chmod +x $HOME/.local/bin/jq
117−fi
118−
119−LATEST_LTS_SLUG=$($HOME/.local/bin/jq -r ".[\"lts\"]" $SNAPSHOTS)
120−LATEST_LTS_VERSION="${LATEST_LTS_SLUG#lts-}"
121−LATEST_LTS_MAJOR="${LATEST_LTS_VERSION%.*}"
122−LATEST_LTS_MINOR="${LATEST_LTS_VERSION#*.}"
123−
124−#
125−# Determine latest minor version of the selected major version
126−#
127−
128−MAJOR_LATEST_LTS_SLUG=$(jq -r ".[\"lts-$LTS_MAJOR\"]" $SNAPSHOTS)
129−MAJOR_LATEST_LTS_VERSION="${MAJOR_LATEST_LTS_SLUG#lts-}"
130−MAJOR_LATEST_LTS_MAJOR="${MAJOR_LATEST_LTS_VERSION%.*}"
131−MAJOR_LATEST_LTS_MINOR="${MAJOR_LATEST_LTS_VERSION#*.}"
132−
133−#
134−# Find the Dockerfile for the selected snapshot
135−#
136−
137−if [[ -s "$LTS_SLUG/Dockerfile" ]]; then
138−
139− # If there is an exact match, build and push that image
140−
141− sed "s/\\\$DOCKER_REPO/$(echo $DOCKER_REPO|sed 's/\//\\\//')/g" "$LTS_SLUG/Dockerfile" >"$LTS_SLUG/Dockerfile.sub"
142− dry docker build -t "$DOCKER_REPO:$LTS_SLUG" --build-arg "DOCKER_REPO=$DOCKER_REPO" --build-arg "LTS_SLUG=$LTS_SLUG" --build-arg "VARIANT=$VARIANT" -f "$LTS_SLUG/Dockerfile.sub" "$LTS_SLUG"
143− rm -f "$LTS_SLUG/Dockerfile.sub"
144− push "$DOCKER_REPO:$LTS_SLUG"
145−else
146−
147− # If no exact match, find a dockerfile for any earlier minor version of the
148− # selected major version, and just create a new tag from version's image with the selected
149− # minor version (assuming that nothing needs to change), and push it.
150−
151− minor=$(( LTS_MINOR - 1 ))
152− while [[ ! -s "lts-$LTS_MAJOR.$minor/Dockerfile" && $minor -ge 0 ]]; do
153− minor=$(( minor - 1 ))
154− done
155− if [[ $minor -lt 0 ]]; then
156− echo "$0: Cannot find any Dockerfile for LTS major version" >&2
157− exit 1
158− fi
159− dry docker pull "$DOCKER_REPO:lts-$LTS_MAJOR.$minor" || true
160− tagpush "$DOCKER_REPO:lts-$LTS_MAJOR.$minor" "$DOCKER_REPO:$LTS_SLUG"
161−fi
162−
163−#
164−# Create and push additional tags
165−#
166−
167−# If we select the latest minor version for the selected major version, then
168−# also create and push an 'lts-X' tag.
169−if [[ $LTS_MINOR -ge $MAJOR_LATEST_LTS_MINOR ]]; then
170− tagpush "$DOCKER_REPO:$LTS_SLUG" "$DOCKER_REPO:lts-$LTS_MAJOR"
171−fi
172−
173−# If we selected the latest LTS snapshot, also create and push the 'lts' and 'latest' tags.
174−if [[ "$LTS_MAJOR" = "$LATEST_LTS_MAJOR" ]] && [[ $LTS_MINOR -ge $LATEST_LTS_MINOR ]]; then
175− tagpush "$DOCKER_REPO:$LTS_SLUG" "$DOCKER_REPO:lts"
176− tagpush "$DOCKER_REPO:$LTS_SLUG" "$DOCKER_REPO:latest"
177−fi
automated/dockerfiles/lts-10.0/Dockerfiledeleted−67
@@ -1,67 +0,0 @@
1−FROM ubuntu:16.04
2−
3−MAINTAINER Emanuel Borsboom <manny@fpcomplete.com>
4−
5−ARG GHC_VERSION=8.2.2
6−ARG LTS_SLUG=lts-10.0
7−ARG PID1_VERSION=0.1.0.1
8−ARG STACK_VERSION=1.6.3
9−ARG BOOTSTRAP_COMMIT=a8234cb586c3022099a3b0155275ed067df00f72
10−ARG DEBIAN_FRONTEND=noninteractive
11−
12−#
13−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
14−#
15−
16−ENV LANG=C.UTF-8 \
17− LC_ALL=C.UTF-8 \
18− PATH=/root/.cabal/bin:/root/.local/bin:/opt/ghc/$GHC_VERSION/bin:$PATH
19−
20−#
21−# Use Stackage's debian-bootstrap.sh script to install system libraries and
22−# tools required to build any Stackage package.
23−#
24−
25−RUN apt-get update && \
26− apt-get install -y wget && \
27− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | bash && \
28− rm -rf /var/lib/apt/lists/*
29−
30−#
31−# Create symlink to help tools find GHC documentation
32−#
33−
34−RUN ln -s ghc /opt/ghc/$GHC_VERSION/share/doc/ghc-$GHC_VERSION
35−
36−#
37−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
38−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
39−# files that some of these tools require.
40−#
41−
42−RUN stack --system-ghc --resolver=$LTS_SLUG --local-bin-path=/usr/local/bin install \
43− cabal-install happy alex cpphs gtk2hs-buildtools hscolour && \
44− cd $HOME/.stack && \
45− find . -type f -not -path './snapshots/*/share/*' -exec rm '{}' \; && \
46− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
47−
48−#
49−# Install 'pid1' init daemon
50−#
51−
52−RUN wget -O- "https://github.com/fpco/pid1/releases/download/pid1%2F$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
53− chown root:root /usr/local/sbin && \
54− chown root:root /usr/local/sbin/pid1
55−
56−#
57−# Install Stack
58−#
59−
60−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
61−
62−#
63−# Set up pid1 entrypoint and default command
64−#
65−
66−ENTRYPOINT ["/usr/local/sbin/pid1"]
67−CMD ["bash"]
automated/dockerfiles/lts-10.1/Dockerfiledeleted−3
@@ -1,3 +0,0 @@
1−FROM fpco/stack-build:lts-10.0
2−ARG STACK_VERSION=1.6.3
3−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
automated/dockerfiles/lts-10.5/Dockerfiledeleted−3
@@ -1,3 +0,0 @@
1−FROM fpco/stack-build:lts-10.0
2−ARG STACK_VERSION=1.6.5
3−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
automated/dockerfiles/lts-11.0/Dockerfiledeleted−67
@@ -1,67 +0,0 @@
1−FROM ubuntu:16.04
2−
3−MAINTAINER Emanuel Borsboom <manny@fpcomplete.com>
4−
5−ARG GHC_VERSION=8.2.2
6−ARG LTS_SLUG=lts-11.0
7−ARG PID1_VERSION=0.1.0.1
8−ARG STACK_VERSION=1.6.5
9−ARG BOOTSTRAP_COMMIT=13ab2b86779c98598e96af7f4c4b9653ba280be5
10−ARG DEBIAN_FRONTEND=noninteractive
11−
12−#
13−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
14−#
15−
16−ENV LANG=C.UTF-8 \
17− LC_ALL=C.UTF-8 \
18− PATH=/root/.cabal/bin:/root/.local/bin:/opt/ghc/$GHC_VERSION/bin:$PATH
19−
20−#
21−# Use Stackage's debian-bootstrap.sh script to install system libraries and
22−# tools required to build any Stackage package.
23−#
24−
25−RUN apt-get update && \
26− apt-get install -y wget && \
27− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | bash && \
28− rm -rf /var/lib/apt/lists/*
29−
30−#
31−# Create symlink to help tools find GHC documentation
32−#
33−
34−RUN ln -s ghc /opt/ghc/$GHC_VERSION/share/doc/ghc-$GHC_VERSION
35−
36−#
37−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
38−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
39−# files that some of these tools require.
40−#
41−
42−RUN stack --system-ghc --resolver=$LTS_SLUG --local-bin-path=/usr/local/bin install \
43− cabal-install happy alex cpphs gtk2hs-buildtools hscolour && \
44− cd $HOME/.stack && \
45− find . -type f -not -path './snapshots/*/share/*' -exec rm '{}' \; && \
46− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
47−
48−#
49−# Install 'pid1' init daemon
50−#
51−
52−RUN wget -O- "https://github.com/fpco/pid1/releases/download/pid1%2F$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
53− chown root:root /usr/local/sbin && \
54− chown root:root /usr/local/sbin/pid1
55−
56−#
57−# Install Stack
58−#
59−
60−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
61−
62−#
63−# Set up pid1 entrypoint and default command
64−#
65−
66−ENTRYPOINT ["/usr/local/sbin/pid1"]
67−CMD ["bash"]
automated/dockerfiles/lts-11.22/Dockerfiledeleted−3
@@ -1,3 +0,0 @@
1−FROM fpco/stack-build:lts-11.6
2−ARG STACK_VERSION=1.9.3
3−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
automated/dockerfiles/lts-11.6/Dockerfiledeleted−3
@@ -1,3 +0,0 @@
1−FROM fpco/stack-build:lts-11.5
2−ARG STACK_VERSION=1.7.1
3−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
automated/dockerfiles/lts-12.0/Dockerfiledeleted−69
@@ -1,69 +0,0 @@
1−FROM ubuntu:16.04
2−
3−MAINTAINER Emanuel Borsboom <manny@fpcomplete.com>
4−
5−ARG GHC_VERSION=8.4.3
6−ARG LTS_SLUG=lts-12.0
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=1.7.1
9−ARG CUDA_VERSION=8.0
10−ARG BOOTSTRAP_COMMIT=56c62ccbf31229ee2b09d3a0b4cd2ad94e7406a8
11−ARG DEBIAN_FRONTEND=noninteractive
12−
13−#
14−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
15−#
16−
17−ENV LANG=C.UTF-8 \
18− LC_ALL=C.UTF-8 \
19− PATH=/root/.cabal/bin:/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:/opt/ghc/$GHC_VERSION/bin:$PATH \
20− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
21− LD_LIBRARY_PATH=/usr/local/cuda-$CUDA_VERSION/lib64:/usr/local/cuda-$CUDA_VERSION/nvvm/lib64
22−#
23−# Use Stackage's debian-bootstrap.sh script to install system libraries and
24−# tools required to build any Stackage package.
25−#
26−
27−RUN apt-get update && \
28− apt-get install -y wget && \
29− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | bash && \
30− rm -rf /var/lib/apt/lists/*
31−
32−#
33−# Create symlink to help tools find GHC documentation
34−#
35−
36−RUN ln -s ghc /opt/ghc/$GHC_VERSION/share/doc/ghc-$GHC_VERSION
37−
38−#
39−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
40−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
41−# files that some of these tools require.
42−#
43−
44−RUN stack --system-ghc --resolver=$LTS_SLUG --local-bin-path=/usr/local/bin install \
45− cabal-install happy alex cpphs gtk2hs-buildtools hscolour && \
46− cd $HOME/.stack && \
47− find . -type f -not -path './snapshots/*/share/*' -exec rm '{}' \; && \
48− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
49−
50−#
51−# Install 'pid1' init daemon
52−#
53−
54−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
55− chown root:root /usr/local/sbin && \
56− chown root:root /usr/local/sbin/pid1
57−
58−#
59−# Install Stack
60−#
61−
62−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
63−
64−#
65−# Set up pid1 entrypoint and default command
66−#
67−
68−ENTRYPOINT ["/usr/local/sbin/pid1"]
69−CMD ["bash"]
automated/dockerfiles/lts-12.13/Dockerfiledeleted−3
@@ -1,3 +0,0 @@
1−FROM fpco/stack-build:lts-12.0
2−ARG STACK_VERSION=1.9.1
3−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
automated/dockerfiles/lts-12.15/Dockerfiledeleted−14
@@ -1,14 +0,0 @@
1−FROM fpco/stack-build:lts-12.0
2−ARG STACK_VERSION=1.9.1
3−ARG GHC_VERSION=8.4.4
4−RUN apt-get update && \
5− apt-get install -y \
6− ghc-$GHC_VERSION \
7− ghc-$GHC_VERSION-dyn \
8− ghc-$GHC_VERSION-htmldocs \
9− ghc-$GHC_VERSION-prof && \
10− rm -rf /var/lib/apt/lists/*
11−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
12−RUN ln -s ghc-$GHC_VERSION /opt/ghc/$GHC_VERSION/share/doc/ghc
13−ARG CUDA_VERSION=8.0
14−ENV PATH=/root/.cabal/bin:/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:/opt/ghc/$GHC_VERSION/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
automated/dockerfiles/lts-12.21/Dockerfiledeleted−3
@@ -1,3 +0,0 @@
1−FROM fpco/stack-build:lts-12.15
2−ARG STACK_VERSION=1.9.3
3−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
automated/dockerfiles/lts-12.26/Dockerfiledeleted−89
@@ -1,89 +0,0 @@
1−FROM ubuntu:16.04
2−
3−MAINTAINER Emanuel Borsboom <manny@fpcomplete.com>
4−
5−ARG GHC_VERSION=8.4.4
6−ARG LTS_SLUG=lts-12.0
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=1.9.3
9−ARG CUDA_VERSION=8.0
10−ARG BOOTSTRAP_COMMIT=7f982f63a3734ddb2a7cbbc52b8cec983c496efa
11−ARG DEBIAN_FRONTEND=noninteractive
12−ARG VARIANT=build
13−
14−#
15−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
16−#
17−
18−ENV LANG=C.UTF-8 \
19− LC_ALL=C.UTF-8 \
20− PATH=/root/.cabal/bin:/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:/opt/ghc/$GHC_VERSION/bin:$PATH \
21− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
22− LD_LIBRARY_PATH=/usr/local/cuda-$CUDA_VERSION/lib64:/usr/local/cuda-$CUDA_VERSION/nvvm/lib64
23−#
24−# Use Stackage's debian-bootstrap.sh script to install system libraries and
25−# tools required to build any Stackage package.
26−#
27−
28−RUN apt-get update && \
29− apt-get install -y --no-install-recommends wget netbase ca-certificates && \
30− if [ "$VARIANT" = "small" ]; then \
31− echo "deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main" >>/etc/apt/sources.list && \
32− echo "deb-src http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main" >>/etc/apt/sources.list && \
33− apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 063DAB2BDC0B3F9FCEBC378BFF3AEACEF6F88286 && \
34− apt-get update && \
35− apt-get install -y --no-install-recommends \
36− ghc-$GHC_VERSION ghc-$GHC_VERSION-htmldocs \
37− g++ gcc libc6-dev libffi-dev libgmp-dev make xz-utils zlib1g-dev git gnupg \
38− libtinfo-dev; \
39− else \
40− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | bash; \
41− fi && \
42− rm -rf /var/lib/apt/lists/*
43−
44−#
45−# Create symlink to help tools find GHC documentation
46−#
47−
48−RUN ln -s ghc /opt/ghc/$GHC_VERSION/share/doc/ghc-$GHC_VERSION
49−
50−#
51−# Install Stack
52−#
53−
54−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
55−
56−#
57−# Configure Stack to use the GHC installed in the Docker image rather than installing its own
58−#
59−
60−RUN mkdir /etc/stack/ && \
61− echo "system-ghc: true" >/etc/stack/config.yaml
62−
63−#
64−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
65−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
66−# files that some of these tools require.
67−#
68−
69−RUN export STACK_ROOT=/usr/local/lib/stack && \
70− stack --resolver=$LTS_SLUG --local-bin-path=/usr/local/bin install \
71− cabal-install happy alex cpphs gtk2hs-buildtools hscolour hlint hindent && \
72− cd $STACK_ROOT && \
73− find . -type f -not -path './snapshots/*/share/*' -exec rm '{}' \; && \
74− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
75−
76−#
77−# Install 'pid1' init daemon
78−#
79−
80−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
81− chown root:root /usr/local/sbin && \
82− chown root:root /usr/local/sbin/pid1
83−
84−#
85−# Set up pid1 entrypoint and default command
86−#
87−
88−ENTRYPOINT ["/usr/local/sbin/pid1"]
89−CMD ["bash"]
automated/dockerfiles/lts-13.0/Dockerfiledeleted−69
@@ -1,69 +0,0 @@
1−FROM ubuntu:16.04
2−
3−MAINTAINER Emanuel Borsboom <manny@fpcomplete.com>
4−
5−ARG GHC_VERSION=8.6.3
6−ARG LTS_SLUG=lts-13.0
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=1.9.3
9−ARG CUDA_VERSION=10.0
10−ARG BOOTSTRAP_COMMIT=26b29f2862462afd47fb916ed0a2c2a6844ebca9
11−ARG DEBIAN_FRONTEND=noninteractive
12−
13−#
14−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
15−#
16−
17−ENV LANG=C.UTF-8 \
18− LC_ALL=C.UTF-8 \
19− PATH=/root/.cabal/bin:/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:/opt/ghc/$GHC_VERSION/bin:$PATH \
20− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
21− LD_LIBRARY_PATH=/usr/local/cuda-$CUDA_VERSION/lib64:/usr/local/cuda-$CUDA_VERSION/nvvm/lib64
22−#
23−# Use Stackage's debian-bootstrap.sh script to install system libraries and
24−# tools required to build any Stackage package.
25−#
26−
27−RUN apt-get update && \
28− apt-get install -y wget && \
29− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | bash && \
30− rm -rf /var/lib/apt/lists/*
31−
32−#
33−# Create symlink to help tools find GHC documentation
34−#
35−
36−RUN ln -s ghc /opt/ghc/$GHC_VERSION/share/doc/ghc-$GHC_VERSION
37−
38−#
39−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
40−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
41−# files that some of these tools require.
42−#
43−
44−RUN stack --system-ghc --resolver=$LTS_SLUG --local-bin-path=/usr/local/bin install \
45− cabal-install happy alex cpphs gtk2hs-buildtools hscolour && \
46− cd $HOME/.stack && \
47− find . -type f -not -path './snapshots/*/share/*' -exec rm '{}' \; && \
48− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
49−
50−#
51−# Install 'pid1' init daemon
52−#
53−
54−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
55− chown root:root /usr/local/sbin && \
56− chown root:root /usr/local/sbin/pid1
57−
58−#
59−# Install Stack
60−#
61−
62−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
63−
64−#
65−# Set up pid1 entrypoint and default command
66−#
67−
68−ENTRYPOINT ["/usr/local/sbin/pid1"]
69−CMD ["bash"]
automated/dockerfiles/lts-13.12/Dockerfiledeleted−93
@@ -1,93 +0,0 @@
1−FROM ubuntu:16.04
2−
3−MAINTAINER Emanuel Borsboom <manny@fpcomplete.com>
4−
5−ARG GHC_VERSION=8.6.4
6−ARG LTS_SLUG=lts-13.11
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=1.9.3
9−ARG CUDA_VERSION=10.0
10−ARG BOOTSTRAP_COMMIT=9f2b7ab95c711794257b059604e80ab9ad3c0c45
11−ARG DEBIAN_FRONTEND=noninteractive
12−ARG VARIANT=build
13−
14−#
15−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
16−#
17−
18−ENV LANG=C.UTF-8 \
19− LC_ALL=C.UTF-8 \
20− PATH=/root/.cabal/bin:/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:/opt/ghc/$GHC_VERSION/bin:$PATH \
21− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
22− LD_LIBRARY_PATH=/usr/local/cuda-$CUDA_VERSION/lib64:/usr/local/cuda-$CUDA_VERSION/nvvm/lib64
23−
24−#
25−# Use Stackage's debian-bootstrap.sh script to install system libraries and
26−# tools required to build any Stackage package.
27−#
28−
29−RUN apt-get update && \
30− apt-get install -y --no-install-recommends wget netbase ca-certificates && \
31− if [ "$VARIANT" = "small" ]; then \
32− echo "deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main" >>/etc/apt/sources.list && \
33− echo "deb-src http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main" >>/etc/apt/sources.list && \
34− apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 063DAB2BDC0B3F9FCEBC378BFF3AEACEF6F88286 && \
35− apt-get update && \
36− apt-get install -y --no-install-recommends \
37− ghc-$GHC_VERSION ghc-$GHC_VERSION-htmldocs \
38− g++ gcc libc6-dev libffi-dev libgmp-dev make xz-utils zlib1g-dev git gnupg \
39− libtinfo-dev; \
40− else \
41− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | sed "s/^GHCVER=8.6.3$/GHCVER=$GHC_VERSION/" | bash && \
42− # Add g++ version required for building 'double-conversion' \
43− # (see https://github.com/commercialhaskell/stack/issues/4470) \
44− apt-get install -y g++-7; \
45− fi && \
46− rm -rf /var/lib/apt/lists/*
47−
48−#
49−# Create symlink to help tools find GHC documentation
50−#
51−
52−RUN ln -s ghc /opt/ghc/$GHC_VERSION/share/doc/ghc-$GHC_VERSION
53−
54−#
55−# Install Stack
56−#
57−
58−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
59−
60−#
61−# Configure Stack to use the GHC installed in the Docker image rather than installing its own
62−#
63−
64−RUN mkdir /etc/stack/ && \
65− echo "system-ghc: true" >/etc/stack/config.yaml
66−
67−#
68−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
69−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
70−# files that some of these tools require.
71−#
72−
73−RUN export STACK_ROOT=/usr/local/lib/stack && \
74− stack --resolver=$LTS_SLUG --local-bin-path=/usr/local/bin install \
75− cabal-install happy alex cpphs gtk2hs-buildtools hscolour hlint hindent && \
76− cd $STACK_ROOT && \
77− find . -type f -not -path './snapshots/*/share/*' -exec rm '{}' \; && \
78− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
79−
80−#
81−# Install 'pid1' init daemon
82−#
83−
84−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
85− chown root:root /usr/local/sbin && \
86− chown root:root /usr/local/sbin/pid1
87−
88−#
89−# Set up pid1 entrypoint and default command
90−#
91−
92−ENTRYPOINT ["/usr/local/sbin/pid1"]
93−CMD ["bash"]
automated/dockerfiles/lts-13.20/Dockerfiledeleted−93
@@ -1,93 +0,0 @@
1−FROM ubuntu:16.04
2−
3−MAINTAINER Emanuel Borsboom <manny@fpcomplete.com>
4−
5−ARG GHC_VERSION=8.6.5
6−ARG LTS_SLUG=lts-13.20
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=1.9.3
9−ARG CUDA_VERSION=10.0
10−ARG BOOTSTRAP_COMMIT=9f2b7ab95c711794257b059604e80ab9ad3c0c45
11−ARG DEBIAN_FRONTEND=noninteractive
12−ARG VARIANT=build
13−
14−#
15−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
16−#
17−
18−ENV LANG=C.UTF-8 \
19− LC_ALL=C.UTF-8 \
20− PATH=/root/.cabal/bin:/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:/opt/ghc/$GHC_VERSION/bin:$PATH \
21− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
22− LD_LIBRARY_PATH=/usr/local/cuda-$CUDA_VERSION/lib64:/usr/local/cuda-$CUDA_VERSION/nvvm/lib64
23−
24−#
25−# Use Stackage's debian-bootstrap.sh script to install system libraries and
26−# tools required to build any Stackage package.
27−#
28−
29−RUN apt-get update && \
30− apt-get install -y --no-install-recommends wget netbase ca-certificates && \
31− if [ "$VARIANT" = "small" ]; then \
32− echo "deb http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main" >>/etc/apt/sources.list && \
33− echo "deb-src http://ppa.launchpad.net/hvr/ghc/ubuntu xenial main" >>/etc/apt/sources.list && \
34− apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 063DAB2BDC0B3F9FCEBC378BFF3AEACEF6F88286 && \
35− apt-get update && \
36− apt-get install -y --no-install-recommends \
37− ghc-$GHC_VERSION ghc-$GHC_VERSION-htmldocs \
38− g++ gcc libc6-dev libffi-dev libgmp-dev make xz-utils zlib1g-dev git gnupg \
39− libtinfo-dev; \
40− else \
41− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | sed "s/^GHCVER=8.6.3$/GHCVER=$GHC_VERSION/" | bash && \
42− # Add g++ version required for building 'double-conversion' \
43− # (see https://github.com/commercialhaskell/stack/issues/4470) \
44− apt-get install -y g++-7; \
45− fi && \
46− rm -rf /var/lib/apt/lists/*
47−
48−#
49−# Create symlink to help tools find GHC documentation
50−#
51−
52−RUN ln -s ghc /opt/ghc/$GHC_VERSION/share/doc/ghc-$GHC_VERSION
53−
54−#
55−# Install Stack
56−#
57−
58−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
59−
60−#
61−# Configure Stack to use the GHC installed in the Docker image rather than installing its own
62−#
63−
64−RUN mkdir /etc/stack/ && \
65− echo "system-ghc: true" >/etc/stack/config.yaml
66−
67−#
68−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
69−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
70−# files that some of these tools require.
71−#
72−
73−RUN export STACK_ROOT=/usr/local/lib/stack && \
74− stack --resolver=$LTS_SLUG --local-bin-path=/usr/local/bin install \
75− cabal-install happy alex cpphs gtk2hs-buildtools hscolour hlint hindent && \
76− cd $STACK_ROOT && \
77− find . -type f -not -path './snapshots/*/share/*' -exec rm '{}' \; && \
78− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
79−
80−#
81−# Install 'pid1' init daemon
82−#
83−
84−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
85− chown root:root /usr/local/sbin && \
86− chown root:root /usr/local/sbin/pid1
87−
88−#
89−# Set up pid1 entrypoint and default command
90−#
91−
92−ENTRYPOINT ["/usr/local/sbin/pid1"]
93−CMD ["bash"]
automated/dockerfiles/lts-13.25/Dockerfiledeleted−3
@@ -1,3 +0,0 @@
1−FROM $DOCKER_REPO:lts-13.24
2−ARG STACK_VERSION=2.1.1
3−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
automated/dockerfiles/lts-13.27/Dockerfiledeleted−9
@@ -1,9 +0,0 @@
1−FROM $DOCKER_REPO:lts-13.26
2−ARG VARIANT
3−RUN if [ "$VARIANT" = "small" ]; then \
4− apt-get update && \
5− apt-get install -y --no-install-recommends sudo && \
6− rm -rf /var/lib/apt/lists/*; \
7− fi
8−ARG STACK_VERSION=2.1.3
9−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64-static.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
automated/dockerfiles/lts-13.3/Dockerfiledeleted−10
@@ -1,10 +0,0 @@
1−FROM fpco/stack-build:lts-13.0
2−
3−#
4−# Add g++ version required for building 'double-conversion'
5−# (see https://github.com/commercialhaskell/stack/issues/4470)
6−#
7−
8−RUN apt-get update && \
9− apt-get install -y g++-7 && \
10− rm -rf /var/lib/apt/lists/*
automated/dockerfiles/lts-14.0/Dockerfiledeleted−89
@@ -1,89 +0,0 @@
1−FROM ubuntu:18.04
2−
3−LABEL maintainer="manny@fpcomplete.com"
4−
5−ARG GHC_VERSION=8.6.5
6−ARG LTS_SLUG=lts-14.0
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=2.1.3
9−ARG CUDA_VERSION=10.0
10−ARG JVM_PATH=/usr/lib/jvm/java-8-openjdk-amd64
11−ARG LLVM_VERSION=3.9
12−ARG BOOTSTRAP_COMMIT=d4143f1845f26e8e99d0a1a8134d6ff535ab98b2
13−ARG DEBIAN_FRONTEND=noninteractive
14−ARG VARIANT=build
15−ARG STACK_ROOT=/home/stackage/.stack
16−
17−#
18−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
19−#
20−
21−ENV LANG=C.UTF-8 \
22− LC_ALL=C.UTF-8 \
23− PATH=/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:$STACK_ROOT/programs/x86_64-linux/ghc-$GHC_VERSION/bin:$PATH \
24− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
25− CPATH=$JVM_PATH/include:$JVM_PATH/include/linux:/usr/lib/llvm-$LLVM_VERSION/include
26−
27−#
28−# Install pre-requisites
29−#
30−
31−RUN apt-get update && \
32− apt-get install -y --no-install-recommends \
33− wget netbase ca-certificates g++ gcc libc6-dev libffi-dev libgmp-dev \
34− make xz-utils zlib1g-dev git gnupg libtinfo-dev && \
35− rm -rf /var/lib/apt/lists/*
36−
37−#
38−# Use Stackage's debian-bootstrap.sh script to install system libraries and
39−# tools required to build any Stackage package.
40−# Re-installs 'stack' *after* running debian-bootstrap.sh since that may have
41−# installed a different version.
42−# In the case of 'small' image, just install Stack and GHC.
43−#
44−
45−RUN if [ "$VARIANT" != "small" ]; then \
46− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | sed "s/^GHCVER=8.6.5$/GHCVER=$GHC_VERSION/" | GHCVER=$GHC_VERSION bash; \
47− fi && \
48− wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/bin '*/stack' && \
49− if [ "$VARIANT" = "small" ]; then \
50− stack setup --resolver ghc-$GHC_VERSION; \
51− fi && \
52− rm -rf /var/lib/apt/lists/* && \
53− cd $STACK_ROOT && \
54− find . -type f -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
55− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
56−
57−#
58−# Configure Stack to use the GHC installed in the Docker image rather than installing its own
59−#
60−
61−RUN mkdir /etc/stack/ && \
62− echo "system-ghc: true" >/etc/stack/config.yaml
63−
64−#
65−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
66−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
67−# files that some of these tools require.
68−#
69−
70−RUN stack --resolver=$LTS_SLUG --local-bin-path=/usr/bin install \
71− happy alex cpphs gtk2hs-buildtools hscolour hlint hindent && \
72− cd $STACK_ROOT && \
73− find . -type f -not -path './snapshots/*/share/*' -and -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
74− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
75−
76−#
77−# Install 'pid1' init daemon
78−#
79−
80−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
81− chown root:root /usr/local/sbin && \
82− chown root:root /usr/local/sbin/pid1
83−
84−#
85−# Set up pid1 entrypoint and default command
86−#
87−
88−ENTRYPOINT ["/usr/local/sbin/pid1"]
89−CMD ["bash"]
automated/dockerfiles/lts-14.0/Dockerfile.subdeleted−89
@@ -1,89 +0,0 @@
1−FROM ubuntu:18.04
2−
3−LABEL maintainer="manny@fpcomplete.com"
4−
5−ARG GHC_VERSION=8.6.5
6−ARG LTS_SLUG=lts-14.0
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=2.1.3
9−ARG CUDA_VERSION=10.0
10−ARG JVM_PATH=/usr/lib/jvm/java-8-openjdk-amd64
11−ARG LLVM_VERSION=3.9
12−ARG BOOTSTRAP_COMMIT=d4143f1845f26e8e99d0a1a8134d6ff535ab98b2
13−ARG DEBIAN_FRONTEND=noninteractive
14−ARG VARIANT=build
15−ARG STACK_ROOT=/home/stackage/.stack
16−
17−#
18−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
19−#
20−
21−ENV LANG=C.UTF-8 \
22− LC_ALL=C.UTF-8 \
23− PATH=/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:$STACK_ROOT/programs/x86_64-linux/ghc-$GHC_VERSION/bin:$PATH \
24− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
25− CPATH=$JVM_PATH/include:$JVM_PATH/include/linux:/usr/lib/llvm-$LLVM_VERSION/include
26−
27−#
28−# Install pre-requisites
29−#
30−
31−RUN apt-get update && \
32− apt-get install -y --no-install-recommends \
33− wget netbase ca-certificates g++ gcc libc6-dev libffi-dev libgmp-dev \
34− make xz-utils zlib1g-dev git gnupg libtinfo-dev && \
35− rm -rf /var/lib/apt/lists/*
36−
37−#
38−# Use Stackage's debian-bootstrap.sh script to install system libraries and
39−# tools required to build any Stackage package.
40−# Re-installs 'stack' *after* running debian-bootstrap.sh since that may have
41−# installed a different version.
42−# In the case of 'small' image, just install Stack and GHC.
43−#
44−
45−RUN if [ "$VARIANT" != "small" ]; then \
46− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | sed "s/^GHCVER=8.6.5$/GHCVER=$GHC_VERSION/" | GHCVER=$GHC_VERSION bash; \
47− fi && \
48− wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/bin '*/stack' && \
49− if [ "$VARIANT" = "small" ]; then \
50− stack setup --resolver ghc-$GHC_VERSION; \
51− fi && \
52− rm -rf /var/lib/apt/lists/* && \
53− cd $STACK_ROOT && \
54− find . -type f -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
55− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
56−
57−#
58−# Configure Stack to use the GHC installed in the Docker image rather than installing its own
59−#
60−
61−RUN mkdir /etc/stack/ && \
62− echo "system-ghc: true" >/etc/stack/config.yaml
63−
64−#
65−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
66−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
67−# files that some of these tools require.
68−#
69−
70−RUN stack --resolver=$LTS_SLUG --local-bin-path=/usr/bin install \
71− happy alex cpphs gtk2hs-buildtools hscolour hlint hindent && \
72− cd $STACK_ROOT && \
73− find . -type f -not -path './snapshots/*/share/*' -and -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
74− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
75−
76−#
77−# Install 'pid1' init daemon
78−#
79−
80−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
81− chown root:root /usr/local/sbin && \
82− chown root:root /usr/local/sbin/pid1
83−
84−#
85−# Set up pid1 entrypoint and default command
86−#
87−
88−ENTRYPOINT ["/usr/local/sbin/pid1"]
89−CMD ["bash"]
automated/dockerfiles/lts-15.0/Dockerfiledeleted−89
@@ -1,89 +0,0 @@
1−FROM ubuntu:18.04
2−
3−LABEL maintainer="manny@fpcomplete.com"
4−
5−ARG GHC_VERSION=8.8.2
6−ARG LTS_SLUG=lts-15.0
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=2.1.3
9−ARG CUDA_VERSION=10.0
10−ARG JVM_PATH=/usr/lib/jvm/java-8-openjdk-amd64
11−ARG LLVM_PATH=/usr/lib/llvm-7
12−ARG BOOTSTRAP_COMMIT=77790c7bcb21fd8875871245df5c5c39a55ec0c1
13−ARG DEBIAN_FRONTEND=noninteractive
14−ARG VARIANT=build
15−ARG STACK_ROOT=/home/stackage/.stack
16−
17−#
18−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
19−#
20−
21−ENV LANG=C.UTF-8 \
22− LC_ALL=C.UTF-8 \
23− PATH=/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:$STACK_ROOT/programs/x86_64-linux/ghc-$GHC_VERSION/bin:$PATH \
24− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
25− CPATH=$JVM_PATH/include:$JVM_PATH/include/linux:$LLVM_PATH/include
26−
27−#
28−# Install pre-requisites
29−#
30−
31−RUN apt-get update && \
32− apt-get install -y --no-install-recommends \
33− wget netbase ca-certificates g++ gcc libc6-dev libffi-dev libgmp-dev \
34− make xz-utils zlib1g-dev git gnupg libtinfo-dev && \
35− rm -rf /var/lib/apt/lists/*
36−
37−#
38−# Use Stackage's debian-bootstrap.sh script to install system libraries and
39−# tools required to build any Stackage package.
40−# Re-installs 'stack' *after* running debian-bootstrap.sh since that may have
41−# installed a different version.
42−# In the case of 'small' image, just install Stack and GHC.
43−#
44−
45−RUN if [ "$VARIANT" != "small" ]; then \
46− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | sed "s/^GHCVER=8.6.5$/GHCVER=$GHC_VERSION/" | GHCVER=$GHC_VERSION bash; \
47− fi && \
48− wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/bin '*/stack' && \
49− if [ "$VARIANT" = "small" ]; then \
50− stack setup --resolver ghc-$GHC_VERSION; \
51− fi && \
52− rm -rf /var/lib/apt/lists/* && \
53− cd $STACK_ROOT && \
54− find . -type f -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
55− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
56−
57−#
58−# Configure Stack to use the GHC installed in the Docker image rather than installing its own
59−#
60−
61−RUN mkdir /etc/stack/ && \
62− echo "system-ghc: true" >/etc/stack/config.yaml
63−
64−#
65−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
66−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
67−# files that some of these tools require.
68−#
69−
70−RUN stack --resolver=$LTS_SLUG --local-bin-path=/usr/bin install \
71− happy alex cpphs gtk2hs-buildtools hscolour hlint hindent && \
72− cd $STACK_ROOT && \
73− find . -type f -not -path './snapshots/*/share/*' -and -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
74− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
75−
76−#
77−# Install 'pid1' init daemon
78−#
79−
80−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
81− chown root:root /usr/local/sbin && \
82− chown root:root /usr/local/sbin/pid1
83−
84−#
85−# Set up pid1 entrypoint and default command
86−#
87−
88−ENTRYPOINT ["/usr/local/sbin/pid1"]
89−CMD ["bash"]
automated/dockerfiles/lts-15.10/Dockerfiledeleted−3
@@ -1,3 +0,0 @@
1−FROM $DOCKER_REPO:lts-15.5
2−ARG STACK_VERSION=2.3.1
3−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
automated/dockerfiles/lts-15.5/Dockerfiledeleted−89
@@ -1,89 +0,0 @@
1−FROM ubuntu:18.04
2−
3−LABEL maintainer="manny@fpcomplete.com"
4−
5−ARG GHC_VERSION=8.8.3
6−ARG LTS_SLUG=lts-15.0
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=2.1.3
9−ARG CUDA_VERSION=10.0
10−ARG JVM_PATH=/usr/lib/jvm/java-8-openjdk-amd64
11−ARG LLVM_PATH=/usr/lib/llvm-7
12−ARG BOOTSTRAP_COMMIT=77790c7bcb21fd8875871245df5c5c39a55ec0c1
13−ARG DEBIAN_FRONTEND=noninteractive
14−ARG VARIANT=build
15−ARG STACK_ROOT=/home/stackage/.stack
16−
17−#
18−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
19−#
20−
21−ENV LANG=C.UTF-8 \
22− LC_ALL=C.UTF-8 \
23− PATH=/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:$STACK_ROOT/programs/x86_64-linux/ghc-$GHC_VERSION/bin:$PATH \
24− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
25− CPATH=$JVM_PATH/include:$JVM_PATH/include/linux:$LLVM_PATH/include
26−
27−#
28−# Install pre-requisites
29−#
30−
31−RUN apt-get update && \
32− apt-get install -y --no-install-recommends \
33− wget netbase ca-certificates g++ gcc libc6-dev libffi-dev libgmp-dev \
34− make xz-utils zlib1g-dev git gnupg libtinfo-dev jq && \
35− rm -rf /var/lib/apt/lists/*
36−
37−#
38−# Use Stackage's debian-bootstrap.sh script to install system libraries and
39−# tools required to build any Stackage package.
40−# Re-installs 'stack' *after* running debian-bootstrap.sh since that may have
41−# installed a different version.
42−# In the case of 'small' image, just install Stack and GHC.
43−#
44−
45−RUN if [ "$VARIANT" != "small" ]; then \
46− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | sed "s/^GHCVER=8.6.5$/GHCVER=$GHC_VERSION/" | GHCVER=$GHC_VERSION bash; \
47− fi && \
48− wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/bin '*/stack' && \
49− if [ "$VARIANT" = "small" ]; then \
50− stack setup --resolver ghc-$GHC_VERSION; \
51− fi && \
52− rm -rf /var/lib/apt/lists/* && \
53− cd $STACK_ROOT && \
54− find . -type f -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
55− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
56−
57−#
58−# Configure Stack to use the GHC installed in the Docker image rather than installing its own
59−#
60−
61−RUN mkdir /etc/stack/ && \
62− echo "system-ghc: true" >/etc/stack/config.yaml
63−
64−#
65−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
66−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
67−# files that some of these tools require.
68−#
69−
70−RUN stack --resolver=$LTS_SLUG --local-bin-path=/usr/bin install \
71− happy alex cpphs gtk2hs-buildtools hscolour hlint hindent && \
72− cd $STACK_ROOT && \
73− find . -type f -not -path './snapshots/*/share/*' -and -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
74− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
75−
76−#
77−# Install 'pid1' init daemon
78−#
79−
80−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
81− chown root:root /usr/local/sbin && \
82− chown root:root /usr/local/sbin/pid1
83−
84−#
85−# Set up pid1 entrypoint and default command
86−#
87−
88−ENTRYPOINT ["/usr/local/sbin/pid1"]
89−CMD ["bash"]
automated/dockerfiles/lts-16.0/Dockerfiledeleted−90
@@ -1,90 +0,0 @@
1−FROM ubuntu:18.04
2−
3−LABEL maintainer="manny@fpcomplete.com"
4−
5−ARG GHC_VERSION=8.8.3
6−ARG LTS_SLUG=lts-16.0
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=2.3.1
9−ARG CUDA_VERSION=10.0
10−ARG JVM_PATH=/usr/lib/jvm/java-8-openjdk-amd64
11−ARG LLVM_PATH=/usr/lib/llvm-7
12−ARG BOOTSTRAP_COMMIT=1afd08ff0a3c3627f17eb1b928d35f337db40e08
13−
14−ARG DEBIAN_FRONTEND=noninteractive
15−ARG VARIANT=build
16−ARG STACK_ROOT=/home/stackage/.stack
17−
18−#
19−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
20−#
21−
22−ENV LANG=C.UTF-8 \
23− LC_ALL=C.UTF-8 \
24− PATH=/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:$STACK_ROOT/programs/x86_64-linux/ghc-$GHC_VERSION/bin:$PATH \
25− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
26− CPATH=$JVM_PATH/include:$JVM_PATH/include/linux:$LLVM_PATH/include
27−
28−#
29−# Install pre-requisites
30−#
31−
32−RUN apt-get update && \
33− apt-get install -y --no-install-recommends \
34− wget netbase ca-certificates g++ gcc libc6-dev libffi-dev libgmp-dev \
35− make xz-utils zlib1g-dev git gnupg libtinfo-dev jq && \
36− rm -rf /var/lib/apt/lists/*
37−
38−#
39−# Use Stackage's debian-bootstrap.sh script to install system libraries and
40−# tools required to build any Stackage package.
41−# Re-installs 'stack' *after* running debian-bootstrap.sh since that may have
42−# installed a different version.
43−# In the case of 'small' image, just install Stack and GHC.
44−#
45−
46−RUN if [ "$VARIANT" != "small" ]; then \
47− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | sed "s/^GHCVER=8.6.5$/GHCVER=$GHC_VERSION/" | GHCVER=$GHC_VERSION bash; \
48− fi && \
49− wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/bin '*/stack' && \
50− if [ "$VARIANT" = "small" ]; then \
51− stack setup --resolver ghc-$GHC_VERSION; \
52− fi && \
53− rm -rf /var/lib/apt/lists/* && \
54− cd $STACK_ROOT && \
55− find . -type f -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
56− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
57−
58−#
59−# Configure Stack to use the GHC installed in the Docker image rather than installing its own
60−#
61−
62−RUN mkdir /etc/stack/ && \
63− echo "system-ghc: true" >/etc/stack/config.yaml
64−
65−#
66−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
67−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
68−# files that some of these tools require.
69−#
70−
71−RUN stack --resolver=$LTS_SLUG --local-bin-path=/usr/bin install \
72− happy alex cpphs gtk2hs-buildtools hscolour hlint hindent && \
73− cd $STACK_ROOT && \
74− find . -type f -not -path './snapshots/*/share/*' -and -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
75− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
76−
77−#
78−# Install 'pid1' init daemon
79−#
80−
81−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
82− chown root:root /usr/local/sbin && \
83− chown root:root /usr/local/sbin/pid1
84−
85−#
86−# Set up pid1 entrypoint and default command
87−#
88−
89−ENTRYPOINT ["/usr/local/sbin/pid1"]
90−CMD ["bash"]
automated/dockerfiles/lts-16.12/Dockerfiledeleted−90
@@ -1,90 +0,0 @@
1−FROM ubuntu:18.04
2−
3−LABEL maintainer="manny@fpcomplete.com"
4−
5−ARG GHC_VERSION=8.8.4
6−ARG LTS_SLUG=lts-16.12
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=2.3.3
9−ARG CUDA_VERSION=10.0
10−ARG JVM_PATH=/usr/lib/jvm/java-8-openjdk-amd64
11−ARG LLVM_PATH=/usr/lib/llvm-7
12−ARG BOOTSTRAP_COMMIT=1afd08ff0a3c3627f17eb1b928d35f337db40e08
13−
14−ARG DEBIAN_FRONTEND=noninteractive
15−ARG VARIANT=build
16−ARG STACK_ROOT=/home/stackage/.stack
17−
18−#
19−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
20−#
21−
22−ENV LANG=C.UTF-8 \
23− LC_ALL=C.UTF-8 \
24− PATH=/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:$STACK_ROOT/programs/x86_64-linux/ghc-$GHC_VERSION/bin:$PATH \
25− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
26− CPATH=$JVM_PATH/include:$JVM_PATH/include/linux:$LLVM_PATH/include
27−
28−#
29−# Install pre-requisites
30−#
31−
32−RUN apt-get update && \
33− apt-get install -y --no-install-recommends \
34− wget netbase ca-certificates g++ gcc libc6-dev libffi-dev libgmp-dev \
35− make xz-utils zlib1g-dev git gnupg libtinfo-dev jq && \
36− rm -rf /var/lib/apt/lists/*
37−
38−#
39−# Use Stackage's debian-bootstrap.sh script to install system libraries and
40−# tools required to build any Stackage package.
41−# Re-installs 'stack' *after* running debian-bootstrap.sh since that may have
42−# installed a different version.
43−# In the case of 'small' image, just install Stack and GHC.
44−#
45−
46−RUN if [ "$VARIANT" != "small" ]; then \
47− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | sed "s/^GHCVER=8.6.5$/GHCVER=$GHC_VERSION/" | GHCVER=$GHC_VERSION bash; \
48− fi && \
49− wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/bin '*/stack' && \
50− if [ "$VARIANT" = "small" ]; then \
51− stack setup --resolver ghc-$GHC_VERSION; \
52− fi && \
53− rm -rf /var/lib/apt/lists/* && \
54− cd $STACK_ROOT && \
55− find . -type f -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
56− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
57−
58−#
59−# Configure Stack to use the GHC installed in the Docker image rather than installing its own
60−#
61−
62−RUN mkdir /etc/stack/ && \
63− echo "system-ghc: true" >/etc/stack/config.yaml
64−
65−#
66−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
67−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
68−# files that some of these tools require.
69−#
70−
71−RUN stack --resolver=$LTS_SLUG --local-bin-path=/usr/bin install \
72− happy alex cpphs gtk2hs-buildtools hscolour hlint hindent && \
73− cd $STACK_ROOT && \
74− find . -type f -not -path './snapshots/*/share/*' -and -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
75− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
76−
77−#
78−# Install 'pid1' init daemon
79−#
80−
81−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
82− chown root:root /usr/local/sbin && \
83− chown root:root /usr/local/sbin/pid1
84−
85−#
86−# Set up pid1 entrypoint and default command
87−#
88−
89−ENTRYPOINT ["/usr/local/sbin/pid1"]
90−CMD ["bash"]
automated/dockerfiles/lts-16.8/Dockerfiledeleted−3
@@ -1,3 +0,0 @@
1−FROM $DOCKER_REPO:lts-16.0
2−ARG STACK_VERSION=2.3.3
3−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
automated/dockerfiles/lts-17.0/Dockerfiledeleted−90
@@ -1,90 +0,0 @@
1−FROM ubuntu:18.04
2−
3−LABEL maintainer="manny@fpcomplete.com"
4−
5−ARG GHC_VERSION=8.8.3
6−ARG LTS_SLUG=lts-17.0
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=2.5.1
9−ARG CUDA_VERSION=10.0
10−ARG JVM_PATH=/usr/lib/jvm/java-8-openjdk-amd64
11−ARG LLVM_PATH=/usr/lib/llvm-7
12−ARG BOOTSTRAP_COMMIT=1afd08ff0a3c3627f17eb1b928d35f337db40e08
13−
14−ARG DEBIAN_FRONTEND=noninteractive
15−ARG VARIANT=build
16−ARG STACK_ROOT=/home/stackage/.stack
17−
18−#
19−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
20−#
21−
22−ENV LANG=C.UTF-8 \
23− LC_ALL=C.UTF-8 \
24− PATH=/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:$STACK_ROOT/programs/x86_64-linux/ghc-$GHC_VERSION/bin:$PATH \
25− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
26− CPATH=$JVM_PATH/include:$JVM_PATH/include/linux:$LLVM_PATH/include
27−
28−#
29−# Install pre-requisites
30−#
31−
32−RUN apt-get update && \
33− apt-get install -y --no-install-recommends \
34− wget netbase ca-certificates g++ gcc libc6-dev libffi-dev libgmp-dev \
35− make xz-utils zlib1g-dev git gnupg libtinfo-dev jq && \
36− rm -rf /var/lib/apt/lists/*
37−
38−#
39−# Use Stackage's debian-bootstrap.sh script to install system libraries and
40−# tools required to build any Stackage package.
41−# Re-installs 'stack' *after* running debian-bootstrap.sh since that may have
42−# installed a different version.
43−# In the case of 'small' image, just install Stack and GHC.
44−#
45−
46−RUN if [ "$VARIANT" != "small" ]; then \
47− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | sed "s/^GHCVER=8.6.5$/GHCVER=$GHC_VERSION/" | GHCVER=$GHC_VERSION bash; \
48− fi && \
49− wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/bin '*/stack' && \
50− if [ "$VARIANT" = "small" ]; then \
51− stack setup --resolver ghc-$GHC_VERSION; \
52− fi && \
53− rm -rf /var/lib/apt/lists/* && \
54− cd $STACK_ROOT && \
55− find . -type f -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
56− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
57−
58−#
59−# Configure Stack to use the GHC installed in the Docker image rather than installing its own
60−#
61−
62−RUN mkdir /etc/stack/ && \
63− echo "system-ghc: true" >/etc/stack/config.yaml
64−
65−#
66−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
67−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
68−# files that some of these tools require.
69−#
70−
71−RUN stack --resolver=$LTS_SLUG --local-bin-path=/usr/bin install \
72− happy alex cpphs gtk2hs-buildtools hscolour hlint hindent && \
73− cd $STACK_ROOT && \
74− find . -type f -not -path './snapshots/*/share/*' -and -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
75− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
76−
77−#
78−# Install 'pid1' init daemon
79−#
80−
81−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
82− chown root:root /usr/local/sbin && \
83− chown root:root /usr/local/sbin/pid1
84−
85−#
86−# Set up pid1 entrypoint and default command
87−#
88−
89−ENTRYPOINT ["/usr/local/sbin/pid1"]
90−CMD ["bash"]
automated/dockerfiles/lts-17.10/Dockerfiledeleted−3
@@ -1,3 +0,0 @@
1−FROM $DOCKER_REPO:lts-17.9
2−ARG STACK_VERSION=2.7.1
3−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
automated/dockerfiles/lts-17.3/Dockerfiledeleted−90
@@ -1,90 +0,0 @@
1−FROM ubuntu:18.04
2−
3−LABEL maintainer="manny@fpcomplete.com"
4−
5−ARG GHC_VERSION=8.8.4
6−ARG LTS_SLUG=lts-17.3
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=2.5.1
9−ARG CUDA_VERSION=10.0
10−ARG JVM_PATH=/usr/lib/jvm/java-8-openjdk-amd64
11−ARG LLVM_PATH=/usr/lib/llvm-7
12−ARG BOOTSTRAP_COMMIT=1afd08ff0a3c3627f17eb1b928d35f337db40e08
13−
14−ARG DEBIAN_FRONTEND=noninteractive
15−ARG VARIANT=build
16−ARG STACK_ROOT=/home/stackage/.stack
17−
18−#
19−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
20−#
21−
22−ENV LANG=C.UTF-8 \
23− LC_ALL=C.UTF-8 \
24− PATH=/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:$STACK_ROOT/programs/x86_64-linux/ghc-$GHC_VERSION/bin:$PATH \
25− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
26− CPATH=$JVM_PATH/include:$JVM_PATH/include/linux:$LLVM_PATH/include
27−
28−#
29−# Install pre-requisites
30−#
31−
32−RUN apt-get update && \
33− apt-get install -y --no-install-recommends \
34− wget netbase ca-certificates g++ gcc libc6-dev libffi-dev libgmp-dev \
35− make xz-utils zlib1g-dev git gnupg libtinfo-dev jq && \
36− rm -rf /var/lib/apt/lists/*
37−
38−#
39−# Use Stackage's debian-bootstrap.sh script to install system libraries and
40−# tools required to build any Stackage package.
41−# Re-installs 'stack' *after* running debian-bootstrap.sh since that may have
42−# installed a different version.
43−# In the case of 'small' image, just install Stack and GHC.
44−#
45−
46−RUN if [ "$VARIANT" != "small" ]; then \
47− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | sed "s/^GHCVER=8.6.5$/GHCVER=$GHC_VERSION/" | GHCVER=$GHC_VERSION bash; \
48− fi && \
49− wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/bin '*/stack' && \
50− if [ "$VARIANT" = "small" ]; then \
51− stack setup --resolver ghc-$GHC_VERSION; \
52− fi && \
53− rm -rf /var/lib/apt/lists/* && \
54− cd $STACK_ROOT && \
55− find . -type f -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
56− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
57−
58−#
59−# Configure Stack to use the GHC installed in the Docker image rather than installing its own
60−#
61−
62−RUN mkdir /etc/stack/ && \
63− echo "system-ghc: true" >/etc/stack/config.yaml
64−
65−#
66−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
67−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
68−# files that some of these tools require.
69−#
70−
71−RUN stack --resolver=$LTS_SLUG --local-bin-path=/usr/bin install \
72− happy alex cpphs gtk2hs-buildtools hscolour hlint hindent && \
73− cd $STACK_ROOT && \
74− find . -type f -not -path './snapshots/*/share/*' -and -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
75− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
76−
77−#
78−# Install 'pid1' init daemon
79−#
80−
81−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
82− chown root:root /usr/local/sbin && \
83− chown root:root /usr/local/sbin/pid1
84−
85−#
86−# Set up pid1 entrypoint and default command
87−#
88−
89−ENTRYPOINT ["/usr/local/sbin/pid1"]
90−CMD ["bash"]
automated/dockerfiles/lts-18.0/Dockerfiledeleted−90
@@ -1,90 +0,0 @@
1−FROM ubuntu:18.04
2−
3−LABEL maintainer="manny@fpcomplete.com"
4−
5−ARG GHC_VERSION=8.10.4
6−ARG LTS_SLUG=lts-18.0
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=2.7.3
9−ARG CUDA_VERSION=10.0
10−ARG JVM_PATH=/usr/lib/jvm/java-8-openjdk-amd64
11−ARG LLVM_PATH=/usr/lib/llvm-7
12−ARG BOOTSTRAP_COMMIT=b91382f2ff1f2775f4aa9d42c9a6b06b33e5904d
13−
14−ARG DEBIAN_FRONTEND=noninteractive
15−ARG VARIANT=build
16−ARG STACK_ROOT=/home/stackage/.stack
17−
18−#
19−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
20−#
21−
22−ENV LANG=C.UTF-8 \
23− LC_ALL=C.UTF-8 \
24− PATH=/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:$STACK_ROOT/programs/x86_64-linux/ghc-$GHC_VERSION/bin:$PATH \
25− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
26− CPATH=$JVM_PATH/include:$JVM_PATH/include/linux:$LLVM_PATH/include
27−
28−#
29−# Install pre-requisites
30−#
31−
32−RUN apt-get update && \
33− apt-get install -y --no-install-recommends \
34− wget netbase ca-certificates g++ gcc libc6-dev libffi-dev libgmp-dev \
35− make xz-utils zlib1g-dev git gnupg libtinfo-dev jq && \
36− rm -rf /var/lib/apt/lists/*
37−
38−#
39−# Use Stackage's debian-bootstrap.sh script to install system libraries and
40−# tools required to build any Stackage package.
41−# Re-installs 'stack' *after* running debian-bootstrap.sh since that may have
42−# installed a different version.
43−# In the case of 'small' image, just install Stack and GHC.
44−#
45−
46−RUN if [ "$VARIANT" != "small" ]; then \
47− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | sed "s/^GHCVER=9.0.1$/GHCVER=$GHC_VERSION/" | GHCVER=$GHC_VERSION bash; \
48− fi && \
49− wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/bin '*/stack' && \
50− if [ "$VARIANT" = "small" ]; then \
51− stack setup --resolver ghc-$GHC_VERSION; \
52− fi && \
53− rm -rf /var/lib/apt/lists/* && \
54− cd $STACK_ROOT && \
55− find . -type f -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
56− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
57−
58−#
59−# Configure Stack to use the GHC installed in the Docker image rather than installing its own
60−#
61−
62−RUN mkdir /etc/stack/ && \
63− echo "system-ghc: true" >/etc/stack/config.yaml
64−
65−#
66−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
67−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
68−# files that some of these tools require.
69−#
70−
71−RUN stack --resolver=$LTS_SLUG --local-bin-path=/usr/bin install \
72− happy alex cpphs gtk2hs-buildtools hscolour hlint hindent && \
73− cd $STACK_ROOT && \
74− find . -type f -not -path './snapshots/*/share/*' -and -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
75− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
76−
77−#
78−# Install 'pid1' init daemon
79−#
80−
81−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
82− chown root:root /usr/local/sbin && \
83− chown root:root /usr/local/sbin/pid1
84−
85−#
86−# Set up pid1 entrypoint and default command
87−#
88−
89−ENTRYPOINT ["/usr/local/sbin/pid1"]
90−CMD ["bash"]
automated/dockerfiles/lts-18.7/Dockerfiledeleted−90
@@ -1,90 +0,0 @@
1−FROM ubuntu:18.04
2−
3−LABEL maintainer="manny@fpcomplete.com"
4−
5−ARG GHC_VERSION=8.10.6
6−ARG LTS_SLUG=lts-18.6
7−ARG PID1_VERSION=0.1.2.0
8−ARG STACK_VERSION=2.7.3
9−ARG CUDA_VERSION=10.0
10−ARG JVM_PATH=/usr/lib/jvm/java-8-openjdk-amd64
11−ARG LLVM_PATH=/usr/lib/llvm-7
12−ARG BOOTSTRAP_COMMIT=b1d40e112040a7f44eff47a9fafb6937f5d02dff
13−
14−ARG DEBIAN_FRONTEND=noninteractive
15−ARG VARIANT=build
16−ARG STACK_ROOT=/home/stackage/.stack
17−
18−#
19−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
20−#
21−
22−ENV LANG=C.UTF-8 \
23− LC_ALL=C.UTF-8 \
24− PATH=/root/.local/bin:/usr/local/cuda-$CUDA_VERSION/bin:$STACK_ROOT/programs/x86_64-linux/ghc-$GHC_VERSION/bin:$PATH \
25− CUDA_PATH=/usr/local/cuda-$CUDA_VERSION \
26− CPATH=$JVM_PATH/include:$JVM_PATH/include/linux:$LLVM_PATH/include
27−
28−#
29−# Install pre-requisites
30−#
31−
32−RUN apt-get update && \
33− apt-get install -y --no-install-recommends \
34− wget netbase ca-certificates g++ gcc libc6-dev libffi-dev libgmp-dev \
35− make xz-utils zlib1g-dev git gnupg libtinfo-dev jq && \
36− rm -rf /var/lib/apt/lists/*
37−
38−#
39−# Use Stackage's debian-bootstrap.sh script to install system libraries and
40−# tools required to build any Stackage package.
41−# Re-installs 'stack' *after* running debian-bootstrap.sh since that may have
42−# installed a different version.
43−# In the case of 'small' image, just install Stack and GHC.
44−#
45−
46−RUN if [ "$VARIANT" != "small" ]; then \
47− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | sed "s/^GHCVER=9.0.1$/GHCVER=$GHC_VERSION/" | GHCVER=$GHC_VERSION bash; \
48− fi && \
49− wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/bin '*/stack' && \
50− if [ "$VARIANT" = "small" ]; then \
51− stack setup --resolver ghc-$GHC_VERSION; \
52− fi && \
53− rm -rf /var/lib/apt/lists/* && \
54− cd $STACK_ROOT && \
55− find . -type f -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
56− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
57−
58−#
59−# Configure Stack to use the GHC installed in the Docker image rather than installing its own
60−#
61−
62−RUN mkdir /etc/stack/ && \
63− echo "system-ghc: true" >/etc/stack/config.yaml
64−
65−#
66−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
67−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
68−# files that some of these tools require.
69−#
70−
71−RUN stack --resolver=$LTS_SLUG --local-bin-path=/usr/bin install \
72− happy alex cpphs gtk2hs-buildtools hscolour hlint hindent && \
73− cd $STACK_ROOT && \
74− find . -type f -not -path './snapshots/*/share/*' -and -not -path "./programs/x86_64-linux/ghc-$GHC_VERSION/*" -exec rm '{}' \; && \
75− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
76−
77−#
78−# Install 'pid1' init daemon
79−#
80−
81−RUN wget -O- "https://github.com/fpco/pid1/releases/download/v$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
82− chown root:root /usr/local/sbin && \
83− chown root:root /usr/local/sbin/pid1
84−
85−#
86−# Set up pid1 entrypoint and default command
87−#
88−
89−ENTRYPOINT ["/usr/local/sbin/pid1"]
90−CMD ["bash"]
automated/dockerfiles/lts-9.0/Dockerfiledeleted−55
@@ -1,55 +0,0 @@
1−FROM ubuntu:16.04
2−
3−MAINTAINER Emanuel Borsboom <manny@fpcomplete.com>
4−
5−ARG GHC_VERSION=8.0.2
6−ARG LTS_SLUG=lts-9.0
7−ARG PID1_VERSION=0.1.0.1
8−ARG BOOTSTRAP_COMMIT=1bc67bb54eda08c90d8421bc11d257354a379d11
9−ARG DEBIAN_FRONTEND=noninteractive
10−
11−#
12−# Set encoding to UTF-8 and PATH to find GHC and cabal/stack-installed binaries.
13−#
14−
15−ENV LANG=C.UTF-8 \
16− LC_ALL=C.UTF-8 \
17− PATH=/root/.cabal/bin:/root/.local/bin:/opt/ghc/$GHC_VERSION/bin:$PATH
18−
19−#
20−# Use Stackage's debian-bootstrap.sh script to install system libraries and
21−# tools required to build any Stackage package.
22−#
23−
24−RUN apt-get update && \
25− apt-get install -y wget && \
26− wget -qO- https://raw.githubusercontent.com/fpco/stackage/$BOOTSTRAP_COMMIT/debian-bootstrap.sh | bash && \
27− ln -s ghc /opt/ghc/$GHC_VERSION/share/doc/ghc-$GHC_VERSION && \
28− rm -rf /var/lib/apt/lists/*
29−
30−#
31−# Use 'stack' to install basic Haskell tools like alex, happy, and cpphs. We
32−# remove most of the STACK_ROOT afterward to save space, but keep the 'share'
33−# files that some of these tools require.
34−#
35−
36−RUN stack --system-ghc --resolver=$LTS_SLUG --local-bin-path=/usr/local/bin install \
37− cabal-install happy alex cpphs gtk2hs-buildtools hscolour && \
38− cd $HOME/.stack && \
39− find . -type f -not -path './snapshots/*/share/*' -exec rm '{}' \; && \
40− find . -type d -print0 |sort -rz |xargs -0 rmdir 2>/dev/null || true
41−
42−#
43−# Install proper 'pid1' init daemon
44−#
45−
46−RUN wget -O- "https://github.com/fpco/pid1/releases/download/pid1%2F$PID1_VERSION/pid1-$PID1_VERSION-linux-x86_64.tar.gz" | tar xzf - -C /usr/local && \
47− chown root:root /usr/local/sbin && \
48− chown root:root /usr/local/sbin/pid1
49−
50−#
51−# Set up pid1 entrypoint and default command
52−#
53−
54−ENTRYPOINT ["/usr/local/sbin/pid1"]
55−CMD ["bash"]
automated/dockerfiles/lts-9.20/Dockerfiledeleted−3
@@ -1,3 +0,0 @@
1−FROM fpco/stack-build:lts-9.0
2−ARG STACK_VERSION=1.6.1
3−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
automated/dockerfiles/lts-9.21/Dockerfiledeleted−3
@@ -1,3 +0,0 @@
1−FROM fpco/stack-build:lts-9.0
2−ARG STACK_VERSION=1.6.5
3−RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
automated/run-nightly.shdeleted−11
@@ -1,11 +0,0 @@
1−#!/usr/bin/env bash
2−
3−cd "$(dirname "${BASH_SOURCE[0]}")"
4−
5−while true; do
6− ./build.sh nightly-$(date -u +%F)
7− date
8−
9− sleep 30m
10− echo
11−done
become-a-curator.mddeleted−44
@@ -1,44 +0,0 @@
1−## We are no longer accepting applications, please wait until next time
2−
3−We are looking to expand the stackage curator team!
4−
5−As a stackage curator you will help the community by curating and
6−publishing the widely used nightly and LTS snapshots: Collections of
7−packages that are guaranteed to play well together. All curators are
8−volunteers.
9−
10−This is a great opportunity to contribute to the haskell community and get
11−familiar with the tools of the trade! You will also be in regular
12−contact with experienced community members.
13−
14−We don't have any prerequisites, but familiarity with any of Haskell,
15−Cabal, Stack, Linux, Git, and Docker is a plus.
16−
17−We work in shifts of one week, which means you will be on duty every
18−6th week. Our suggestion is to pair you up with another curator to
19−help out in the beginning.
20−
21−The workload is usually about 30 minutes per day, whenever you have
22−time. The work consists of keeping the builds running on the build
23−server, filing issues for packages needing updates when new releases
24−occur, and closing resolved issues. The LTS snapshots are prepared
25−once a week. All communication with package maintainers happen on
26−github.
27−
28−We also have a curator slack channel where we help each other out.
29−
30−The current curator team consists of:
31−* Adam Bergmark
32−* Dan Burton
33−* Jens Petersen
34−* Luke Murphy
35−* Michael Snoyman
36−
37−We onboarded Luke as the newest member a few months ago and this
38−helped us iron out and document the process further.
39−
40−You can read the curator documentation here: https://github.com/commercialhaskell/stackage/blob/master/CURATORS.md
41−
42−To apply, please fill in this form: [REDACTED]
43−
44−If you applied last time, we encourage you to do so again!
build-constraints.yamldeleted−8048

This diff is too big to show here.

cabal.confignew file+830

This diff is too big to show here.

checkdeleted−14

This diff is too big to show here.

commenterdeleted−20

This diff is too big to show here.

debian-bootstrap.sh+31−325

This diff is too big to show here.

etc/check.shdeleted−28

This diff is too big to show here.

etc/commenter/.gitignoredeleted−3

This diff is too big to show here.

etc/commenter/Cargo.lockdeleted−365

This diff is too big to show here.

etc/commenter/Cargo.tomldeleted−14

This diff is too big to show here.

etc/commenter/README.mddeleted−3

This diff is too big to show here.

etc/commenter/commenterdeleted−2

This diff is too big to show here.

etc/commenter/latest-version/LICENSEdeleted−30

This diff is too big to show here.

etc/commenter/latest-version/README.mddeleted−1

This diff is too big to show here.

etc/commenter/latest-version/cabal.projectdeleted−6

This diff is too big to show here.

etc/commenter/latest-version/latest-version.cabaldeleted−23

This diff is too big to show here.

etc/commenter/latest-version/src/Main.hsdeleted−28

This diff is too big to show here.

etc/commenter/latest-version/stack.yamldeleted−4

This diff is too big to show here.

etc/commenter/latest-version/stack.yaml.lockdeleted−13

This diff is too big to show here.

etc/commenter/src/lib.rsdeleted−574

This diff is too big to show here.

etc/commenter/src/main.rsdeleted−171

This diff is too big to show here.

etc/curator-exes/.gitignoredeleted−1

This diff is too big to show here.

etc/curator-exes/Dockerfiledeleted−13

This diff is too big to show here.

etc/curator-exes/README.mddeleted−5

This diff is too big to show here.

etc/curator-exes/run.shdeleted−11

This diff is too big to show here.

etc/curator-exes/stack.yamldeleted−22

This diff is too big to show here.

etc/diskspace/clean-old-stack-libs.shdeleted−13

This diff is too big to show here.

etc/diskspace/remove-old-stack-work-libs.hsdeleted−57

This diff is too big to show here.

full-run.shnew file+6

This diff is too big to show here.

jenkins-build.shnew file+22

This diff is too big to show here.

jenkins-nightly.shnew file+5

This diff is too big to show here.

patching/.gitignorenew file+2

This diff is too big to show here.

patching/scripts/create-patches.shnew file+25

This diff is too big to show here.

patching/scripts/create-tarballs.shnew file+31

This diff is too big to show here.

patching/scripts/edit-package.shnew file+6

This diff is too big to show here.

stackage-upload.hsnew file+176

This diff is too big to show here.

stackage.cabalnew file+132

This diff is too big to show here.

test/Spec.hsnew file+1

This diff is too big to show here.

test/Stackage2/BuildPlanSpec.hsnew file+35

This diff is too big to show here.

test/Stackage2/CorePackagesSpec.hsnew file+19

This diff is too big to show here.

test/Stackage2/PackageIndexSpec.hsnew file+21

This diff is too big to show here.

verify-packagedeleted−47

This diff is too big to show here.