aboutsummaryrefslogtreecommitdiffstats
path: root/modules/home/conf/unison
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-10-18 17:07:46 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-10-18 17:07:46 +0200
commitc52c7f314ccadcc2fcd91e28c8fd1b88f6d5ce0c (patch)
treee8b947710b467b32740598ff574982097836f66c /modules/home/conf/unison
parentchore(pkgs/yt): 1.2.1 -> 1.3.0 (diff)
downloadnixos-config-c52c7f314ccadcc2fcd91e28c8fd1b88f6d5ce0c.zip
refactor(modules): Move all system modules to `by-name`
From now on all modules should be added to the new `by-name` directory. This should help remove the (superficial and utterly useless) distinction between `home-manager` and `NixOS` modules.
Diffstat (limited to 'modules/home/conf/unison')
-rw-r--r--modules/home/conf/unison/default.nix187
1 files changed, 0 insertions, 187 deletions
diff --git a/modules/home/conf/unison/default.nix b/modules/home/conf/unison/default.nix
deleted file mode 100644
index ae682235..00000000
--- a/modules/home/conf/unison/default.nix
+++ /dev/null
@@ -1,187 +0,0 @@
-{
- lib,
- config,
- nixosConfig,
- sysLib,
- pkgs,
- ...
-}: let
- unisonPath = "${config.xdg.dataHome}/unison";
-
- # These are only used for the script
- unisonOptions = {
- sshcmd = "ssh";
- ui = "text";
- auto = "true";
- # This is useless, with hm links
- links = "false";
-
- backupdir = "${unisonPath}/backups";
- backuploc = "central";
- backupcurr = paths_to_merge;
- # merge =
- # builtins.map (x: ''${x} -> diff3 --text --merge CURRENT1 CURRENTARCH CURRENT2 > NEW'')
- # paths_to_merge;
- };
-
- paths_to_merge = mkPathName {
- file_names = ["log" "history" "harpoon.json" "file_frecency.bin" "main.shada"];
- extensions = ["log"];
- };
-
- paths_to_keep = [
- "~/.local/state/mpv"
- "~/.local/state/nvim"
- "~/.local/share"
- "~/.local/.Trash-1000"
-
- "~/.mozilla/.Trash-1000"
- "~/.mozilla/firefox"
-
- "~/media"
- "~/school"
- "~/repos"
- ];
- paths_to_ignore = [
- # already synchronized by the taskserver
- "~/.local/share/task"
-
- # Should not be synchronized
- "~/.local/share/unison"
-
- # Is just to big to be synchronized (# TODO: Work around that <2024-08-31> )
- "~/media/music"
- ];
-
- hostName = let
- hn = nixosConfig.networking.hostName;
- in
- if hn == "tiamat"
- then "apzu"
- else if hn == "apzu"
- then "tiamat"
- else builtins.throw "Host (${hn}) not yet covered in the unison host mapping.";
-
- mkPathName = {
- file_names,
- extensions,
- }:
- builtins.map (x: ''Name ${x}'') (
- (builtins.map (x: ''*.${x}'') extensions)
- ++ file_names
- );
-
- unitName = name: builtins.replaceStrings ["/"] ["-"] name;
-
- mkPath = path:
- if lib.strings.hasPrefix "~" path
- then "${builtins.elemAt (builtins.attrNames config.home.persistence)
- 0}${lib.strings.removePrefix "~" path}"
- else
- builtins.throw
- "Every pathname needs to start with a '~'";
-
- mkPair = pathname: let
- path = mkPath pathname;
- in {
- name = unitName "${pathname}";
- value = {
- stateDirectory = unisonPath;
- roots = [
- "${path}"
- "ssh://${config.home.username}@${hostName}.fritz.box/${path}"
- ];
- };
- };
-
- getIgnoredSingle = path: path_to_ignore: let
- clean_path_to_ignore = mkPath path_to_ignore;
- commonPath = builtins.substring 0 (builtins.stringLength path) clean_path_to_ignore;
- in
- if commonPath == path
- then let
- preFinalPath =
- builtins.substring (builtins.stringLength commonPath)
- (builtins.stringLength clean_path_to_ignore)
- clean_path_to_ignore;
- finalPath =
- if lib.strings.hasPrefix "/" preFinalPath
- then lib.strings.removePrefix "/" preFinalPath
- else preFinalPath;
- in "BelowPath ${finalPath}"
- else null;
-
- getIgnored = paths_to_ignore: path:
- serialiseArgs {
- ignore =
- builtins.filter (x: x != null) (builtins.map (getIgnoredSingle path) paths_to_ignore);
- };
-
- serialiseArg = key: val:
- if builtins.typeOf val == "string"
- then lib.strings.escapeShellArg "-${key}=${lib.strings.escape ["="] val}"
- else if builtins.typeOf val == "list"
- then lib.strings.concatStringsSep " " (builtins.map (serialiseArg key) val)
- else builtins.throw "Unsupported type: ${builtins.typeOf val}";
-
- serialiseArgs = args:
- lib.strings.concatStringsSep " " (
- lib.attrsets.mapAttrsToList
- serialiseArg
- args
- );
-
- esa = a: lib.strings.escapeShellArg a;
-
- mkScriptLine = pathname: let
- path =
- mkPath pathname;
- in
- lib.strings.concatStringsSep " " [
- "unison"
- "${serialiseArgs unisonOptions}"
- "$EXTRA_OPTIONS"
- "${getIgnored paths_to_ignore path}"
- "${esa path}"
- (esa "ssh://${config.home.username}@${hostName}.fritz.box/${path}")
- ];
-
- script = lib.strings.concatStringsSep "\n" (builtins.map mkScriptLine paths_to_keep);
-
- pairs = builtins.listToAttrs (builtins.map mkPair paths_to_keep);
-in {
- home.sessionVariables = {
- UNISON = unisonPath;
- };
- home.packages = [
- pkgs.unison
- (sysLib.writeShellScript {
- name = "unison-sync";
- src = builtins.toFile "unison-backup" (''
- #!/usr/bin/env dash
-
- # shellcheck source=/dev/null
- SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
-
- export UNISON=${esa unisonPath};
-
- if [ "$1" = "links" ]; then
- shift 1;
- EXTRA_OPTIONS="-links=true";
- fi
- EXTRA_OPTIONS="$EXTRA_OPTIONS $*"
- ''
- + script);
- dependencies = with pkgs; [
- unison
- openssh # needed to connect to the other server
- less # needed to show diffs
- diffutils # needed to compute diffs
- ];
- })
- ];
- services.unison = {
- enable = false;
- inherit pairs;
- };
-}