From 6047087f35f4db28ac6c0e6e6f1d07e2b4a9aa54 Mon Sep 17 00:00:00 2001 From: Moshe Avni Date: Wed, 18 Jun 2025 14:31:02 +0300 Subject: [PATCH 01/10] feat/fzf-assignable --- lua/octo/gh/queries.lua | 14 ++ lua/octo/pickers/fzf-lua/pickers/users.lua | 266 +++++++++++++-------- 2 files changed, 184 insertions(+), 96 deletions(-) diff --git a/lua/octo/gh/queries.lua b/lua/octo/gh/queries.lua index e96aebcbe..acb9e109a 100644 --- a/lua/octo/gh/queries.lua +++ b/lua/octo/gh/queries.lua @@ -887,6 +887,19 @@ query($owner: String!, $name: String! $endCursor: String) { } } } + organization(login: $owner) { + teams(first: 100, after: $endCursor) { + totalCount + nodes { + id + name + } + pageInfo { + hasNextPage + endCursor + } + } + } } ]] @@ -897,6 +910,7 @@ query($endCursor: String) { ... on User { id login + name } ... on Organization { id diff --git a/lua/octo/pickers/fzf-lua/pickers/users.lua b/lua/octo/pickers/fzf-lua/pickers/users.lua index 89b167d25..e1766ae54 100644 --- a/lua/octo/pickers/fzf-lua/pickers/users.lua +++ b/lua/octo/pickers/fzf-lua/pickers/users.lua @@ -1,118 +1,192 @@ local entry_maker = require "octo.pickers.fzf-lua.entry_maker" +local octo_config = require "octo.config" +local queries = require "octo.gh.queries" local fzf = require "fzf-lua" local gh = require "octo.gh" local graphql = require "octo.gh.graphql" local picker_utils = require "octo.pickers.fzf-lua.pickers.utils" local utils = require "octo.utils" -return function(cb) - local formatted_users = {} +local M = { formatted_users = {} } - local function contents(prompt) - -- skip empty queries - if not prompt or prompt == "" or utils.is_blank(prompt) then - return {} - end - local query = graphql("users_query", prompt) - local output = gh.run { - args = { "api", "graphql", "--paginate", "-f", string.format("query=%s", query) }, - mode = "sync", - } - if output then - local users = {} - local orgs = {} - local responses = utils.get_pages(output) - for _, resp in ipairs(responses) do - for _, user in ipairs(resp.data.search.nodes) do - if not user.teams then - -- regular user - if not vim.tbl_contains(vim.tbl_keys(users), user.login) then - users[user.login] = { - id = user.id, - login = user.login, - } - end - elseif user.teams and user.teams.totalCount > 0 then - -- organization, collect all teams - if not vim.tbl_contains(vim.tbl_keys(orgs), user.login) then - orgs[user.login] = { - id = user.id, - login = user.login, - teams = user.teams.nodes, - } - else - vim.list_extend(orgs[user.login].teams, user.teams.nodes) - end +local delimiter = "\t" + +local fzf_opts = { + ["--delimiter"] = delimiter, + ["--with-nth"] = "2..", +} + +local function format_display(thing) + local str = thing.id .. delimiter .. thing.login + if thing.name and thing.name ~= vim.NIL then + str = string.format("%s (%s)", str, thing.name) + end + return str +end + +local function get_user_requester(prompt) + M.formatted_users = {} -- reset formatted users + -- skip empty queries + if not prompt or prompt == "" or utils.is_blank(prompt) then + return {} + end + local query = graphql("users_query", prompt) + local output = gh.run { + args = { "api", "graphql", "--paginate", "-f", string.format("query=%s", query) }, + mode = "sync", + } + if not output then + return {} + end + local users = {} + local orgs = {} + local responses = utils.get_pages(output) + for _, resp in ipairs(responses) do + for _, user in ipairs(resp.data.search.nodes) do + if not user.teams then + -- regular user + if not vim.tbl_contains(vim.tbl_keys(users), user.login) then + users[user.login] = { + id = user.id, + login = user.login, + } + if user.name then + users[user.login].name = user.name end end + elseif user.teams and user.teams.totalCount > 0 then + -- organization, collect all teams + if not vim.tbl_contains(vim.tbl_keys(orgs), user.login) then + orgs[user.login] = { + id = user.id, + login = user.login, + teams = user.teams.nodes, + } + else + vim.list_extend(orgs[user.login].teams, user.teams.nodes) + end end + end + end - -- TODO highlight orgs? - local function format_display(thing) - return thing.id .. " " .. thing.login - end + local results = {} + -- process orgs with teams + for _, user in pairs(users) do + user.ordinal = format_display(user) + M.formatted_users[user.ordinal] = user + table.insert(results, user.ordinal) + end + for _, org in pairs(orgs) do + org.login = string.format("%s (%d)", org.login, #org.teams) + org.ordinal = format_display(org) + M.formatted_users[org.ordinal] = org + table.insert(results, org.ordinal) + end + return results +end - local results = {} - -- process orgs with teams - for _, user in pairs(users) do - user.ordinal = format_display(user) - formatted_users[user.ordinal] = user - table.insert(results, user.ordinal) - end - for _, org in pairs(orgs) do - org.login = string.format("%s (%d)", org.login, #org.teams) - org.ordinal = format_display(org) - formatted_users[org.ordinal] = org - table.insert(results, org.ordinal) - end - return results - else - return {} - end +local function get_users(query_name, node_name) + local repo = utils.get_remote_name() + local owner, name = utils.split_repo(repo) + local output = gh.api.graphql { + query = queries[query_name], + f = { owner = owner, name = name }, + paginate = true, + jq = ".data.repository." .. node_name .. ".nodes", + opts = { mode = "sync" }, + } + if utils.is_blank(output) then + return {} end - fzf.fzf_live( - contents, - vim.tbl_deep_extend("force", picker_utils.dropdown_opts, { - fzf_opts = { - ["--delimiter"] = "' '", - ["--with-nth"] = "2..", - }, - actions = { - ["default"] = { - function(user_selected) - local user_entry = formatted_users[user_selected[1]] - if not user_entry.teams then - -- user - cb(user_entry.id) - else - local formatted_teams = {} - local team_titles = {} + local results = {} + local flattened = utils.get_flatten_pages(output) + for _, user in ipairs(flattened) do + user.ordinal = format_display(user) + table.insert(results, user.ordinal) + end + return results +end + +local function get_assignable_users() + return get_users("assignable_users", "assignableUsers") +end + +local function get_mentionable_users() + return get_users("mentionable_users", "mentionableUsers") +end + +-- return M - for _, team in ipairs(user_entry.teams) do - local team_entry = entry_maker.gen_from_team(team) +return function(cb) + local cfg = octo_config.values + if cfg.users == "search" then + return fzf.fzf_live( + get_user_requester, + vim.tbl_deep_extend("force", picker_utils.dropdown_opts, { + fzf_opts = fzf_opts, + actions = { + ["default"] = { + function(user_selected) + local user_entry = M.formatted_users[user_selected[1]] + if not user_entry.teams then + -- user + cb(user_entry.id) + else + local formatted_teams = {} + local team_titles = {} + + for _, team in ipairs(user_entry.teams) do + local team_entry = entry_maker.gen_from_team(team) - if team_entry ~= nil then - formatted_teams[team_entry.ordinal] = team_entry - table.insert(team_titles, team_entry.ordinal) + if team_entry ~= nil then + formatted_teams[team_entry.ordinal] = team_entry + table.insert(team_titles, team_entry.ordinal) + end end - end - fzf.fzf_exec( - team_titles, - vim.tbl_deep_extend("force", picker_utils.dropdown_opts, { - actions = { - ["default"] = function(team_selected) - local team_entry = formatted_teams[team_selected[1]] - cb(team_entry.team.id) - end, - }, - }) - ) - end + fzf.fzf_exec( + team_titles, + vim.tbl_deep_extend("force", picker_utils.dropdown_opts, { + actions = { + ["default"] = function(team_selected) + local team_entry = formatted_teams[team_selected[1]] + cb(team_entry.team.id) + end, + }, + }) + ) + end + end, + }, + }, + }) + ) + else + local users = {} + if cfg.users == "assignable" then + users = get_assignable_users() + elseif cfg.users == "mentionable" then + users = get_mentionable_users() + else + utils.error("Invalid user selection mode: " .. cfg.users) + return + end + if #users == 0 then + utils.error(string.format("No %s users found.", cfg.users)) + return + end + fzf.fzf_exec( + users, + vim.tbl_deep_extend("force", picker_utils.dropdown_opts, { + fzf_opts = fzf_opts, + actions = { + ["default"] = function(user_selected) + local user_id = vim.split(user_selected[1], delimiter)[1] + cb(user_id) end, }, - }, - }) - ) + }) + ) + end end From e9098d2ebcdb534ddd865638d42ae51bc195837b Mon Sep 17 00:00:00 2001 From: Moshe Avni Date: Wed, 18 Jun 2025 14:31:35 +0300 Subject: [PATCH 02/10] =?UTF-8?q?=F0=9F=A5=A8=20work=20in=20progress=20Wed?= =?UTF-8?q?=20Jun=2018=2014:31:35=202025?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/octo/gh/queries.lua | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/lua/octo/gh/queries.lua b/lua/octo/gh/queries.lua index acb9e109a..87b8600ac 100644 --- a/lua/octo/gh/queries.lua +++ b/lua/octo/gh/queries.lua @@ -887,19 +887,6 @@ query($owner: String!, $name: String! $endCursor: String) { } } } - organization(login: $owner) { - teams(first: 100, after: $endCursor) { - totalCount - nodes { - id - name - } - pageInfo { - hasNextPage - endCursor - } - } - } } ]] From 5718e3161d53324f444ee229d65cbfd8d05d3136 Mon Sep 17 00:00:00 2001 From: Moshe Avni Date: Wed, 18 Jun 2025 14:54:33 +0300 Subject: [PATCH 03/10] =?UTF-8?q?=F0=9F=99=89=20work=20in=20progress=20Wed?= =?UTF-8?q?=20Jun=2018=2014:54:33=202025?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/octo/pickers/fzf-lua/pickers/users.lua | 100 ++++++++------------- lua/octo/pickers/telescope/provider.lua | 2 +- 2 files changed, 40 insertions(+), 62 deletions(-) diff --git a/lua/octo/pickers/fzf-lua/pickers/users.lua b/lua/octo/pickers/fzf-lua/pickers/users.lua index e1766ae54..aeba32e89 100644 --- a/lua/octo/pickers/fzf-lua/pickers/users.lua +++ b/lua/octo/pickers/fzf-lua/pickers/users.lua @@ -1,4 +1,3 @@ -local entry_maker = require "octo.pickers.fzf-lua.entry_maker" local octo_config = require "octo.config" local queries = require "octo.gh.queries" local fzf = require "fzf-lua" @@ -7,8 +6,6 @@ local graphql = require "octo.gh.graphql" local picker_utils = require "octo.pickers.fzf-lua.pickers.utils" local utils = require "octo.utils" -local M = { formatted_users = {} } - local delimiter = "\t" local fzf_opts = { @@ -25,7 +22,6 @@ local function format_display(thing) end local function get_user_requester(prompt) - M.formatted_users = {} -- reset formatted users -- skip empty queries if not prompt or prompt == "" or utils.is_blank(prompt) then return {} @@ -40,30 +36,40 @@ local function get_user_requester(prompt) end local users = {} local orgs = {} - local responses = utils.get_pages(output) - for _, resp in ipairs(responses) do - for _, user in ipairs(resp.data.search.nodes) do - if not user.teams then - -- regular user - if not vim.tbl_contains(vim.tbl_keys(users), user.login) then - users[user.login] = { - id = user.id, - login = user.login, - } - if user.name then - users[user.login].name = user.name + -- check if the output has }{ and if so, split it and parse each part + local end_idx = output:find "}{" + -- add a newline after }{ if it exists + if end_idx then + output = output:sub(1, end_idx) .. "\n" .. output:sub(end_idx + 1) + end + local jsons = vim.split(output, "\n", { plain = true }) + -- parse each JSON object + for _, json_raw in ipairs(jsons) do + local responses = utils.get_pages(json_raw) + for _, resp in ipairs(responses) do + for _, user in ipairs(resp.data.search.nodes) do + if not user.teams then + -- regular user + if not vim.tbl_contains(vim.tbl_keys(users), user.login) then + users[user.login] = { + id = user.id, + login = user.login, + } + if user.name then + users[user.login].name = user.name + end + end + elseif user.teams and user.teams.totalCount > 0 then + -- organization, collect all teams + if not vim.tbl_contains(vim.tbl_keys(orgs), user.login) then + orgs[user.login] = { + id = user.id, + login = user.login, + teams = user.teams.nodes, + } + else + vim.list_extend(orgs[user.login].teams, user.teams.nodes) end - end - elseif user.teams and user.teams.totalCount > 0 then - -- organization, collect all teams - if not vim.tbl_contains(vim.tbl_keys(orgs), user.login) then - orgs[user.login] = { - id = user.id, - login = user.login, - teams = user.teams.nodes, - } - else - vim.list_extend(orgs[user.login].teams, user.teams.nodes) end end end @@ -73,15 +79,14 @@ local function get_user_requester(prompt) -- process orgs with teams for _, user in pairs(users) do user.ordinal = format_display(user) - M.formatted_users[user.ordinal] = user table.insert(results, user.ordinal) end for _, org in pairs(orgs) do org.login = string.format("%s (%d)", org.login, #org.teams) org.ordinal = format_display(org) - M.formatted_users[org.ordinal] = org table.insert(results, org.ordinal) end + vim.print("results: " .. vim.inspect(results)) return results end @@ -116,7 +121,9 @@ local function get_mentionable_users() return get_users("mentionable_users", "mentionableUsers") end --- return M +local function get_user_id(selection) + return vim.split(selection[1], delimiter)[1] +end return function(cb) local cfg = octo_config.values @@ -128,35 +135,7 @@ return function(cb) actions = { ["default"] = { function(user_selected) - local user_entry = M.formatted_users[user_selected[1]] - if not user_entry.teams then - -- user - cb(user_entry.id) - else - local formatted_teams = {} - local team_titles = {} - - for _, team in ipairs(user_entry.teams) do - local team_entry = entry_maker.gen_from_team(team) - - if team_entry ~= nil then - formatted_teams[team_entry.ordinal] = team_entry - table.insert(team_titles, team_entry.ordinal) - end - end - - fzf.fzf_exec( - team_titles, - vim.tbl_deep_extend("force", picker_utils.dropdown_opts, { - actions = { - ["default"] = function(team_selected) - local team_entry = formatted_teams[team_selected[1]] - cb(team_entry.team.id) - end, - }, - }) - ) - end + cb(get_user_id(user_selected)) end, }, }, @@ -182,8 +161,7 @@ return function(cb) fzf_opts = fzf_opts, actions = { ["default"] = function(user_selected) - local user_id = vim.split(user_selected[1], delimiter)[1] - cb(user_id) + cb(get_user_id(user_selected)) end, }, }) diff --git a/lua/octo/pickers/telescope/provider.lua b/lua/octo/pickers/telescope/provider.lua index 68754790f..3d4fdd99c 100644 --- a/lua/octo/pickers/telescope/provider.lua +++ b/lua/octo/pickers/telescope/provider.lua @@ -1047,7 +1047,7 @@ local function get_user_requester() args = { "api", "graphql", "--paginate", "-f", string.format("query=%s", query) }, mode = "sync", } - if output then + if not output then return {} end From c4747300b1c6d3e80bc653fd55055be538399321 Mon Sep 17 00:00:00 2001 From: Moshe Avni Date: Wed, 18 Jun 2025 15:00:43 +0300 Subject: [PATCH 04/10] =?UTF-8?q?=F0=9F=98=88=20work=20in=20progress=20Wed?= =?UTF-8?q?=20Jun=2018=2015:00:43=202025?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/octo/pickers/fzf-lua/pickers/users.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lua/octo/pickers/fzf-lua/pickers/users.lua b/lua/octo/pickers/fzf-lua/pickers/users.lua index aeba32e89..2974c6b8f 100644 --- a/lua/octo/pickers/fzf-lua/pickers/users.lua +++ b/lua/octo/pickers/fzf-lua/pickers/users.lua @@ -74,6 +74,7 @@ local function get_user_requester(prompt) end end end + vim.print("orgs: " .. vim.inspect(orgs)) local results = {} -- process orgs with teams @@ -86,7 +87,6 @@ local function get_user_requester(prompt) org.ordinal = format_display(org) table.insert(results, org.ordinal) end - vim.print("results: " .. vim.inspect(results)) return results end From 52431d795be15f9be47c957f4e5983eded9e2ceb Mon Sep 17 00:00:00 2001 From: Moshe Avni Date: Wed, 18 Jun 2025 15:42:44 +0300 Subject: [PATCH 05/10] =?UTF-8?q?=E2=98=98=EF=B8=8F=20work=20in=20progress?= =?UTF-8?q?=20Wed=20Jun=2018=2015:42:44=202025?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/octo/pickers/fzf-lua/pickers/users.lua | 65 ++++++++++++++++------ 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/lua/octo/pickers/fzf-lua/pickers/users.lua b/lua/octo/pickers/fzf-lua/pickers/users.lua index 2974c6b8f..c4696464d 100644 --- a/lua/octo/pickers/fzf-lua/pickers/users.lua +++ b/lua/octo/pickers/fzf-lua/pickers/users.lua @@ -1,3 +1,4 @@ +local entry_maker = require "octo.pickers.fzf-lua.entry_maker" local octo_config = require "octo.config" local queries = require "octo.gh.queries" local fzf = require "fzf-lua" @@ -6,15 +7,17 @@ local graphql = require "octo.gh.graphql" local picker_utils = require "octo.pickers.fzf-lua.pickers.utils" local utils = require "octo.utils" +local M = { orgs = {} } + local delimiter = "\t" local fzf_opts = { ["--delimiter"] = delimiter, - ["--with-nth"] = "2..", + ["--with-nth"] = "3..", } -local function format_display(thing) - local str = thing.id .. delimiter .. thing.login +local function format_display(thing, type) + local str = thing.id .. delimiter .. type .. delimiter .. thing.login if thing.name and thing.name ~= vim.NIL then str = string.format("%s (%s)", str, thing.name) end @@ -35,7 +38,6 @@ local function get_user_requester(prompt) return {} end local users = {} - local orgs = {} -- check if the output has }{ and if so, split it and parse each part local end_idx = output:find "}{" -- add a newline after }{ if it exists @@ -60,31 +62,30 @@ local function get_user_requester(prompt) end end elseif user.teams and user.teams.totalCount > 0 then - -- organization, collect all teams - if not vim.tbl_contains(vim.tbl_keys(orgs), user.login) then - orgs[user.login] = { + -- organization, collect orgs + if not vim.tbl_contains(vim.tbl_keys(M.orgs), user.login) then + M.orgs[user.id] = { id = user.id, login = user.login, teams = user.teams.nodes, } else - vim.list_extend(orgs[user.login].teams, user.teams.nodes) + vim.list_extend(M.orgs[user.login].teams, user.teams.nodes) end end end end end - vim.print("orgs: " .. vim.inspect(orgs)) local results = {} -- process orgs with teams for _, user in pairs(users) do - user.ordinal = format_display(user) + user.ordinal = format_display(user, "user") table.insert(results, user.ordinal) end - for _, org in pairs(orgs) do + for _, org in pairs(M.orgs) do org.login = string.format("%s (%d)", org.login, #org.teams) - org.ordinal = format_display(org) + org.ordinal = format_display(org, "org") table.insert(results, org.ordinal) end return results @@ -107,7 +108,7 @@ local function get_users(query_name, node_name) local results = {} local flattened = utils.get_flatten_pages(output) for _, user in ipairs(flattened) do - user.ordinal = format_display(user) + user.ordinal = format_display(user, "user") table.insert(results, user.ordinal) end return results @@ -121,8 +122,9 @@ local function get_mentionable_users() return get_users("mentionable_users", "mentionableUsers") end -local function get_user_id(selection) - return vim.split(selection[1], delimiter)[1] +local function get_user_id_type(selection) + local spl = vim.split(selection[1], delimiter) + return spl[1], spl[2] end return function(cb) @@ -135,7 +137,35 @@ return function(cb) actions = { ["default"] = { function(user_selected) - cb(get_user_id(user_selected)) + local user_id, user_type = get_user_id_type(user_selected) + if user_type == "user" then + cb(user_id) + else + -- handle org + local formatted_teams = {} + local team_titles = {} + + for _, team in ipairs(M.orgs[user_id].teams) do + local team_entry = entry_maker.gen_from_team(team) + + if team_entry ~= nil then + formatted_teams[team_entry.ordinal] = team_entry + table.insert(team_titles, team_entry.ordinal) + end + end + + fzf.fzf_exec( + team_titles, + vim.tbl_deep_extend("force", picker_utils.dropdown_opts, { + actions = { + ["default"] = function(team_selected) + local team_entry = formatted_teams[team_selected[1]] + cb(team_entry.team.id) + end, + }, + }) + ) + end end, }, }, @@ -161,7 +191,8 @@ return function(cb) fzf_opts = fzf_opts, actions = { ["default"] = function(user_selected) - cb(get_user_id(user_selected)) + local user_id, _ = get_user_id_type(user_selected) + cb(user_id) end, }, }) From a8dbac0e17ca32a15ed7c0cb9e73dd6c576d8415 Mon Sep 17 00:00:00 2001 From: Moshe Avni Date: Wed, 18 Jun 2025 15:55:37 +0300 Subject: [PATCH 06/10] =?UTF-8?q?=F0=9F=A5=A8=20work=20in=20progress=20Wed?= =?UTF-8?q?=20Jun=2018=2015:55:37=202025?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/octo/pickers/fzf-lua/pickers/users.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lua/octo/pickers/fzf-lua/pickers/users.lua b/lua/octo/pickers/fzf-lua/pickers/users.lua index c4696464d..0da79db91 100644 --- a/lua/octo/pickers/fzf-lua/pickers/users.lua +++ b/lua/octo/pickers/fzf-lua/pickers/users.lua @@ -160,7 +160,10 @@ return function(cb) actions = { ["default"] = function(team_selected) local team_entry = formatted_teams[team_selected[1]] - cb(team_entry.team.id) + if false then + cb(team_entry.team.id) + end + utils.error "Not implemented yet" end, }, }) From 127acb05aa30e6b26aa9e935a956ed8c6c7939a5 Mon Sep 17 00:00:00 2001 From: Moshe Avni Date: Wed, 18 Jun 2025 16:13:14 +0300 Subject: [PATCH 07/10] =?UTF-8?q?=E2=9C=A8=20work=20in=20progress=20Wed=20?= =?UTF-8?q?Jun=2018=2016:13:14=202025?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/octo/pickers/fzf-lua/pickers/users.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lua/octo/pickers/fzf-lua/pickers/users.lua b/lua/octo/pickers/fzf-lua/pickers/users.lua index 0da79db91..aa560cfbf 100644 --- a/lua/octo/pickers/fzf-lua/pickers/users.lua +++ b/lua/octo/pickers/fzf-lua/pickers/users.lua @@ -17,7 +17,12 @@ local fzf_opts = { } local function format_display(thing, type) - local str = thing.id .. delimiter .. type .. delimiter .. thing.login + local str = thing.id .. delimiter .. type .. delimiter + if type == "org" then + str = str .. require("fzf-lua").utils.ansi_codes.magenta(thing.login) + else + str = str .. thing.login + end if thing.name and thing.name ~= vim.NIL then str = string.format("%s (%s)", str, thing.name) end From 1ef2c221d4ecba489801c300f350c8f09fefec79 Mon Sep 17 00:00:00 2001 From: Moshe Avni Date: Wed, 18 Jun 2025 16:15:31 +0300 Subject: [PATCH 08/10] =?UTF-8?q?=F0=9F=99=89=20work=20in=20progress=20Wed?= =?UTF-8?q?=20Jun=2018=2016:15:31=202025?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/octo/pickers/fzf-lua/pickers/users.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lua/octo/pickers/fzf-lua/pickers/users.lua b/lua/octo/pickers/fzf-lua/pickers/users.lua index aa560cfbf..a9df39dcb 100644 --- a/lua/octo/pickers/fzf-lua/pickers/users.lua +++ b/lua/octo/pickers/fzf-lua/pickers/users.lua @@ -7,7 +7,7 @@ local graphql = require "octo.gh.graphql" local picker_utils = require "octo.pickers.fzf-lua.pickers.utils" local utils = require "octo.utils" -local M = { orgs = {} } +local orgs = {} local delimiter = "\t" @@ -68,14 +68,14 @@ local function get_user_requester(prompt) end elseif user.teams and user.teams.totalCount > 0 then -- organization, collect orgs - if not vim.tbl_contains(vim.tbl_keys(M.orgs), user.login) then - M.orgs[user.id] = { + if not vim.tbl_contains(vim.tbl_keys(orgs), user.login) then + orgs[user.id] = { id = user.id, login = user.login, teams = user.teams.nodes, } else - vim.list_extend(M.orgs[user.login].teams, user.teams.nodes) + vim.list_extend(orgs[user.login].teams, user.teams.nodes) end end end @@ -88,7 +88,7 @@ local function get_user_requester(prompt) user.ordinal = format_display(user, "user") table.insert(results, user.ordinal) end - for _, org in pairs(M.orgs) do + for _, org in pairs(orgs) do org.login = string.format("%s (%d)", org.login, #org.teams) org.ordinal = format_display(org, "org") table.insert(results, org.ordinal) @@ -150,7 +150,7 @@ return function(cb) local formatted_teams = {} local team_titles = {} - for _, team in ipairs(M.orgs[user_id].teams) do + for _, team in ipairs(orgs[user_id].teams) do local team_entry = entry_maker.gen_from_team(team) if team_entry ~= nil then From 4880c16ae387df2318fcd650c905c3623ae94f64 Mon Sep 17 00:00:00 2001 From: Moshe Avni Date: Wed, 18 Jun 2025 16:27:28 +0300 Subject: [PATCH 09/10] =?UTF-8?q?=F0=9F=91=91=20work=20in=20progress=20Wed?= =?UTF-8?q?=20Jun=2018=2016:27:28=202025?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lua/octo/pickers/fzf-lua/pickers/users.lua | 29 +++++++--------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/lua/octo/pickers/fzf-lua/pickers/users.lua b/lua/octo/pickers/fzf-lua/pickers/users.lua index a9df39dcb..4c5469d0a 100644 --- a/lua/octo/pickers/fzf-lua/pickers/users.lua +++ b/lua/octo/pickers/fzf-lua/pickers/users.lua @@ -1,4 +1,3 @@ -local entry_maker = require "octo.pickers.fzf-lua.entry_maker" local octo_config = require "octo.config" local queries = require "octo.gh.queries" local fzf = require "fzf-lua" @@ -16,22 +15,21 @@ local fzf_opts = { ["--with-nth"] = "3..", } -local function format_display(thing, type) - local str = thing.id .. delimiter .. type .. delimiter - if type == "org" then - str = str .. require("fzf-lua").utils.ansi_codes.magenta(thing.login) - else - str = str .. thing.login - end +local function format_display(thing, entity_type) + local str = thing.id .. delimiter .. entity_type .. delimiter + local display_login = entity_type == "org" and require("fzf-lua").utils.ansi_codes.magenta(thing.login) or thing.login + str = str .. display_login + if thing.name and thing.name ~= vim.NIL then str = string.format("%s (%s)", str, thing.name) end + return str end local function get_user_requester(prompt) -- skip empty queries - if not prompt or prompt == "" or utils.is_blank(prompt) then + if utils.is_blank(prompt) then return {} end local query = graphql("users_query", prompt) @@ -43,7 +41,6 @@ local function get_user_requester(prompt) return {} end local users = {} - -- check if the output has }{ and if so, split it and parse each part local end_idx = output:find "}{" -- add a newline after }{ if it exists if end_idx then @@ -119,14 +116,6 @@ local function get_users(query_name, node_name) return results end -local function get_assignable_users() - return get_users("assignable_users", "assignableUsers") -end - -local function get_mentionable_users() - return get_users("mentionable_users", "mentionableUsers") -end - local function get_user_id_type(selection) local spl = vim.split(selection[1], delimiter) return spl[1], spl[2] @@ -182,9 +171,9 @@ return function(cb) else local users = {} if cfg.users == "assignable" then - users = get_assignable_users() + users = get_users("assignable_users", "assignableUsers") elseif cfg.users == "mentionable" then - users = get_mentionable_users() + users = get_users("mentionable_users", "mentionableUsers") else utils.error("Invalid user selection mode: " .. cfg.users) return From 3efbffc0c48f0edafaf95d6b2da1db8c8dfb70a8 Mon Sep 17 00:00:00 2001 From: Moshe Avni Date: Wed, 18 Jun 2025 16:30:01 +0300 Subject: [PATCH 10/10] done --- lua/octo/pickers/fzf-lua/pickers/users.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/lua/octo/pickers/fzf-lua/pickers/users.lua b/lua/octo/pickers/fzf-lua/pickers/users.lua index 4c5469d0a..107882a9a 100644 --- a/lua/octo/pickers/fzf-lua/pickers/users.lua +++ b/lua/octo/pickers/fzf-lua/pickers/users.lua @@ -1,3 +1,4 @@ +local entry_maker = require "octo.pickers.fzf-lua.entry_maker" local octo_config = require "octo.config" local queries = require "octo.gh.queries" local fzf = require "fzf-lua"