diff --git a/modules/misc/news.nix b/modules/misc/news.nix index d09176e54fb2..fbbcfc1c1292 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -1919,6 +1919,17 @@ in { Cavalier is a GUI wrapper around the Cava audio visualizer. ''; } + + { + time = "2024-12-14T20:35:07+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 d7f1393335c0..09f0bc4ec5dd 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -106,6 +106,7 @@ let ./programs/gh-dash.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 000000000000..ebe0072f128b --- /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 = [ lib.maintainers.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 f7a1b283fbeb..c4c456cf0a9d 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -82,6 +82,7 @@ in import nmtSrc { ./modules/programs/git ./modules/programs/git-cliff ./modules/programs/git-credential-oauth + ./modules/programs/git-worktree-switcher ./modules/programs/gpg ./modules/programs/gradle ./modules/programs/granted 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 000000000000..0e0fb55e2256 --- /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 000000000000..d5a34f1c07c3 --- /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 000000000000..b6b29c2ae8f4 --- /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 000000000000..5e06727635b1 --- /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)"' + ''; +}