diff --git a/plugins/default.nix b/plugins/default.nix index a89dcde3..91fe2b64 100644 --- a/plugins/default.nix +++ b/plugins/default.nix @@ -52,6 +52,7 @@ ./git/gitsigns ./git/lazygit.nix ./git/neogit + ./git/octo.nix ./languages/clangd-extensions.nix ./languages/debugprint.nix diff --git a/plugins/git/octo.nix b/plugins/git/octo.nix new file mode 100644 index 00000000..500c75e7 --- /dev/null +++ b/plugins/git/octo.nix @@ -0,0 +1,179 @@ +{ + lib, + helpers, + config, + pkgs, + ... +}: +with lib; +helpers.neovim-plugin.mkNeovimPlugin config { + name = "octo"; + originalName = "octo.nvim"; + defaultPackage = pkgs.vimPlugins.octo-nvim; + + maintainers = [ helpers.maintainers.svl ]; + + extraPackages = [ pkgs.gh ]; + + settingsOptions = { + use_local_fs = helpers.defaultNullOpts.mkBool false '' + Use local files on right side of reviews. + ''; + + enable_builtin = helpers.defaultNullOpts.mkBool false '' + Shows a list of builtin actions when no action is provided. + ''; + + default_remote = + helpers.defaultNullOpts.mkListOf types.str + [ + "upstream" + "origin" + ] + '' + Order to try remotes + ''; + + ssh_aliases = helpers.defaultNullOpts.mkAttrsOf types.str { } '' + SSH aliases. + ''; + + picker_config = { + use_emojis = helpers.defaultNullOpts.mkBool false '' + Use emojis in picker. Only used by "fzf-lua" picker for now. + ''; + + mappings = + let + mkMappingOption = lhs: desc: { + lhs = helpers.defaultNullOpts.mkStr lhs '' + Key to map. + ''; + + desc = helpers.defaultNullOpts.mkStr desc '' + Description of the mapping. + ''; + }; + in + { + open_in_browser = mkMappingOption "" '' + Open issue in browser. + ''; + + copy_url = mkMappingOption "" '' + Copy url to system clipboard. + ''; + + checkout_pr = mkMappingOption "" '' + Checkout pull request. + ''; + + merge_pr = mkMappingOption "" '' + Merge pull request. + ''; + }; + }; + + reaction_viewer_hint_icon = helpers.defaultNullOpts.mkStr "" '' + Marker for user reactions. + ''; + + user_icon = helpers.defaultNullOpts.mkStr " " '' + User Icon. + ''; + + timeline_marker = helpers.defaultNullOpts.mkStr "" '' + Timeline marker. + ''; + + timeline_indent = helpers.defaultNullOpts.mkStr "2" '' + Timeline indentation. + ''; + + right_bubble_delimiter = helpers.defaultNullOpts.mkStr "" '' + Bubble delimiter. + ''; + + left_bubble_delimiter = helpers.defaultNullOpts.mkStr "" '' + Bubble delimiter. + ''; + + github_hostname = helpers.defaultNullOpts.mkStr "" '' + Github Enterprise host. + ''; + + snippet_context_lines = helpers.defaultNullOpts.mkInt 4 '' + Number of lines around commented lines. + ''; + + gh_env = helpers.defaultNullOpts.mkAttributeSet { } '' + Extra environment variables to pass on to GitHub CLI, can be a table or function returning a table. + ''; + + timeout = helpers.defaultNullOpts.mkInt 5000 '' + Timeout for requests between the remote server. + ''; + + ui = { + use_sign_column = helpers.defaultNullOpts.mkBool true '' + Show "modified" marks on the sign column. + ''; + }; + + picker = + helpers.defaultNullOpts.mkEnumFirstDefault + [ + "telescope" + "fzf-lua" + ] + '' + Picker to use. + ''; + + issues = { + order_by = { + field = + helpers.defaultNullOpts.mkEnumFirstDefault + [ + "CREATED_AT" + "COMMENTS" + "UPDATED_AT" + ] + '' + See GitHub's [`IssueOrderField`](https://docs.github.com/en/graphql/reference/enums#issueorderfield) documentation. + ''; + direction = + helpers.defaultNullOpts.mkEnumFirstDefault + [ + "DESC" + "ASC" + ] + '' + See GitHub's [`OrderDirection`](https://docs.github.com/en/graphql/reference/enums#orderdirection) documentation. + ''; + }; + }; + }; + + settingsExample = { + ssh_aliases = { + "github.com-work" = "github.com"; + }; + + # options not defined + mappings_disable_default = true; + mappings = { + issue.react_heart = "rh"; + file_panel.select_prev_entry = "[q"; + }; + }; + + extraConfig = + cfg: + mkMerge [ + (mkIf (cfg.settings.picker == null || cfg.settings.picker == "telescope") { + plugins.telescope.enable = mkDefault true; + }) + (mkIf (cfg.settings.picker == "fzf-lua") { plugins.fzf-lua.enable = mkDefault true; }) + ]; +} diff --git a/tests/test-sources/plugins/git/octo.nix b/tests/test-sources/plugins/git/octo.nix new file mode 100644 index 00000000..467121f2 --- /dev/null +++ b/tests/test-sources/plugins/git/octo.nix @@ -0,0 +1,75 @@ +{ + empty = { + plugins.octo.enable = true; + }; + + example = { + plugins.octo = { + enable = true; + + settings = { + ssh_aliases = { + "github.com-work" = "github.com"; + }; + mappings_disable_default = true; + mappings = { + issue.react_heart = "rh"; + file_panel.select_prev_entry = "[q"; + }; + }; + }; + }; + + withFzfLuaPicker = { + plugins.octo = { + enable = true; + settings.picker = "fzf-lua"; + }; + }; + + defaults = { + plugins.octo = { + enable = true; + + settings = { + use_local_fs = false; + enable_builtin = false; + reaction_viewer_hint_icon = ""; + user_icon = " "; + timeline_marker = ""; + timeline_indent = "2"; + right_bubble_delimiter = ""; + left_bubble_delimiter = ""; + github_hostname = ""; + snippet_context_lines = 4; + timeout = 5000; + ui.use_sign_column = true; + picker = "telescope"; + + default_remote = [ + "upstream" + "origin" + ]; + + gh_env = { }; + ssh_aliases = { }; + + picker_config = { + use_emojis = false; + + mappings = { + open_in_browser.lhs = ""; + copy_url.lhs = ""; + checkout_pr.lhs = ""; + merge_pr.lhs = ""; + }; + }; + + issues.order_by = { + field = "CREATED_AT"; + direction = "DESC"; + }; + }; + }; + }; +}