diff --git a/modules/misc/news.nix b/modules/misc/news.nix index c34fbcba8..dc605ae4c 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -2034,7 +2034,17 @@ in { - programs.zellij.enableZshIntegration ''; } + + { + time = "2025-02-11T15:25:26+00:00"; + message = '' + A new module is available: 'programs.git-worktree-switcher'. + + git-worktree-switcher allows you to quickly switch git worktrees. + It includes shell completions for Bash, Fish and Zsh. + See https://github.com/mateusauler/git-worktree-switcher for more. + ''; + } ]; }; } - diff --git a/modules/modules.nix b/modules/modules.nix index cdfb90804..5fd4394aa 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -110,6 +110,7 @@ let ./programs/ghostty.nix ./programs/git-cliff.nix ./programs/git-credential-oauth.nix + ./programs/git-worktree-switcher.nix ./programs/git.nix ./programs/gitui.nix ./programs/gnome-shell.nix diff --git a/modules/programs/git-worktree-switcher.nix b/modules/programs/git-worktree-switcher.nix new file mode 100644 index 000000000..e7dcbf2c3 --- /dev/null +++ b/modules/programs/git-worktree-switcher.nix @@ -0,0 +1,52 @@ +{ pkgs, config, lib, ... }: + +let + inherit (lib) mkEnableOption mkOption mkPackageOption optionalString; + + cfg = config.programs.git-worktree-switcher; + + initScript = shell: + if (shell == "fish") then '' + ${lib.getExe pkgs.git-worktree-switcher} init ${shell} | source + '' else '' + eval "$(${lib.getExe pkgs.git-worktree-switcher} init ${shell})" + ''; +in { + meta.maintainers = with lib.maintainers; [ jiriks74 mateusauler ]; + + options.programs.git-worktree-switcher = { + enable = mkEnableOption "git-worktree-switcher"; + package = mkPackageOption pkgs "git-worktree-switcher" { }; + enableBashIntegration = mkOption { + type = lib.types.bool; + default = true; + description = '' + Whether to enable git-worktree-switcher's Bash integration. + ''; + }; + enableFishIntegration = mkOption { + type = lib.types.bool; + default = config.programs.fish.enable; + description = '' + Whether to enable git-worktree-switcher's Fish integration. + ''; + }; + enableZshIntegration = mkOption { + type = lib.types.bool; + default = config.programs.zsh.enable; + description = '' + Whether to enable git-worktree-switcher's Zsh integration. + ''; + }; + }; + + config = lib.mkIf cfg.enable { + home.packages = [ cfg.package ]; + programs.bash.initExtra = + optionalString cfg.enableBashIntegration (initScript "bash"); + programs.fish.interactiveShellInit = + optionalString cfg.enableFishIntegration (initScript "fish"); + programs.zsh.initExtra = + optionalString cfg.enableZshIntegration (initScript "zsh"); + }; +} diff --git a/tests/default.nix b/tests/default.nix index 792c99951..5c487bd8d 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -157,6 +157,7 @@ in import nmtSrc { ./modules/programs/git ./modules/programs/git-cliff ./modules/programs/git-credential-oauth + ./modules/programs/git-worktree-switcher ./modules/programs/go ./modules/programs/gpg ./modules/programs/gradle diff --git a/tests/modules/programs/git-worktree-switcher/bash.nix b/tests/modules/programs/git-worktree-switcher/bash.nix new file mode 100644 index 000000000..0e0fb55e2 --- /dev/null +++ b/tests/modules/programs/git-worktree-switcher/bash.nix @@ -0,0 +1,17 @@ +{ ... }: + +{ + programs = { + bash.enable = true; + git-worktree-switcher.enable = true; + }; + + test.stubs.git-worktree-switcher = { name = "git-worktree-switcher"; }; + + nmt.script = '' + assertFileExists home-files/.bashrc + assertFileContains \ + home-files/.bashrc \ + 'eval "$(@git-worktree-switcher@/bin/git-worktree-switcher init bash)"' + ''; +} diff --git a/tests/modules/programs/git-worktree-switcher/default.nix b/tests/modules/programs/git-worktree-switcher/default.nix new file mode 100644 index 000000000..d5a34f1c0 --- /dev/null +++ b/tests/modules/programs/git-worktree-switcher/default.nix @@ -0,0 +1,5 @@ +{ + git-worktree-switcher-bash = ./bash.nix; + git-worktree-switcher-fish = ./fish.nix; + git-worktree-switcher-zsh = ./zsh.nix; +} diff --git a/tests/modules/programs/git-worktree-switcher/fish.nix b/tests/modules/programs/git-worktree-switcher/fish.nix new file mode 100644 index 000000000..b6b29c2ae --- /dev/null +++ b/tests/modules/programs/git-worktree-switcher/fish.nix @@ -0,0 +1,17 @@ +{ ... }: + +{ + programs = { + fish.enable = true; + git-worktree-switcher.enable = true; + }; + + test.stubs.git-worktree-switcher = { name = "git-worktree-switcher"; }; + + nmt.script = '' + assertFileExists home-files/.config/fish/config.fish + assertFileContains \ + home-files/.config/fish/config.fish \ + '@git-worktree-switcher@/bin/git-worktree-switcher init fish | source' + ''; +} diff --git a/tests/modules/programs/git-worktree-switcher/zsh.nix b/tests/modules/programs/git-worktree-switcher/zsh.nix new file mode 100644 index 000000000..5e0672763 --- /dev/null +++ b/tests/modules/programs/git-worktree-switcher/zsh.nix @@ -0,0 +1,17 @@ +{ ... }: + +{ + programs = { + zsh.enable = true; + git-worktree-switcher.enable = true; + }; + + test.stubs.git-worktree-switcher = { name = "git-worktree-switcher"; }; + + nmt.script = '' + assertFileExists home-files/.zshrc + assertFileContains \ + home-files/.zshrc \ + 'eval "$(@git-worktree-switcher@/bin/git-worktree-switcher init zsh)"' + ''; +}