main
  1{den, ...}: {
  2  den.aspects.dev.jujutsu = {
  3    includes =
  4      den.lib.policy.when
  5      ({host, ...}: host.hasAspect den.aspects.desktop.gnupg)
  6      [den.aspects.dev.jujutsu.sign];
  7
  8    provides.to-users = {
  9      hjem = {
 10        user,
 11        pkgs,
 12        lib,
 13        ...
 14      }: let
 15        # git.ignore-filters support, from https://github.com/jj-vcs/jj/pull/9635
 16        # TODO: re-check this patch on every nixpkgs bump, drop it once upstreamed.
 17        jujutsu = pkgs.jujutsu.overrideAttrs {
 18          patches = [./jujutsu-lfs.patch];
 19        };
 20      in {
 21        packages = [
 22          jujutsu
 23          pkgs.jjui
 24          pkgs.oyui
 25        ];
 26
 27        xdg.config.files."jj/config.toml" = {
 28          generator = (pkgs.formats.toml {}).generate "jj-config.toml";
 29          value = {
 30            user = {
 31              name = user.identity.displayName;
 32              email = user.identity.email;
 33            };
 34            ui = {
 35              diff-formatter =
 36                [(lib.getExe pkgs.difftastic)]
 37                ++ (lib.cli.toCommandLineGNU {} {
 38                  color = "always";
 39                  sort-paths = true;
 40                  width = "$width";
 41                })
 42                ++ ["$left" "$right"];
 43
 44              diff-editor = [(lib.getExe pkgs.oyui) "diff" "$left" "$right"];
 45              diff-instructions = false;
 46            };
 47            merge-tools.oyui = {
 48              program = lib.getExe pkgs.oyui;
 49              edit-args = ["diff" "$left" "$right"];
 50            };
 51          };
 52        };
 53
 54        xdg.config.files."oyui/config.rn" = {
 55          generator = cfg: ''
 56            pub fn config() {
 57              // Theme
 58              ${lib.concatMapAttrsStringSep "  \n"
 59              (key: value:
 60                if (key == "name")
 61                then "theme::set(\"${value}\");"
 62                else "theme::${key}::set(\"${value}\");")
 63              cfg.theme or {}}
 64
 65              // Keybinds
 66              ${lib.concatMapAttrsStringSep "  \n"
 67              (key: value: "keybind(\"${key}\", || ${value});")
 68              cfg.keybinds.global or {}}
 69              on_mode("file", || {
 70                ${lib.concatMapAttrsStringSep "    \n"
 71              (key: value: "keybind(\"${key}\", || ${value});")
 72              cfg.keybinds.file or {}}
 73              });
 74              on_mode("tree", || {
 75                ${lib.concatMapAttrsStringSep "    \n"
 76              (key: value: "keybind(\"${key}\", || ${value});")
 77              cfg.keybinds.tree or {}}
 78              });
 79            }
 80          '';
 81          value = {
 82          };
 83        };
 84      };
 85    };
 86  };
 87
 88  den.aspects.dev.jujutsu.sign = {
 89    hjem = {
 90      xdg.config.files."jj/config.toml".value = {
 91        signing = {
 92          behavior = "drop";
 93          backend = "gpg";
 94        };
 95        git = {
 96          sign-on-push = true;
 97        };
 98      };
 99
100      xdg.config.files."oyui/config.rn".value = {
101        theme.name = "catppuccin_mocha";
102      };
103    };
104  };
105}