From 886d0858f220e21aa53a95b0b0a71fb23ed333b1 Mon Sep 17 00:00:00 2001 From: Stephane Leclercq Date: Tue, 14 Jun 2016 14:53:47 +0200 Subject: [PATCH 1/2] feat(project) list/add/edit/rm project variables --- README.md | 5 +- examples/projects/main.go | 103 ++++++++++++++++++++++++- projects.go | 113 ++++++++++++++++++++++++++-- projects_test.go | 60 +++++++++++++++ stubs/projects/variables/index.json | 10 +++ stubs/projects/variables/show.json | 4 + 6 files changed, 285 insertions(+), 10 deletions(-) create mode 100644 stubs/projects/variables/index.json create mode 100644 stubs/projects/variables/show.json diff --git a/README.md b/README.md index 68cdf65..a49cfb4 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,10 @@ go-gitlab-client is a simple client written in golang to consume gitlab API. * ### Projects [gitlab api doc](http://doc.gitlab.com/ce/api/projects.html) * list projects - * add/get/edit/rm single project + * get single project + * remove project + * list project variables + * add/get/edit/rm project variable * ### Repositories [gitlab api doc](http://doc.gitlab.com/ce/api/repositories.html) * list repository branches diff --git a/examples/projects/main.go b/examples/projects/main.go index 6bc22da..f3f8512 100644 --- a/examples/projects/main.go +++ b/examples/projects/main.go @@ -39,7 +39,8 @@ func main() { " > -m hooks -id PROJECT_ID\n"+ " > -m branches -id PROJECT_ID\n"+ " > -m team -id PROJECT_ID\n"+ - " > -m merge_requests -id PROJECT_ID [-state ] [-order ] [-sort ]") + " > -m merge_requests -id PROJECT_ID [-state ] [-order ] [-sort ]\n"+ + " > -m variables -id PROJECT_ID [-o ] [-key VARIABLE_KEY] [-value VARIABLE_VALUE]") var id string flag.StringVar(&id, "id", "", "Specify repository id") @@ -56,6 +57,12 @@ func main() { var operation string flag.StringVar(&operation, "o", "", "Specify operation") + var key string + flag.StringVar(&key, "key", "", "Specify key") + + var value string + flag.StringVar(&value, "value", "", "Specify value") + var desc string flag.StringVar(&desc, "desc", "", "Specify description") @@ -223,5 +230,99 @@ func main() { fmt.Printf("> [%d] %s (+%d) by %s on %s.\n", mr.Id, mr.Title, mr.Upvotes, mr.Author.Name, mr.CreatedAt) } + case "variables": + + if id == "" { + flag.Usage() + return + } + + if operation == "" { + fmt.Println("Fetching project variables...") + + variables, err := gitlab.ProjectVariables(id) + if err != nil { + fmt.Println(err.Error()) + return + } + + for _, variable := range variables { + fmt.Printf("> %s -> %s.\n", variable.Key, variable.Value) + } + return + } + + switch operation { + case "get": + fmt.Println("Fetching project variable...") + if key == "" { + flag.Usage() + return + } + + variable, err := gitlab.ProjectVariable(id, key) + if err != nil { + fmt.Println(err.Error()) + return + } + + fmt.Printf("> %s -> %s.\n", variable.Key, variable.Value) + + case "add": + fmt.Println("Add project variable...") + if key == "" || value == "" { + flag.Usage() + return + } + + req := gogitlab.Variable{ + Key: key, + Value: value, + } + + variable, err := gitlab.AddProjectVariable(id, &req) + if err != nil { + fmt.Println(err.Error()) + return + } + + fmt.Printf("> %s -> %s.\n", variable.Key, variable.Value) + + case "edit": + fmt.Println("Edit project variable...") + if key == "" || value == "" { + flag.Usage() + return + } + + req := gogitlab.Variable{ + Key: key, + Value: value, + } + + variable, err := gitlab.UpdateProjectVariable(id, &req) + if err != nil { + fmt.Println(err.Error()) + return + } + + fmt.Printf("> %s -> %s.\n", variable.Key, variable.Value) + + case "rm": + fmt.Println("Delete project variable...") + if key == "" { + flag.Usage() + return + } + + variable, err := gitlab.DeleteProjectVariable(id, key) + if err != nil { + fmt.Println(err.Error()) + return + } + + fmt.Printf("> %s -> %s.\n", variable.Key, variable.Value) + + } } } diff --git a/projects.go b/projects.go index a56cc67..763b77b 100644 --- a/projects.go +++ b/projects.go @@ -6,14 +6,16 @@ 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" // 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 + project_url_variables = "/projects/:id/variables" // List project variables or add one + project_url_variable = "/projects/:id/variables/:variable_key" // Get or Update project variable ) type Member struct { @@ -36,6 +38,11 @@ type Namespace struct { Updated_At string } +type Variable struct { + Key string `json:"key"` + Value string `json:"value"` +} + // A gitlab project type Project struct { Id int `json:"id,omitempty"` @@ -180,3 +187,93 @@ func (g *Gitlab) ProjectMembers(id string) ([]*Member, error) { return members, err } + +/* +Lists all variables of a project +*/ +func (g *Gitlab) ProjectVariables(id string) ([]*Variable, error) { + url, opaque := g.ResourceUrlRaw(project_url_variables, map[string]string{":id": id}) + + var variables []*Variable + + contents, err := g.buildAndExecRequestRaw("GET", url, opaque, nil) + if err == nil { + err = json.Unmarshal(contents, &variables) + } + + return variables, err +} + +/* +Shows a project variable +*/ +func (g *Gitlab) ProjectVariable(id string, key string) (*Variable, error) { + url, opaque := g.ResourceUrlRaw(project_url_variable, map[string]string{":id": id, ":variable_key": key}) + + var result *Variable + + contents, err := g.buildAndExecRequestRaw("GET", url, opaque, nil) + if err == nil { + err = json.Unmarshal(contents, &result) + } + + return result, err +} + +/* +Adds a project variable +*/ +func (g *Gitlab) AddProjectVariable(id string, variable *Variable) (*Variable, error) { + url, opaque := g.ResourceUrlRaw(project_url_variables, map[string]string{":id": id}) + + encodedRequest, err := json.Marshal(variable) + if err != nil { + return nil, err + } + + var result *Variable + + contents, err := g.buildAndExecRequestRaw("POST", url, opaque, encodedRequest) + if err == nil { + err = json.Unmarshal(contents, &result) + } + + return result, err +} + +/* +Updates a project variable +*/ +func (g *Gitlab) UpdateProjectVariable(id string, variable *Variable) (*Variable, error) { + url := g.ResourceUrl(project_url_variable, map[string]string{":id": id, ":variable_key": variable.Key}) + + encodedRequest, err := json.Marshal(variable) + if err != nil { + return nil, err + } + var result *Variable + + contents, err := g.buildAndExecRequest("PUT", url, encodedRequest) + + if err == nil { + err = json.Unmarshal(contents, &result) + } + + return result, err +} + +/* +Deletes a project variable +*/ +func (g *Gitlab) DeleteProjectVariable(id string, key string) (*Variable, error) { + url, opaque := g.ResourceUrlRaw(project_url_variable, map[string]string{":id": id, ":variable_key": key}) + + var result *Variable + + contents, err := g.buildAndExecRequestRaw("DELETE", url, opaque, nil) + if err == nil { + err = json.Unmarshal(contents, &result) + } + + return result, err +} diff --git a/projects_test.go b/projects_test.go index dc770da..4a0bf2f 100644 --- a/projects_test.go +++ b/projects_test.go @@ -55,3 +55,63 @@ func TestRemoveProject(t *testing.T) { assert.Equal(t, err, nil) assert.Equal(t, result, true) } + +func TestListVariables(t *testing.T) { + ts, gitlab := Stub("stubs/projects/variables/index.json") + + variables, err := gitlab.ProjectVariables("1") + + assert.Equal(t, err, nil) + assert.Equal(t, len(variables), 2) + defer ts.Close() +} + +func TestGetVariable(t *testing.T) { + ts, gitlab := Stub("stubs/projects/variables/show.json") + + result, err := gitlab.ProjectVariable("1", "Somekey") + + assert.NoError(t, err) + assert.Equal(t, result.Key, "somekey") + assert.Equal(t, result.Value, "somevalue") + defer ts.Close() +} + +func TestAddVariable(t *testing.T) { + ts, gitlab := Stub("stubs/projects/variables/show.json") + req := Variable{ + Key: "somekey", + Value: "somevalue", + } + result, err := gitlab.AddProjectVariable("1", &req) + + assert.NoError(t, err) + assert.Equal(t, result.Key, "somekey") + assert.Equal(t, result.Value, "somevalue") + defer ts.Close() +} + +func TestUpdateVariable(t *testing.T) { + ts, gitlab := Stub("stubs/projects/variables/show.json") + req := Variable{ + Key: "somekey", + Value: "somevalue", + } + result, err := gitlab.UpdateProjectVariable("1", &req) + + assert.NoError(t, err) + assert.Equal(t, result.Key, "somekey") + assert.Equal(t, result.Value, "somevalue") + defer ts.Close() +} + +func TestDeleteVariable(t *testing.T) { + ts, gitlab := Stub("stubs/projects/variables/show.json") + + result, err := gitlab.DeleteProjectVariable("1", "somekey") + + assert.NoError(t, err) + assert.Equal(t, result.Key, "somekey") + assert.Equal(t, result.Value, "somevalue") + defer ts.Close() +} diff --git a/stubs/projects/variables/index.json b/stubs/projects/variables/index.json new file mode 100644 index 0000000..dd2c84e --- /dev/null +++ b/stubs/projects/variables/index.json @@ -0,0 +1,10 @@ +[ + { + "key": "somekey", + "value": "somevalue" + }, + { + "key": "someotherkey", + "value": "someothervalue" + } +] diff --git a/stubs/projects/variables/show.json b/stubs/projects/variables/show.json new file mode 100644 index 0000000..322da6c --- /dev/null +++ b/stubs/projects/variables/show.json @@ -0,0 +1,4 @@ +{ + "key": "somekey", + "value": "somevalue" +} From a85a7727f42e7db85d9c9e0a7b9b64f4865bb978 Mon Sep 17 00:00:00 2001 From: Stephane Leclercq Date: Fri, 17 Jun 2016 09:28:57 +0200 Subject: [PATCH 2/2] chore(tests) Use assert.NoError across project --- hooks_test.go | 8 ++++---- issue_test.go | 2 +- merge_requests_test.go | 16 ++++++++-------- projects_test.go | 10 +++++----- public_keys_test.go | 12 ++++++------ repositories_test.go | 10 +++++----- users_test.go | 8 ++++---- 7 files changed, 33 insertions(+), 33 deletions(-) diff --git a/hooks_test.go b/hooks_test.go index fa272ec..04a30b2 100644 --- a/hooks_test.go +++ b/hooks_test.go @@ -10,7 +10,7 @@ func TestHook(t *testing.T) { ts, gitlab := Stub("stubs/hooks/show.json") hook, err := gitlab.ProjectHook("1", "2") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.IsType(t, new(Hook), hook) assert.Equal(t, hook.Url, "http://example.com/hook") defer ts.Close() @@ -20,7 +20,7 @@ func TestParsePushHook(t *testing.T) { stub, _ := ioutil.ReadFile("stubs/hooks/push.json") p, err := ParseHook([]byte(stub)) - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.IsType(t, new(HookPayload), p) assert.Equal(t, p.After, "da1560886d4f094c3e6c9ef40349f7d38b5d27d7") assert.Equal(t, p.Repository.URL, "git@localhost:diaspora.git") @@ -35,7 +35,7 @@ func TestParseIssueHook(t *testing.T) { stub, _ := ioutil.ReadFile("stubs/hooks/issue.json") p, err := ParseHook([]byte(stub)) - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, p.ObjectKind, "issue") assert.Equal(t, p.ObjectAttributes.Id, 301) } @@ -44,7 +44,7 @@ func TestParseMergeRequestHook(t *testing.T) { stub, _ := ioutil.ReadFile("stubs/hooks/merge_request.json") p, err := ParseHook([]byte(stub)) - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, p.ObjectKind, "merge_request") assert.Equal(t, p.ObjectAttributes.TargetBranch, "master") assert.Equal(t, p.ObjectAttributes.SourceProjectId, p.ObjectAttributes.TargetProjectId) diff --git a/issue_test.go b/issue_test.go index 529bde4..5432aef 100644 --- a/issue_test.go +++ b/issue_test.go @@ -15,7 +15,7 @@ func TestAddIssue(t *testing.T) { } issue, err := gitlab.AddIssue("1", req) - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, issue.Id, 1) assert.Equal(t, issue.IId, 1) assert.Equal(t, issue.ProjectId, 1) diff --git a/merge_requests_test.go b/merge_requests_test.go index 4e9cf31..670ba68 100644 --- a/merge_requests_test.go +++ b/merge_requests_test.go @@ -10,7 +10,7 @@ func TestProjectMergeRequests(t *testing.T) { ts, gitlab := Stub("stubs/merge_requests/index.json") mrs, err := gitlab.ProjectMergeRequests("3", nil) - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, len(mrs), 1) defer ts.Close() } @@ -19,7 +19,7 @@ func TestProjectMergeRequest(t *testing.T) { ts, gitlab := Stub("stubs/merge_requests/show.json") mr, err := gitlab.ProjectMergeRequest("3", "1") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, mr.TargetBranch, "master") assert.Equal(t, mr.MergeStatus, "can_be_merged") assert.Equal(t, mr.SourceProjectID, 2) @@ -31,7 +31,7 @@ func TestProjectMergeRequestCommits(t *testing.T) { ts, gitlab := Stub("stubs/merge_requests/commits.json") commits, err := gitlab.ProjectMergeRequestCommits("3", "1") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, len(commits), 2) defer ts.Close() } @@ -40,7 +40,7 @@ func TestProjectMergeRequestChanges(t *testing.T) { ts, gitlab := Stub("stubs/merge_requests/changes.json") mr, err := gitlab.ProjectMergeRequestChanges("3", "1") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, len(mr.Changes), 1) defer ts.Close() } @@ -52,7 +52,7 @@ func TestAddMergeRequest(t *testing.T) { } _, err := gitlab.AddMergeRequest(&req) - assert.Equal(t, err, nil) + assert.NoError(t, err) defer ts.Close() } @@ -64,7 +64,7 @@ func TestEditMergeRequest(t *testing.T) { } err := gitlab.EditMergeRequest(&req) - assert.Equal(t, err, nil) + assert.NoError(t, err) defer ts.Close() } @@ -72,13 +72,13 @@ func TestProjectMergeRequestAccept(t *testing.T) { ts, gitlab := Stub("stubs/merge_requests/show.json") req := AcceptMergeRequestRequest{} _, err := gitlab.ProjectMergeRequestAccept("3", "1", &req) - assert.Equal(t, err, nil) + assert.NoError(t, err) defer ts.Close() } func TestProjectMergeRequestCancelMerge(t *testing.T) { ts, gitlab := Stub("stubs/merge_requests/show.json") _, err := gitlab.ProjectMergeRequestCancelMerge("3", "1") - assert.Equal(t, err, nil) + assert.NoError(t, err) defer ts.Close() } diff --git a/projects_test.go b/projects_test.go index 4a0bf2f..830db09 100644 --- a/projects_test.go +++ b/projects_test.go @@ -9,7 +9,7 @@ func TestProjects(t *testing.T) { ts, gitlab := Stub("stubs/projects/index.json") projects, err := gitlab.Projects() - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, len(projects), 2) defer ts.Close() } @@ -18,7 +18,7 @@ func TestProject(t *testing.T) { ts, gitlab := Stub("stubs/projects/show.json") project, err := gitlab.Project("1") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.IsType(t, new(Project), project) assert.Equal(t, project.SshRepoUrl, "git@example.com:diaspora/diaspora-project-site.git") assert.Equal(t, project.HttpRepoUrl, "http://example.com/diaspora/diaspora-project-site.git") @@ -41,7 +41,7 @@ func TestProjectBranches(t *testing.T) { ts, gitlab := Stub("stubs/projects/branches/index.json") branches, err := gitlab.ProjectBranches("1") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, len(branches), 2) defer ts.Close() } @@ -52,7 +52,7 @@ func TestRemoveProject(t *testing.T) { result, err := gitlab.RemoveProject("1") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, result, true) } @@ -61,7 +61,7 @@ func TestListVariables(t *testing.T) { variables, err := gitlab.ProjectVariables("1") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, len(variables), 2) defer ts.Close() } diff --git a/public_keys_test.go b/public_keys_test.go index 8489512..90568af 100644 --- a/public_keys_test.go +++ b/public_keys_test.go @@ -9,7 +9,7 @@ func TestGetUserKeys(t *testing.T) { ts, gitlab := Stub("stubs/public_keys/index.json") keys, err := gitlab.UserKeys() - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, len(keys), 2) defer ts.Close() } @@ -18,7 +18,7 @@ func TestListKeys(t *testing.T) { ts, gitlab := Stub("stubs/public_keys/index.json") keys, err := gitlab.ListKeys("1") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, len(keys), 2) defer ts.Close() } @@ -27,7 +27,7 @@ func TestGetUserKey(t *testing.T) { ts, gitlab := Stub("stubs/public_keys/show.json") key, err := gitlab.UserKey("1") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.IsType(t, new(PublicKey), key) assert.Equal(t, key.Title, "Public key") assert.Equal(t, key.Key, "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=") @@ -38,7 +38,7 @@ func TestAddKey(t *testing.T) { ts, gitlab := Stub("") err := gitlab.AddKey("Public key", "stubbed key") - assert.Equal(t, err, nil) + assert.NoError(t, err) defer ts.Close() } @@ -46,7 +46,7 @@ func TestAddUserKey(t *testing.T) { ts, gitlab := Stub("") err := gitlab.AddUserKey("1", "Public key", "stubbed key") - assert.Equal(t, err, nil) + assert.NoError(t, err) defer ts.Close() } @@ -54,6 +54,6 @@ func TestDeleteKey(t *testing.T) { ts, gitlab := Stub("") err := gitlab.DeleteKey("1") - assert.Equal(t, err, nil) + assert.NoError(t, err) defer ts.Close() } diff --git a/repositories_test.go b/repositories_test.go index 5fbcf85..4e960d3 100644 --- a/repositories_test.go +++ b/repositories_test.go @@ -9,7 +9,7 @@ func TestRepoBranches(t *testing.T) { ts, gitlab := Stub("stubs/branches/index.json") branches, err := gitlab.RepoBranches("1") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, len(branches), 1) defer ts.Close() } @@ -18,7 +18,7 @@ func TestRepoBranch(t *testing.T) { ts, gitlab := Stub("stubs/branches/show.json") branch, err := gitlab.RepoBranch("1", "master") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.IsType(t, new(Branch), branch) assert.Equal(t, branch.Name, "master") defer ts.Close() @@ -28,7 +28,7 @@ func TestRepoTags(t *testing.T) { ts, gitlab := Stub("stubs/tags/index.json") tags, err := gitlab.RepoTags("1") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, len(tags), 1) defer ts.Close() } @@ -37,7 +37,7 @@ func TestRepoCommits(t *testing.T) { ts, gitlab := Stub("stubs/commits/index.json") commits, err := gitlab.RepoCommits("1") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, len(commits), 2) defer ts.Close() } @@ -46,7 +46,7 @@ func TestRepoTree(t *testing.T) { ts, gitlab := Stub("stubs/trees/show.json") tree, err := gitlab.RepoTree("1", "path", "ref_name") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, len(tree), 6) defer ts.Close() } diff --git a/users_test.go b/users_test.go index a597b47..bb899e1 100644 --- a/users_test.go +++ b/users_test.go @@ -9,7 +9,7 @@ func TestUsers(t *testing.T) { ts, gitlab := Stub("stubs/users/index.json") users, err := gitlab.Users(0, 0) - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, len(users), 2) defer ts.Close() } @@ -18,7 +18,7 @@ func TestUser(t *testing.T) { ts, gitlab := Stub("stubs/users/show.json") user, err := gitlab.User("plouc") - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.IsType(t, new(User), user) assert.Equal(t, user.Id, 6) assert.Equal(t, user.Username, "plouc") @@ -39,7 +39,7 @@ func TestDeleteUser(t *testing.T) { ts, gitlab := Stub("") err := gitlab.DeleteUser("1") - assert.Equal(t, err, nil) + assert.NoError(t, err) defer ts.Close() } @@ -47,7 +47,7 @@ func TestCurrentUser(t *testing.T) { ts, gitlab := Stub("stubs/users/current.json") user, err := gitlab.CurrentUser() - assert.Equal(t, err, nil) + assert.NoError(t, err) assert.Equal(t, user.Username, "john_smith") defer ts.Close() }