blob: ad508d8d7bcfd9e841b8a2baa4918bd6ebc75235 (
plain) (
tree)
|
|
let
pkgs = import <nixpkgs> {};
rootSrc = pkgs.nix-gitignore.gitignoreSource [] ./.;
# 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
'';
});
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
];
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 ]))
];
};
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"
'';
}
|