@@ -2,6 +2,8 @@ package cmd
2
2
3
3
import (
4
4
"fmt"
5
+ "os"
6
+ "strconv"
5
7
6
8
"github.com/MakeNowJust/heredoc/v2"
7
9
"github.com/spf13/cobra"
@@ -10,71 +12,151 @@ import (
10
12
gitlab "github.com/xanzy/go-gitlab"
11
13
)
12
14
13
- func mrApprovalRuleShow (approvalState * gitlab.MergeRequestApprovalState ) {
14
- for _ , rule := range approvalState .Rules {
15
- fmt .Println ("Rule:" , rule .Name )
16
- if rule .Approved {
17
- fmt .Println (" Approved: Y" )
18
- } else {
19
- fmt .Println (" Approved:" )
20
- }
15
+ func mrApprovalRuleShow (rule * gitlab.MergeRequestApprovalRule ) {
16
+ fmt .Println ("Rule:" , rule .Name )
17
+ if rule .Approved {
18
+ fmt .Println (" Approved: Y" )
19
+ } else {
20
+ fmt .Println (" Approved:" )
21
+ }
21
22
22
- if rule .RuleType == "regular" {
23
- users := ""
24
- for u , user := range rule .EligibleApprovers {
25
- users += fmt .Sprintf ("%s" , user .Username )
26
- if u != (len (rule .EligibleApprovers ) - 1 ) {
27
- users += ","
28
- }
23
+ if rule .RuleType == "regular" {
24
+ users := ""
25
+ for u , user := range rule .EligibleApprovers {
26
+ users += fmt .Sprintf ("%s" , user .Username )
27
+ if u != (len (rule .EligibleApprovers ) - 1 ) {
28
+ users += ","
29
29
}
30
- fmt .Println (" Approvers:" , users )
31
- } else if rule .RuleType == "any_approver" {
32
- fmt .Println (" Approvers: All eligible users" )
33
30
}
31
+ fmt .Println (" Approvers:" , users )
32
+ } else if rule .RuleType == "any_approver" {
33
+ fmt .Println (" Approvers: All eligible users" )
34
+ }
34
35
35
- if rule .ApprovalsRequired > 0 {
36
- fmt .Printf (" Approvals: %d of %d\n " , len (rule .ApprovedBy ), rule .ApprovalsRequired )
37
- } else {
38
- fmt .Println (" Approvals: Optional" )
39
- }
36
+ if rule .ApprovalsRequired > 0 {
37
+ fmt .Printf (" Approvals: %d of %d\n " , len (rule .ApprovedBy ), rule .ApprovalsRequired )
38
+ } else {
39
+ fmt .Println (" Approvals: Optional" )
40
+ }
40
41
41
- if len (rule .ApprovedBy ) > 0 {
42
- users := ""
43
- for u , user := range rule .ApprovedBy {
44
- users += fmt .Sprintf ("%s" , user .Username )
45
- if u != (len (rule .ApprovedBy ) - 1 ) {
46
- users += ","
47
- }
42
+ if len (rule .ApprovedBy ) > 0 {
43
+ users := ""
44
+ for u , user := range rule .ApprovedBy {
45
+ users += fmt .Sprintf ("%s" , user .Username )
46
+ if u != (len (rule .ApprovedBy ) - 1 ) {
47
+ users += ","
48
48
}
49
- fmt .Println (" Approved By:" , users )
50
- } else {
51
- fmt .Println (" Approved By:" )
52
49
}
50
+ fmt .Println (" Approved By:" , users )
51
+ } else {
52
+ fmt .Println (" Approved By:" )
53
53
}
54
54
}
55
55
56
56
var mrApprovalRuleCmd = & cobra.Command {
57
57
Use : "approval-rule [remote] [<MR id or branch>]" ,
58
58
Aliases : []string {},
59
59
Example : heredoc .Doc (`
60
- lab mr approval-rule 1234` ),
60
+ lab mr approval-rule 1234
61
+ lab mr approval-rule 1234 --name "Fancy rule name"
62
+ lab mr approval-rule --create --name "Fancy rule name" --user "prarit" --user "zaquestion"
63
+ lab mr approval-rule --create --name "Fancy rule name" --user "prarit" --user "zaquestion" --approvals-required 1
64
+ lab mr approval-rule --delete "Fancy rule name"` ),
61
65
PersistentPreRun : labPersistentPreRun ,
62
66
Run : func (cmd * cobra.Command , args []string ) {
63
67
rn , id , err := parseArgsWithGitBranchMR (args )
64
68
if err != nil {
65
69
log .Fatal (err )
66
70
}
67
71
68
- approvalState , err := lab . GetMRApprovalState ( rn , int ( id ) )
72
+ create , err := cmd . Flags (). GetBool ( "create" )
69
73
if err != nil {
70
74
log .Fatal (err )
71
75
}
72
76
77
+ if create {
78
+ _approvalsRequired , err := cmd .Flags ().GetString ("approvals-required" )
79
+ if err != nil {
80
+ log .Fatal (err )
81
+ }
82
+ approvalsRequired , err := strconv .Atoi (_approvalsRequired )
83
+ if err != nil {
84
+ log .Fatal (err )
85
+ }
86
+
87
+ name , err := cmd .Flags ().GetString ("name" )
88
+ if err != nil {
89
+ log .Fatal (err )
90
+ }
91
+ if name == "" {
92
+ fmt .Println ("The --name option must be used with the --create option" )
93
+ os .Exit (1 )
94
+ }
95
+
96
+ users , err := cmd .Flags ().GetStringSlice ("user" )
97
+ if err != nil {
98
+ log .Fatal (err )
99
+ }
100
+ userIDs := getUserIDs (users )
101
+
102
+ groups , err := cmd .Flags ().GetStringSlice ("group" )
103
+ if err != nil {
104
+ log .Fatal (err )
105
+ }
106
+ groupIDs := getUserIDs (groups )
107
+
108
+ rule , err := lab .CreateMRApprovalRule (rn , approvalsRequired , int (id ), name , 0 , groupIDs , userIDs )
109
+ if err != nil {
110
+ log .Fatal (err )
111
+ }
112
+
113
+ mrApprovalRuleShow (rule )
114
+ return
115
+ }
116
+
117
+ deleteRule , err := cmd .Flags ().GetString ("delete" )
118
+ if err != nil {
119
+ log .Fatal (err )
120
+ }
121
+ if deleteRule != "" {
122
+ msg , err := lab .DeleteMRApprovalRule (rn , deleteRule , int (id ))
123
+ if err != nil {
124
+ log .Fatal (err )
125
+ }
126
+ fmt .Println (msg )
127
+ return
128
+ }
129
+
73
130
// default, no options just show the rules
74
- mrApprovalRuleShow (approvalState )
131
+ approvalState , err := lab .GetMRApprovalState (rn , int (id ))
132
+ if err != nil {
133
+ log .Fatal (err )
134
+ }
135
+
136
+ name , err := cmd .Flags ().GetString ("name" )
137
+ if err != nil {
138
+ log .Fatal (err )
139
+ }
140
+
141
+ for _ , rule := range approvalState .Rules {
142
+ if name != "" {
143
+ if rule .Name != name {
144
+ continue
145
+ }
146
+ }
147
+ mrApprovalRuleShow (rule )
148
+ }
75
149
},
76
150
}
77
151
78
152
func init () {
153
+ mrApprovalRuleCmd .Flags ().BoolP ("create" , "c" , false , "create a new rule. See 'create:' sub-options in help" )
154
+ mrApprovalRuleCmd .Flags ().StringP ("delete" , "d" , "" , "delete the named rule" )
155
+ mrApprovalRuleCmd .Flags ().String ("approvals-required" , "0" , "create: number of approvals required" )
156
+ mrApprovalRuleCmd .Flags ().StringP ("name" , "n" , "" , "create: rule name (can also be used to display a rule)" )
157
+ mrApprovalRuleCmd .Flags ().String ("project-rule-id" , "" , "create: project rule id for new rule" )
158
+ mrApprovalRuleCmd .Flags ().StringSliceP ("user" , "u" , []string {}, "create: approvers for new rule; can be used multiple times for different users" )
159
+ mrApprovalRuleCmd .Flags ().StringSliceP ("group" , "g" , []string {}, "create: groups for new rule; can be used multiple times for different groups" )
160
+
79
161
mrCmd .AddCommand (mrApprovalRuleCmd )
80
162
}
0 commit comments