{ stdenv, fetchFromGitHub
, meson, ninja, pkgconfig, python3, sphinx
, acl, curl, fuse, libselinux, udev, xz, zstd
, fuseSupport ? true
, selinuxSupport ? true
, udevSupport ? true
, glibcLocales, rsync
}:

stdenv.mkDerivation {
  pname = "casync";
  version = "2-152-ge4a3c5e";

  src = fetchFromGitHub {
    owner  = "systemd";
    repo   = "casync";
    rev    = "e4a3c5efc8f11e0e99f8cc97bd417665d92b40a9";
    sha256 = "0zx6zvj5a6rr3w9s207rvpfw7gwssiqmp1p3c75bsirmz4nmsdf0";
  };

  buildInputs = [ acl curl xz zstd ]
                ++ stdenv.lib.optionals (fuseSupport) [ fuse ]
                ++ stdenv.lib.optionals (selinuxSupport) [ libselinux ]
                ++ stdenv.lib.optionals (udevSupport) [ udev ];
  nativeBuildInputs = [ meson ninja pkgconfig python3 sphinx ];
  checkInputs = [ glibcLocales rsync ];

  postPatch = ''
    for f in test/test-*.sh.in; do
      patchShebangs $f
    done
    patchShebangs test/http-server.py
  '';

  PKG_CONFIG_UDEV_UDEVDIR = "lib/udev";
  mesonFlags = stdenv.lib.optionals (!fuseSupport) [ "-Dfuse=false" ]
               ++ stdenv.lib.optionals (!udevSupport) [ "-Dudev=false" ]
               ++ stdenv.lib.optionals (!selinuxSupport) [ "-Dselinux=false" ];

  doCheck = true;
  preCheck = ''
    export LC_ALL="en_US.utf-8"
  '';

  meta = with stdenv.lib; {
    description = "Content-Addressable Data Synchronizer";
    homepage    = https://github.com/systemd/casync;
    license     = licenses.lgpl21;
    platforms   = platforms.linux;
    maintainers = with maintainers; [ flokli ];
  };
}
