diff --git a/cmd/main.go b/cmd/main.go index ae718bf..404ba91 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -11,16 +11,22 @@ import ( ) func main() { - branchName, err := getCurrentBranch() - errCheck(err) + + if err != nil { + log.Fatalf("Failure: Failed to get current branch: %v", err) + } + if branchName == "main" || branchName == "master" { log.Fatalf("Cannot run on %s branch", branchName) } /* Initialize Gitlab client */ var c Client - errCheck(c.Init(branchName)) + + if err := c.Init(branchName); err != nil { + log.Fatalf("Failure: Failed to iniialize client: %v", err) + } m := http.NewServeMux() m.Handle("/approve", withGitlabContext(http.HandlerFunc(ApproveHandler), c)) @@ -45,10 +51,6 @@ func main() { <-done } -type ResponseError struct { - message string -} - func withGitlabContext(next http.HandlerFunc, c Client) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := context.WithValue(context.Background(), "client", c) @@ -56,13 +58,6 @@ func withGitlabContext(next http.HandlerFunc, c Client) http.Handler { }) } -func errCheck(err error) { - if err != nil { - log.Fatalf("Failure: %s", err) - os.Exit(1) - } -} - /* Gets the current branch */ func getCurrentBranch() (res string, e error) { gitCmd := exec.Command("git", "rev-parse", "--abbrev-ref", "HEAD") @@ -73,5 +68,4 @@ func getCurrentBranch() (res string, e error) { } return strings.TrimSpace(string(output)), nil - } diff --git a/lua/gitlab/init.lua b/lua/gitlab/init.lua index 8df2233..9542828 100644 --- a/lua/gitlab/init.lua +++ b/lua/gitlab/init.lua @@ -1,103 +1,88 @@ -local curl = require("plenary.curl") -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 job = require("gitlab.job") -local u = require("gitlab.utils") +local curl = require("plenary.curl") +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 job = require("gitlab.job") +local u = require("gitlab.utils") -- Root Module Scope -local M = {} -M.summary = summary.summary -M.approve = job.approve -M.revoke = job.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 +local M = {} +M.summary = summary.summary +M.approve = job.approve +M.revoke = job.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 -M.build = function(args) - if args == nil then args = {} end +-- Builds the Go binary +local function build_binary() 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) + return false end + return true 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") + +-- Setups up the binary (if not built), starts the Go server, and calls the /info endpoint, +-- which sets the Gitlab project's information in gitlab.nvim's state module +M.setup = function(args) + local file_path = u.current_file_path() + local parent_dir = vim.fn.fnamemodify(file_path, ":h: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 + build_binary() end - if build_only then return end - local config_file_path = vim.fn.getcwd() .. "/.gitlab.nvim" local config_file_content = u.read_file(config_file_path) if config_file_content == nil then return end - args.project_id = config_file_content - - if args.project_id == nil then - args.project_id = u.read_file(state.BIN_PATH .. "/.gitlab/project_id") + state.PROJECT_ID = config_file_content + if state.PROJECT_ID == nil then error("No project ID provided!") end - state.PROJECT_ID = args.project_id + if type(tonumber(state.PROJECT_ID)) ~= 'number' then + error("The .gitlab.nvim project file may only contain a project number") + end if args.base_branch ~= nil then state.BASE_BRANCH = args.base_branch end - local error_message = "Failed to set up gitlab.nvim, could not get project information." if u.is_gitlab_repo() then state.PORT = args.port or 21036 vim.fn.jobstart(state.BIN .. " " .. state.PROJECT_ID .. " " .. state.PORT, { on_stdout = function(job_id) if job_id <= 0 then - notify(error_message, "error") + notify("Could not start gitlab.nvim binary", "error") return else local response_ok, response = pcall(curl.get, "localhost:" .. state.PORT .. "/info", { timeout = 750 }) if response == nil or not response_ok then - notify(error_message, "error") + notify("The gitlab.nvim server did not respond", "error") return end local body = response.body local parsed_ok, data = pcall(vim.json.decode, body) if parsed_ok ~= true then - notify(error_message, "error") + notify("The gitlab.nvim server returned an invalid response to the /info endpoint", "error") return end state.INFO = data @@ -109,9 +94,4 @@ M.setup = function(args, build_only) end end -M.current_file_path = function() - local path = debug.getinfo(1, 'S').source:sub(2) - return vim.fn.fnamemodify(path, ':p') -end - return M diff --git a/lua/gitlab/utils/init.lua b/lua/gitlab/utils/init.lua index fd053b6..2536c3f 100644 --- a/lua/gitlab/utils/init.lua +++ b/lua/gitlab/utils/init.lua @@ -239,6 +239,12 @@ local split_diff_view_filename = function(filename) return hash, path end +local current_file_path = function() + local path = debug.getinfo(1, 'S').source:sub(2) + return vim.fn.fnamemodify(path, ':p') +end + + M.get_relative_file_path = get_relative_file_path M.get_current_line_number = get_current_line_number M.get_buffer_text = get_buffer_text @@ -259,5 +265,6 @@ M.exit = exit M.read_file = read_file M.split_diff_view_filename = split_diff_view_filename M.branch_exists = branch_exists +M.current_file_path = current_file_path M.P = P return M