diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7910ad07a..b922114a0 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -56,6 +56,9 @@ /modules/programs/firefox.nix @rycee +/modules/programs/gh.nix @Gerschtli +/tests/modules/programs/gh @Gerschtli + /modules/programs/git.nix @rycee /modules/programs/gnome-terminal.nix @rycee diff --git a/modules/misc/news.nix b/modules/misc/news.nix index 685480863..3e5d8d529 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -1713,6 +1713,13 @@ in A new module is available: 'services.gammastep'. ''; } + + { + time = "2020-10-22T21:30:42+00:00"; + message = '' + A new module is available: 'programs.gh'. + ''; + } ]; }; } diff --git a/modules/modules.nix b/modules/modules.nix index 33e51b8cc..26e6d14b2 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -67,6 +67,7 @@ let (loadModule ./programs/fish.nix { }) (loadModule ./programs/fzf.nix { }) (loadModule ./programs/getmail.nix { condition = hostPlatform.isLinux; }) + (loadModule ./programs/gh.nix { }) (loadModule ./programs/git.nix { }) (loadModule ./programs/gnome-terminal.nix { }) (loadModule ./programs/go.nix { }) diff --git a/modules/programs/gh.nix b/modules/programs/gh.nix new file mode 100644 index 000000000..41d6aa1de --- /dev/null +++ b/modules/programs/gh.nix @@ -0,0 +1,53 @@ +{ config, lib, pkgs, ... }: + +with lib; + +let + + cfg = config.programs.gh; + +in { + meta.maintainers = [ maintainers.gerschtli ]; + + options.programs.gh = { + enable = mkEnableOption "GitHub CLI tool"; + + aliases = mkOption { + type = with types; attrsOf str; + default = { }; + example = literalExample '' + { + co = "pr checkout"; + pv = "pr view"; + } + ''; + description = '' + Aliases that allow you to create nicknames for gh commands. + ''; + }; + + editor = mkOption { + type = types.str; + default = ""; + description = '' + The editor that gh should run when creating issues, pull requests, etc. + If blank, will refer to environment. + ''; + }; + + gitProtocol = mkOption { + type = types.enum [ "https" "ssh" ]; + default = "https"; + description = '' + The protocol to use when performing Git operations. + ''; + }; + }; + + config = mkIf cfg.enable { + home.packages = [ pkgs.gitAndTools.gh ]; + + xdg.configFile."gh/config.yml".text = + builtins.toJSON { inherit (cfg) aliases editor gitProtocol; }; + }; +} diff --git a/tests/default.nix b/tests/default.nix index 4a68939ec..6ece9dfdb 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -48,6 +48,7 @@ import nmt { ./modules/programs/direnv ./modules/programs/feh ./modules/programs/fish + ./modules/programs/gh ./modules/programs/git ./modules/programs/gpg ./modules/programs/i3status diff --git a/tests/modules/programs/gh/config-file.nix b/tests/modules/programs/gh/config-file.nix new file mode 100644 index 000000000..0c0186942 --- /dev/null +++ b/tests/modules/programs/gh/config-file.nix @@ -0,0 +1,27 @@ +{ config, lib, pkgs, ... }: + +{ + config = { + programs.gh = { + enable = true; + aliases = { co = "pr checkout"; }; + editor = "vim"; + }; + + nixpkgs.overlays = [ + (self: super: { + gitAndTools = super.gitAndTools // { + gh = pkgs.writeScriptBin "dummy-gh" ""; + }; + }) + ]; + + nmt.script = '' + assertFileExists home-files/.config/gh/config.yml + assertFileContent home-files/.config/gh/config.yml ${ + builtins.toFile "config-file.yml" '' + {"aliases":{"co":"pr checkout"},"editor":"vim","gitProtocol":"https"}'' + } + ''; + }; +} diff --git a/tests/modules/programs/gh/default.nix b/tests/modules/programs/gh/default.nix new file mode 100644 index 000000000..680e8b275 --- /dev/null +++ b/tests/modules/programs/gh/default.nix @@ -0,0 +1 @@ +{ gh-config-file = ./config-file.nix; }