Loading projects.go +3 −0 Changes for projects.go: 3 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -510,6 +510,7 @@ type Project struct { MergePipelinesEnabled bool `json:"merge_pipelines_enabled"` MergeTrainsEnabled bool `json:"merge_trains_enabled"` MergeTrainsSkipTrainAllowed bool `json:"merge_trains_skip_train_allowed"` MergeTrainEnforcement MergeTrainEnforcementValue `json:"merge_train_enforcement"` CIPipelineVariablesMinimumOverrideRole CIPipelineVariablesMinimumOverrideRoleValue `json:"ci_pipeline_variables_minimum_override_role"` MergeCommitTemplate string `json:"merge_commit_template"` SquashCommitTemplate string `json:"squash_commit_template"` Loading Loading @@ -938,6 +939,7 @@ type CreateProjectOptions struct { MergeMethod *MergeMethodValue `url:"merge_method,omitempty" json:"merge_method,omitempty"` MergePipelinesEnabled *bool `url:"merge_pipelines_enabled,omitempty" json:"merge_pipelines_enabled,omitempty"` MergeRequestsAccessLevel *AccessControlValue `url:"merge_requests_access_level,omitempty" json:"merge_requests_access_level,omitempty"` MergeTrainEnforcement *MergeTrainEnforcementValue `url:"merge_train_enforcement,omitempty" json:"merge_train_enforcement,omitempty"` MergeTrainsEnabled *bool `url:"merge_trains_enabled,omitempty" json:"merge_trains_enabled,omitempty"` MergeTrainsSkipTrainAllowed *bool `url:"merge_trains_skip_train_allowed,omitempty" json:"merge_trains_skip_train_allowed,omitempty"` Mirror *bool `url:"mirror,omitempty" json:"mirror,omitempty"` Loading Loading @@ -1146,6 +1148,7 @@ type EditProjectOptions struct { MergePipelinesEnabled *bool `url:"merge_pipelines_enabled,omitempty" json:"merge_pipelines_enabled,omitempty"` MergeRequestsAccessLevel *AccessControlValue `url:"merge_requests_access_level,omitempty" json:"merge_requests_access_level,omitempty"` MergeRequestsTemplate *string `url:"merge_requests_template,omitempty" json:"merge_requests_template,omitempty"` MergeTrainEnforcement *MergeTrainEnforcementValue `url:"merge_train_enforcement,omitempty" json:"merge_train_enforcement,omitempty"` MergeTrainsEnabled *bool `url:"merge_trains_enabled,omitempty" json:"merge_trains_enabled,omitempty"` MergeTrainsSkipTrainAllowed *bool `url:"merge_trains_skip_train_allowed,omitempty" json:"merge_trains_skip_train_allowed,omitempty"` Mirror *bool `url:"mirror,omitempty" json:"mirror,omitempty"` Loading projects_test.go +70 −0 Changes for projects_test.go: 70 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -81,6 +81,17 @@ func TestListProjects(t *testing.T) { `[{"id":1, "automatic_rebase_enabled": false},{"id":2}]`, []*Project{{ID: 1, AutomaticRebaseEnabled: false}, {ID: 2}}, }, { // GIVEN a project response with merge_train_enforcement set // WHEN the response is deserialized // THEN the field should hold the enforcement level "with merge_train_enforcement", `[{"id":1, "merge_train_enforcement": "enforce_for_all_users"},{"id":2}]`, []*Project{ {ID: 1, MergeTrainEnforcement: EnforceForAllUsersMergeTrainEnforcement}, {ID: 2}, }, }, } for _, testCase := range testCases { Loading Loading @@ -542,6 +553,37 @@ func TestEditProjectWithAutomaticRebaseEnabled(t *testing.T) { assert.True(t, project.AutomaticRebaseEnabled) } func TestEditProjectWithMergeTrainEnforcement(t *testing.T) { t.Parallel() mux, client := setup(t) // GIVEN edit options that set the merge train enforcement level opt := &EditProjectOptions{ MergeTrainEnforcement: new(EnforceWithOwnerOverrideMergeTrainEnforcement), } // THEN the enforcement level is sent as merge_train_enforcement mux.HandleFunc("/api/v4/projects/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, http.MethodPut) testBodyJSON(t, r, map[string]any{ "merge_train_enforcement": "enforce_with_owner_override", }) fmt.Fprint(w, `{ "id": 1, "merge_train_enforcement": "enforce_with_owner_override" }`) }) // WHEN the project is edited project, resp, err := client.Projects.EditProject(1, opt) // THEN the enforcement level returned by the API is exposed assert.NoError(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, EnforceWithOwnerOverrideMergeTrainEnforcement, project.MergeTrainEnforcement) } func TestEditProjectContainerExpirationPolicyNameRegex(t *testing.T) { t.Parallel() Loading Loading @@ -639,6 +681,34 @@ func TestCreateProjectContainerExpirationPolicyNameRegex(t *testing.T) { assert.Equal(t, "delete-me", project.ContainerExpirationPolicy.NameRegex) } func TestCreateProjectWithMergeTrainEnforcement(t *testing.T) { t.Parallel() mux, client := setup(t) // GIVEN create options that set the merge train enforcement level opt := &CreateProjectOptions{ Name: new("n"), MergeTrainEnforcement: new(EnforceForAllUsersMergeTrainEnforcement), } // THEN the enforcement level is sent as merge_train_enforcement mux.HandleFunc("/api/v4/projects", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, http.MethodPost) testBodyJSON(t, r, map[string]any{ "name": "n", "merge_train_enforcement": "enforce_for_all_users", }) fmt.Fprint(w, `{"id":1,"merge_train_enforcement":"enforce_for_all_users"}`) }) // WHEN the project is created project, _, err := client.Projects.CreateProject(opt) // THEN the enforcement level returned by the API is exposed assert.NoError(t, err) assert.Equal(t, EnforceForAllUsersMergeTrainEnforcement, project.MergeTrainEnforcement) } func TestListStarredProjects(t *testing.T) { t.Parallel() mux, client := setup(t) Loading types.go +15 −0 Changes for types.go: 15 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -676,6 +676,21 @@ const ( RebaseMerge MergeMethodValue = "rebase_merge" ) // MergeTrainEnforcementValue represents the merge train enforcement level of // a project within GitLab. It has no effect unless merge trains are enabled. // // GitLab API docs: https://docs.gitlab.com/api/projects/ type MergeTrainEnforcementValue string // List of available merge train enforcement values. // // GitLab API docs: https://docs.gitlab.com/api/projects/ const ( AllowBypassMergeTrainEnforcement MergeTrainEnforcementValue = "allow_bypass" EnforceForAllUsersMergeTrainEnforcement MergeTrainEnforcementValue = "enforce_for_all_users" EnforceWithOwnerOverrideMergeTrainEnforcement MergeTrainEnforcementValue = "enforce_with_owner_override" ) // NoteTypeValue represents the type of a Note. type NoteTypeValue string Loading Loading
projects.go +3 −0 Changes for projects.go: 3 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -510,6 +510,7 @@ type Project struct { MergePipelinesEnabled bool `json:"merge_pipelines_enabled"` MergeTrainsEnabled bool `json:"merge_trains_enabled"` MergeTrainsSkipTrainAllowed bool `json:"merge_trains_skip_train_allowed"` MergeTrainEnforcement MergeTrainEnforcementValue `json:"merge_train_enforcement"` CIPipelineVariablesMinimumOverrideRole CIPipelineVariablesMinimumOverrideRoleValue `json:"ci_pipeline_variables_minimum_override_role"` MergeCommitTemplate string `json:"merge_commit_template"` SquashCommitTemplate string `json:"squash_commit_template"` Loading Loading @@ -938,6 +939,7 @@ type CreateProjectOptions struct { MergeMethod *MergeMethodValue `url:"merge_method,omitempty" json:"merge_method,omitempty"` MergePipelinesEnabled *bool `url:"merge_pipelines_enabled,omitempty" json:"merge_pipelines_enabled,omitempty"` MergeRequestsAccessLevel *AccessControlValue `url:"merge_requests_access_level,omitempty" json:"merge_requests_access_level,omitempty"` MergeTrainEnforcement *MergeTrainEnforcementValue `url:"merge_train_enforcement,omitempty" json:"merge_train_enforcement,omitempty"` MergeTrainsEnabled *bool `url:"merge_trains_enabled,omitempty" json:"merge_trains_enabled,omitempty"` MergeTrainsSkipTrainAllowed *bool `url:"merge_trains_skip_train_allowed,omitempty" json:"merge_trains_skip_train_allowed,omitempty"` Mirror *bool `url:"mirror,omitempty" json:"mirror,omitempty"` Loading Loading @@ -1146,6 +1148,7 @@ type EditProjectOptions struct { MergePipelinesEnabled *bool `url:"merge_pipelines_enabled,omitempty" json:"merge_pipelines_enabled,omitempty"` MergeRequestsAccessLevel *AccessControlValue `url:"merge_requests_access_level,omitempty" json:"merge_requests_access_level,omitempty"` MergeRequestsTemplate *string `url:"merge_requests_template,omitempty" json:"merge_requests_template,omitempty"` MergeTrainEnforcement *MergeTrainEnforcementValue `url:"merge_train_enforcement,omitempty" json:"merge_train_enforcement,omitempty"` MergeTrainsEnabled *bool `url:"merge_trains_enabled,omitempty" json:"merge_trains_enabled,omitempty"` MergeTrainsSkipTrainAllowed *bool `url:"merge_trains_skip_train_allowed,omitempty" json:"merge_trains_skip_train_allowed,omitempty"` Mirror *bool `url:"mirror,omitempty" json:"mirror,omitempty"` Loading
projects_test.go +70 −0 Changes for projects_test.go: 70 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -81,6 +81,17 @@ func TestListProjects(t *testing.T) { `[{"id":1, "automatic_rebase_enabled": false},{"id":2}]`, []*Project{{ID: 1, AutomaticRebaseEnabled: false}, {ID: 2}}, }, { // GIVEN a project response with merge_train_enforcement set // WHEN the response is deserialized // THEN the field should hold the enforcement level "with merge_train_enforcement", `[{"id":1, "merge_train_enforcement": "enforce_for_all_users"},{"id":2}]`, []*Project{ {ID: 1, MergeTrainEnforcement: EnforceForAllUsersMergeTrainEnforcement}, {ID: 2}, }, }, } for _, testCase := range testCases { Loading Loading @@ -542,6 +553,37 @@ func TestEditProjectWithAutomaticRebaseEnabled(t *testing.T) { assert.True(t, project.AutomaticRebaseEnabled) } func TestEditProjectWithMergeTrainEnforcement(t *testing.T) { t.Parallel() mux, client := setup(t) // GIVEN edit options that set the merge train enforcement level opt := &EditProjectOptions{ MergeTrainEnforcement: new(EnforceWithOwnerOverrideMergeTrainEnforcement), } // THEN the enforcement level is sent as merge_train_enforcement mux.HandleFunc("/api/v4/projects/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, http.MethodPut) testBodyJSON(t, r, map[string]any{ "merge_train_enforcement": "enforce_with_owner_override", }) fmt.Fprint(w, `{ "id": 1, "merge_train_enforcement": "enforce_with_owner_override" }`) }) // WHEN the project is edited project, resp, err := client.Projects.EditProject(1, opt) // THEN the enforcement level returned by the API is exposed assert.NoError(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) assert.Equal(t, EnforceWithOwnerOverrideMergeTrainEnforcement, project.MergeTrainEnforcement) } func TestEditProjectContainerExpirationPolicyNameRegex(t *testing.T) { t.Parallel() Loading Loading @@ -639,6 +681,34 @@ func TestCreateProjectContainerExpirationPolicyNameRegex(t *testing.T) { assert.Equal(t, "delete-me", project.ContainerExpirationPolicy.NameRegex) } func TestCreateProjectWithMergeTrainEnforcement(t *testing.T) { t.Parallel() mux, client := setup(t) // GIVEN create options that set the merge train enforcement level opt := &CreateProjectOptions{ Name: new("n"), MergeTrainEnforcement: new(EnforceForAllUsersMergeTrainEnforcement), } // THEN the enforcement level is sent as merge_train_enforcement mux.HandleFunc("/api/v4/projects", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, http.MethodPost) testBodyJSON(t, r, map[string]any{ "name": "n", "merge_train_enforcement": "enforce_for_all_users", }) fmt.Fprint(w, `{"id":1,"merge_train_enforcement":"enforce_for_all_users"}`) }) // WHEN the project is created project, _, err := client.Projects.CreateProject(opt) // THEN the enforcement level returned by the API is exposed assert.NoError(t, err) assert.Equal(t, EnforceForAllUsersMergeTrainEnforcement, project.MergeTrainEnforcement) } func TestListStarredProjects(t *testing.T) { t.Parallel() mux, client := setup(t) Loading
types.go +15 −0 Changes for types.go: 15 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -676,6 +676,21 @@ const ( RebaseMerge MergeMethodValue = "rebase_merge" ) // MergeTrainEnforcementValue represents the merge train enforcement level of // a project within GitLab. It has no effect unless merge trains are enabled. // // GitLab API docs: https://docs.gitlab.com/api/projects/ type MergeTrainEnforcementValue string // List of available merge train enforcement values. // // GitLab API docs: https://docs.gitlab.com/api/projects/ const ( AllowBypassMergeTrainEnforcement MergeTrainEnforcementValue = "allow_bypass" EnforceForAllUsersMergeTrainEnforcement MergeTrainEnforcementValue = "enforce_for_all_users" EnforceWithOwnerOverrideMergeTrainEnforcement MergeTrainEnforcementValue = "enforce_with_owner_override" ) // NoteTypeValue represents the type of a Note. type NoteTypeValue string Loading