Skip to content

Commit 2bc8413

Browse files
committed
Add get branch command
1 parent b127f30 commit 2bc8413

File tree

2 files changed

+134
-0
lines changed

2 files changed

+134
-0
lines changed

cmd/get_branch.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright © 2018 github.com/devopsctl authors
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a copy
4+
// of this software and associated documentation files (the "Software"), to deal
5+
// in the Software without restriction, including without limitation the rights
6+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7+
// copies of the Software, and to permit persons to whom the Software is
8+
// furnished to do so, subject to the following conditions:
9+
//
10+
// The above copyright notice and this permission notice shall be included in
11+
// all copies or substantial portions of the Software.
12+
//
13+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19+
// THE SOFTWARE.
20+
21+
package cmd
22+
23+
import (
24+
"github.com/spf13/cobra"
25+
gitlab "github.com/xanzy/go-gitlab"
26+
)
27+
28+
var getBranchCmd = &cobra.Command{
29+
Use: "branch",
30+
Short: "List all branches of a repository",
31+
Aliases: []string{"b"},
32+
Example: "gitlabctl get branch devopsctl/gitlabctl",
33+
SilenceErrors: true,
34+
SilenceUsage: true,
35+
DisableAutoGenTag: true,
36+
Args: cobra.ExactArgs(1),
37+
RunE: func(cmd *cobra.Command, args []string) error {
38+
return runGetBranch(cmd, args[0])
39+
},
40+
}
41+
42+
func init() {
43+
getCmd.AddCommand(getBranchCmd)
44+
addPaginationFlags(getBranchCmd)
45+
}
46+
47+
func runGetBranch(cmd *cobra.Command, project string) error {
48+
opts := new(gitlab.ListBranchesOptions)
49+
if cmd.Flag("page").Changed {
50+
opts.Page = getFlagInt(cmd, "page")
51+
}
52+
if cmd.Flag("per-page").Changed {
53+
opts.PerPage = getFlagInt(cmd, "per-page")
54+
}
55+
branches, err := getBranch(project, opts)
56+
if err != nil {
57+
return err
58+
}
59+
printBranchOut(getFlagString(cmd, "out"), branches...)
60+
return nil
61+
}
62+
63+
func getBranch(project string, opts *gitlab.ListBranchesOptions) ([]*gitlab.Branch, error) {
64+
git, err := newGitlabClient()
65+
if err != nil {
66+
return nil, err
67+
}
68+
branches, _, err := git.Branches.ListBranches(project, opts)
69+
if err != nil {
70+
return nil, err
71+
}
72+
return branches, nil
73+
}

cmd/get_branch_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// Copyright © 2018 github.com/devopsctl authors
2+
//
3+
// Permission is hereby granted, free of charge, to any person obtaining a copy
4+
// of this software and associated documentation files (the "Software"), to deal
5+
// in the Software without restriction, including without limitation the rights
6+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7+
// copies of the Software, and to permit persons to whom the Software is
8+
// furnished to do so, subject to the following conditions:
9+
//
10+
// The above copyright notice and this permission notice shall be included in
11+
// all copies or substantial portions of the Software.
12+
//
13+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19+
// THE SOFTWARE.
20+
21+
package cmd
22+
23+
import (
24+
"testing"
25+
)
26+
27+
func TestGetBranchCmd(t *testing.T) {
28+
tt := []struct {
29+
name string
30+
args []string
31+
expect testResult
32+
expectOut []string
33+
}{
34+
{
35+
name: "get branches of a project",
36+
args: []string{"12"},
37+
expect: pass,
38+
expectOut: []string{"master"},
39+
},
40+
{
41+
name: "get branches of a non existent project fails",
42+
args: []string{"xxx"},
43+
expect: fail,
44+
expectOut: []string{`message: 404 Project Not Found`},
45+
},
46+
}
47+
48+
for _, tc := range tt {
49+
t.Run(tc.name, func(t *testing.T) {
50+
execT := execTestCmdFlags{
51+
t: t,
52+
cmd: getBranchCmd,
53+
args: tc.args,
54+
}
55+
stdout, execResult := execT.executeCommand()
56+
assertEqualResult(t, execResult, tc.expect, stdout)
57+
assertOutContains(t, stdout, tc.expectOut...)
58+
})
59+
}
60+
61+
}

0 commit comments

Comments
 (0)