/* Taken from: https://github.com/nix-community/home-manager/blob/9ba7b3990eb1f4782ea3f5fe7ac4f3c88dd7a32c/modules/services/git-sync.nix */ { config, lib, pkgs, ... }: let cfg = config.services.git-sync; mkUnit = name: repo: { Unit.Description = "Git Sync ${name}"; Install.WantedBy = ["default.target"]; Service = { Environment = [ "PATH=${lib.makeBinPath (with pkgs; [openssh git])}" "GIT_SYNC_DIRECTORY=${repo.path}" "GIT_SYNC_COMMAND=${cfg.package}/bin/git-sync" "GIT_SYNC_REPOSITORY=${repo.uri}" "GIT_SYNC_INTERVAL=${toString repo.interval}" ]; ExecStart = "${cfg.package}/bin/git-sync-on-inotify"; Restart = "on-abort"; }; }; services = lib.mapAttrs' (name: repo: { name = "git-sync-${name}"; value = mkUnit name repo; }) cfg.repositories; repositoryType = lib.types.submodule ({name, ...}: { options = { name = lib.mkOption { internal = true; default = name; type = lib.types.str; description = "The name that should be given to this unit."; }; path = lib.mkOption { type = lib.types.path; description = "The path at which to sync the repository"; }; uri = lib.mkOption { type = lib.types.str; example = "git+ssh://user@example.com:/~[user]/path/to/repo.git"; description = '' The URI of the remote to be synchronized. This is only used in the event that the directory does not already exist. See for the supported URIs. ''; }; interval = lib.mkOption { type = lib.types.int; default = 500; description = '' The interval, specified in seconds, at which the synchronization will be triggered even without filesystem changes. ''; }; }; }); in { options = { services.git-sync = { enable = lib.mkEnableOption "git-sync services"; package = lib.mkOption { type = lib.types.package; default = pkgs.git-sync; defaultText = lib.literalExpression "pkgs.git-sync"; description = '' Package containing the git-sync program. ''; }; repositories = lib.mkOption { type = with lib.types; attrsOf repositoryType; description = '' The repositories that should be synchronized. ''; }; }; }; config = lib.mkIf cfg.enable { assertions = [ (lib.hm.assertions.assertPlatform "services.git-sync" pkgs lib.platforms.linux) ]; systemd.user.services = services; }; }