From ef9631e5232f43973c37e7664dd814f96bef1cc4 Mon Sep 17 00:00:00 2001
From: sternenseemann <0rpkxez4ksa01gb3typccl0i@systemli.org>
Date: Sat, 1 May 2021 18:00:40 +0200
Subject: [PATCH 1/2] pkgs/top-level: init expression for haskell-updates
 jobset

release-haskell.nix is intended to be a replacement for
https://github.com/peti/ci/blob/master/haskell-nixpkgs.nix
which is currently the main expression for the haskell-updates jobset
on hydra (in the nixpkgs project).

It has the same jobs as the old haskell-nixpkgs.nix file:

* haskellPackages.*
* haskell.compiler.*
* Some extra haskell packages for certain compilers

The following jobs are new:

* tests.haskell.*
* A manually maintained list of top-level haskell packages (most of them
  using justStaticExecutables)
* An aggregate job which is intended to aid merging the haskell-updates
  branch: It holds an arbitrary list of haskell-related packages and
  tests we intend have working at all times. This is still somewhat
  incomplete and should be extendend in the future.

Additionally a lot of refactoring has been done and some unnecessary
code has been eliminated. Due to the increased set of jobs and my
ideas of convenience however, the code size has grown overall.
I've tried document the individual parts and would be happy about
feedback in general.

One future improvement could be making adding top-level haskell packages
more convenient and adding them all to the aggregate job automatically.
---
 .github/CODEOWNERS                 |   1 +
 .github/labeler.yml                |   1 +
 pkgs/top-level/release-haskell.nix | 201 +++++++++++++++++++++++++++++
 3 files changed, 203 insertions(+)
 create mode 100644 pkgs/top-level/release-haskell.nix

diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 6cde8c6fde0..256abac7b41 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -84,6 +84,7 @@
 /pkgs/development/compilers/ghc               @cdepillabout @sternenseemann @maralorn
 /pkgs/development/haskell-modules             @cdepillabout @sternenseemann @maralorn
 /pkgs/test/haskell                            @cdepillabout @sternenseemann @maralorn
+/pkgs/top-level/release-haskell.nix           @cdepillabout @sternenseemann @maralorn
 /pkgs/top-level/haskell-packages.nix          @cdepillabout @sternenseemann @maralorn
 
 # Perl
diff --git a/.github/labeler.yml b/.github/labeler.yml
index ef95fe66832..3637d05f48b 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -56,6 +56,7 @@
   - pkgs/development/tools/haskell/**/*
   - pkgs/test/haskell/**/*
   - pkgs/top-level/haskell-packages.nix
+  - pkgs/top-level/release-haskell.nix
 
 "6.topic: kernel":
   - pkgs/build-support/kernel/**/*
diff --git a/pkgs/top-level/release-haskell.nix b/pkgs/top-level/release-haskell.nix
new file mode 100644
index 00000000000..ac89af71b51
--- /dev/null
+++ b/pkgs/top-level/release-haskell.nix
@@ -0,0 +1,201 @@
+/*
+  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" ] }:
+
+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 // {
+    gitAndTools = packagePlatforms pkgs.gitAndTools;
+  };
+
+  jobs = mapTestOn {
+    haskellPackages = packagePlatforms pkgs.haskellPackages;
+    haskell.compiler = packagePlatforms pkgs.haskell.compiler;
+
+    tests.haskell = packagePlatforms pkgs.tests.haskell;
+
+    # top-level haskell packages
+    inherit (pkgsPlatforms)
+      bench
+      cabal-install
+      cabal2nix
+      cachix
+      darcs
+      dhall
+      dhall-bash
+      dhall-docs
+      dhall-lsp-server
+      dhall-json
+      dhall-nix
+      dhall-text
+      elm2nix
+      fffuu
+      futhark
+      glirc
+      hadolint
+      haskell-ci
+      haskell-language-server
+      hasura-graphql-engine
+      hinit
+      hledger
+      hledger-iadd
+      hledger-interest
+      hledger-ui
+      hledger-web
+      hlint
+      hpack
+      icepeak
+      koka
+      krank
+      madlang
+      matterhorn
+      neuron-notes
+      niv
+      nix-delegate
+      nix-deploy
+      nix-diff
+      nix-linter
+      nix-output-monitor
+      nix-tree
+      nixfmt
+      pandoc
+      place-cursor-at
+      shake
+      shellcheck
+      spacecookie
+      splot
+      stack
+      stack2nix
+      stutter
+      stylish-haskell
+      taskell
+      tweet-hs
+      update-nix-fetchgit
+      uuagc
+      wstunnel
+      ;
+
+    gitAndTools.git-annex = pkgsPlatforms.gitAndTools.git-annex;
+  } // 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
+        # 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
+      ];
+    };
+  };
+
+in jobs

From 233682cf1e5b06f2d31df3657172690fbda5372d Mon Sep 17 00:00:00 2001
From: sternenseemann <0rpkxez4ksa01gb3typccl0i@systemli.org>
Date: Sat, 1 May 2021 23:37:42 +0200
Subject: [PATCH 2/2] pkgs/release-haskell.nix: add aggregate job of all pkgs
 with maintainers

---
 pkgs/top-level/release-haskell.nix | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/pkgs/top-level/release-haskell.nix b/pkgs/top-level/release-haskell.nix
index ac89af71b51..bf09485fa0d 100644
--- a/pkgs/top-level/release-haskell.nix
+++ b/pkgs/top-level/release-haskell.nix
@@ -71,6 +71,12 @@ let
     gitAndTools = packagePlatforms pkgs.gitAndTools;
   };
 
+  # 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;
@@ -196,6 +202,17 @@ let
         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