Skip to content

Commit 00caddc

Browse files
authored
feat!: Add merge queue parameters to repository ruleset (#3253)
Fixes: #3225. BREAKING CHANGE: `NewMergeQueueRule` now takes one parameter: `*MergeQueueRuleParameters`.
1 parent c96ef95 commit 00caddc

File tree

3 files changed

+80
-17
lines changed

3 files changed

+80
-17
lines changed

github/orgs_rules_test.go

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,6 @@ func TestOrganizationsService_CreateOrganizationRuleset_RepoNames(t *testing.T)
123123
{
124124
"type": "deletion"
125125
},
126-
{
127-
"type": "merge_queue"
128-
},
129126
{
130127
"type": "required_linear_history"
131128
},
@@ -241,7 +238,6 @@ func TestOrganizationsService_CreateOrganizationRuleset_RepoNames(t *testing.T)
241238
UpdateAllowsFetchAndMerge: true,
242239
}),
243240
NewDeletionRule(),
244-
NewMergeQueueRule(),
245241
NewRequiredLinearHistoryRule(),
246242
NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{
247243
RequiredDeploymentEnvironments: []string{"test"},
@@ -328,7 +324,6 @@ func TestOrganizationsService_CreateOrganizationRuleset_RepoNames(t *testing.T)
328324
UpdateAllowsFetchAndMerge: true,
329325
}),
330326
NewDeletionRule(),
331-
NewMergeQueueRule(),
332327
NewRequiredLinearHistoryRule(),
333328
NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{
334329
RequiredDeploymentEnvironments: []string{"test"},
@@ -449,9 +444,6 @@ func TestOrganizationsService_CreateOrganizationRuleset_RepoProperty(t *testing.
449444
{
450445
"type": "deletion"
451446
},
452-
{
453-
"type": "merge_queue"
454-
},
455447
{
456448
"type": "required_linear_history"
457449
},
@@ -574,7 +566,6 @@ func TestOrganizationsService_CreateOrganizationRuleset_RepoProperty(t *testing.
574566
UpdateAllowsFetchAndMerge: true,
575567
}),
576568
NewDeletionRule(),
577-
NewMergeQueueRule(),
578569
NewRequiredLinearHistoryRule(),
579570
NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{
580571
RequiredDeploymentEnvironments: []string{"test"},
@@ -668,7 +659,6 @@ func TestOrganizationsService_CreateOrganizationRuleset_RepoProperty(t *testing.
668659
UpdateAllowsFetchAndMerge: true,
669660
}),
670661
NewDeletionRule(),
671-
NewMergeQueueRule(),
672662
NewRequiredLinearHistoryRule(),
673663
NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{
674664
RequiredDeploymentEnvironments: []string{"test"},
@@ -781,9 +771,6 @@ func TestOrganizationsService_CreateOrganizationRuleset_RepoIDs(t *testing.T) {
781771
{
782772
"type": "deletion"
783773
},
784-
{
785-
"type": "merge_queue"
786-
},
787774
{
788775
"type": "required_linear_history"
789776
},
@@ -897,7 +884,6 @@ func TestOrganizationsService_CreateOrganizationRuleset_RepoIDs(t *testing.T) {
897884
UpdateAllowsFetchAndMerge: true,
898885
}),
899886
NewDeletionRule(),
900-
NewMergeQueueRule(),
901887
NewRequiredLinearHistoryRule(),
902888
NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{
903889
RequiredDeploymentEnvironments: []string{"test"},
@@ -982,7 +968,6 @@ func TestOrganizationsService_CreateOrganizationRuleset_RepoIDs(t *testing.T) {
982968
UpdateAllowsFetchAndMerge: true,
983969
}),
984970
NewDeletionRule(),
985-
NewMergeQueueRule(),
986971
NewRequiredLinearHistoryRule(),
987972
NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{
988973
RequiredDeploymentEnvironments: []string{"test"},

github/repos_rules.go

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,19 @@ type RuleRequiredStatusChecks struct {
110110
IntegrationID *int64 `json:"integration_id,omitempty"`
111111
}
112112

113+
// MergeQueueRuleParameters represents the merge_queue rule parameters.
114+
type MergeQueueRuleParameters struct {
115+
CheckResponseTimeoutMinutes int `json:"check_response_timeout_minutes"`
116+
// Possible values for GroupingStrategy are: ALLGREEN, HEADGREEN
117+
GroupingStrategy string `json:"grouping_strategy"`
118+
MaxEntriesToBuild int `json:"max_entries_to_build"`
119+
MaxEntriesToMerge int `json:"max_entries_to_merge"`
120+
// Possible values for MergeMethod are: MERGE, SQUASH, REBASE
121+
MergeMethod string `json:"merge_method"`
122+
MinEntriesToMerge int `json:"min_entries_to_merge"`
123+
MinEntriesToMergeWaitMinutes int `json:"min_entries_to_merge_wait_minutes"`
124+
}
125+
113126
// RequiredStatusChecksRuleParameters represents the required_status_checks rule parameters.
114127
type RequiredStatusChecksRuleParameters struct {
115128
DoNotEnforceOnCreate bool `json:"do_not_enforce_on_create"`
@@ -154,7 +167,7 @@ func (r *RepositoryRule) UnmarshalJSON(data []byte) error {
154167
r.Type = RepositoryRule.Type
155168

156169
switch RepositoryRule.Type {
157-
case "creation", "deletion", "merge_queue", "non_fast_forward", "required_linear_history", "required_signatures":
170+
case "creation", "deletion", "non_fast_forward", "required_linear_history", "required_signatures":
158171
r.Parameters = nil
159172
case "update":
160173
if RepositoryRule.Parameters == nil {
@@ -170,7 +183,20 @@ func (r *RepositoryRule) UnmarshalJSON(data []byte) error {
170183
rawParams := json.RawMessage(bytes)
171184

172185
r.Parameters = &rawParams
186+
case "merge_queue":
187+
if RepositoryRule.Parameters == nil {
188+
r.Parameters = nil
189+
return nil
190+
}
191+
params := MergeQueueRuleParameters{}
192+
if err := json.Unmarshal(*RepositoryRule.Parameters, &params); err != nil {
193+
return err
194+
}
195+
196+
bytes, _ := json.Marshal(params)
197+
rawParams := json.RawMessage(bytes)
173198

199+
r.Parameters = &rawParams
174200
case "required_deployments":
175201
params := RequiredDeploymentEnvironmentsRuleParameters{}
176202
if err := json.Unmarshal(*RepositoryRule.Parameters, &params); err != nil {
@@ -240,7 +266,17 @@ func (r *RepositoryRule) UnmarshalJSON(data []byte) error {
240266
}
241267

242268
// NewMergeQueueRule creates a rule to only allow merges via a merge queue.
243-
func NewMergeQueueRule() (rule *RepositoryRule) {
269+
func NewMergeQueueRule(params *MergeQueueRuleParameters) (rule *RepositoryRule) {
270+
if params != nil {
271+
bytes, _ := json.Marshal(params)
272+
273+
rawParams := json.RawMessage(bytes)
274+
275+
return &RepositoryRule{
276+
Type: "merge_queue",
277+
Parameters: &rawParams,
278+
}
279+
}
244280
return &RepositoryRule{
245281
Type: "merge_queue",
246282
}

github/repos_rules_test.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,48 @@ func TestRepositoryRule_UnmarshalJSON(t *testing.T) {
7474
Parameters: nil,
7575
},
7676
},
77+
"Valid merge_queue with params": {
78+
data: `{
79+
"type":"merge_queue",
80+
"parameters":{
81+
"check_response_timeout_minutes": 35,
82+
"grouping_strategy": "HEADGREEN",
83+
"max_entries_to_build": 8,
84+
"max_entries_to_merge": 4,
85+
"merge_method": "SQUASH",
86+
"min_entries_to_merge": 2,
87+
"min_entries_to_merge_wait_minutes": 13
88+
}
89+
}`,
90+
want: NewMergeQueueRule(&MergeQueueRuleParameters{
91+
CheckResponseTimeoutMinutes: 35,
92+
GroupingStrategy: "HEADGREEN",
93+
MaxEntriesToBuild: 8,
94+
MaxEntriesToMerge: 4,
95+
MergeMethod: "SQUASH",
96+
MinEntriesToMerge: 2,
97+
MinEntriesToMergeWaitMinutes: 13,
98+
}),
99+
},
100+
"Invalid merge_queue with params": {
101+
data: `{
102+
"type":"merge_queue",
103+
"parameters":{
104+
"check_response_timeout_minutes": "35",
105+
"grouping_strategy": "HEADGREEN",
106+
"max_entries_to_build": "8",
107+
"max_entries_to_merge": "4",
108+
"merge_method": "SQUASH",
109+
"min_entries_to_merge": "2",
110+
"min_entries_to_merge_wait_minutes": "13"
111+
}
112+
}`,
113+
want: &RepositoryRule{
114+
Type: "merge_queue",
115+
Parameters: nil,
116+
},
117+
wantErr: true,
118+
},
77119
"Valid non_fast_forward": {
78120
data: `{"type":"non_fast_forward"}`,
79121
want: &RepositoryRule{

0 commit comments

Comments
 (0)