aboutsummaryrefslogtreecommitdiffstats
path: root/system/services/git-sync
diff options
context:
space:
mode:
Diffstat (limited to 'system/services/git-sync')
-rw-r--r--system/services/git-sync/default.nix104
1 files changed, 104 insertions, 0 deletions
diff --git a/system/services/git-sync/default.nix b/system/services/git-sync/default.nix
new file mode 100644
index 0000000..776ca60
--- /dev/null
+++ b/system/services/git-sync/default.nix
@@ -0,0 +1,104 @@
+/*
+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
+ <link xlink:href="https://git-scm.com/docs/git-clone#_git_urls"/>
+ 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 <command>git-sync</command> 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;
+ };
+}