mirror of
https://github.com/zoriya/jj.nvim.git
synced 2026-08-15 23:53:18 +00:00
feat(picker): Add a snacks picker with jj status command
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
local utils = require("jj.utils")
|
||||
|
||||
--- @class jj.picker
|
||||
|
||||
--- @class jj.picker.config
|
||||
--- @field snacks table|boolean The snacks config
|
||||
|
||||
--- @class jj.picker.file
|
||||
--- @field file string The path of the file
|
||||
--- @field change string The type of change in the file
|
||||
--- @field diff_cmd string The command to get the diff of the file
|
||||
|
||||
local M = {
|
||||
--- @type jj.picker.config
|
||||
config = {
|
||||
snacks = {},
|
||||
},
|
||||
}
|
||||
|
||||
--- Initializes the picker
|
||||
--- @param opts jj.picker.config
|
||||
function M.setup(opts)
|
||||
M.config = vim.tbl_deep_extend("force", M.config, opts or {})
|
||||
end
|
||||
|
||||
--- Gets the files in the current jj repository
|
||||
--- @return jj.picker.file[]|nil A list of files with their changes or nil if not in a jj repo
|
||||
local function get_files()
|
||||
local diff_ouptut, ok = utils.execute_command("jj diff --summary --quiet")
|
||||
if not ok then
|
||||
return
|
||||
end
|
||||
|
||||
if type(diff_ouptut) ~= "string" then
|
||||
return utils.notify("Could not get diff output", vim.log.levels.ERROR)
|
||||
end
|
||||
|
||||
local files = {}
|
||||
|
||||
-- Split the output into lines
|
||||
local lines = vim.split(diff_ouptut, "\n", { trimempty = true })
|
||||
|
||||
for _, line in ipairs(lines) do
|
||||
local change, file_path = line:match("^(%a)%s(.+)$")
|
||||
|
||||
table.insert(files, {
|
||||
file = file_path,
|
||||
change = change,
|
||||
diff_cmd = string.format("jj diff %s", file_path),
|
||||
})
|
||||
end
|
||||
|
||||
return files
|
||||
end
|
||||
|
||||
--- Displays in the configurated picker the status of the files
|
||||
function M.status()
|
||||
-- Ensure jj is installed
|
||||
if not utils.ensure_jj() then
|
||||
return
|
||||
end
|
||||
|
||||
local files = get_files()
|
||||
if not files or #files == 0 then
|
||||
return utils.notify("`Picker`: No diffs found", vim.log.levels.INFO)
|
||||
end
|
||||
|
||||
if M.config.snacks then
|
||||
require("jj.picker.snacks").status(M.config, files)
|
||||
else
|
||||
return utils.notify("No `picker` enabled", vim.log.levels.INFO)
|
||||
end
|
||||
end
|
||||
|
||||
return M
|
||||
Reference in New Issue
Block a user