diff --git a/modules/misc/news/2026/02/2026-02-23_17-02-43.nix b/modules/misc/news/2026/02/2026-02-23_17-02-43.nix new file mode 100644 index 00000000..e7246a99 --- /dev/null +++ b/modules/misc/news/2026/02/2026-02-23_17-02-43.nix @@ -0,0 +1,13 @@ +{ config, ... }: +{ + time = "2026-02-23T17:02:43+00:00"; + condition = config.programs.mergiraf.enable; + message = '' + The `programs.mergiraf` module's Git and Jujutsu integration are now gated + behind `programs.mergiraf.enableGitIntegration` (respectively + `enableJujutsuIntegration`). + + They are enabled by default for `stateVersion < 26.04`, and otherwise need + to be explicitly enabled. + ''; +} diff --git a/modules/programs/mergiraf.nix b/modules/programs/mergiraf.nix index 5ade2536..9b17b6d5 100644 --- a/modules/programs/mergiraf.nix +++ b/modules/programs/mergiraf.nix @@ -2,6 +2,7 @@ pkgs, config, lib, + options, ... }: let @@ -12,7 +13,6 @@ let maintainers ; cfg = config.programs.mergiraf; - mergiraf = "${cfg.package}/bin/mergiraf"; in { meta.maintainers = [ maintainers.bobvanderlinden ]; @@ -20,28 +20,105 @@ in options = { programs.mergiraf = { enable = mkEnableOption "mergiraf"; + package = mkPackageOption pkgs "mergiraf" { }; + + enableGitIntegration = lib.mkOption { + type = lib.types.bool; + default = lib.versionOlder config.home.stateVersion "26.05"; + defaultText = ''lib.versionOlder config.home.stateVersion "26.05"''; + description = '' + Whether to enable git integration for mergiraf. + + When enabled, mergiraf will be configured as git's merge driver. + ''; + }; + + enableJujutsuIntegration = lib.mkOption { + type = lib.types.bool; + default = lib.versionOlder config.home.stateVersion "26.05"; + defaultText = ''lib.versionOlder config.home.stateVersion "26.05"''; + description = '' + Whether to enable jujutsu integration for mergiraf. + + When enabled, mergiraf will be configured as jujutsus's merge tool. + ''; + }; }; }; - config = mkIf cfg.enable { - home.packages = [ cfg.package ]; + config = lib.mkMerge [ + { + warnings = + lib.optionals + ( + cfg.enable + && !lib.versionAtLeast config.home.stateVersion "26.05" + && options.programs.mergiraf.enableGitIntegration.highestPrio >= 1500 + ) + [ + '' + The default value of `programs.mergiraf.enableGitIntegration` will change in future versions. + You are currently using the legacy default (true) because `home.stateVersion` is less than "26.05". + To silence this warning set: + programs.mergiraf.enableGitIntegration = true; + '' + ] + ++ + lib.optionals + ( + cfg.enable + && !lib.versionAtLeast config.home.stateVersion "26.05" + && options.programs.mergiraf.enableJujutsuIntegration.highestPrio >= 1500 + ) + [ + '' + The default value of `programs.mergiraf.enableJujutsuIntegration` will change in future versions. + You are currently using the legacy default (true) because `home.stateVersion` is less than "26.05". + To silence this warning set: + programs.mergiraf.enableJujutsuIntegration = true; + '' + ]; + } - programs = { - git = { - attributes = [ "* merge=mergiraf" ]; - settings = { - merge = { - mergiraf = { - name = "mergiraf"; - driver = "${mergiraf} merge --git %O %A %B -s %S -x %X -y %Y -p %P -l %L"; + (mkIf cfg.enable { + home.packages = [ cfg.package ]; + }) + + (mkIf (cfg.enable && cfg.enableGitIntegration) { + programs = { + git = { + attributes = [ "* merge=mergiraf" ]; + settings = { + merge = { + mergiraf = { + name = "mergiraf"; + driver = "${lib.getExe cfg.package} merge --git %O %A %B -s %S -x %X -y %Y -p %P -l %L"; + }; + conflictStyle = "diff3"; }; - conflictStyle = "diff3"; }; }; }; + }) - jujutsu.settings.ui.merge-editor = "mergiraf"; - }; - }; + (mkIf (cfg.enable && cfg.enableJujutsuIntegration) { + programs = { + jujutsu = { + settings = { + ui = { + # Rely on the built-in configuration + merge-editor = "mergiraf"; + }; + # Explicitly set the path to the package + merge-tools = { + mergiraf = { + program = lib.getExe cfg.package; + }; + }; + }; + }; + }; + }) + ]; } diff --git a/tests/modules/programs/mergiraf/default.nix b/tests/modules/programs/mergiraf/default.nix index fce09934..b818d9ca 100644 --- a/tests/modules/programs/mergiraf/default.nix +++ b/tests/modules/programs/mergiraf/default.nix @@ -1,4 +1,5 @@ { - mergiraf-basic-configuration = ./basic-configuration.nix; + mergiraf-git-integration = ./git-integration.nix; mergiraf-jujutsu-integration = ./jujutsu-integration.nix; + mergiraf-legacy-warnings = ./legacy-warnings.nix; } diff --git a/tests/modules/programs/mergiraf/basic-configuration.nix b/tests/modules/programs/mergiraf/git-integration.nix similarity index 59% rename from tests/modules/programs/mergiraf/basic-configuration.nix rename to tests/modules/programs/mergiraf/git-integration.nix index c8833284..34875357 100644 --- a/tests/modules/programs/mergiraf/basic-configuration.nix +++ b/tests/modules/programs/mergiraf/git-integration.nix @@ -1,6 +1,11 @@ { programs.git.enable = true; - programs.mergiraf.enable = true; + programs.mergiraf = { + enable = true; + enableGitIntegration = true; + # Do not warn about default value + enableJujutsuIntegration = false; + }; nmt.script = '' assertFileContent "home-files/.config/git/config" ${./mergiraf-git.conf} diff --git a/tests/modules/programs/mergiraf/jujutsu-integration.nix b/tests/modules/programs/mergiraf/jujutsu-integration.nix index bb729947..bee3b672 100644 --- a/tests/modules/programs/mergiraf/jujutsu-integration.nix +++ b/tests/modules/programs/mergiraf/jujutsu-integration.nix @@ -20,12 +20,20 @@ in enable = true; package = config.lib.test.mkStubPackage { }; }; - programs.mergiraf.enable = true; + programs.mergiraf = { + enable = true; + enableJujutsuIntegration = true; + # Do not warn about default value + enableGitIntegration = false; + }; nmt.script = '' assertFileExists 'home-files/${configDir}/jj/config.toml' assertFileContent 'home-files/${configDir}/jj/config.toml' \ ${builtins.toFile "expected.toml" '' + [merge-tools.mergiraf] + program = "@mergiraf@/bin/mergiraf" + [ui] merge-editor = "mergiraf" ''} diff --git a/tests/modules/programs/mergiraf/legacy-warnings.nix b/tests/modules/programs/mergiraf/legacy-warnings.nix new file mode 100644 index 00000000..53885121 --- /dev/null +++ b/tests/modules/programs/mergiraf/legacy-warnings.nix @@ -0,0 +1,20 @@ +{ + programs.mergiraf = { + enable = true; + }; + + test.asserts.warnings.expected = [ + '' + The default value of `programs.mergiraf.enableGitIntegration` will change in future versions. + You are currently using the legacy default (true) because `home.stateVersion` is less than "26.05". + To silence this warning set: + programs.mergiraf.enableGitIntegration = true; + '' + '' + The default value of `programs.mergiraf.enableJujutsuIntegration` will change in future versions. + You are currently using the legacy default (true) because `home.stateVersion` is less than "26.05". + To silence this warning set: + programs.mergiraf.enableJujutsuIntegration = true; + '' + ]; +}