From f436677f5f8812d9ab365a822c77d9f1fac47dac Mon Sep 17 00:00:00 2001 From: Austin Horstman Date: Sun, 12 Oct 2025 19:19:12 -0500 Subject: [PATCH] delta: create new module Pull out of git module and deprecate old usage. Signed-off-by: Austin Horstman --- modules/programs/delta.nix | 125 +++++++++++++++++++ modules/programs/git.nix | 52 +------- tests/modules/programs/git/git-expected.conf | 15 --- tests/modules/programs/git/git.nix | 12 -- 4 files changed, 126 insertions(+), 78 deletions(-) create mode 100644 modules/programs/delta.nix diff --git a/modules/programs/delta.nix b/modules/programs/delta.nix new file mode 100644 index 000000000..b453807a7 --- /dev/null +++ b/modules/programs/delta.nix @@ -0,0 +1,125 @@ +{ + config, + options, + lib, + pkgs, + ... +}: +let + cfg = config.programs.delta; + + inherit (lib) + mkOption + types + ; +in +{ + meta.maintainers = with lib.maintainers; [ khaneliman ]; + + imports = [ + (lib.mkRenamedOptionModule [ "programs" "git" "delta" "enable" ] [ "programs" "delta" "enable" ]) + (lib.mkRenamedOptionModule [ "programs" "git" "delta" "package" ] [ "programs" "delta" "package" ]) + (lib.mkRenamedOptionModule [ "programs" "git" "delta" "options" ] [ "programs" "delta" "options" ]) + ]; + + options.programs.delta = { + enable = lib.mkEnableOption "delta, a syntax highlighter for git diffs"; + + package = lib.mkPackageOption pkgs "delta" { }; + + options = mkOption { + type = + with types; + let + primitiveType = oneOf [ + str + bool + int + ]; + sectionType = attrsOf primitiveType; + in + attrsOf (either primitiveType sectionType); + default = { }; + example = { + features = "decorations"; + whitespace-error-style = "22 reverse"; + decorations = { + commit-decoration-style = "bold yellow box ul"; + file-style = "bold yellow ul"; + file-decoration-style = "none"; + }; + }; + description = '' + Options to configure delta. + ''; + }; + + enableGitIntegration = mkOption { + type = types.bool; + default = false; + description = '' + Whether to enable git integration for delta. + + When enabled, delta will be configured as git's pager and diff filter. + ''; + }; + + finalPackage = mkOption { + type = types.package; + readOnly = true; + visible = false; + default = + let + configFile = pkgs.writeText "delta-config" (lib.generators.toGitINI { delta = cfg.options; }); + wrappedDelta = pkgs.symlinkJoin { + name = "delta-wrapped"; + paths = [ cfg.package ]; + nativeBuildInputs = [ pkgs.makeWrapper ]; + postBuild = '' + wrapProgram $out/bin/delta \ + --add-flags "--config ${configFile}" + ''; + }; + in + if !cfg.enableGitIntegration && cfg.options != { } then wrappedDelta else cfg.package; + description = '' + The delta package with configuration wrapper applied. + + When git integration is disabled and options are configured, + this is a wrapped version that passes --config to delta. + Otherwise, it's the unwrapped package. + ''; + }; + }; + + config = + let + oldOption = lib.attrByPath [ "programs" "git" "delta" "enable" ] null options; + oldOptionEnabled = + oldOption != null && oldOption.isDefined && (builtins.length oldOption.files) > 0; + in + lib.mkMerge [ + (lib.mkIf cfg.enable { + home.packages = [ cfg.finalPackage ]; + + programs.delta.enableGitIntegration = lib.mkIf oldOptionEnabled (lib.mkOverride 1490 true); + + warnings = + lib.optional + (cfg.enableGitIntegration && options.programs.delta.enableGitIntegration.highestPrio == 1490) + "`programs.delta.enableGitIntegration` automatic enablement is deprecated. Please explicitly set `programs.delta.enableGitIntegration = true`."; + }) + + (lib.mkIf (cfg.enable && cfg.enableGitIntegration) { + programs.git.iniContent = + let + deltaCommand = lib.getExe cfg.package; + in + { + core.pager = deltaCommand; + interactive.diffFilter = "${deltaCommand} --color-only"; + delta = cfg.options; + }; + }) + ]; +} diff --git a/modules/programs/git.nix b/modules/programs/git.nix index 8a2f2ffd0..7319be04f 100644 --- a/modules/programs/git.nix +++ b/modules/programs/git.nix @@ -348,40 +348,6 @@ in }; }; - delta = { - enable = mkEnableOption "" // { - description = '' - Whether to enable the {command}`delta` syntax highlighter. - See . - ''; - }; - - package = mkPackageOption pkgs "delta" { }; - - options = mkOption { - type = - with types; - let - primitiveType = either str (either bool int); - sectionType = attrsOf primitiveType; - in - attrsOf (either primitiveType sectionType); - default = { }; - example = { - features = "decorations"; - whitespace-error-style = "22 reverse"; - decorations = { - commit-decoration-style = "bold yellow box ul"; - file-style = "bold yellow ul"; - file-decoration-style = "none"; - }; - }; - description = '' - Options to configure delta. - ''; - }; - }; - diff-so-fancy = { enable = mkEnableOption "" // { description = '' @@ -530,7 +496,7 @@ in assertion = let enabled = [ - cfg.delta.enable + (config.programs.delta.enable && config.programs.delta.enableGitIntegration) cfg.diff-so-fancy.enable cfg.difftastic.enable cfg.diff-highlight.enable @@ -853,22 +819,6 @@ in ]) ) - ( - let - deltaPackage = cfg.delta.package; - deltaCommand = "${deltaPackage}/bin/delta"; - in - mkIf cfg.delta.enable { - home.packages = [ deltaPackage ]; - - programs.git.iniContent = { - core.pager = deltaCommand; - interactive.diffFilter = "${deltaCommand} --color-only"; - delta = cfg.delta.options; - }; - } - ) - (mkIf cfg.diff-so-fancy.enable { home.packages = [ pkgs.diff-so-fancy ]; diff --git a/tests/modules/programs/git/git-expected.conf b/tests/modules/programs/git/git-expected.conf index 3d072b404..39849fe52 100644 --- a/tests/modules/programs/git/git-expected.conf +++ b/tests/modules/programs/git/git-expected.conf @@ -6,18 +6,6 @@ [commit] gpgSign = true -[core] - pager = "@delta@/bin/delta" - -[delta] - features = "decorations" - whitespace-error-style = "22 reverse" - -[delta "decorations"] - commit-decoration-style = "bold yellow box ul" - file-decoration-style = "none" - file-style = "bold yellow ul" - [extra] boolean = true integer = 38 @@ -43,9 +31,6 @@ [gpg "openpgp"] program = "path-to-gpg" -[interactive] - diffFilter = "@delta@/bin/delta --color-only" - [tag] gpgSign = true diff --git a/tests/modules/programs/git/git.nix b/tests/modules/programs/git/git.nix index ff6b91a13..de579c462 100644 --- a/tests/modules/programs/git/git.nix +++ b/tests/modules/programs/git/git.nix @@ -69,18 +69,6 @@ in userEmail = "user@example.org"; userName = "John Doe"; lfs.enable = true; - delta = { - enable = true; - options = { - features = "decorations"; - whitespace-error-style = "22 reverse"; - decorations = { - commit-decoration-style = "bold yellow box ul"; - file-style = "bold yellow ul"; - file-decoration-style = "none"; - }; - }; - }; } {