aboutsummaryrefslogblamecommitdiff
path: root/utils.nix
blob: fd25021b49f64dfca843cabe0c50e546ee20490a (plain) (tree)


















                                                                  

                                                                  
















































































                                                                                                                        
{ pkgs, src, baseName }:
let
  nixfmt = import (builtins.fetchTarball
  "https://github.com/serokell/nixfmt/archive/master.tar.gz") { };
in rec {
  baseTask = pkgs.stdenv.mkDerivation {
    name = "${baseName}-task";
    src = src;
    buildInputs = [ ];
    phases = "unpackPhase buildPhase";
    buildPhase = ''
      echo "ERROR: base task buildPhase not overriden."
      exit 1
    '';
  };
  shellcheck = ignoredFindPattern:
  baseTask.overrideAttrs (baseAttrs: rec {
    name = "${baseAttrs.name}-shellcheck";
    buildInputs = baseAttrs.buildInputs ++ [ pkgs.shellcheck ];
    ignoredPattern =
    if ignoredFindPattern == null then "" else ignoredFindPattern;
    buildPhase = ''
      find . -type f \( -name '*.sh' -and -regextype egrep ! -regex '${ignoredPattern}' \) -print0 | xargs -0 shellcheck
      touch $out
    '';
  });
  formatNix = baseTask.overrideAttrs (baseAttrs: {
    name = "${baseAttrs.name}-nixfmt";
    buildInputs = baseAttrs.buildInputs ++ [ nixfmt ];
    buildPhase = ''
      format() {
        nix_file="$1"
        diff <(nixfmt < "$nix_file") "$nix_file" || {
          echo "The $nix_file is unformatted. To fix it, run:"
          echo "  nixfmt $nix_file"
          exit 1
        }
      }
      export -f format
      find . -type f -name '*.nix' -print0 | xargs -0 -I{} bash -c "format {}" \;
      touch $out
    '';
  });
  fixme = ignoredFiles:
  baseTask.overrideAttrs (baseAttrs: rec {
    name = "${baseAttrs.name}-fixme";
    buildInputs = baseAttrs.buildInputs ++ [ pkgs.ag ];
    ignoredPattern = pkgs.lib.fold (a: b: " --ignore ${a} ${b}") ""
    (if ignoredFiles == null then [
      "default.nix"
      "TODOs.org"
    ] else
      ignoredFiles);
    buildPhase = ''
      ag FIXME ${ignoredPattern} || {
        touch $out
        exit 0
      }
      echo "  Found dangling FIXME markers on the project."
      echo "  You should write them down properly on TODOs.org."
      exit 1
    '';
  });
  orgMkDocs = title:
  baseTask.overrideAttrs (baseAttrs: {
    name = "${baseAttrs.name}-docs";
    buildInputs = [ pkgs.pandoc pkgs.mkdocs ];
    buildPhase = ''
      # Convert from org-mode to markdown with pandoc
      find docs/ -type f -name '*.org' -print0 | xargs -0 -I{} pandoc -o {}.md {}.org

      # Give the generated markdown files to MkDocs
      mkdocs build

      # Build remaining one-off files
      pandoc README.org -o site/index.html --css docs/README.css --to=html5 --self-contained --metadata title="${title}"

      mv site/ $out/
    '';
  });
  test = testDerivations:
  baseTask.overrideAttrs (baseAttrs: {
    name = "${baseAttrs.name}-test";
    buildPhase = ''
      echo "Ran tests for:"
      for d in ${builtins.toString testDerivations}; do
        echo "  $d"
      done
      echo "All tests passed!"
      touch $out
    '';
  });
  publishScript = docsDerivation:
  pkgs.writeShellScriptBin "publish.sh" ''
    set -euo pipefail
    OUT_DOCS="${docsDerivation}"
    ${pkgs.rsync}/bin/rsync -avzP                                   \
                            --rsh="ssh -o StrictHostKeyChecking=no" \
                            "$OUT_DOCS/"                            \
                            "$SERVER_URL:$DOCS_SERVER_PATH"
  '';
}