summary refs log tree commit diff
diff options
context:
space:
mode:
authorhyperfekt <git@hyperfekt.net>2020-05-04 01:01:57 +0200
committerMalte Brandy <malte.brandy@maralorn.de>2021-05-01 21:55:18 +0200
commitf3f84855e8fa9b190a14f49c5c6db9e816e72c10 (patch)
treedbdded4995b914d883b9ff546f3c1d31cce8e145
parentee30de13b7730342a2bfe720c5877b6abf361172 (diff)
downloadnixpkgs-f3f84855e8fa9b190a14f49c5c6db9e816e72c10.tar
nixpkgs-f3f84855e8fa9b190a14f49c5c6db9e816e72c10.tar.gz
nixpkgs-f3f84855e8fa9b190a14f49c5c6db9e816e72c10.tar.bz2
nixpkgs-f3f84855e8fa9b190a14f49c5c6db9e816e72c10.tar.lz
nixpkgs-f3f84855e8fa9b190a14f49c5c6db9e816e72c10.tar.xz
nixpkgs-f3f84855e8fa9b190a14f49c5c6db9e816e72c10.tar.zst
nixpkgs-f3f84855e8fa9b190a14f49c5c6db9e816e72c10.zip
maintainers/scripts/haskell/regenerate-hackage-packages.sh: init
Introduces a script that can be used to update the Nix expressions for

the Haskell package set. In service of that, also

- introduces cabal2nix-latest, which pins the hackage2nix version used

- changes all-cabal-hashes to use fetchFromGitHub

