From 74309af007b28a82a35f41f0019a13fa4273059d Mon Sep 17 00:00:00 2001 From: Harrison Cramer Date: Sun, 23 Apr 2023 14:27:08 -0400 Subject: [PATCH] Set up comment to allow for comments on unmodified lines --- cmd/comment.go | 67 ++++++++++++++++++++++++++++++--------- lua/gitlab/comment.lua | 2 ++ lua/gitlab/init.lua | 5 +-- lua/gitlab/utils/init.lua | 3 +- 4 files changed, 57 insertions(+), 20 deletions(-) diff --git a/cmd/comment.go b/cmd/comment.go index 29164a4..9b64c3d 100644 --- a/cmd/comment.go +++ b/cmd/comment.go @@ -9,6 +9,7 @@ import ( "net/http" "os" "strconv" + "sync" "time" "github.com/xanzy/go-gitlab" @@ -55,24 +56,60 @@ func (c *Client) Comment() error { time := time.Now() - options := gitlab.CreateMergeRequestDiscussionOptions{ - Body: &comment, - CreatedAt: &time, - Position: &gitlab.NotePosition{ - PositionType: "text", - BaseSHA: diffVersionInfo[0].BaseCommitSHA, - HeadSHA: diffVersionInfo[0].HeadCommitSHA, - StartSHA: diffVersionInfo[0].StartCommitSHA, - NewPath: fileName, - OldPath: fileName, - NewLine: lineNumberInt, - }, + /* This is necessary since we do not know whether the comment is on a line that + has been changed or not. Making all three of these API calls will let us leave + the comment regardless. See the Gitlab documentation: https://docs.gitlab.com/ee/api/discussions.html#create-a-new-thread-in-the-merge-request-diff */ + wg := sync.WaitGroup{} + wg.Add(3) + + resultChannel := make(chan *gitlab.Discussion, 3) + + for i := 0; i < 3; i++ { + ii := i + go func() { + defer wg.Done() + options := gitlab.CreateMergeRequestDiscussionOptions{ + Body: &comment, + CreatedAt: &time, + Position: &gitlab.NotePosition{ + PositionType: "text", + BaseSHA: diffVersionInfo[0].BaseCommitSHA, + HeadSHA: diffVersionInfo[0].HeadCommitSHA, + StartSHA: diffVersionInfo[0].StartCommitSHA, + NewPath: fileName, + OldPath: fileName, + }, + } + + if ii == 0 { + options.Position.NewLine = lineNumberInt + } else if ii == 1 { + options.Position.OldLine = lineNumberInt + } else { + options.Position.NewLine = lineNumberInt + options.Position.OldLine = lineNumberInt + } + + discussion, _, _ := c.git.Discussions.CreateMergeRequestDiscussion(c.projectId, c.mergeId, &options) + resultChannel <- discussion + + }() } - _, _, err = c.git.Discussions.CreateMergeRequestDiscussion(c.projectId, c.mergeId, &options) + go func() { + wg.Wait() + close(resultChannel) + }() - if err != nil { - return fmt.Errorf("Could not leave comment: %w", err) + var createdDiscussion *gitlab.Discussion + for discussion := range resultChannel { + if discussion != nil { + createdDiscussion = discussion + } + } + + if createdDiscussion == nil { + return fmt.Errorf("Could not leave comment") } fmt.Println("Left Comment: " + comment[0:min(len(comment), 25)] + "...") diff --git a/lua/gitlab/comment.lua b/lua/gitlab/comment.lua index 65c56c7..afad2f6 100644 --- a/lua/gitlab/comment.lua +++ b/lua/gitlab/comment.lua @@ -11,6 +11,8 @@ local M = {} local commentPopup = Popup(u.create_popup_state("Comment", "40%", "60%")) local editPopup = Popup(u.create_popup_state("Edit Comment", "80%", "80%")) +M.line_status = nil + M.create_comment = function() if u.base_invalid() then return end commentPopup:mount() diff --git a/lua/gitlab/init.lua b/lua/gitlab/init.lua index 86b951d..f83eca5 100644 --- a/lua/gitlab/init.lua +++ b/lua/gitlab/init.lua @@ -42,9 +42,6 @@ M.setup = function(args, build_only) 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 @@ -65,7 +62,7 @@ M.setup = function(args, build_only) -- 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) + local config_file_content = u.read_file(config_file_path) if config_file_content ~= nil then args.project_id = config_file_content end diff --git a/lua/gitlab/utils/init.lua b/lua/gitlab/utils/init.lua index 94333c3..3bc31e7 100644 --- a/lua/gitlab/utils/init.lua +++ b/lua/gitlab/utils/init.lua @@ -204,7 +204,7 @@ M.merge_tables = function(defaults, overrides) return result end -function read_file(file_path) +local read_file = function(file_path) local file = io.open(file_path, "r") if file == nil then return nil @@ -232,5 +232,6 @@ M.print_success = print_success M.print_error = print_error M.create_popup_state = create_popup_state M.exit = exit +M.read_file = read_file M.P = P return M