From 69083b3cdd2e16825d928a800bf1812baad8b7a6 Mon Sep 17 00:00:00 2001 From: Austin Horstman Date: Fri, 12 Sep 2025 08:35:46 -0500 Subject: [PATCH] jjui: init module Add a module for configuring the jjui program. --- .../misc/news/2025/09/2025-09-12_10-02-45.nix | 9 +++ modules/programs/jjui.nix | 65 +++++++++++++++++++ tests/modules/programs/jjui/default.nix | 5 ++ .../modules/programs/jjui/empty-settings.nix | 9 +++ .../jjui/example-settings-expected.toml | 3 + .../programs/jjui/example-settings.nix | 29 +++++++++ tests/modules/programs/jjui/null-package.nix | 30 +++++++++ 7 files changed, 150 insertions(+) create mode 100644 modules/misc/news/2025/09/2025-09-12_10-02-45.nix create mode 100644 modules/programs/jjui.nix create mode 100644 tests/modules/programs/jjui/default.nix create mode 100644 tests/modules/programs/jjui/empty-settings.nix create mode 100644 tests/modules/programs/jjui/example-settings-expected.toml create mode 100644 tests/modules/programs/jjui/example-settings.nix create mode 100644 tests/modules/programs/jjui/null-package.nix diff --git a/modules/misc/news/2025/09/2025-09-12_10-02-45.nix b/modules/misc/news/2025/09/2025-09-12_10-02-45.nix new file mode 100644 index 00000000..1e750844 --- /dev/null +++ b/modules/misc/news/2025/09/2025-09-12_10-02-45.nix @@ -0,0 +1,9 @@ +{ + time = "2025-09-12T15:02:45+00:00"; + condition = true; + message = '' + A new module is available: 'programs.jjui' + + jjui is a terminal user interface for jujutsu version control system. + ''; +} diff --git a/modules/programs/jjui.nix b/modules/programs/jjui.nix new file mode 100644 index 00000000..deee1127 --- /dev/null +++ b/modules/programs/jjui.nix @@ -0,0 +1,65 @@ +{ + config, + lib, + pkgs, + ... +}: +let + inherit (lib) mkIf mkOption; + + cfg = config.programs.jjui; + tomlFormat = pkgs.formats.toml { }; +in +{ + meta.maintainers = [ lib.maintainers.khaneliman ]; + + options.programs.jjui = { + enable = lib.mkEnableOption "jjui - A terminal user interface for jujutsu"; + + package = lib.mkPackageOption pkgs "jjui" { nullable = true; }; + + configDir = mkOption { + type = lib.types.str; + default = + let + dir = if pkgs.stdenv.isDarwin then "Library/Application Support" else config.xdg.configHome; + in + "${dir}/jjui"; + defaultText = lib.literalExpression "Darwin: \"Library/Application Support/jjui\" \nLinux: \${config.xdg.configHome}/jjui"; + example = lib.literalExpression "\${config.home.homeDirectory}/.jjui"; + description = '' + The directory to contain jjui configuration files. + ''; + }; + + settings = mkOption { + inherit (tomlFormat) type; + default = { }; + example = { + revisions = { + template = "builtin_log_compact"; + revset = ""; + }; + }; + description = '' + Options to add to the {file}`config.toml` file. See + + for options. + ''; + }; + }; + + config = mkIf cfg.enable { + home = { + packages = mkIf (cfg.package != null) [ cfg.package ]; + + file."${cfg.configDir}/config.toml" = mkIf (cfg.settings != { }) { + source = tomlFormat.generate "jjui-config" cfg.settings; + }; + + sessionVariables = { + JJUI_CONFIG_DIR = cfg.configDir; + }; + }; + }; +} diff --git a/tests/modules/programs/jjui/default.nix b/tests/modules/programs/jjui/default.nix new file mode 100644 index 00000000..faeb7a15 --- /dev/null +++ b/tests/modules/programs/jjui/default.nix @@ -0,0 +1,5 @@ +{ + jjui-empty-settings = ./empty-settings.nix; + jjui-example-settings = ./example-settings.nix; + jjui-null-package = ./null-package.nix; +} diff --git a/tests/modules/programs/jjui/empty-settings.nix b/tests/modules/programs/jjui/empty-settings.nix new file mode 100644 index 00000000..0de0946f --- /dev/null +++ b/tests/modules/programs/jjui/empty-settings.nix @@ -0,0 +1,9 @@ +{ + config = { + programs.jjui.enable = true; + + nmt.script = '' + assertPathNotExists home-files/.config/jjui + ''; + }; +} diff --git a/tests/modules/programs/jjui/example-settings-expected.toml b/tests/modules/programs/jjui/example-settings-expected.toml new file mode 100644 index 00000000..9e4b424e --- /dev/null +++ b/tests/modules/programs/jjui/example-settings-expected.toml @@ -0,0 +1,3 @@ +[revisions] +revset = "ancestors(@ | heads(remote_branches())) ~ empty()" +template = "builtin_log_compact" diff --git a/tests/modules/programs/jjui/example-settings.nix b/tests/modules/programs/jjui/example-settings.nix new file mode 100644 index 00000000..30598f07 --- /dev/null +++ b/tests/modules/programs/jjui/example-settings.nix @@ -0,0 +1,29 @@ +{ + config, + pkgs, + ... +}: + +{ + config = { + programs.jjui = { + enable = true; + settings = { + revisions = { + template = "builtin_log_compact"; + revset = "ancestors(@ | heads(remote_branches())) ~ empty()"; + }; + }; + }; + + nmt.script = + let + configDir = if !pkgs.stdenv.isDarwin then ".config/jjui" else "Library/Application Support/jjui"; + in + '' + assertFileContent \ + "home-files/${configDir}/config.toml" \ + ${./example-settings-expected.toml} + ''; + }; +} diff --git a/tests/modules/programs/jjui/null-package.nix b/tests/modules/programs/jjui/null-package.nix new file mode 100644 index 00000000..4fa1e578 --- /dev/null +++ b/tests/modules/programs/jjui/null-package.nix @@ -0,0 +1,30 @@ +{ + config, + pkgs, + ... +}: + +{ + config = { + programs.jjui = { + enable = true; + package = null; + settings = { + revisions.template = "builtin_log_oneline"; + }; + }; + + nmt.script = + let + configDir = if !pkgs.stdenv.isDarwin then ".config/jjui" else "Library/Application Support/jjui"; + in + '' + assertFileContent \ + "home-files/${configDir}/config.toml" \ + ${pkgs.writeText "expected" '' + [revisions] + template = "builtin_log_oneline" + ''} + ''; + }; +}