diff --git a/lua/gitea/commands.lua b/lua/gitea/commands.lua index 5fdc444..44195ab 100644 --- a/lua/gitea/commands.lua +++ b/lua/gitea/commands.lua @@ -7,9 +7,9 @@ local M = {} --------------------------------------------------------------------------- +---------------------------------------------------------------------------- -- A simple completion function for the :Gitea command --------------------------------------------------------------------------- +---------------------------------------------------------------------------- function M._gitea_cmd_complete(arg_lead, cmd_line, cursor_pos) local tokens = vim.split(cmd_line, "%s+") @@ -47,7 +47,6 @@ function M._gitea_cmd_complete(arg_lead, cmd_line, cursor_pos) end -- If "pr" was selected, next subcommands can be list, create - -- (removed "open" and "merge" as subcommands) if main_sub == "pr" then if #tokens == 3 then local candidates = { "list", "create" } @@ -106,7 +105,8 @@ function M.setup_commands(core) elseif main == "pr" then local sub = args[2] or "" if sub == "list" then - vim.cmd([[echo "TODO: :Gitea pr list"]]) + -- :Gitea pr list + telescope_mod.list_pulls_in_telescope() elseif sub == "create" then vim.cmd([[echo "TODO: :Gitea pr create"]]) else @@ -126,4 +126,4 @@ function M.setup_commands(core) }) end -return M +return M \ No newline at end of file diff --git a/lua/gitea/issues.lua b/lua/gitea/issues.lua index 4dda644..948056a 100644 --- a/lua/gitea/issues.lua +++ b/lua/gitea/issues.lua @@ -133,7 +133,7 @@ local function list_issues(owner, repo, on_done) if not owner or not repo then return end - local ep = string.format("/api/v1/repos/%s/%s/issues", owner, repo) + local ep = string.format("/api/v1/repos/%s/%s/issues?type=issues", owner, repo) core.request("GET", ep, nil, function(data, err) if err then vim.schedule(function() diff --git a/lua/gitea/pulls.lua b/lua/gitea/pulls.lua index bb9f7a1..cda6364 100644 --- a/lua/gitea/pulls.lua +++ b/lua/gitea/pulls.lua @@ -3,7 +3,7 @@ -- -- Provides functions specifically for Gitea pull requests: -- list, create, merge, comment, etc. --- We add a key binding to merge the PR in the PR buffer. +-- Modified so the "list_pulls" call only returns open PRs. ---------------------------------------------------------------------------- local M = {} @@ -12,7 +12,7 @@ local Job = require('plenary.job') local lyaml = require("lyaml") ---------------------------------------------------------------------------- --- fallback for owner/repo +-- fallback_owner_repo ---------------------------------------------------------------------------- local function fallback_owner_repo(owner, repo) if (not owner or owner == "") or (not repo or repo == "") then @@ -30,12 +30,13 @@ end ---------------------------------------------------------------------------- -- M.list_pulls +-- Use "?state=open" so it only shows open PRs ---------------------------------------------------------------------------- function M.list_pulls(owner, repo, on_done) owner, repo = fallback_owner_repo(owner, repo) if not owner or not repo then return end - local ep = string.format("/api/v1/repos/%s/%s/pulls", owner, repo) + local ep = string.format("/api/v1/repos/%s/%s/pulls?state=open", owner, repo) core.request("GET", ep, nil, function(data, err) if err then vim.schedule(function() @@ -46,7 +47,7 @@ function M.list_pulls(owner, repo, on_done) if on_done then on_done(data) else - print(string.format("Got %d PRs for %s/%s", #data, owner, repo)) + print(string.format("Got %d open PRs for %s/%s", #data, owner, repo)) end end) end @@ -58,7 +59,7 @@ function M.merge_pull(owner, repo, pr_number) owner, repo = fallback_owner_repo(owner, repo) if not owner or not repo or not pr_number then vim.schedule(function() - vim.cmd([[echoerr "Usage: :Gitea pr merge "]]) + vim.cmd([[echoerr "No valid // for merge_pull()"]]) end) return end @@ -107,7 +108,7 @@ function M.create_pull(owner, repo, head, base, title, body, cb) end ---------------------------------------------------------------------------- --- Buffer approach for the PR (like issues) +-- Buffer approach for the PR ---------------------------------------------------------------------------- local function set_pr_buffer_options(buf) vim.api.nvim_buf_set_option(buf, "buftype", "acwrite") -- allow saving @@ -125,7 +126,6 @@ local function attach_pr_autocmds(buf) local lines = vim.api.nvim_buf_get_lines(buf, 0, -1, false) local doc_str = table.concat(lines, "\n") - -- Parse as YAML local ok, docs = pcall(lyaml.load, doc_str) if not ok or type(docs) ~= "table" then vim.schedule(function() @@ -160,9 +160,6 @@ local function attach_pr_autocmds(buf) }) end ----------------------------------------------------------------------------- --- Keymap callback to merge the current PR ----------------------------------------------------------------------------- function M.merge_current_pr() local buf = vim.api.nvim_get_current_buf() local owner = vim.api.nvim_buf_get_var(buf, "gitea_pr_owner") diff --git a/lua/gitea/telescope.lua b/lua/gitea/telescope.lua index bce1681..6770239 100644 --- a/lua/gitea/telescope.lua +++ b/lua/gitea/telescope.lua @@ -1,18 +1,21 @@ ---------------------------------------------------------------------------- -- lua/gitea/telescope.lua -- --- Minimal telescope integration for listing issues +-- Minimal telescope integration for listing issues (and now PRs) ---------------------------------------------------------------------------- local M = {} -local pickers = require("telescope.pickers") -local finders = require("telescope.finders") -local conf = require("telescope.config").values -local actions = require("telescope.actions") +local pickers = require("telescope.pickers") +local finders = require("telescope.finders") +local conf = require("telescope.config").values +local actions = require("telescope.actions") local action_state = require("telescope.actions.state") local issues_mod = require("gitea.issues") +---------------------------------------------------------------------------- +-- Open selected issue +---------------------------------------------------------------------------- local function open_selected_issue(prompt_bufnr) local selection = action_state.get_selected_entry() actions.close(prompt_bufnr) @@ -23,6 +26,9 @@ local function open_selected_issue(prompt_bufnr) issues_mod.open_issue(nil, nil, number) end +---------------------------------------------------------------------------- +-- list_issues_in_telescope +---------------------------------------------------------------------------- function M.list_issues_in_telescope() issues_mod.list_issues(nil, nil, function(data) pickers.new({}, { @@ -47,4 +53,46 @@ function M.list_issues_in_telescope() end) end +---------------------------------------------------------------------------- +-- Open selected PR +---------------------------------------------------------------------------- +local function open_selected_pr(prompt_bufnr) + local selection = action_state.get_selected_entry() + actions.close(prompt_bufnr) + if not selection then return end + + local pr_obj = selection.value + local number = pr_obj.number + local pulls_mod = require("gitea.pulls") + pulls_mod.open_pull_in_buffer(nil, nil, number) +end + +---------------------------------------------------------------------------- +-- list_pulls_in_telescope +---------------------------------------------------------------------------- +function M.list_pulls_in_telescope() + local pulls_mod = require("gitea.pulls") + pulls_mod.list_pulls(nil, nil, function(data) + pickers.new({}, { + prompt_title = "Gitea Pull Requests", + finder = finders.new_table { + results = data, + entry_maker = function(pr) + return { + value = pr, + display = ("#%d: %s"):format(pr.number, pr.title or ""), + ordinal = ("%d %s"):format(pr.number, (pr.title or "")) + } + end + }, + sorter = conf.generic_sorter({}), + attach_mappings = function(prompt_bufnr, map) + map("i", "", open_selected_pr) + map("n", "", open_selected_pr) + return true + end + }):find() + end) +end + return M \ No newline at end of file