feat!: MAJOR release. Update go to 1.25, and add migration path (#520)

BREAKING CHANGE: This bumps Go and external packages to later versions.
This commit is contained in:
Harrison Cramer
2026-01-30 21:54:00 -05:00
parent 7dba805f6a
commit 3d2828a950
61 changed files with 358 additions and 266 deletions

View File

@@ -21,16 +21,17 @@ jobs:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: actions/setup-go@v4 - uses: actions/setup-go@v4
with: with:
go-version: '1.23.1' go-version: '1.25.1'
cache: false cache: false
- name: golangci-lint - name: golangci-lint
uses: golangci/golangci-lint-action@v3 uses: golangci/golangci-lint-action@v7
with: with:
version: v1.61.0 version: v2.7.2
only-new-issues: true only-new-issues: true
skip-cache: true skip-cache: true
- name: Install staticcheck - name: Install staticcheck
run: go install honnef.co/go/tools/cmd/staticcheck@2024.1.1 run: go install honnef.co/go/tools/cmd/staticcheck@2025.1.1
- name: Run staticcheck - name: Run staticcheck
run: staticcheck ./... run: staticcheck ./...
go_test: go_test:
@@ -42,8 +43,9 @@ jobs:
- name: Set up Go - name: Set up Go
uses: actions/setup-go@v4 uses: actions/setup-go@v4
with: with:
go-version: '1.19' go-version: '1.25.1'
- name: Build - name: Build
run: make compile run: make compile
- name: Test - name: Test
run: make test run: make test

View File

@@ -39,5 +39,5 @@ jobs:
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ needs.tag.outputs.tag }} tag: ${{ needs.tag.outputs.tag }}
body: ${{ github.event.head_commit.message }} generateReleaseNotes: true
skipIfReleaseExists: true # Do not release if NONE tag is used above skipIfReleaseExists: true # Do not release if NONE tag is used above

2
.gitignore vendored
View File

@@ -8,3 +8,5 @@ tests/plugins
!tests/plugins/.placeholder !tests/plugins/.placeholder
luacov.* luacov.*
tags tags
.claude
cmd/cmd

View File

@@ -1,3 +1,4 @@
version: "2"
run: run:
tests: true tests: true
timeout: 30s timeout: 30s

View File

