diff --git a/gitlab_test.go b/gitlab_test.go index f4088e4..292d285 100644 --- a/gitlab_test.go +++ b/gitlab_test.go @@ -8,6 +8,8 @@ import ( func TestResourceUrl(t *testing.T) { gitlab := NewGitlab("http://base_url/", "api_path", "token") - assert.Equal(t, gitlab.ResourceUrl(projects_url, nil), "http://base_url/api_path/projects?private_token=token") + assert.Equal(t, gitlab.ResourceUrl( + projects_url, map[string]string{":page": "1", ":per_page": "20"}), + "http://base_url/api_path/projects?page=1&per_page=20&private_token=token") assert.Equal(t, gitlab.ResourceUrl(project_url, map[string]string{":id": "123"}), "http://base_url/api_path/projects/123?private_token=token") } diff --git a/projects.go b/projects.go index a56cc67..117ab86 100644 --- a/projects.go +++ b/projects.go @@ -6,14 +6,15 @@ import ( ) const ( - projects_url = "/projects" // Get a list of projects owned by the authenticated user - projects_all = "/projects/all" // Get a list of all GitLab projects (admin only) - projects_search_url = "/projects/search/:query" // Search for projects by name - project_url = "/projects/:id" // Get a specific project, identified by project ID or NAME - project_url_events = "/projects/:id/events" // Get project events - project_url_branches = "/projects/:id/repository/branches" // Lists all branches of a project - project_url_members = "/projects/:id/members" // List project team members - project_url_member = "/projects/:id/members/:user_id" // Get project team member + projects_url = "/projects?page=:page&per_page=:per_page" // Get a list of projects owned by the authenticated user + projects_all = "/projects/all?page=:page&per_page=:per_page" // Get a list of all GitLab projects (admin only) + projects_search_url = "/projects/search/:query" // Search for projects by name + project_url = "/projects/:id" // Get a specific project, identified by project ID or NAME + project_url_events = "/projects/:id/events" // Get project events + project_url_branches = "/projects/:id/repository/branches" // Lists all branches of a project + project_url_members = "/projects/:id/members" // List project team members + project_url_member = "/projects/:id/members/:user_id" // Get project team member + max_page_size = 20 ) type Member struct { @@ -58,17 +59,50 @@ type Project struct { SharedRunners bool `json:"shared_runners_enabled"` } +func append(slice []*Project, elements ...*Project) []*Project { + n := len(slice) + total := len(slice) + len(elements) + if total > cap(slice) { + // Reallocate. Grow to 1.5 times the new size, so we can still grow. + newSize := total*3/2 + 1 + newSlice := make([]*Project, total, newSize) + copy(newSlice, slice) + slice = newSlice + } + slice = slice[:total] + copy(slice[n:], elements) + return slice +} + func projects(u string, g *Gitlab) ([]*Project, error) { - url := g.ResourceUrl(u, nil) var projects []*Project - - contents, err := g.buildAndExecRequest("GET", url, nil) - if err == nil { - err = json.Unmarshal(contents, &projects) + var page int64 = 1 + for { + url := g.ResourceUrl( + u, + map[string]string{ + ":page": strconv.FormatInt(page, 10), + ":per_page": strconv.FormatInt(max_page_size, 10)}) + + var pageProjects []*Project + + contents, err := g.buildAndExecRequest("GET", url, nil) + if err == nil { + err = json.Unmarshal(contents, &pageProjects) + if err == nil { + projects = append(projects, pageProjects...) + page++ + if len(pageProjects) < max_page_size { + break + } + continue + } + } + return projects, err } - return projects, err + return projects, nil } /*