Files
gitlab.nvim/lua/gitlab/init.lua
Harrison (Harry) Cramer 08463c0b84 Develop (#4)
Adds `.gitlab.nvim` configuration file option.
2023-04-22 14:19:12 -04:00

114 lines
3.4 KiB
Lua

local Job = require("plenary.job")
local state = require("gitlab.state")
local notify = require("notify")
local discussions = require("gitlab.discussions")
local summary = require("gitlab.summary")
local keymaps = require("gitlab.keymaps")
local comment = require("gitlab.comment")
local approve = require("gitlab.approve")
local revoke = require("gitlab.revoke")
local u = require("gitlab.utils")
-- Root Module Scope
local M = {}
M.summary = summary.summary
M.approve = approve.approve
M.revoke = revoke.revoke
M.create_comment = comment.create_comment
M.list_discussions = discussions.list_discussions
M.edit_comment = comment.edit_comment
M.delete_comment = comment.delete_comment
M.reply = discussions.reply
-- Builds the Go binary, initializes the plugin, fetches MR info
local projectData = {}
M.build = function(args)
if args == nil then args = {} end
local command = string.format("cd %s && make", state.BIN_PATH)
local installCode = os.execute(command .. "> /dev/null")
if installCode ~= 0 then
notify("Could not install gitlab.nvim!", "error")
return
else
M.setup(args, true)
end
end
M.setup = function(args, build_only)
local file_path = M.current_file_path()
local parent_dir = vim.fn.fnamemodify(file_path, ":h:h:h")
state.BIN_PATH = parent_dir
state.BIN = parent_dir .. "/bin"
if args == nil then args = {} end
if args.dev == true then
M.build(args)
end
local binExists = io.open(state.BIN, "r")
if not binExists or args.dev == true then
local command = string.format("cd %s && make", state.BIN_PATH)
local installCode = os.execute(command .. "> /dev/null")
if installCode ~= 0 then
require("notify")("Could not install gitlab.nvim! Do you have Go installed?", "error")
return
end
end
local binary_exists = vim.loop.fs_stat(state.BIN)
if binary_exists == nil then
return -- Ensure build function completes before initializing plugin
end
if build_only then return end
-- Override project_id in setup call if configuration file is present
local config_file_path = vim.fn.getcwd() .. "/.gitlab.nvim"
local config_file_content = read_file(config_file_path)
if config_file_content ~= nil then
args.project_id = config_file_content
end
if args.project_id == nil then
args.project_id = u.read_file(state.BIN_PATH .. "/.gitlab/project_id")
error("No project ID provided!")
end
state.PROJECT_ID = args.project_id
if args.base_branch ~= nil then
state.BASE_BRANCH = args.base_branch
end
if u.is_gitlab_repo() then
Job:new({
command = state.BIN,
args = { "info", state.PROJECT_ID },
on_stdout = function(_, line)
table.insert(projectData, line)
end,
on_stderr = u.print_error,
on_exit = function()
if projectData[1] ~= nil then
local parsed_ok, data = pcall(vim.json.decode, projectData[1])
if parsed_ok ~= true then
notify("Failed calling setup. Could not get project data.", "error")
else
state.INFO = data
end
end
end,
}):start()
end
keymaps.set_keymap_keys(args.keymaps)
end
M.current_file_path = function()
local path = debug.getinfo(1, 'S').source:sub(2)
return vim.fn.fnamemodify(path, ':p')
end
return M