1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-08 11:36:05 +01:00
home-manager/modules/programs/delta.nix
2025-10-27 09:11:41 -05:00

150 lines
4.3 KiB
Nix

{
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.
'';
};
enableJujutsuIntegration = mkOption {
type = types.bool;
default = false;
description = ''
Whether to enable jujutsu integration for delta.
When enabled, delta will be configured as jujutsus's pager, diff filter, and merge tool.
'';
};
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}"
'';
inherit (cfg.package) meta;
};
hasGitConfig = cfg.enableGitIntegration && config.programs.git.enable;
in
if !hasGitConfig && 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;
};
})
(lib.mkIf (cfg.enable && cfg.enableJujutsuIntegration) {
programs.jujutsu.settings = {
merge-tools.delta.diff-expected-exit-codes = [
0
1
];
ui = {
diff-formatter = ":git";
pager = "${lib.getExe cfg.package}";
};
};
})
];
}