From eeeeb9148b68236e5eb3caea2f46d0a9c0c33df4 Mon Sep 17 00:00:00 2001 From: Clement Hue Date: Fri, 24 Apr 2026 15:58:32 +0200 Subject: [PATCH 1/3] feat(choose_merge_request): add per_page option for merge request fetching Allow users to configure the number of merge requests fetched via the `per_page` setting in `choose_merge_request`. Defaults to 100. --- lua/gitlab/annotations.lua | 1 + lua/gitlab/state.lua | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/lua/gitlab/annotations.lua b/lua/gitlab/annotations.lua index 4b8dfa6c..d35128d7 100644 --- a/lua/gitlab/annotations.lua +++ b/lua/gitlab/annotations.lua @@ -256,6 +256,7 @@ ---@class ChooseMergeRequestSettings ---@field open_reviewer? boolean -- Open the reviewer window automatically after switching merge requests +---@field per_page? integer -- Number of merge requests to fetch (default: 100) ---@class InfoSettings ---@field horizontal? boolean -- Display metadata to the left of the summary rather than underneath diff --git a/lua/gitlab/state.lua b/lua/gitlab/state.lua index 7a570e8d..c99c98e2 100644 --- a/lua/gitlab/state.lua +++ b/lua/gitlab/state.lua @@ -203,6 +203,7 @@ M.settings = { }, choose_merge_request = { open_reviewer = true, + per_page = 100, }, info = { enabled = true, @@ -562,7 +563,11 @@ M.dependencies = { opts["not[label]"] = opts.notlabel opts.notlabel = nil end - return opts or vim.empty_dict() + local body = opts or vim.empty_dict() + if body.per_page == nil then + body.per_page = M.settings.choose_merge_request.per_page + end + return body end, }, merge_requests_by_username = { From 681fa7e308073875e78457a49f0e0b336dcfecf0 Mon Sep 17 00:00:00 2001 From: Clement Hue Date: Sat, 25 Apr 2026 16:11:22 +0200 Subject: [PATCH 2/3] Remove the per_page option and now fetch all merge request internally --- lua/gitlab/annotations.lua | 1 - lua/gitlab/state.lua | 7 +------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/lua/gitlab/annotations.lua b/lua/gitlab/annotations.lua index d35128d7..4b8dfa6c 100644 --- a/lua/gitlab/annotations.lua +++ b/lua/gitlab/annotations.lua @@ -256,7 +256,6 @@ ---@class ChooseMergeRequestSettings ---@field open_reviewer? boolean -- Open the reviewer window automatically after switching merge requests ----@field per_page? integer -- Number of merge requests to fetch (default: 100) ---@class InfoSettings ---@field horizontal? boolean -- Display metadata to the left of the summary rather than underneath diff --git a/lua/gitlab/state.lua b/lua/gitlab/state.lua index c99c98e2..7a570e8d 100644 --- a/lua/gitlab/state.lua +++ b/lua/gitlab/state.lua @@ -203,7 +203,6 @@ M.settings = { }, choose_merge_request = { open_reviewer = true, - per_page = 100, }, info = { enabled = true, @@ -563,11 +562,7 @@ M.dependencies = { opts["not[label]"] = opts.notlabel opts.notlabel = nil end - local body = opts or vim.empty_dict() - if body.per_page == nil then - body.per_page = M.settings.choose_merge_request.per_page - end - return body + return opts or vim.empty_dict() end, }, merge_requests_by_username = { From 474161115fe903ffa4398981cabacb9f5a5af3ff Mon Sep 17 00:00:00 2001 From: Clement Hue Date: Mon, 27 Apr 2026 09:56:23 +0200 Subject: [PATCH 3/3] Implement merge request pagination using gitlab api --- cmd/app/merge_requests.go | 26 +++++++++++--------------- cmd/app/merge_requests_test.go | 6 +++--- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/cmd/app/merge_requests.go b/cmd/app/merge_requests.go index a72408db..edb76db4 100644 --- a/cmd/app/merge_requests.go +++ b/cmd/app/merge_requests.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "net/http" + "slices" gitlab "gitlab.com/gitlab-org/api/client-go" ) @@ -35,23 +36,18 @@ func (a mergeRequestListerService) ServeHTTP(w http.ResponseWriter, r *http.Requ payload.Scope = gitlab.Ptr("all") } - payload.PerPage = 100 - var mergeRequests []*gitlab.BasicMergeRequest - for nextPage := int64(1); nextPage != 0; { - payload.Page = nextPage - mrs, res, err := a.client.ListProjectMergeRequests(a.projectInfo.ProjectId, payload) - if err != nil { - handleError(w, err, "Failed to list merge requests", http.StatusInternalServerError) - return - } + payload.ListOptions = gitlab.ListOptions{ + PerPage: 100, + } - if res.StatusCode >= 300 { - handleError(w, GenericError{r.URL.Path}, "Failed to list merge requests", res.StatusCode) - return - } + it, hasErr := gitlab.Scan(func(p gitlab.PaginationOptionFunc) ([]*gitlab.BasicMergeRequest, *gitlab.Response, error) { + return a.client.ListProjectMergeRequests(a.projectInfo.ProjectId, payload, p) + }) + mergeRequests := slices.Collect(it) - mergeRequests = append(mergeRequests, mrs...) - nextPage = res.NextPage + if err := hasErr(); err != nil { + handleError(w, err, "Failed to list merge requests", http.StatusInternalServerError) + return } if len(mergeRequests) == 0 { diff --git a/cmd/app/merge_requests_test.go b/cmd/app/merge_requests_test.go index 1170c6d0..05b9a30d 100644 --- a/cmd/app/merge_requests_test.go +++ b/cmd/app/merge_requests_test.go @@ -56,13 +56,13 @@ func TestMergeRequestHandler(t *testing.T) { t.Run("Handles non-200s from Gitlab client", func(t *testing.T) { request := makeRequest(t, http.MethodPost, "/merge_requests", testListMergeRequestsRequest) svc := middleware( - mergeRequestListerService{testProjectData, fakeMergeRequestLister{testBase: testBase{status: http.StatusSeeOther}}}, + mergeRequestListerService{testProjectData, fakeMergeRequestLister{testBase: testBase{errFromGitlab: true}}}, withPayloadValidation(methodToPayload{http.MethodPost: newPayload[gitlab.ListProjectMergeRequestsOptions]}), withMethodCheck(http.MethodPost), ) data, status := getFailData(t, svc, request) - checkNon200(t, data, "Failed to list merge requests", "/merge_requests") - assert(t, status, http.StatusSeeOther) + checkErrorFromGitlab(t, data, "Failed to list merge requests") + assert(t, status, http.StatusInternalServerError) }) t.Run("Should handle not having any merge requests with 404", func(t *testing.T) { request := makeRequest(t, http.MethodPost, "/merge_requests", testListMergeRequestsRequest)