- adds update-hackage.sh & update-cabal2nix-latest.sh & update-stackage.sh maintainer scripts
-rwxr-xr-xmaintainers/scripts/haskell/regenerate-hackage-packages.sh20
-rwxr-xr-xmaintainers/scripts/haskell/update-cabal2nix-latest.sh17
-rwxr-xr-xmaintainers/scripts/haskell/update-hackage.sh21
-rwxr-xr-xmaintainers/scripts/haskell/update-stackage.sh51
-rw-r--r--pkgs/data/misc/hackage/default.nix10
-rw-r--r--pkgs/data/misc/hackage/pin.json5
-rw-r--r--pkgs/development/haskell-modules/cabal2nix-latest.nix40
-rw-r--r--pkgs/development/haskell-modules/configuration-common.nix4
-rw-r--r--pkgs/development/haskell-modules/hackage-packages.nix34
-rw-r--r--pkgs/development/haskell-modules/non-hackage-packages.nix4
10 files changed, 189 insertions, 17 deletions
diff --git a/maintainers/scripts/haskell/regenerate-hackage-packages.sh b/maintainers/scripts/haskell/regenerate-hackage-packages.sh
new file mode 100755
index 00000000000..79b93f5b7cb
--- /dev/null
+++ b/maintainers/scripts/haskell/regenerate-hackage-packages.sh
@@ -0,0 +1,20 @@
+#! /usr/bin/env nix-shell
+#! nix-shell -i bash -p coreutils haskellPackages.cabal2nix-latest -I nixpkgs=.
+
+# This script is used to regenerate nixpkgs' Haskell package set, using a tool
+# called hackage2nix. hackage2nix looks at
+# pkgs/development/haskell-modules/configuration-hackage2nix.yaml and generates
+# a Nix expression for package version specified there, using the Cabal files
+# from the Hackage database (available under all-cabal-hashes) and its
+# companion tool cabal2nix.
+#
+# Related scripts are update-hackage.sh, for updating the snapshot of the
+# Hackage database used by hackage2nix, and update-cabal2nix-latest.sh,
+# for updating the version of hackage2nix used to perform this task.
+
+set -euo pipefail
+
+extractionDerivation='with import ./. {}; runCommand "unpacked-cabal-hashes" { } "tar xf ${all-cabal-hashes} --strip-components=1 --one-top-level=$out"'
+unpacked_hackage="$(nix-build -E "$extractionDerivation" --no-out-link)"
+
+hackage2nix --hackage "$unpacked_hackage" --preferred-versions <(for n in "$unpacked_hackage"/*/preferred-versions; do cat "$n"; echo; done) --nixpkgs "$PWD" --config pkgs/development/haskell-modules/configuration-hackage2nix.yaml
diff --git a/maintainers/scripts/haskell/update-cabal2nix-latest.sh b/maintainers/scripts/haskell/update-cabal2nix-latest.sh
new file mode 100755
index 00000000000..1f22bb1792f
--- /dev/null
+++ b/maintainers/scripts/haskell/update-cabal2nix-latest.sh
@@ -0,0 +1,17 @@
+#! /usr/bin/env nix-shell
+#! nix-shell -i bash -p coreutils curl jq gnused haskellPackages.cabal2nix-latest -I nixpkgs=.
+
+# Updates cabal2nix-latest to the latest master of the nixos/cabal2nix repository.
+# See regenerate-hackage-packages.sh for details on the purpose of this script.
+
+set -euo pipefail
+
+# fetch current master HEAD from Github
+head_info="$(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/NixOS/cabal2nix/branches/master)"
+# extract commit hash
+commit="$(jq -r .commit.sha <<< "$head_info")"
+# extract commit timestamp and convert to date
+date="$(date "--date=$(jq -r .commit.commit.committer.date <<< "$head_info")" +%F)"
+# generate nix expression from cabal file, replacing the version with the commit date
+echo '# This file defines cabal2nix-latest, used by maintainers/scripts/haskell/regenerate-hackage-packages.sh.' > pkgs/development/haskell-modules/cabal2nix-latest.nix
+cabal2nix "https://github.com/NixOS/cabal2nix/archive/$commit.tar.gz" | sed -e 's/version = ".*"/version = "'"$date"'"/' >> pkgs/development/haskell-modules/cabal2nix-latest.nix
diff --git a/maintainers/scripts/haskell/update-hackage.sh b/maintainers/scripts/haskell/update-hackage.sh
new file mode 100755
index 00000000000..de4b3bc0448
--- /dev/null
+++ b/maintainers/scripts/haskell/update-hackage.sh
@@ -0,0 +1,21 @@
+#! /usr/bin/env nix-shell
+#! nix-shell -i bash -p nix curl jq nix-prefetch-github -I nixpkgs=.
+
+# See regenerate-hackage-packages.sh for details on the purpose of this script.
+
+set -euo pipefail
+
+pin_file=pkgs/data/misc/hackage/pin.json
+current_commit="$(jq -r .commit $pin_file)"
+head_commit="$(curl -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/commercialhaskell/all-cabal-hashes/branches/hackage | jq -r .commit.sha)"
+
+if [ "$current_commit" != "$head_commit" ]; then
+   url="https://github.com/commercialhaskell/all-cabal-hashes/archive/$head_commit.tar.gz"
+   hash="$(nix-prefetch-url "$url")"
+   jq -n \
+     --arg commit "$head_commit" \
+     --arg hash "$hash" \
+     --arg url "$url" \
+     '{commit: $commit, url: $url, sha256: $hash}' \
+     > $pin_file
+fi
diff --git a/maintainers/scripts/haskell/update-stackage.sh b/maintainers/scripts/haskell/update-stackage.sh
new file mode 100755
index 00000000000..0e08c02bc2c
--- /dev/null
+++ b/maintainers/scripts/haskell/update-stackage.sh
@@ -0,0 +1,51 @@
+#! /usr/bin/env bash
+
+set -eu -o pipefail
+
+tmpfile=$(mktemp "update-stackage.XXXXXXX")
+# shellcheck disable=SC2064
+trap "rm ${tmpfile} ${tmpfile}.new" 0
+
+curl -L -s "https://stackage.org/nightly/cabal.config" >"$tmpfile"
+version=$(sed -rn "s/^--.*http:..(www.)?stackage.org.snapshot.nightly-//p" "$tmpfile")
+
+# Create a simple yaml version of the file.
+sed -r \
+    -e '/^--/d' \
+    -e 's|^constraints:||' \
+    -e 's|^ +|  - |' \
+    -e 's|,$||' \
+    -e '/installed$/d' \
+    -e '/^$/d' \
+    < "${tmpfile}" | sort --ignore-case >"${tmpfile}.new"
+
+# Drop restrictions on some tools where we always want the latest version.
+sed -r \
+    -e '/ cabal-install /d' \
+    -e '/ cabal2nix /d' \
+    -e '/ cabal2spec /d' \
+    -e '/ distribution-nixpkgs /d' \
+    -e '/ git-annex /d' \
+    -e '/ hindent /d' \
+    -e '/ hledger/d' \
+    -e '/ hlint /d' \
+    -e '/ hoogle /d' \
+    -e '/ hopenssl /d' \
+    -e '/ jailbreak-cabal /d' \
+    -e '/ json-autotype/d' \
+    -e '/ language-nix /d' \
+    -e '/ shake /d' \
+    -e '/ ShellCheck /d' \
+    -e '/ stack /d' \
+    -e '/ weeder /d' \
+    < "${tmpfile}.new" > "${tmpfile}"
+
+# Drop the previous configuration ...
+# shellcheck disable=SC1004
+sed -e '/  # Stackage Nightly/,/^$/c \TODO\
+'   -i pkgs/development/haskell-modules/configuration-hackage2nix.yaml
+
+# ... and replace it with the new one.
+sed -e "/TODO/r $tmpfile" \
+    -e "s/TODO/  # Stackage Nightly $version/" \
+    -i pkgs/development/haskell-modules/configuration-hackage2nix.yaml
diff --git a/pkgs/data/misc/hackage/default.nix b/pkgs/data/misc/hackage/default.nix
index d8599c50b1d..e559281303d 100644
--- a/pkgs/data/misc/hackage/default.nix
+++ b/pkgs/data/misc/hackage/default.nix
@@ -1,6 +1,10 @@
+# Hackage database snapshot, used by maintainers/scripts/regenerate-hackage-packages.sh
+# and callHackage
 { fetchurl }:
-
+let
+  pin = builtins.fromJSON (builtins.readFile ./pin.json);
+in
 fetchurl {
-  url = "https://github.com/commercialhaskell/all-cabal-hashes/archive/d202e2aff06500ede787ed63544476f6d41e9eb7.tar.gz";
-  sha256 = "00hmclrhr3a2h9vshsl909g0zgymlamx491lkhwr5kgb3qx9sfh2";
+  inherit (pin) url sha256;
+  passthru.updateScript = ../../../../maintainers/scripts/haskell/update-hackage.sh;
 }
diff --git a/pkgs/data/misc/hackage/pin.json b/pkgs/data/misc/hackage/pin.json
new file mode 100644
index 00000000000..f0aef7f5a1c
--- /dev/null
+++ b/pkgs/data/misc/hackage/pin.json
@@ -0,0 +1,5 @@
+{
+  "commit": "f04ff9179e228b67aee1241fe8c6508f91e92fb5",
+  "url": "https://github.com/commercialhaskell/all-cabal-hashes/archive/f04ff9179e228b67aee1241fe8c6508f91e92fb5.tar.gz",
+  "sha256": "11k786zcj21hgjxd2fvfshllxdl1z252x01wvfs16wp66n720wly"
+}
diff --git a/pkgs/development/haskell-modules/cabal2nix-latest.nix b/pkgs/development/haskell-modules/cabal2nix-latest.nix
new file mode 100644
index 00000000000..75c9de963a0
--- /dev/null
+++ b/pkgs/development/haskell-modules/cabal2nix-latest.nix
@@ -0,0 +1,40 @@
+# This file defines cabal2nix-latest, used by maintainers/scripts/haskell/regenerate-hackage-packages.sh.
+{ mkDerivation, aeson, ansi-wl-pprint, base, bytestring, Cabal
+, containers, deepseq, directory, distribution-nixpkgs, fetchzip
+, filepath, hackage-db, hopenssl, hpack, language-nix, lens, lib
+, monad-par, monad-par-extras, mtl, optparse-applicative, pretty
+, process, split, tasty, tasty-golden, text, time, transformers
+, yaml
+}:
+mkDerivation {
+  pname = "cabal2nix";
+  version = "2021-05-01";
+  src = fetchzip {
+    url = "https://github.com/NixOS/cabal2nix/archive/849a3507c849e3e2331efbc5ebe391b70a215ddc.tar.gz";
+    sha256 = "0g91d2bd72l3kkykc47a2raymvgw6427n7cg9ayzvrpldkd0silc";
+  };
+  isLibrary = true;
+  isExecutable = true;
+  libraryHaskellDepends = [
+    aeson ansi-wl-pprint base bytestring Cabal containers deepseq
+    directory distribution-nixpkgs filepath hackage-db hopenssl hpack
+    language-nix lens optparse-applicative pretty process split text
+    time transformers yaml
+  ];
+  executableHaskellDepends = [
+    aeson base bytestring Cabal containers directory
+    distribution-nixpkgs filepath hopenssl language-nix lens monad-par
+    monad-par-extras mtl optparse-applicative pretty
+  ];
+  testHaskellDepends = [
+    base Cabal containers directory filepath language-nix lens pretty
+    process tasty tasty-golden
+  ];
+  preCheck = ''
+    export PATH="$PWD/dist/build/cabal2nix:$PATH"
+    export HOME="$TMPDIR/home"
+  '';
+  homepage = "https://github.com/nixos/cabal2nix#readme";
+  description = "Convert Cabal files into Nix build instructions";
+  license = lib.licenses.bsd3;
+}
diff --git a/pkgs/development/haskell-modules/configuration-common.nix b/pkgs/development/haskell-modules/configuration-common.nix
index 73ef9fd84dc..3b6f5f3ef5e 100644
--- a/pkgs/development/haskell-modules/configuration-common.nix
+++ b/pkgs/development/haskell-modules/configuration-common.nix
@@ -1797,4 +1797,8 @@ self: super: {
   # https://github.com/obsidiansystems/database-id/issues/1
   database-id-class = doJailbreak super.database-id-class;
 
+  cabal2nix-latest = overrideCabal super.cabal2nix-latest {
+    passthru.updateScript = ../../../maintainers/scripts/haskell/update-cabal2nix-latest.sh;
+  };
+
 } // import ./configuration-tensorflow.nix {inherit pkgs haskellLib;} self super
diff --git a/pkgs/development/haskell-modules/hackage-packages.nix b/pkgs/development/haskell-modules/hackage-packages.nix
index 6fa8f733558..86b75b58e1a 100644
--- a/pkgs/development/haskell-modules/hackage-packages.nix
+++ b/pkgs/development/haskell-modules/hackage-packages.nix
@@ -58220,8 +58220,8 @@ self: {
      }:
      mkDerivation {
        pname = "code-conjure";
-       version = "0.1.0";
-       sha256 = "0zagchakak4mrdpgy23d2wfb357dc6fn78fpcjs1ik025wmldy88";
+       version = "0.1.2";
+       sha256 = "14xgpax596wd66kan1nj043n9f4wwn34rr77hgj6wir9aygx9sla";
        libraryHaskellDepends = [
          base express leancheck speculate template-haskell
        ];
@@ -70946,8 +70946,6 @@ self: {
        libraryHaskellDepends = [ aeson base ];
        description = "Class for types with a database id";
        license = lib.licenses.bsd3;
-       hydraPlatforms = lib.platforms.none;
-       broken = true;
      }) {};
 
   "database-id-groundhog" = callPackage
@@ -88332,6 +88330,20 @@ self: {
        license = lib.licenses.bsd3;
      }) {};
 
+  "express_0_1_8" = callPackage
+    ({ mkDerivation, base, leancheck, template-haskell }:
+     mkDerivation {
+       pname = "express";
+       version = "0.1.8";
+       sha256 = "1g586cv6j79w40bmagqi156rjv09k1whhvpg67p0f707hbq1ph0a";
+       libraryHaskellDepends = [ base template-haskell ];
+       testHaskellDepends = [ base leancheck ];
+       benchmarkHaskellDepends = [ base leancheck ];
+       description = "Dynamically-typed expressions involving applications and variables";
+       license = lib.licenses.bsd3;
+       hydraPlatforms = lib.platforms.none;
+     }) {};
+
   "expression-parser" = callPackage
     ({ mkDerivation, base }:
      mkDerivation {
@@ -145141,8 +145153,6 @@ self: {
        executableHaskellDepends = [ base containers HUnit random ];
        description = "A Yahtzee game implementation in Haskell";
        license = lib.licenses.bsd3;
-       hydraPlatforms = lib.platforms.none;
-       broken = true;
      }) {};
 
   "hyakko" = callPackage
@@ -195775,8 +195785,6 @@ self: {
        platforms = [
          "aarch64-linux" "armv7l-linux" "i686-linux" "x86_64-linux"
        ];
-       hydraPlatforms = lib.platforms.none;
-       broken = true;
      }) {pam = null;};
 
   "pan-os-syslog" = callPackage
@@ -244539,17 +244547,15 @@ self: {
 
   "sockets-and-pipes" = callPackage
     ({ mkDerivation, aeson, ascii, async, base, blaze-html, bytestring
-     , containers, network, safe-exceptions, stm, text, time
+     , containers, network, pipes, safe-exceptions, stm, text, time
      }:
      mkDerivation {
        pname = "sockets-and-pipes";
-       version = "0.1";
-       sha256 = "02xc2kddcz93d9yqdchml0yh9gypcx64315baj766adgf8np42nv";
-       revision = "4";
-       editedCabalFile = "1lv2zpyblqryr59ii3zvwi5f06vxsgnla1xa14rardhncs36fa8r";
+       version = "0.2";
+       sha256 = "13xc6f525la66k76y515r0dwjqh583zl7z1k4z1w6hraim6kg95v";
        libraryHaskellDepends = [
          aeson ascii async base blaze-html bytestring containers network
-         safe-exceptions stm text time
+         pipes safe-exceptions stm text time
        ];
        description = "Support for the Sockets and Pipes book";
        license = lib.licenses.asl20;
diff --git a/pkgs/development/haskell-modules/non-hackage-packages.nix b/pkgs/development/haskell-modules/non-hackage-packages.nix
index 86123d8a70f..7c3c43fd9dc 100644
--- a/pkgs/development/haskell-modules/non-hackage-packages.nix
+++ b/pkgs/development/haskell-modules/non-hackage-packages.nix
@@ -11,6 +11,10 @@ self: super: {
 
   ldgallery-compiler = self.callPackage ../../tools/graphics/ldgallery/compiler { };
 
+  # Used by maintainers/scripts/regenerate-hackage-packages.sh, and generated
+  # from the latest master instead of the current version on Hackage.
+  cabal2nix-latest = self.callPackage ./cabal2nix-latest.nix { };
+
   # https://github.com/channable/vaultenv/issues/1
   vaultenv = self.callPackage ../tools/haskell/vaultenv { };