@@ -18,7 +18,7 @@ To view these help docs and to get more detailed help information, please run `:
## Requirements ## Requirements
- <a href="https://go.dev/">Go</a> >= v1.19 - <a href="https://go.dev/">Go</a> >= v1.25.1
## Quick Start ## Quick Start

View File

@@ -4,11 +4,11 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type MergeRequestApprover interface { type MergeRequestApprover interface {
ApproveMergeRequest(pid interface{}, mr int, opt *gitlab.ApproveMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequestApprovals, *gitlab.Response, error) ApproveMergeRequest(pid interface{}, mr int64, opt *gitlab.ApproveMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequestApprovals, *gitlab.Response, error)
} }
type mergeRequestApproverService struct { type mergeRequestApproverService struct {

View File

@@ -4,14 +4,14 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeApproverClient struct { type fakeApproverClient struct {
testBase testBase
} }
func (f fakeApproverClient) ApproveMergeRequest(pid interface{}, mr int, opt *gitlab.ApproveMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequestApprovals, *gitlab.Response, error) { func (f fakeApproverClient) ApproveMergeRequest(pid interface{}, mr int64, opt *gitlab.ApproveMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequestApprovals, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err

View File

@@ -5,11 +5,11 @@ import (
"errors" "errors"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type AssigneeUpdateRequest struct { type AssigneeUpdateRequest struct {
Ids []int `json:"ids" validate:"required"` Ids []int64 `json:"ids" validate:"required"`
} }
type AssigneeUpdateResponse struct { type AssigneeUpdateResponse struct {

View File

@@ -4,14 +4,14 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeAssigneeClient struct { type fakeAssigneeClient struct {
testBase testBase
} }
func (f fakeAssigneeClient) UpdateMergeRequest(pid interface{}, mergeRequest int, opt *gitlab.UpdateMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) { func (f fakeAssigneeClient) UpdateMergeRequest(pid interface{}, mergeRequest int64, opt *gitlab.UpdateMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@@ -20,7 +20,7 @@ func (f fakeAssigneeClient) UpdateMergeRequest(pid interface{}, mergeRequest int
} }
func TestAssigneeHandler(t *testing.T) { func TestAssigneeHandler(t *testing.T) {
var updatePayload = AssigneeUpdateRequest{Ids: []int{1, 2}} var updatePayload = AssigneeUpdateRequest{Ids: []int64{1, 2}}
t.Run("Updates assignees", func(t *testing.T) { t.Run("Updates assignees", func(t *testing.T) {
request := makeRequest(t, http.MethodPut, "/mr/assignee", updatePayload) request := makeRequest(t, http.MethodPut, "/mr/assignee", updatePayload)

View File

@@ -8,7 +8,7 @@ import (
"net/http" "net/http"
"os" "os"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type FileReader interface { type FileReader interface {
@@ -48,7 +48,7 @@ func (ar attachmentReader) ReadFile(path string) (io.Reader, error) {
} }
type FileUploader interface { type FileUploader interface {
UploadFile(pid interface{}, content io.Reader, filename string, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectFile, *gitlab.Response, error) UploadProjectMarkdown(pid any, content io.Reader, filename string, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectMarkdownUploadedFile, *gitlab.Response, error)
} }
type attachmentService struct { type attachmentService struct {
@@ -67,7 +67,7 @@ func (a attachmentService) ServeHTTP(w http.ResponseWriter, r *http.Request) {
return return
} }
projectFile, res, err := a.client.UploadFile(a.projectInfo.ProjectId, file, payload.FileName) projectFile, res, err := a.client.UploadProjectMarkdown(a.projectInfo.ProjectId, file, payload.FileName)
if err != nil { if err != nil {
handleError(w, err, fmt.Sprintf("Could not upload %s to Gitlab", payload.FileName), http.StatusInternalServerError) handleError(w, err, fmt.Sprintf("Could not upload %s to Gitlab", payload.FileName), http.StatusInternalServerError)
return return

View File

@@ -6,20 +6,20 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeFileUploaderClient struct { type fakeFileUploaderClient struct {
testBase testBase
} }
func (f fakeFileUploaderClient) UploadFile(pid interface{}, content io.Reader, filename string, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectFile, *gitlab.Response, error) { func (f fakeFileUploaderClient) UploadProjectMarkdown(pid interface{}, content io.Reader, filename string, options ...gitlab.RequestOptionFunc) (*gitlab.ProjectMarkdownUploadedFile, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
return &gitlab.ProjectFile{}, resp, nil return &gitlab.ProjectMarkdownUploadedFile{}, resp, nil
} }
type fakeFileReader struct{} type fakeFileReader struct{}

View File

@@ -10,27 +10,28 @@ import (
"github.com/harrisoncramer/gitlab.nvim/cmd/app/git" "github.com/harrisoncramer/gitlab.nvim/cmd/app/git"
"github.com/hashicorp/go-retryablehttp" "github.com/hashicorp/go-retryablehttp"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type ProjectInfo struct { type ProjectInfo struct {
ProjectId string ProjectId string
MergeId int MergeId int64
} }
/* The Client struct embeds all the methods from Gitlab for the different services */ /* The Client struct embeds all the methods from Gitlab for the different services */
type Client struct { type Client struct {
*gitlab.MergeRequestsService gitlab.MergeRequestsServiceInterface
*gitlab.MergeRequestApprovalsService gitlab.MergeRequestApprovalsServiceInterface
*gitlab.DiscussionsService gitlab.DiscussionsServiceInterface
*gitlab.ProjectsService gitlab.ProjectsServiceInterface
*gitlab.ProjectMembersService gitlab.ProjectMembersServiceInterface
*gitlab.JobsService gitlab.JobsServiceInterface
*gitlab.PipelinesService gitlab.PipelinesServiceInterface
*gitlab.LabelsService gitlab.LabelsServiceInterface
*gitlab.AwardEmojiService gitlab.AwardEmojiServiceInterface
*gitlab.UsersService gitlab.UsersServiceInterface
*gitlab.DraftNotesService gitlab.DraftNotesServiceInterface
gitlab.ProjectMarkdownUploadsServiceInterface
} }
/* NewClient parses and validates the project settings and initializes the Gitlab client. */ /* NewClient parses and validates the project settings and initializes the Gitlab client. */
@@ -87,17 +88,18 @@ func NewClient() (*Client, error) {
} }
return &Client{ return &Client{
MergeRequestsService: client.MergeRequests, client.MergeRequests,
MergeRequestApprovalsService: client.MergeRequestApprovals, client.MergeRequestApprovals,
DiscussionsService: client.Discussions, client.Discussions,
ProjectsService: client.Projects, client.Projects,
ProjectMembersService: client.ProjectMembers, client.ProjectMembers,
JobsService: client.Jobs, client.Jobs,
PipelinesService: client.Pipelines, client.Pipelines,
LabelsService: client.Labels, client.Labels,
AwardEmojiService: client.AwardEmoji, client.AwardEmoji,
UsersService: client.Users, client.Users,
DraftNotesService: client.DraftNotes, client.DraftNotes,
client.ProjectMarkdownUploads,
}, nil }, nil
} }

View File

@@ -4,7 +4,7 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type CommentResponse struct { type CommentResponse struct {
@@ -14,9 +14,9 @@ type CommentResponse struct {
} }
type CommentManager interface { type CommentManager interface {
CreateMergeRequestDiscussion(pid interface{}, mergeRequest int, opt *gitlab.CreateMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) CreateMergeRequestDiscussion(pid interface{}, mergeRequest int64, opt *gitlab.CreateMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error)
UpdateMergeRequestDiscussionNote(pid interface{}, mergeRequest int, discussion string, note int, opt *gitlab.UpdateMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) UpdateMergeRequestDiscussionNote(pid interface{}, mergeRequest int64, discussion string, note int64, opt *gitlab.UpdateMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error)
DeleteMergeRequestDiscussionNote(pid interface{}, mergeRequest int, discussion string, note int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) DeleteMergeRequestDiscussionNote(pid interface{}, mergeRequest int64, discussion string, note int64, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error)
} }
type commentService struct { type commentService struct {
@@ -38,7 +38,7 @@ func (a commentService) ServeHTTP(w http.ResponseWriter, r *http.Request) {
} }
type DeleteCommentRequest struct { type DeleteCommentRequest struct {
NoteId int `json:"note_id" validate:"required"` NoteId int64 `json:"note_id" validate:"required"`
DiscussionId string `json:"discussion_id" validate:"required"` DiscussionId string `json:"discussion_id" validate:"required"`
} }
@@ -124,7 +124,7 @@ func (a commentService) postComment(w http.ResponseWriter, r *http.Request) {
type EditCommentRequest struct { type EditCommentRequest struct {
Comment string `json:"comment" validate:"required"` Comment string `json:"comment" validate:"required"`
NoteId int `json:"note_id" validate:"required"` NoteId int64 `json:"note_id" validate:"required"`
DiscussionId string `json:"discussion_id" validate:"required"` DiscussionId string `json:"discussion_id" validate:"required"`
Resolved bool `json:"resolved"` Resolved bool `json:"resolved"`
} }

View File

@@ -4,14 +4,14 @@ import (
"crypto/sha1" "crypto/sha1"
"fmt" "fmt"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
/* LinePosition represents a position in a line range. Unlike the Gitlab struct, this does not contain LineCode with a sha1 of the filename */ /* LinePosition represents a position in a line range. Unlike the Gitlab struct, this does not contain LineCode with a sha1 of the filename */
type LinePosition struct { type LinePosition struct {
Type string `json:"type"` Type string `json:"type"`
OldLine int `json:"old_line"` OldLine int64 `json:"old_line"`
NewLine int `json:"new_line"` NewLine int64 `json:"new_line"`
} }
/* LineRange represents the range of a note. */ /* LineRange represents the range of a note. */
@@ -24,8 +24,8 @@ type LineRange struct {
type PositionData struct { type PositionData struct {
FileName string `json:"file_name"` FileName string `json:"file_name"`
OldFileName string `json:"old_file_name"` OldFileName string `json:"old_file_name"`
NewLine *int `json:"new_line,omitempty"` NewLine *int64 `json:"new_line,omitempty"`
OldLine *int `json:"old_line,omitempty"` OldLine *int64 `json:"old_line,omitempty"`
HeadCommitSHA string `json:"head_commit_sha"` HeadCommitSHA string `json:"head_commit_sha"`
BaseCommitSHA string `json:"base_commit_sha"` BaseCommitSHA string `json:"base_commit_sha"`
StartCommitSHA string `json:"start_commit_sha"` StartCommitSHA string `json:"start_commit_sha"`

View File

@@ -4,14 +4,14 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeCommentClient struct { type fakeCommentClient struct {
testBase testBase
} }
func (f fakeCommentClient) CreateMergeRequestDiscussion(pid interface{}, mergeRequest int, opt *gitlab.CreateMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) { func (f fakeCommentClient) CreateMergeRequestDiscussion(pid interface{}, mergeRequest int64, opt *gitlab.CreateMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@@ -19,7 +19,7 @@ func (f fakeCommentClient) CreateMergeRequestDiscussion(pid interface{}, mergeRe
return &gitlab.Discussion{Notes: []*gitlab.Note{{}}}, resp, err return &gitlab.Discussion{Notes: []*gitlab.Note{{}}}, resp, err
} }
func (f fakeCommentClient) UpdateMergeRequestDiscussionNote(pid interface{}, mergeRequest int, discussion string, note int, opt *gitlab.UpdateMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) { func (f fakeCommentClient) UpdateMergeRequestDiscussionNote(pid interface{}, mergeRequest int64, discussion string, note int64, opt *gitlab.UpdateMergeRequestDiscussionNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@@ -28,7 +28,7 @@ func (f fakeCommentClient) UpdateMergeRequestDiscussionNote(pid interface{}, mer
return &gitlab.Note{}, resp, err return &gitlab.Note{}, resp, err
} }
func (f fakeCommentClient) DeleteMergeRequestDiscussionNote(pid interface{}, mergeRequest int, discussion string, note int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) { func (f fakeCommentClient) DeleteMergeRequestDiscussionNote(pid interface{}, mergeRequest int64, discussion string, note int64, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, err return nil, err

View File

@@ -11,7 +11,7 @@ type PluginOptions struct {
GitlabRequest bool `json:"gitlab_request"` GitlabRequest bool `json:"gitlab_request"`
GitlabResponse bool `json:"gitlab_response"` GitlabResponse bool `json:"gitlab_response"`
} `json:"debug"` } `json:"debug"`
ChosenMrIID int `json:"chosen_mr_iid"` ChosenMrIID int64 `json:"chosen_mr_iid"`
ConnectionSettings struct { ConnectionSettings struct {
Proxy string `json:"proxy"` Proxy string `json:"proxy"`
Insecure bool `json:"insecure"` Insecure bool `json:"insecure"`
@@ -20,7 +20,12 @@ type PluginOptions struct {
} }
var pluginOptions PluginOptions var pluginOptions PluginOptions
var version string
func SetPluginOptions(p PluginOptions) { func SetPluginOptions(p PluginOptions) {
pluginOptions = p pluginOptions = p
} }
func SetVersion(v string) {
version = v
}

View File

@@ -5,14 +5,14 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type CreateMrRequest struct { type CreateMrRequest struct {
Title string `json:"title" validate:"required"` Title string `json:"title" validate:"required"`
TargetBranch string `json:"target_branch" validate:"required"` TargetBranch string `json:"target_branch" validate:"required"`
Description string `json:"description"` Description string `json:"description"`
TargetProjectID int `json:"forked_project_id,omitempty"` TargetProjectID int64 `json:"forked_project_id,omitempty"`
DeleteBranch bool `json:"delete_branch"` DeleteBranch bool `json:"delete_branch"`
Squash bool `json:"squash"` Squash bool `json:"squash"`
} }

View File

@@ -4,7 +4,7 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeMergeCreatorClient struct { type fakeMergeCreatorClient struct {

View File

@@ -4,12 +4,12 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type DraftNotePublisher interface { type DraftNotePublisher interface {
PublishAllDraftNotes(pid interface{}, mergeRequest int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) PublishAllDraftNotes(pid interface{}, mergeRequest int64, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error)
PublishDraftNote(pid interface{}, mergeRequest int, note int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) PublishDraftNote(pid interface{}, mergeRequest int64, note int64, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error)
} }
type draftNotePublisherService struct { type draftNotePublisherService struct {
@@ -18,7 +18,7 @@ type draftNotePublisherService struct {
} }
type DraftNotePublishRequest struct { type DraftNotePublishRequest struct {
Note int `json:"note,omitempty"` Note int64 `json:"note,omitempty"`
} }
func (a draftNotePublisherService) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (a draftNotePublisherService) ServeHTTP(w http.ResponseWriter, r *http.Request) {

View File

@@ -4,17 +4,17 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeDraftNotePublisher struct { type fakeDraftNotePublisher struct {
testBase testBase
} }
func (f fakeDraftNotePublisher) PublishAllDraftNotes(pid interface{}, mergeRequest int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) { func (f fakeDraftNotePublisher) PublishAllDraftNotes(pid interface{}, mergeRequest int64, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) {
return f.handleGitlabError() return f.handleGitlabError()
} }
func (f fakeDraftNotePublisher) PublishDraftNote(pid interface{}, mergeRequest int, note int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) { func (f fakeDraftNotePublisher) PublishDraftNote(pid interface{}, mergeRequest int64, note int64, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) {
return f.handleGitlabError() return f.handleGitlabError()
} }

View File

@@ -7,7 +7,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
/* The data coming from the client when creating a draft note is the same /* The data coming from the client when creating a draft note is the same
@@ -29,10 +29,10 @@ func (draftNote DraftNoteWithPosition) GetPositionData() PositionData {
} }
type DraftNoteManager interface { type DraftNoteManager interface {
ListDraftNotes(pid interface{}, mergeRequest int, opt *gitlab.ListDraftNotesOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.DraftNote, *gitlab.Response, error) ListDraftNotes(pid interface{}, mergeRequest int64, opt *gitlab.ListDraftNotesOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.DraftNote, *gitlab.Response, error)
CreateDraftNote(pid interface{}, mergeRequest int, opt *gitlab.CreateDraftNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.DraftNote, *gitlab.Response, error) CreateDraftNote(pid interface{}, mergeRequest int64, opt *gitlab.CreateDraftNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.DraftNote, *gitlab.Response, error)
DeleteDraftNote(pid interface{}, mergeRequest int, note int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) DeleteDraftNote(pid interface{}, mergeRequest int64, note int64, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error)
UpdateDraftNote(pid interface{}, mergeRequest int, note int, opt *gitlab.UpdateDraftNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.DraftNote, *gitlab.Response, error) UpdateDraftNote(pid interface{}, mergeRequest int64, note int64, opt *gitlab.UpdateDraftNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.DraftNote, *gitlab.Response, error)
} }
type draftNoteService struct { type draftNoteService struct {
@@ -139,7 +139,7 @@ func (a draftNoteService) postDraftNote(w http.ResponseWriter, r *http.Request)
/* deleteDraftNote deletes a draft note */ /* deleteDraftNote deletes a draft note */
func (a draftNoteService) deleteDraftNote(w http.ResponseWriter, r *http.Request) { func (a draftNoteService) deleteDraftNote(w http.ResponseWriter, r *http.Request) {
suffix := strings.TrimPrefix(r.URL.Path, "/mr/draft_notes/") suffix := strings.TrimPrefix(r.URL.Path, "/mr/draft_notes/")
id, err := strconv.Atoi(suffix) id, err := strconv.ParseInt(suffix, 10, 64)
if err != nil { if err != nil {
handleError(w, err, "Could not parse draft note ID", http.StatusBadRequest) handleError(w, err, "Could not parse draft note ID", http.StatusBadRequest)
return return
@@ -174,7 +174,7 @@ type UpdateDraftNoteRequest struct {
/* updateDraftNote edits the text of a draft comment */ /* updateDraftNote edits the text of a draft comment */
func (a draftNoteService) updateDraftNote(w http.ResponseWriter, r *http.Request) { func (a draftNoteService) updateDraftNote(w http.ResponseWriter, r *http.Request) {
suffix := strings.TrimPrefix(r.URL.Path, "/mr/draft_notes/") suffix := strings.TrimPrefix(r.URL.Path, "/mr/draft_notes/")
id, err := strconv.Atoi(suffix) id, err := strconv.ParseInt(suffix, 10, 64)
if err != nil { if err != nil {
handleError(w, err, "Could not parse draft note ID", http.StatusBadRequest) handleError(w, err, "Could not parse draft note ID", http.StatusBadRequest)
return return

View File

@@ -4,14 +4,14 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeDraftNoteManager struct { type fakeDraftNoteManager struct {
testBase testBase
} }
func (f fakeDraftNoteManager) ListDraftNotes(pid interface{}, mergeRequest int, opt *gitlab.ListDraftNotesOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.DraftNote, *gitlab.Response, error) { func (f fakeDraftNoteManager) ListDraftNotes(pid interface{}, mergeRequest int64, opt *gitlab.ListDraftNotesOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.DraftNote, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@@ -19,7 +19,7 @@ func (f fakeDraftNoteManager) ListDraftNotes(pid interface{}, mergeRequest int,
return []*gitlab.DraftNote{}, resp, err return []*gitlab.DraftNote{}, resp, err
} }
func (f fakeDraftNoteManager) CreateDraftNote(pid interface{}, mergeRequest int, opt *gitlab.CreateDraftNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.DraftNote, *gitlab.Response, error) { func (f fakeDraftNoteManager) CreateDraftNote(pid interface{}, mergeRequest int64, opt *gitlab.CreateDraftNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.DraftNote, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@@ -27,11 +27,11 @@ func (f fakeDraftNoteManager) CreateDraftNote(pid interface{}, mergeRequest int,
return &gitlab.DraftNote{}, resp, err return &gitlab.DraftNote{}, resp, err
} }
func (f fakeDraftNoteManager) DeleteDraftNote(pid interface{}, mergeRequest int, note int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) { func (f fakeDraftNoteManager) DeleteDraftNote(pid interface{}, mergeRequest int64, note int64, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) {
return f.handleGitlabError() return f.handleGitlabError()
} }
func (f fakeDraftNoteManager) UpdateDraftNote(pid interface{}, mergeRequest int, note int, opt *gitlab.UpdateDraftNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.DraftNote, *gitlab.Response, error) { func (f fakeDraftNoteManager) UpdateDraftNote(pid interface{}, mergeRequest int64, note int64, opt *gitlab.UpdateDraftNoteOptions, options ...gitlab.RequestOptionFunc) (*gitlab.DraftNote, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err

View File

@@ -11,7 +11,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type Emoji struct { type Emoji struct {
@@ -30,7 +30,7 @@ type EmojiMap map[string]Emoji
type CreateNoteEmojiPost struct { type CreateNoteEmojiPost struct {
Emoji string `json:"emoji"` Emoji string `json:"emoji"`
NoteId int `json:"note_id"` NoteId int64 `json:"note_id"`
} }
type CreateEmojiResponse struct { type CreateEmojiResponse struct {
@@ -39,8 +39,8 @@ type CreateEmojiResponse struct {
} }
type EmojiManager interface { type EmojiManager interface {
DeleteMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID int, noteID int, awardID int, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error) DeleteMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID int64, noteID int64, awardID int64, options ...gitlab.RequestOptionFunc) (*gitlab.Response, error)
CreateMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID int, noteID int, opt *gitlab.CreateAwardEmojiOptions, options ...gitlab.RequestOptionFunc) (*gitlab.AwardEmoji, *gitlab.Response, error) CreateMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID int64, noteID int64, opt *gitlab.CreateAwardEmojiOptions, options ...gitlab.RequestOptionFunc) (*gitlab.AwardEmoji, *gitlab.Response, error)
} }
type emojiService struct { type emojiService struct {
@@ -69,13 +69,13 @@ func (a emojiService) deleteEmojiFromNote(w http.ResponseWriter, r *http.Request
return return
} }
noteId, err := strconv.Atoi(ids[0]) noteId, err := strconv.ParseInt(ids[0], 10, 64)
if err != nil { if err != nil {
handleError(w, err, "Could not convert note ID to integer", http.StatusBadRequest) handleError(w, err, "Could not convert note ID to integer", http.StatusBadRequest)
return return
} }
awardableId, err := strconv.Atoi(ids[1]) awardableId, err := strconv.ParseInt(ids[1], 10, 64)
if err != nil { if err != nil {
handleError(w, err, "Could not convert awardable ID to integer", http.StatusBadRequest) handleError(w, err, "Could not convert awardable ID to integer", http.StatusBadRequest)
return return

View File

@@ -4,7 +4,7 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type InfoResponse struct { type InfoResponse struct {
@@ -13,7 +13,7 @@ type InfoResponse struct {
} }
type MergeRequestGetter interface { type MergeRequestGetter interface {
GetMergeRequest(pid interface{}, mergeRequest int, opt *gitlab.GetMergeRequestsOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) GetMergeRequest(pid interface{}, mergeRequest int64, opt *gitlab.GetMergeRequestsOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error)
} }
type infoService struct { type infoService struct {

View File

@@ -4,14 +4,14 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeMergeRequestGetter struct { type fakeMergeRequestGetter struct {
testBase testBase
} }
func (f fakeMergeRequestGetter) GetMergeRequest(pid interface{}, mergeRequest int, opt *gitlab.GetMergeRequestsOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) { func (f fakeMergeRequestGetter) GetMergeRequest(pid interface{}, mergeRequest int64, opt *gitlab.GetMergeRequestsOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err

View File

@@ -6,11 +6,11 @@ import (
"io" "io"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type JobTraceRequest struct { type JobTraceRequest struct {
JobId int `json:"job_id" validate:"required"` JobId int64 `json:"job_id" validate:"required"`
} }
type JobTraceResponse struct { type JobTraceResponse struct {
@@ -19,7 +19,7 @@ type JobTraceResponse struct {
} }
type TraceFileGetter interface { type TraceFileGetter interface {
GetTraceFile(pid interface{}, jobID int, options ...gitlab.RequestOptionFunc) (*bytes.Reader, *gitlab.Response, error) GetTraceFile(pid interface{}, jobID int64, options ...gitlab.RequestOptionFunc) (*bytes.Reader, *gitlab.Response, error)
} }
type traceFileService struct { type traceFileService struct {

View File

@@ -7,7 +7,7 @@ import (
"net/http/httptest" "net/http/httptest"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeTraceFileGetter struct { type fakeTraceFileGetter struct {
@@ -26,7 +26,7 @@ func getTraceFileData(t *testing.T, svc http.Handler, request *http.Request) Job
return data return data
} }
func (f fakeTraceFileGetter) GetTraceFile(pid interface{}, jobID int, options ...gitlab.RequestOptionFunc) (*bytes.Reader, *gitlab.Response, error) { func (f fakeTraceFileGetter) GetTraceFile(pid interface{}, jobID int64, options ...gitlab.RequestOptionFunc) (*bytes.Reader, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err

View File

@@ -5,7 +5,7 @@ import (
"io" "io"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type LabelUpdateRequest struct { type LabelUpdateRequest struct {
@@ -28,7 +28,7 @@ type LabelsRequestResponse struct {
} }
type LabelManager interface { type LabelManager interface {
UpdateMergeRequest(interface{}, int, *gitlab.UpdateMergeRequestOptions, ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) UpdateMergeRequest(interface{}, int64, *gitlab.UpdateMergeRequestOptions, ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error)
ListLabels(interface{}, *gitlab.ListLabelsOptions, ...gitlab.RequestOptionFunc) ([]*gitlab.Label, *gitlab.Response, error) ListLabels(interface{}, *gitlab.ListLabelsOptions, ...gitlab.RequestOptionFunc) ([]*gitlab.Label, *gitlab.Response, error)
} }

View File

@@ -8,7 +8,7 @@ import (
"encoding/json" "encoding/json"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
func Contains[T comparable](elems []T, v T) bool { func Contains[T comparable](elems []T, v T) bool {
@@ -36,7 +36,7 @@ type DiscussionsResponse struct {
SuccessResponse SuccessResponse
Discussions []*gitlab.Discussion `json:"discussions"` Discussions []*gitlab.Discussion `json:"discussions"`
UnlinkedDiscussions []*gitlab.Discussion `json:"unlinked_discussions"` UnlinkedDiscussions []*gitlab.Discussion `json:"unlinked_discussions"`
Emojis map[int][]*gitlab.AwardEmoji `json:"emojis"` Emojis map[int64][]*gitlab.AwardEmoji `json:"emojis"`
} }
type SortableDiscussions struct { type SortableDiscussions struct {
@@ -66,8 +66,8 @@ func (d SortableDiscussions) Swap(i, j int) {
} }
type DiscussionsLister interface { type DiscussionsLister interface {
ListMergeRequestDiscussions(pid interface{}, mergeRequest int, opt *gitlab.ListMergeRequestDiscussionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Discussion, *gitlab.Response, error) ListMergeRequestDiscussions(pid interface{}, mergeRequest int64, opt *gitlab.ListMergeRequestDiscussionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Discussion, *gitlab.Response, error)
ListMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID int, noteID int, opt *gitlab.ListAwardEmojiOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.AwardEmoji, *gitlab.Response, error) ListMergeRequestAwardEmojiOnNote(pid any, mergeRequestIID int64, noteID int64, opt *gitlab.ListAwardEmojiOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.AwardEmoji, *gitlab.Response, error)
} }
type discussionsListerService struct { type discussionsListerService struct {
@@ -84,8 +84,10 @@ func (a discussionsListerService) ServeHTTP(w http.ResponseWriter, r *http.Reque
request := r.Context().Value(payload(payload("payload"))).(*DiscussionsRequest) request := r.Context().Value(payload(payload("payload"))).(*DiscussionsRequest)
mergeRequestDiscussionOptions := gitlab.ListMergeRequestDiscussionsOptions{ mergeRequestDiscussionOptions := gitlab.ListMergeRequestDiscussionsOptions{
ListOptions: gitlab.ListOptions{
Page: 1, Page: 1,
PerPage: 250, PerPage: 250,
},
} }
discussions, res, err := a.client.ListMergeRequestDiscussions(a.projectInfo.ProjectId, a.projectInfo.MergeId, &mergeRequestDiscussionOptions) discussions, res, err := a.client.ListMergeRequestDiscussions(a.projectInfo.ProjectId, a.projectInfo.MergeId, &mergeRequestDiscussionOptions)
@@ -121,7 +123,7 @@ func (a discussionsListerService) ServeHTTP(w http.ResponseWriter, r *http.Reque
} }
/* Collect IDs in order to fetch emojis */ /* Collect IDs in order to fetch emojis */
var noteIds []int var noteIds []int64
for _, discussion := range discussions { for _, discussion := range discussions {
for _, note := range discussion.Notes { for _, note := range discussion.Notes {
noteIds = append(noteIds, note.ID) noteIds = append(noteIds, note.ID)
@@ -164,20 +166,20 @@ func (a discussionsListerService) ServeHTTP(w http.ResponseWriter, r *http.Reque
Fetches emojis for a set of notes and comments in parallel and returns a map of note IDs to their emojis. Fetches emojis for a set of notes and comments in parallel and returns a map of note IDs to their emojis.
Gitlab's API does not allow for fetching notes for an entire discussion thread so we have to do it per-note. Gitlab's API does not allow for fetching notes for an entire discussion thread so we have to do it per-note.
*/ */
func (a discussionsListerService) fetchEmojisForNotesAndComments(noteIDs []int) (map[int][]*gitlab.AwardEmoji, error) { func (a discussionsListerService) fetchEmojisForNotesAndComments(noteIDs []int64) (map[int64][]*gitlab.AwardEmoji, error) {
var wg sync.WaitGroup var wg sync.WaitGroup
emojis := make(map[int][]*gitlab.AwardEmoji) emojis := make(map[int64][]*gitlab.AwardEmoji)
mu := &sync.Mutex{} mu := &sync.Mutex{}
errs := make(chan error, len(noteIDs)) errs := make(chan error, len(noteIDs))
emojiChan := make(chan struct { emojiChan := make(chan struct {
noteID int noteID int64
emojis []*gitlab.AwardEmoji emojis []*gitlab.AwardEmoji
}, len(noteIDs)) }, len(noteIDs))
for _, noteID := range noteIDs { for _, noteID := range noteIDs {
wg.Add(1) wg.Add(1)
go func(noteID int) { go func(noteID int64) {
defer wg.Done() defer wg.Done()
emojis, _, err := a.client.ListMergeRequestAwardEmojiOnNote(a.projectInfo.ProjectId, a.projectInfo.MergeId, noteID, &gitlab.ListAwardEmojiOptions{}) emojis, _, err := a.client.ListMergeRequestAwardEmojiOnNote(a.projectInfo.ProjectId, a.projectInfo.MergeId, noteID, &gitlab.ListAwardEmojiOptions{})
if err != nil { if err != nil {
@@ -185,7 +187,7 @@ func (a discussionsListerService) fetchEmojisForNotesAndComments(noteIDs []int)
return return
} }
emojiChan <- struct { emojiChan <- struct {
noteID int noteID int64
emojis []*gitlab.AwardEmoji emojis []*gitlab.AwardEmoji
}{noteID, emojis} }{noteID, emojis}
}(noteID) }(noteID)

View File

@@ -8,7 +8,7 @@ import (
"testing" "testing"
"time" "time"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeDiscussionsLister struct { type fakeDiscussionsLister struct {
@@ -16,7 +16,7 @@ type fakeDiscussionsLister struct {
badEmojiResponse bool badEmojiResponse bool
} }
func (f fakeDiscussionsLister) ListMergeRequestDiscussions(pid interface{}, mergeRequest int, opt *gitlab.ListMergeRequestDiscussionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Discussion, *gitlab.Response, error) { func (f fakeDiscussionsLister) ListMergeRequestDiscussions(pid interface{}, mergeRequest int64, opt *gitlab.ListMergeRequestDiscussionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Discussion, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@@ -30,34 +30,24 @@ func (f fakeDiscussionsLister) ListMergeRequestDiscussions(pid interface{}, merg
*timePointers[i] = timePointers[i-1].Add(time.Second * 100) *timePointers[i] = timePointers[i-1].Add(time.Second * 100)
} }
type Author struct {
ID int `json:"id"`
Username string `json:"username"`
Email string `json:"email"`
Name string `json:"name"`
State string `json:"state"`
AvatarURL string `json:"avatar_url"`
WebURL string `json:"web_url"`
}
testListDiscussionsResponse := []*gitlab.Discussion{ testListDiscussionsResponse := []*gitlab.Discussion{
{Notes: []*gitlab.Note{ {Notes: []*gitlab.Note{
{CreatedAt: timePointers[0], Type: "DiffNote", Author: Author{Username: "hcramer0"}}, {CreatedAt: timePointers[0], Type: "DiffNote", Author: gitlab.NoteAuthor{Username: "hcramer0"}},
{CreatedAt: timePointers[4], Type: "DiffNote", Author: Author{Username: "hcramer1"}}, {CreatedAt: timePointers[4], Type: "DiffNote", Author: gitlab.NoteAuthor{Username: "hcramer1"}},
}}, }},
{Notes: []*gitlab.Note{ {Notes: []*gitlab.Note{
{CreatedAt: timePointers[2], Type: "DiffNote", Author: Author{Username: "hcramer2"}}, {CreatedAt: timePointers[2], Type: "DiffNote", Author: gitlab.NoteAuthor{Username: "hcramer2"}},
{CreatedAt: timePointers[3], Type: "DiffNote", Author: Author{Username: "hcramer3"}}, {CreatedAt: timePointers[3], Type: "DiffNote", Author: gitlab.NoteAuthor{Username: "hcramer3"}},
}}, }},
{Notes: []*gitlab.Note{ {Notes: []*gitlab.Note{
{CreatedAt: timePointers[1], Type: "DiffNote", Author: Author{Username: "hcramer4"}}, {CreatedAt: timePointers[1], Type: "DiffNote", Author: gitlab.NoteAuthor{Username: "hcramer4"}},
{CreatedAt: timePointers[5], Type: "DiffNote", Author: Author{Username: "hcramer5"}}, {CreatedAt: timePointers[5], Type: "DiffNote", Author: gitlab.NoteAuthor{Username: "hcramer5"}},
}}, }},
} }
return testListDiscussionsResponse, resp, err return testListDiscussionsResponse, resp, err
} }
func (f fakeDiscussionsLister) ListMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID int, noteID int, opt *gitlab.ListAwardEmojiOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.AwardEmoji, *gitlab.Response, error) { func (f fakeDiscussionsLister) ListMergeRequestAwardEmojiOnNote(pid interface{}, mergeRequestIID int64, noteID int64, opt *gitlab.ListAwardEmojiOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.AwardEmoji, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err

View File

@@ -4,7 +4,7 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type ProjectMembersResponse struct { type ProjectMembersResponse struct {

View File

@@ -4,7 +4,7 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeMemberLister struct { type fakeMemberLister struct {

View File

@@ -4,7 +4,7 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type AcceptMergeRequestRequest struct { type AcceptMergeRequestRequest struct {
@@ -14,7 +14,7 @@ type AcceptMergeRequestRequest struct {
} }
type MergeRequestAccepter interface { type MergeRequestAccepter interface {
AcceptMergeRequest(pid interface{}, mergeRequest int, opt *gitlab.AcceptMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) AcceptMergeRequest(pid interface{}, mergeRequest int64, opt *gitlab.AcceptMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error)
} }
type mergeRequestAccepterService struct { type mergeRequestAccepterService struct {

View File

@@ -4,14 +4,14 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeMergeRequestAccepter struct { type fakeMergeRequestAccepter struct {
testBase testBase
} }
func (f fakeMergeRequestAccepter) AcceptMergeRequest(pid interface{}, mergeRequest int, opt *gitlab.AcceptMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) { func (f fakeMergeRequestAccepter) AcceptMergeRequest(pid interface{}, mergeRequest int64, opt *gitlab.AcceptMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err

View File

@@ -5,16 +5,16 @@ import (
"errors" "errors"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type ListMergeRequestResponse struct { type ListMergeRequestResponse struct {
SuccessResponse SuccessResponse
MergeRequests []*gitlab.MergeRequest `json:"merge_requests"` MergeRequests []*gitlab.BasicMergeRequest `json:"merge_requests"`
} }
type MergeRequestLister interface { type MergeRequestLister interface {
ListProjectMergeRequests(pid interface{}, opt *gitlab.ListProjectMergeRequestsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequest, *gitlab.Response, error) ListProjectMergeRequests(pid interface{}, opt *gitlab.ListProjectMergeRequestsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.BasicMergeRequest, *gitlab.Response, error)
} }
type mergeRequestListerService struct { type mergeRequestListerService struct {

View File

@@ -7,11 +7,11 @@ import (
"net/http" "net/http"
"sync" "sync"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type MergeRequestListerByUsername interface { type MergeRequestListerByUsername interface {
ListProjectMergeRequests(pid interface{}, opt *gitlab.ListProjectMergeRequestsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequest, *gitlab.Response, error) ListProjectMergeRequests(pid interface{}, opt *gitlab.ListProjectMergeRequestsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.BasicMergeRequest, *gitlab.Response, error)
} }
type mergeRequestListerByUsernameService struct { type mergeRequestListerByUsernameService struct {
@@ -53,7 +53,7 @@ func (a mergeRequestListerByUsernameService) ServeHTTP(w http.ResponseWriter, r
} }
type apiResponse struct { type apiResponse struct {
mrs []*gitlab.MergeRequest mrs []*gitlab.BasicMergeRequest
err error err error
} }
@@ -73,8 +73,8 @@ func (a mergeRequestListerByUsernameService) ServeHTTP(w http.ResponseWriter, r
}(payload) }(payload)
} }
var mergeRequests []*gitlab.MergeRequest var mergeRequests []*gitlab.BasicMergeRequest
existingIds := make(map[int]bool) existingIds := make(map[int64]bool)
var errs []error var errs []error
for res := range mrChan { for res := range mrChan {
if res.err != nil { if res.err != nil {
@@ -115,14 +115,14 @@ func (a mergeRequestListerByUsernameService) ServeHTTP(w http.ResponseWriter, r
} }
} }
func (a mergeRequestListerByUsernameService) getMrs(payload *gitlab.ListProjectMergeRequestsOptions) ([]*gitlab.MergeRequest, error) { func (a mergeRequestListerByUsernameService) getMrs(payload *gitlab.ListProjectMergeRequestsOptions) ([]*gitlab.BasicMergeRequest, error) {
mrs, res, err := a.client.ListProjectMergeRequests(a.projectInfo.ProjectId, payload) mrs, res, err := a.client.ListProjectMergeRequests(a.projectInfo.ProjectId, payload)
if err != nil { if err != nil {
return []*gitlab.MergeRequest{}, err return []*gitlab.BasicMergeRequest{}, err
} }
if res.StatusCode >= 300 { if res.StatusCode >= 300 {
return []*gitlab.MergeRequest{}, GenericError{endpoint: "/merge_requests_by_username"} return []*gitlab.BasicMergeRequest{}, GenericError{endpoint: "/merge_requests_by_username"}
} }
defer res.Body.Close() defer res.Body.Close()

View File

@@ -5,7 +5,7 @@ import (
"strings" "strings"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeMergeRequestListerByUsername struct { type fakeMergeRequestListerByUsername struct {
@@ -13,17 +13,17 @@ type fakeMergeRequestListerByUsername struct {
emptyResponse bool emptyResponse bool
} }
func (f fakeMergeRequestListerByUsername) ListProjectMergeRequests(pid interface{}, opt *gitlab.ListProjectMergeRequestsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequest, *gitlab.Response, error) { func (f fakeMergeRequestListerByUsername) ListProjectMergeRequests(pid interface{}, opt *gitlab.ListProjectMergeRequestsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.BasicMergeRequest, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
if f.emptyResponse { if f.emptyResponse {
return []*gitlab.MergeRequest{}, resp, err return []*gitlab.BasicMergeRequest{}, resp, err
} }
return []*gitlab.MergeRequest{{IID: 10}}, resp, err return []*gitlab.BasicMergeRequest{{IID: 10}}, resp, err
} }
func TestListMergeRequestByUsername(t *testing.T) { func TestListMergeRequestByUsername(t *testing.T) {

View File

@@ -4,7 +4,7 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeMergeRequestLister struct { type fakeMergeRequestLister struct {
@@ -13,21 +13,21 @@ type fakeMergeRequestLister struct {
multipleMrs bool multipleMrs bool
} }
func (f fakeMergeRequestLister) ListProjectMergeRequests(pid interface{}, opt *gitlab.ListProjectMergeRequestsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequest, *gitlab.Response, error) { func (f fakeMergeRequestLister) ListProjectMergeRequests(pid interface{}, opt *gitlab.ListProjectMergeRequestsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.BasicMergeRequest, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
if f.emptyResponse { if f.emptyResponse {
return []*gitlab.MergeRequest{}, resp, err return []*gitlab.BasicMergeRequest{}, resp, err
} }
if f.multipleMrs { if f.multipleMrs {
return []*gitlab.MergeRequest{{IID: 10}, {IID: 11}}, resp, err return []*gitlab.BasicMergeRequest{{IID: 10}, {IID: 11}}, resp, err
} }
return []*gitlab.MergeRequest{{IID: 10}}, resp, err return []*gitlab.BasicMergeRequest{{IID: 10}}, resp, err
} }
func TestMergeRequestHandler(t *testing.T) { func TestMergeRequestHandler(t *testing.T) {

View File

@@ -10,7 +10,7 @@ import (
"strings" "strings"
"github.com/go-playground/validator/v10" "github.com/go-playground/validator/v10"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type mw func(http.Handler) http.Handler type mw func(http.Handler) http.Handler
@@ -108,7 +108,7 @@ func (m withMrMiddleware) handle(next http.Handler) http.Handler {
} }
if pluginOptions.ChosenMrIID != 0 { if pluginOptions.ChosenMrIID != 0 {
options.IIDs = gitlab.Ptr([]int{pluginOptions.ChosenMrIID}) options.IIDs = gitlab.Ptr([]int64{pluginOptions.ChosenMrIID})
} }
mergeRequests, _, err := m.client.ListProjectMergeRequests(m.data.projectInfo.ProjectId, &options) mergeRequests, _, err := m.client.ListProjectMergeRequests(m.data.projectInfo.ProjectId, &options)

View File

@@ -9,7 +9,7 @@ import (
"strings" "strings"
"github.com/harrisoncramer/gitlab.nvim/cmd/app/git" "github.com/harrisoncramer/gitlab.nvim/cmd/app/git"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type RetriggerPipelineResponse struct { type RetriggerPipelineResponse struct {
@@ -30,9 +30,9 @@ type GetPipelineAndJobsResponse struct {
type PipelineManager interface { type PipelineManager interface {
ListProjectPipelines(pid interface{}, opt *gitlab.ListProjectPipelinesOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.PipelineInfo, *gitlab.Response, error) ListProjectPipelines(pid interface{}, opt *gitlab.ListProjectPipelinesOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.PipelineInfo, *gitlab.Response, error)
ListPipelineJobs(pid interface{}, pipelineID int, opts *gitlab.ListJobsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Job, *gitlab.Response, error) ListPipelineJobs(pid interface{}, pipelineID int64, opts *gitlab.ListJobsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Job, *gitlab.Response, error)
ListPipelineBridges(pid interface{}, pipelineID int, opts *gitlab.ListJobsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Bridge, *gitlab.Response, error) ListPipelineBridges(pid interface{}, pipelineID int64, opts *gitlab.ListJobsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Bridge, *gitlab.Response, error)
RetryPipelineBuild(pid interface{}, pipeline int, options ...gitlab.RequestOptionFunc) (*gitlab.Pipeline, *gitlab.Response, error) RetryPipelineBuild(pid interface{}, pipeline int64, options ...gitlab.RequestOptionFunc) (*gitlab.Pipeline, *gitlab.Response, error)
} }
type pipelineService struct { type pipelineService struct {
@@ -171,7 +171,7 @@ func (a pipelineService) RetriggerPipeline(w http.ResponseWriter, r *http.Reques
id := strings.TrimPrefix(r.URL.Path, "/pipeline/trigger/") id := strings.TrimPrefix(r.URL.Path, "/pipeline/trigger/")
idInt, err := strconv.Atoi(id) idInt, err := strconv.ParseInt(id, 10, 64)
if err != nil { if err != nil {
handleError(w, err, "Could not convert pipeline ID to integer", http.StatusBadRequest) handleError(w, err, "Could not convert pipeline ID to integer", http.StatusBadRequest)
return return

View File

@@ -4,7 +4,7 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakePipelineManager struct { type fakePipelineManager struct {
@@ -19,7 +19,7 @@ func (f fakePipelineManager) ListProjectPipelines(pid interface{}, opt *gitlab.L
return []*gitlab.PipelineInfo{{ID: 1234}}, resp, err return []*gitlab.PipelineInfo{{ID: 1234}}, resp, err
} }
func (f fakePipelineManager) ListPipelineJobs(pid interface{}, pipelineID int, opts *gitlab.ListJobsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Job, *gitlab.Response, error) { func (f fakePipelineManager) ListPipelineJobs(pid interface{}, pipelineID int64, opts *gitlab.ListJobsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Job, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@@ -27,7 +27,7 @@ func (f fakePipelineManager) ListPipelineJobs(pid interface{}, pipelineID int, o
return []*gitlab.Job{}, resp, err return []*gitlab.Job{}, resp, err
} }
func (f fakePipelineManager) ListPipelineBridges(pid interface{}, pipelineID int, opts *gitlab.ListJobsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Bridge, *gitlab.Response, error) { func (f fakePipelineManager) ListPipelineBridges(pid interface{}, pipelineID int64, opts *gitlab.ListJobsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.Bridge, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
@@ -35,7 +35,7 @@ func (f fakePipelineManager) ListPipelineBridges(pid interface{}, pipelineID int
return []*gitlab.Bridge{}, resp, err return []*gitlab.Bridge{}, resp, err
} }
func (f fakePipelineManager) RetryPipelineBuild(pid interface{}, pipeline int, options ...gitlab.RequestOptionFunc) (*gitlab.Pipeline, *gitlab.Response, error) { func (f fakePipelineManager) RetryPipelineBuild(pid interface{}, pipeline int64, options ...gitlab.RequestOptionFunc) (*gitlab.Pipeline, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err

View File

@@ -5,7 +5,7 @@ import (
"net/http" "net/http"
"time" "time"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type ReplyRequest struct { type ReplyRequest struct {
@@ -20,7 +20,7 @@ type ReplyResponse struct {
} }
type ReplyManager interface { type ReplyManager interface {
AddMergeRequestDiscussionNote(interface{}, int, string, *gitlab.AddMergeRequestDiscussionNoteOptions, ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) AddMergeRequestDiscussionNote(interface{}, int64, string, *gitlab.AddMergeRequestDiscussionNoteOptions, ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error)
} }
type replyService struct { type replyService struct {

View File

@@ -4,14 +4,14 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeReplyManager struct { type fakeReplyManager struct {
testBase testBase
} }
func (f fakeReplyManager) AddMergeRequestDiscussionNote(interface{}, int, string, *gitlab.AddMergeRequestDiscussionNoteOptions, ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) { func (f fakeReplyManager) AddMergeRequestDiscussionNote(interface{}, int64, string, *gitlab.AddMergeRequestDiscussionNoteOptions, ...gitlab.RequestOptionFunc) (*gitlab.Note, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err

View File

@@ -5,11 +5,11 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type DiscussionResolver interface { type DiscussionResolver interface {
ResolveMergeRequestDiscussion(pid interface{}, mergeRequest int, discussion string, opt *gitlab.ResolveMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) ResolveMergeRequestDiscussion(pid interface{}, mergeRequest int64, discussion string, opt *gitlab.ResolveMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error)
} }
type discussionsResolutionService struct { type discussionsResolutionService struct {

View File

@@ -4,14 +4,14 @@ import (
"net/http" "net/http"
"testing" "testing"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type fakeDiscussionResolver struct { type fakeDiscussionResolver struct {
testBase testBase
} }
func (f fakeDiscussionResolver) ResolveMergeRequestDiscussion(pid interface{}, mergeRequest int, discussion string, opt *gitlab.ResolveMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) { func (f fakeDiscussionResolver) ResolveMergeRequestDiscussion(pid interface{}, mergeRequest int64, discussion string, opt *gitlab.ResolveMergeRequestDiscussionOptions, options ...gitlab.RequestOptionFunc) (*gitlab.Discussion, *gitlab.Response, error) {
resp, err := f.handleGitlabError() resp, err := f.handleGitlabError()
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err

View File

@@ -4,11 +4,11 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type ReviewerUpdateRequest struct { type ReviewerUpdateRequest struct {
Ids []int `json:"ids" validate:"required"` Ids []int64 `json:"ids" validate:"required"`
} }
type ReviewerUpdateResponse struct { type ReviewerUpdateResponse struct {
@@ -22,7 +22,7 @@ type ReviewersRequestResponse struct {
} }
type MergeRequestUpdater interface { type MergeRequestUpdater interface {
UpdateMergeRequest(pid interface{}, mergeRequest int, opt *gitlab.UpdateMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error) UpdateMergeRequest(pid interface{}, mergeRequest int64, opt *gitlab.UpdateMergeRequestOptions, options ...gitlab.RequestOptionFunc) (*gitlab.MergeRequest, *gitlab.Response, error)
} }
type reviewerService struct { type reviewerService struct {

View File

@@ -4,7 +4,7 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type RevisionsResponse struct { type RevisionsResponse struct {
@@ -13,7 +13,7 @@ type RevisionsResponse struct {
} }
type RevisionsGetter interface { type RevisionsGetter interface {
GetMergeRequestDiffVersions(pid interface{}, mergeRequest int, opt *gitlab.GetMergeRequestDiffVersionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequestDiffVersion, *gitlab.Response, error) GetMergeRequestDiffVersions(pid interface{}, mergeRequest int64, opt *gitlab.GetMergeRequestDiffVersionsOptions, options ...gitlab.RequestOptionFunc) ([]*gitlab.MergeRequestDiffVersion, *gitlab.Response, error)
} }
type revisionsService struct { type revisionsService struct {

View File

@@ -4,11 +4,11 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type MergeRequestRevoker interface { type MergeRequestRevoker interface {
UnapproveMergeRequest(interface{}, int, ...gitlab.RequestOptionFunc) (*gitlab.Response, error) UnapproveMergeRequest(interface{}, int64, ...gitlab.RequestOptionFunc) (*gitlab.Response, error)
} }
type mergeRequestRevokerService struct { type mergeRequestRevokerService struct {

View File

@@ -9,7 +9,7 @@ import (
"time" "time"
"github.com/harrisoncramer/gitlab.nvim/cmd/app/git" "github.com/harrisoncramer/gitlab.nvim/cmd/app/git"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
/* /*
@@ -89,7 +89,7 @@ func CreateRouter(gitlabClient *Client, projectInfo *ProjectInfo, s *shutdownSer
if os.Getenv("DEBUG") != "" { if os.Getenv("DEBUG") != "" {
// TODO: We have some JSON files (emojis.json) we import relative to the binary in production and // TODO: We have some JSON files (emojis.json) we import relative to the binary in production and
// expect to break during debugging, do not throw when that occurs. // expect to break during debugging, do not throw when that occurs.
fmt.Fprintf(os.Stdout, "Issue occured setting up router: %s\n", err) _, _ = fmt.Fprintf(os.Stdout, "Issue occured setting up router: %s\n", err)
} else { } else {
panic(err) panic(err)
} }
@@ -241,7 +241,22 @@ func CreateRouter(gitlabClient *Client, projectInfo *ProjectInfo, s *shutdownSer
m.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) { m.HandleFunc("/ping", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
fmt.Fprintln(w, "pong") _, _ = fmt.Fprintln(w, "pong")
})
m.HandleFunc("/version", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
_, _ = fmt.Fprintf(w, `{"version":"%s"}`, version)
})
// Default 404 handler
m.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/" {
handleError(w, fmt.Errorf("endpoint %s does not exist", r.URL.Path), "Not found", http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
}) })
return LoggingServer{handler: m} return LoggingServer{handler: m}

View File

@@ -4,7 +4,7 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type SummaryUpdateRequest struct { type SummaryUpdateRequest struct {

View File

@@ -11,7 +11,7 @@ import (
"testing" "testing"
"github.com/harrisoncramer/gitlab.nvim/cmd/app/git" "github.com/harrisoncramer/gitlab.nvim/cmd/app/git"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
var errorFromGitlab = errors.New("some error from Gitlab") var errorFromGitlab = errors.New("some error from Gitlab")

View File

@@ -4,7 +4,7 @@ import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"github.com/xanzy/go-gitlab" gitlab "gitlab.com/gitlab-org/api/client-go"
) )
type UserResponse struct { type UserResponse struct {

View File

@@ -10,6 +10,7 @@ import (
) )
var pluginOptions app.PluginOptions var pluginOptions app.PluginOptions
var Version = "unknown" // Set via ldflags
func main() { func main() {
log.SetFlags(0) log.SetFlags(0)
@@ -20,6 +21,7 @@ func main() {
err := json.Unmarshal([]byte(os.Args[1]), &pluginOptions) err := json.Unmarshal([]byte(os.Args[1]), &pluginOptions)
app.SetPluginOptions(pluginOptions) app.SetPluginOptions(pluginOptions)
app.SetVersion(Version)
if err != nil { if err != nil {
log.Fatalf("Failure parsing plugin settings: %v", err) log.Fatalf("Failure parsing plugin settings: %v", err)

20
go.mod
View File

@@ -1,27 +1,25 @@
module github.com/harrisoncramer/gitlab.nvim module github.com/harrisoncramer/gitlab.nvim
go 1.19 go 1.25.1
require ( require (
github.com/go-playground/validator/v10 v10.22.1 github.com/go-playground/validator/v10 v10.22.1
github.com/hashicorp/go-retryablehttp v0.7.7 github.com/hashicorp/go-retryablehttp v0.7.8
github.com/xanzy/go-gitlab v0.108.0 gitlab.com/gitlab-org/api/client-go v1.17.0
) )
require ( require (
github.com/gabriel-vasile/mimetype v1.4.3 // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect
github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.7.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect github.com/google/go-querystring v1.2.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/leodido/go-urn v1.4.0 // indirect github.com/leodido/go-urn v1.4.0 // indirect
golang.org/x/crypto v0.19.0 // indirect golang.org/x/crypto v0.19.0 // indirect
golang.org/x/net v0.21.0 // indirect golang.org/x/net v0.21.0 // indirect
golang.org/x/oauth2 v0.6.0 // indirect golang.org/x/oauth2 v0.34.0 // indirect
golang.org/x/sys v0.20.0 // indirect golang.org/x/sys v0.39.0 // indirect
golang.org/x/text v0.14.0 // indirect golang.org/x/text v0.32.0 // indirect
golang.org/x/time v0.3.0 // indirect golang.org/x/time v0.14.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.29.1 // indirect
) )

62
go.sum
View File

@@ -1,59 +1,51 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA= github.com/go-playground/validator/v10 v10.22.1 h1:40JcKH+bBNGFczGuoBYgX4I6m/i27HYW8P9FDk5PbgA=
github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= github.com/go-playground/validator/v10 v10.22.1/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-querystring v1.2.0 h1:yhqkPbu2/OH+V9BfpCVPZkNmUXhb2gBxJArfhIxNtP0=
github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-querystring v1.2.0/go.mod h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48=
github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/xanzy/go-gitlab v0.108.0 h1:IEvEUWFR5G1seslRhJ8gC//INiIUqYXuSUoBd7/gFKE= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/xanzy/go-gitlab v0.108.0/go.mod h1:wKNKh3GkYDMOsGmnfuX+ITCmDuSDWFO0G+C4AygL9RY= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= gitlab.com/gitlab-org/api/client-go v1.17.0 h1:4aVMqYyJONZXWHoH78wzhIMzWkzwqJ8cEPhJRQnUPFI=
gitlab.com/gitlab-org/api/client-go v1.17.0/go.mod h1:ctGKgv9bErQHO0NOrfhoyFtKMAkBhUE7y53F2xHFAkE=
golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo= golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw=
golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM=
google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -63,8 +63,7 @@ M.sequence = function(dependencies, cb)
end end
-- Otherwise, start the go server and start fetching the values -- Otherwise, start the go server and start fetching the values
server.start(function() server.build_and_start(function()
state.go_server_running = true
handler:fetch(dependencies, 1, argTable) handler:fetch(dependencies, 1, argTable)
end) end)
end end

View File

@@ -1,22 +1,9 @@
local state = require("gitlab.state") local state = require("gitlab.state")
local List = require("gitlab.utils.list") local List = require("gitlab.utils.list")
local version = require("gitlab.version")
local u = require("gitlab.utils") local u = require("gitlab.utils")
local M = {} local M = {}
local function check_go_version()
local go_version = io.popen("go version"):read("*a")
if go_version then
local major, minor, _ = go_version:match("(%d+)%.(%d+)%.(%d+)")
if major and tonumber(major) >= 1 and tonumber(minor) >= 19 then
return
else
return "Go is installed, but version is older than 1.19."
end
else
return "Go is not installed."
end
end
---Checks the health of the plugin ---Checks the health of the plugin
---@param return_results boolean ---@param return_results boolean
M.check = function(return_results) M.check = function(return_results)
@@ -60,7 +47,7 @@ M.check = function(return_results)
}, },
} }
local go_version_problem = check_go_version() local go_version_problem = version.check_go_version()
if go_version_problem ~= nil then if go_version_problem ~= nil then
table.insert(warnings, go_version_problem) table.insert(warnings, go_version_problem)
end end

View File

@@ -12,6 +12,7 @@ local summary = require("gitlab.actions.summary")
local data = require("gitlab.actions.data") local data = require("gitlab.actions.data")
local assignees_and_reviewers = require("gitlab.actions.assignees_and_reviewers") local assignees_and_reviewers = require("gitlab.actions.assignees_and_reviewers")
local comment = require("gitlab.actions.comment") local comment = require("gitlab.actions.comment")
local version = require("gitlab.version")
local pipeline = require("gitlab.actions.pipeline") local pipeline = require("gitlab.actions.pipeline")
local create_mr = require("gitlab.actions.create_mr") local create_mr = require("gitlab.actions.create_mr")
local approvals = require("gitlab.actions.approvals") local approvals = require("gitlab.actions.approvals")
@@ -36,6 +37,13 @@ local function setup(args)
if args == nil then if args == nil then
args = {} args = {}
end end
local version_issue = version.check_go_version()
if version_issue ~= nil then
u.notify(version_issue, vim.log.levels.ERROR)
return
end
server.build() -- Builds the Go binary if it doesn't exist server.build() -- Builds the Go binary if it doesn't exist
state.merge_settings(args) -- Merges user settings with default settings state.merge_settings(args) -- Merges user settings with default settings
state.set_global_keymaps() -- Sets keymaps that are not bound to a specific buffer state.set_global_keymaps() -- Sets keymaps that are not bound to a specific buffer

View File

@@ -4,7 +4,7 @@ local Job = require("plenary.job")
local u = require("gitlab.utils") local u = require("gitlab.utils")
local M = {} local M = {}
M.run_job = function(endpoint, method, body, callback, on_error_callback) M.run_job = function(endpoint, method, body, callback)
local state = require("gitlab.state") local state = require("gitlab.state")
local args = { "-s", "-X", (method or "POST"), string.format("localhost:%s", state.settings.port) .. endpoint } local args = { "-s", "-X", (method or "POST"), string.format("localhost:%s", state.settings.port) .. endpoint }
@@ -16,10 +16,8 @@ M.run_job = function(endpoint, method, body, callback, on_error_callback)
-- This handler will handle all responses from the Go server. Anything with a successful -- This handler will handle all responses from the Go server. Anything with a successful
-- status will call the callback (if it is supplied for the job). Otherwise, it will print out the -- status will call the callback (if it is supplied for the job). Otherwise, it will print out the
-- success message or error message and details from the Go server and run the on_error_callback -- success message or error message and details from the Go server.
-- (if supplied for the job).
local stderr = {} local stderr = {}
Job:new({ Job:new({
command = "curl", command = "curl",
args = args, args = args,
@@ -55,9 +53,6 @@ M.run_job = function(endpoint, method, body, callback, on_error_callback)
-- Handle error case -- Handle error case
local message = string.format("%s: %s", data.message, data.details) local message = string.format("%s: %s", data.message, data.details)
u.notify(message, vim.log.levels.ERROR) u.notify(message, vim.log.levels.ERROR)
if on_error_callback then
on_error_callback(data)
end
end end
end, 0) end, 0)
end, end,

View File

@@ -5,8 +5,29 @@ local List = require("gitlab.utils.list")
local state = require("gitlab.state") local state = require("gitlab.state")
local u = require("gitlab.utils") local u = require("gitlab.utils")
local job = require("gitlab.job") local job = require("gitlab.job")
local Job = require("plenary.job")
local M = {} local M = {}
-- Builds the binary if it doesn't exist, and starts the server. If the pre-existing binary has an older
-- tag than the Lua code (exposed via the /version endpoint) then shuts down the server, rebuilds it, and
-- restarts the server again.
M.build_and_start = function(callback)
M.build(false)
M.start(function()
M.get_version(function(version)
if version.plugin_version ~= version.binary_version then
M.shutdown(function()
if M.build(true) then
M.start(callback)
end
end)
else
callback()
end
end)
end)
end
-- Starts the Go server and call the callback provided -- Starts the Go server and call the callback provided
M.start = function(callback) M.start = function(callback)
local port = tonumber(state.settings.port) or 0 local port = tonumber(state.settings.port) or 0
@@ -50,6 +71,7 @@ M.start = function(callback)
-- Make sure that this actually check if port was correctly parsed based on server output -- Make sure that this actually check if port was correctly parsed based on server output
-- because server outputs port only if it started successfully. -- because server outputs port only if it started successfully.
if parsed_port ~= nil and not callback_called then if parsed_port ~= nil and not callback_called then
state.go_server_running = true
callback() callback()
callback_called = true callback_called = true
end end
@@ -80,7 +102,7 @@ M.start = function(callback)
end end
end end
-- Builds the Go binary -- Builds the Go binary with the current Git tag.
M.build = function(override) M.build = function(override)
local file_path = u.current_file_path() local file_path = u.current_file_path()
local parent_dir = vim.fn.fnamemodify(file_path, ":h:h:h:h") local parent_dir = vim.fn.fnamemodify(file_path, ":h:h:h:h")
@@ -96,8 +118,15 @@ M.build = function(override)
end end
end end
local version_output = vim.system({ "git", "describe", "--tags", "--always" }, { cwd = parent_dir }):wait()
local version = version_output.code == 0 and vim.trim(version_output.stdout) or "unknown"
local ldflags = string.format("-X main.Version=%s", version)
local res = vim local res = vim
.system({ "go", "build", "-o", bin_name }, { cwd = state.settings.root_path .. u.path_separator .. "cmd" }) .system(
{ "go", "build", "-ldflags", ldflags, "-o", bin_name },
{ cwd = state.settings.root_path .. u.path_separator .. "cmd" }
)
:wait() :wait()
if res.code ~= 0 then if res.code ~= 0 then
@@ -134,7 +163,6 @@ M.restart = function(cb)
job.run_job("/shutdown", "POST", { restart = true }, function(data) job.run_job("/shutdown", "POST", { restart = true }, function(data)
state.go_server_running = false state.go_server_running = false
M.start(function() M.start(function()
state.go_server_running = true
state.clear_data() state.clear_data()
if cb then if cb then
cb() cb()
@@ -145,4 +173,44 @@ M.restart = function(cb)
end) end)
end end
-- Returns the version (git tag) that was baked into the binary when it was last built
M.get_version = function(callback)
if not state.go_server_running then
u.notify("Gitlab server not running", vim.log.levels.ERROR)
return nil
end
local file_path = u.current_file_path()
local parent_dir = vim.fn.fnamemodify(file_path, ":h:h:h:h")
local version_output = vim.system({ "git", "describe", "--tags", "--always" }, { cwd = parent_dir }):wait()
local plugin_version = version_output.code == 0 and vim.trim(version_output.stdout) or "unknown"
local args = { "-s", "-X", "GET", string.format("localhost:%s/version", state.settings.port) }
-- We call the "/version" endpoint here instead of through the regular jobs pattern because earlier versions of the plugin
-- may not have it. We handle a 404 as an "unknown" version error.
Job:new({
command = "curl",
args = args,
on_stdout = function(_, output)
vim.defer_fn(function()
if output == nil then
callback({ plugin_version = plugin_version, binary_version = "unknown" })
return
end
local data_ok, data = pcall(vim.json.decode, output)
if not data_ok or data == nil or data.version == nil then
callback({ plugin_version = plugin_version, binary_version = "unknown" })
return
end
callback({ plugin_version = plugin_version, binary_version = data.version })
end, 0)
end,
on_stderr = function() end,
on_exit = function() end,
}):start()
end
return M return M

24
lua/gitlab/version.lua Normal file
View File

@@ -0,0 +1,24 @@
local M = {}
M.is_go_valid = function()
local go_version = io.popen("go version"):read("*a")
if go_version then
local major, minor, _ = go_version:match("(%d+)%.(%d+)%.?(%d*)")
if major and tonumber(major) >= 1 and tonumber(minor) >= 25 then
return true
else
return false
end
else
return false
end
end
M.check_go_version = function()
local has_version = M.is_go_valid()
if not has_version then
return "Go is not installed, or version is older than 1.25.1. Please reinstall up-to-date Go version: https://go.dev/dl/"
end
end
return M