Travis CI等でstackのresolverにstackage latest nightlyを使う

stackでstackage nightlyのresolverを使おうとしても,stack.yamlには

resolver: nightly-2015-10-27

のように日付まで用意しないと使えない.lts-2やlts-3についても同様で,lts-3.*まで指定する必要がある.

Travis CI等で各resolverについてマトリクステストする場合,ltsのほうはともかくnightlyについてはビルド時点で最新のものを常に見るようにして欲しい.どうにかなりませんかという話は出ているのだが,とりあえずこの件がどうにかなるまでのツナギ

stackageのリダイレクトがnightlyやlts-*の最新を知ってるので,次のようなスクリプト用意しておいて,

#!/bin/bash

LATEST_VERSION=$(wget -O/dev/null https://www.stackage.org/$1 2>&1 |
                     grep "https://www.stackage.org/$1" |
                     tail -n1 |
                     sed "s/.*$1/$1/")
sed "s/^resolver: .*/resolver: ${LATEST_VERSION}/" stack.yaml

元となるstack.yamlからresolverを書き変えたものを生成して使わせるようにする,

before_install:
  - ./latest $RESOLVER > stack-travis.yaml
  - export STACK_YAML=stack-travis.yaml

あとはマトリクス指定で

matrix:
  include:
    - env: RESOLVER=lts-2
    - env: RESOLVER=ghc-7.10.2
    - env: RESOLVER=lts-3
    - env: RESOLVER=lts-3.10
    - env: RESOLVER=nightly
  allow_failures:
    - env: RESOLVER=nightly

のようにしておくと,lts-2(の最新),ghc-7.10.2,lts-3(の最新),lts-3.10,nightly(の最新)という設定になる.現時点で具体的には,lts-2 → lts-2.22,lts-3 → lts-3.11,nightly → nightly-2015-10-27 となる.