summary refs log tree commit diff
path: root/pkgs/top-level/release-haskell.nix
blob: 1c3389c24d1865a7a42265c42a3827a4716d4f29 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
/*
  To debug this expression you can use `hydra-eval-jobs` from
  `pkgs.hydra-unstable` which prints the jobset description
  to `stdout`:

  $ hydra-eval-jobs -I . pkgs/top-level/release-haskell.nix
*/
{ supportedSystems ? [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" ] }:

let

  releaseLib = import ./release-lib.nix {
    inherit supportedSystems;
  };

  inherit (releaseLib)
    pkgs
    packagePlatforms
    mapTestOn
    aggregate
    ;

  inherit (pkgs) lib;

  # helper function which traverses a (nested) set
  # of derivations produced by mapTestOn and flattens
  # it to a list of derivations suitable to be passed
  # to `releaseTools.aggregate` as constituents.
  accumulateDerivations = jobList:
    lib.concatMap (
      attrs:
        if lib.isDerivation attrs
        then [ attrs ]
        else if lib.isAttrs attrs
        then accumulateDerivations (lib.attrValues attrs)
        else []
    ) jobList;

  # names of all subsets of `pkgs.haskell.packages`
  compilerNames = lib.mapAttrs (name: _: name) pkgs.haskell.packages;

  # list of all compilers to test specific packages on
  all = with compilerNames; [
    ghc884
    ghc8104
    ghc901
  ];

  # packagePlatforms applied to `haskell.packages.*`
  compilerPlatforms = lib.mapAttrs
    (_: v: packagePlatforms v)
    pkgs.haskell.packages;

  # This function lets you specify specific packages
  # which are to be tested on a list of specific GHC
  # versions and returns a job set for all specified
  # combinations. See `jobs` below for an example.
  versionedCompilerJobs = config: mapTestOn {
    haskell.packages =
      (lib.mapAttrs (
        ghc: jobs:
        lib.filterAttrs (
          jobName: platforms:
          lib.elem ghc (config."${jobName}" or [])
        ) jobs
      ) compilerPlatforms);
  };

  # hydra jobs for `pkgs` of which we import a subset of
  pkgsPlatforms = packagePlatforms pkgs;

  # names of packages in an attribute set that are maintained
  maintainedPkgNames = set: builtins.attrNames
    (lib.filterAttrs (
      _: v: builtins.length (v.meta.maintainers or []) > 0
    ) set);

  jobs = mapTestOn {
    haskellPackages = packagePlatforms pkgs.haskellPackages;
    haskell.compiler = packagePlatforms pkgs.haskell.compiler;

    tests = let
      testPlatforms = packagePlatforms pkgs.tests;
    in {
      haskell = testPlatforms.haskell;
      writers = testPlatforms.writers;
    };

    # top-level packages that depend on haskellPackages
    inherit (pkgsPlatforms)
      agda
      arion
      bench
      bustle
      blucontrol
      cabal-install
      cabal2nix
      cachix
      carp
      cedille
      client-ip-echo
      darcs
      dconf2nix
      dhall
      dhall-bash
      dhall-docs
      dhall-lsp-server
      dhall-json
      dhall-nix
      dhall-text
      diagrams-builder
      elm2nix
      fffuu
      futhark
      ghcid
      git-annex
      git-brunch
      gitit
      glirc
      hadolint
      haskell-ci
      haskell-language-server
      hasura-graphql-engine
      hci
      hercules-ci-agent
      hinit
      hedgewars
      hledger
      hledger-iadd
      hledger-interest
      hledger-ui
      hledger-web
      hlint
      hpack
      hyper-haskell
      hyper-haskell-server-with-packages
      icepeak
      idris
      ihaskell
      jl
      koka
      krank
      lambdabot
      ldgallery
      madlang
      matterhorn
      mueval
      neuron-notes
      niv
      nix-delegate
      nix-deploy
      nix-diff
      nix-linter
      nix-output-monitor
      nix-script
      nix-tree
      nixfmt
      nota
      ormolu
      pandoc
      pakcs
      petrinizer
      place-cursor-at
      pinboard-notes-backup
      pretty-simple
      shake
      shellcheck
      sourceAndTags
      spacecookie
      spago
      splot
      stack
      stack2nix
      stutter
      stylish-haskell
      taffybar
      tamarin-prover
      taskell
      termonad-with-packages
      tldr-hs
      tweet-hs
      update-nix-fetchgit
      uqm
      uuagc
      vaultenv
      wstunnel
      xmobar
      xmonad-with-packages
      yi
      zsh-git-prompt
      ;

    elmPackages.elm = pkgsPlatforms.elmPackages.elm;
  } // versionedCompilerJobs {
    # Packages which should be checked on more than the
    # default GHC version. This list can be used to test
    # the state of the package set with newer compilers
    # and to confirm that critical packages for the
    # package sets (like Cabal, jailbreak-cabal) are
    # working as expected.
    cabal-install = all;
    Cabal_3_4_0_0 = with compilerNames; [ ghc884 ghc8104 ];
    funcmp = all;
    haskell-language-server = all;
    hoogle = all;
    hsdns = all;
    jailbreak-cabal = all;
    language-nix = all;
    nix-paths = all;
    titlecase = all;
  } // {
    mergeable = pkgs.releaseTools.aggregate {
      name = "haskell-updates-mergeable";
      meta = {
        description = ''
          Critical haskell packages that should work at all times,
          serves as minimum requirement for an update merge
        '';
        maintainers = lib.teams.haskell.members;
      };
      constituents = accumulateDerivations [
        # haskell specific tests
        jobs.tests.haskell
        jobs.tests.writers # writeHaskell{,Bin}
        # important top-level packages
        jobs.cabal-install
        jobs.cabal2nix
        jobs.cachix
        jobs.darcs
        jobs.haskell-language-server
        jobs.hledger
        jobs.hledger-ui
        jobs.hpack
        jobs.niv
        jobs.pandoc
        jobs.stack
        jobs.stylish-haskell
        # important haskell (library) packages
        jobs.haskellPackages.cabal-plan
        jobs.haskellPackages.distribution-nixpkgs
        jobs.haskellPackages.hackage-db
        jobs.haskellPackages.policeman
        jobs.haskellPackages.xmonad
        jobs.haskellPackages.xmonad-contrib
        # haskell packages maintained by @peti
        # imported from the old hydra jobset
        jobs.haskellPackages.hopenssl
        jobs.haskellPackages.hsemail
        jobs.haskellPackages.hsyslog
      ];
    };
    maintained = pkgs.releaseTools.aggregate {
      name = "maintained-haskell-packages";
      meta = {
        description = "Aggregate jobset of all haskell packages with a maintainer";
        maintainers = lib.teams.haskell.members;
      };
      constituents = accumulateDerivations
        (builtins.map
          (name: jobs.haskellPackages."${name}")
          (maintainedPkgNames pkgs.haskellPackages));
    };
  };

in jobs