# generate s6-rc database,  by generating closure of all
# config.services and calling s6-rc-compile on them

{
  stdenvNoCC
, buildPackages
, closureInfo
, writeText
, services ? []
}:
let closure-info = closureInfo { rootPaths = services; };
in stdenvNoCC.mkDerivation  {
  name = "s6-rc-database";
  nativeBuildInputs = [buildPackages.s6-rc];
  builder = writeText "find-s6-services" ''
    source $stdenv/setup
    mkdir -p $out
    srcs=""
    shopt -s nullglob
    for i in $(cat  ${closure-info}/store-paths ); do
      if test -d $i; then
        for j in $i/* ; do
          if test -f $j/type ; then
            if test -e $j/restart-on-upgrade; then
              flag=force-restart
            else
              unset flag
            fi
            case $(cat $j/type) in
              longrun|oneshot)
                # s6-rc-update only wants atomics in its
                # restarts file
                echo $(basename $j) " " ''${flag-$i} >>  $out/hashes
                ;;
              *)
                ;;
            esac
            srcs="$srcs $i"
          fi
        done
      fi
    done
    s6-rc-compile $out/compiled $srcs
    s6-rc-db -c $out/compiled contents default
    mv $out/hashes $out/compiled
  '';
}