@@ -2,6 +2,8 @@ package cmd
22
33import (
44 "fmt"
5+ "os"
6+ "strconv"
57
68 "github.com/MakeNowJust/heredoc/v2"
79 "github.com/spf13/cobra"
@@ -10,71 +12,151 @@ import (
1012 gitlab "github.com/xanzy/go-gitlab"
1113)
1214
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+ }
2122
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 += ","
2929 }
30- fmt .Println (" Approvers:" , users )
31- } else if rule .RuleType == "any_approver" {
32- fmt .Println (" Approvers: All eligible users" )
3330 }
31+ fmt .Println (" Approvers:" , users )
32+ } else if rule .RuleType == "any_approver" {
33+ fmt .Println (" Approvers: All eligible users" )
34+ }
3435
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+ }
4041
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 += ","
4848 }
49- fmt .Println (" Approved By:" , users )
50- } else {
51- fmt .Println (" Approved By:" )
5249 }
50+ fmt .Println (" Approved By:" , users )
51+ } else {
52+ fmt .Println (" Approved By:" )
5353 }
5454}
5555
5656var mrApprovalRuleCmd = & cobra.Command {
5757 Use : "approval-rule [remote] [<MR id or branch>]" ,
5858 Aliases : []string {},
5959 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"` ),
6165 PersistentPreRun : labPersistentPreRun ,
6266 Run : func (cmd * cobra.Command , args []string ) {
6367 rn , id , err := parseArgsWithGitBranchMR (args )
6468 if err != nil {
6569 log .Fatal (err )
6670 }
6771
68- approvalState , err := lab . GetMRApprovalState ( rn , int ( id ) )
72+ create , err := cmd . Flags (). GetBool ( "create" )
6973 if err != nil {
7074 log .Fatal (err )
7175 }
7276
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+
73130 // 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+ }
75149 },
76150}
77151
78152func 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+
79161 mrCmd .AddCommand (mrApprovalRuleCmd )
80162}
0 commit comments