# This derivation builds two files containing information about the
# closure of 'rootPaths': $out/store-paths contains the paths in the
# closure, and $out/registration contains a file suitable for use with
# "nix-store --load-db" and "nix-store --register-validity
# --hash-given".

{ stdenv, coreutils, jq, perl, pathsFromGraph }:

{ rootPaths }:

#if builtins.langVersion >= 5 then
# FIXME: it doesn't work on Hydra, failing to find mkdir;
#   perhaps .attrs.sh clobbers PATH with new nix?
if false then

  # Nix >= 1.12: Include NAR hash / size info.

  stdenv.mkDerivation {
    name = "closure-info";

    __structuredAttrs = true;

    exportReferencesGraph.closure = rootPaths;

    PATH = "${coreutils}/bin:${jq}/bin";

    builder = builtins.toFile "builder"
      ''
        if [ -e .attrs.sh ]; then . .attrs.sh; fi

        out=''${outputs[out]}

        mkdir $out

        jq -r '.closure | map([.path, .narHash, .narSize, "", (.references | length)] + .references) | add | map("\(.)\n") | add' < .attrs.json | head -n -1 > $out/registration
        jq -r .closure[].path < .attrs.json > $out/store-paths
      '';
  }

else

  # Nix < 1.12

  stdenv.mkDerivation {
    name = "closure-info";

    exportReferencesGraph =
      map (x: [("closure-" + baseNameOf x) x]) rootPaths;

    buildInputs = [ perl ];

    buildCommand =
      ''
        mkdir $out
        printRegistration=1 perl ${pathsFromGraph} closure-* > $out/registration
        perl ${pathsFromGraph} closure-* > $out/store-paths
      '';
  }