let pkgs = import { }; rootSrc = pkgs.nix-gitignore.gitignoreSource [] ./.; nixfmt = import (builtins.fetchTarball "https://github.com/serokell/nixfmt/archive/master.tar.gz") { }; # Taken from: # http://www.cs.yale.edu/homes/lucas.paul/posts/2017-04-10-hakyll-on-nix.html websiteBuilder = pkgs.stdenv.mkDerivation { name = "website-builder"; src = ./hakyll; phases = "unpackPhase buildPhase"; buildInputs = [(pkgs.haskellPackages.ghcWithPackages (p: with p; [hakyll]))]; buildPhase = '' mkdir -p $out/bin ghc -O2 -dynamic --make Main.hs -o $out/bin/build-site ''; }; baseTask = pkgs.stdenv.mkDerivation { name = "website-task"; src = rootSrc; buildInputs = [pkgs.perl]; phases = "unpackPhase buildPhase"; buildPhase = '' echo "ERROR: base task buildPhase not overriden." exit 1 ''; }; in with pkgs; with pkgs.stdenv; rec { subtasks = rec { fixme = baseTask.overrideAttrs (baseAttrs: { name = "${baseAttrs.name}-fixme"; buildInputs = baseAttrs.buildInputs ++ [ag]; buildPhase = '' ag FIXME --ignore default.nix --ignore pastebin/skeleton.org || { touch $out } ''; }); perlPodCheck = baseTask.overrideAttrs (baseAttrs: { name = "${baseAttrs.name}-perl-podcheck"; buildPhase = '' podchecker website pastebin/website-pastebin slides/website-slides touch $out ''; }); batsTest = baseTask.overrideAttrs (baseAttrs: { name = "${baseAttrs.name}-bats-test"; buildInputs = baseAttrs.buildInputs ++ [bats]; buildPhase = '' patchShebangs . ./t/website.bats touch $out ''; }); perlInternalTest = baseTask.overrideAttrs (baseAttrs: { name = "${baseAttrs.name}-perl-test"; buildPhase = '' patchShebangs . ./website test touch $out ''; }); formatNix = baseTask.overrideAttrs (baseAttrs: { name = "${baseAttrs.name}-nixfmt"; buildInputs = baseAttrs.buildInputs ++ [nixfmt]; buildPhase = '' diff <(nixfmt < default.nix) default.nix touch $out ''; }); docs = baseTask.overrideAttrs (baseAttrs: { name = "${baseAttrs.name}-docs"; buildInputs = [ websiteBuilder pandoc ]; buildPhase = '' export LOCALE_ARCHIVE="${pkgs.glibcLocales}/lib/locale/locale-archive"; export LANG=en_US.UTF-8 ls pastebin/*.org | awk -F. '{print $1}' | xargs -I{} pandoc -o {}.html {}.org --standalone build-site build mkdir $out cp -r _site/* $out ''; }); }; test = baseTask.overrideAttrs (baseAttrs: rec { name = "${baseAttrs.name}-test"; buildInputs = [ subtasks.fixme subtasks.perlPodCheck subtasks.batsTest subtasks.perlInternalTest subtasks.formatNix ]; buildPhase = '' echo "Ran tests for:" for d in ${builtins.toString buildInputs}; do echo " $d" done echo "All tests passed!" touch $out ''; }); shell = mkShell rec { name = "website-shell"; buildInputs = [ websiteBuilder (pkgs.haskellPackages.ghcWithPackages (p: with p; [hakyll])) nixfmt ]; }; publishScript = pkgs.writeShellScriptBin "publish.sh" '' set -euo pipefail ${pkgs.rsync}/bin/rsync --verbose \ --copy-links \ --progress \ --stats \ --update \ --recursive \ --rsh="ssh -o StrictHostKeyChecking=no" \ ${subtasks.docs}/ \ "$SERVER_URL:$DOCS_SERVER_PATH" ''; }