From 3272bfb26ddd917a9a0341f3926dcedd3ce6235c Mon Sep 17 00:00:00 2001 From: clchen Date: Mon, 5 Sep 2016 18:03:43 +0800 Subject: [PATCH 1/3] fix get projects limit --- projects.go | 50 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/projects.go b/projects.go index a56cc67..94a6573 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_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 } /* From 3ed736168f337e5477311e41d6e39372946db398 Mon Sep 17 00:00:00 2001 From: clchen Date: Mon, 5 Sep 2016 18:12:50 +0800 Subject: [PATCH 2/3] fix unittest --- gitlab_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gitlab_test.go b/gitlab_test.go index f4088e4..ff7df7d 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") } From ccb2e4a786222b61f8e9ade782814447544d8c35 Mon Sep 17 00:00:00 2001 From: clchen Date: Mon, 5 Sep 2016 18:19:20 +0800 Subject: [PATCH 3/3] fix codiny style --- gitlab_test.go | 2 +- projects.go | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/gitlab_test.go b/gitlab_test.go index ff7df7d..292d285 100644 --- a/gitlab_test.go +++ b/gitlab_test.go @@ -9,7 +9,7 @@ func TestResourceUrl(t *testing.T) { gitlab := NewGitlab("http://base_url/", "api_path", "token") assert.Equal(t, gitlab.ResourceUrl( - projects_url, map[string]string{":page":"1", ":per_page":"20"}), + 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 94a6573..117ab86 100644 --- a/projects.go +++ b/projects.go @@ -6,15 +6,15 @@ import ( ) const ( - 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 + 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 { @@ -82,7 +82,7 @@ func projects(u string, g *Gitlab) ([]*Project, error) { url := g.ResourceUrl( u, map[string]string{ - ":page": strconv.FormatInt(page, 10), + ":page": strconv.FormatInt(page, 10), ":per_page": strconv.FormatInt(max_page_size, 10)}) var pageProjects []*Project