Repository: xanzy/go-gitlab
Pull request #718 (2019-10-22 04:12:21)

Update MergeEvent changes struct

nauxliu: @svanharmelen 

Here is a merge request webhook request:

```json
{
    "object_kind":"merge_request",
    "event_type":"merge_request",
    "user":{
        "name":"Xiangxuan Liu",
        "username":"NauxLiu",
        "avatar_url":"https://assets.gitlab-static.net/uploads/-/system/user/avatar/363406/avatar.png"
    },
    "project":{
        "id":4184318,
        "name":"test",
        "description":"",
        "web_url":"https://gitlab.com/NauxLiu/test",
        "avatar_url":null,
        "git_ssh_url":"git@gitlab.com:NauxLiu/test.git",
        "git_http_url":"https://gitlab.com/NauxLiu/test.git",
        "namespace":"Xiangxuan Liu",
        "visibility_level":0,
        "path_with_namespace":"NauxLiu/test",
        "default_branch":"master",
        "ci_config_path":null,
        "homepage":"https://gitlab.com/NauxLiu/test",
        "url":"git@gitlab.com:NauxLiu/test.git",
        "ssh_url":"git@gitlab.com:NauxLiu/test.git",
        "http_url":"https://gitlab.com/NauxLiu/test.git"
    },
    "object_attributes":{
        "assignee_id":363406,
        "author_id":363406,
        "created_at":"2019-10-23 06:37:28 UTC",
        "description":"foobar",
        "head_pipeline_id":null,
        "id":40352048,
        "iid":1,
        "last_edited_at":null,
        "last_edited_by_id":null,
        "merge_commit_sha":null,
        "merge_error":null,
        "merge_params":{
            "force_remove_source_branch":"1"
        },
        "merge_status":"unchecked",
        "merge_user_id":null,
        "merge_when_pipeline_succeeds":false,
        "milestone_id":null,
        "source_branch":"test",
        "source_project_id":4184318,
        "state":"opened",
        "target_branch":"master",
        "target_project_id":4184318,
        "time_estimate":0,
        "title":"WIP: Test",
        "updated_at":"2019-10-23 06:37:28 UTC",
        "updated_by_id":null,
        "url":"https://gitlab.com/NauxLiu/test/merge_requests/1",
        "source":{
            "id":4184318,
            "name":"test",
            "description":"",
            "web_url":"https://gitlab.com/NauxLiu/test",
            "avatar_url":null,
            "git_ssh_url":"git@gitlab.com:NauxLiu/test.git",
            "git_http_url":"https://gitlab.com/NauxLiu/test.git",
            "namespace":"Xiangxuan Liu",
            "visibility_level":0,
            "path_with_namespace":"NauxLiu/test",
            "default_branch":"master",
            "ci_config_path":null,
            "homepage":"https://gitlab.com/NauxLiu/test",
            "url":"git@gitlab.com:NauxLiu/test.git",
            "ssh_url":"git@gitlab.com:NauxLiu/test.git",
            "http_url":"https://gitlab.com/NauxLiu/test.git"
        },
        "target":{
            "id":4184318,
            "name":"test",
            "description":"",
            "web_url":"https://gitlab.com/NauxLiu/test",
            "avatar_url":null,
            "git_ssh_url":"git@gitlab.com:NauxLiu/test.git",
            "git_http_url":"https://gitlab.com/NauxLiu/test.git",
            "namespace":"Xiangxuan Liu",
            "visibility_level":0,
            "path_with_namespace":"NauxLiu/test",
            "default_branch":"master",
            "ci_config_path":null,
            "homepage":"https://gitlab.com/NauxLiu/test",
            "url":"git@gitlab.com:NauxLiu/test.git",
            "ssh_url":"git@gitlab.com:NauxLiu/test.git",
            "http_url":"https://gitlab.com/NauxLiu/test.git"
        },
        "last_commit":{
            "id":"110bdaed3a35a320bd0ba929239f9323b9cd7d53",
            "message":"Add new file",
            "timestamp":"2017-09-19T10:51:50Z",
            "url":"https://gitlab.com/NauxLiu/test/commit/110bdaed3a35a320bd0ba929239f9323b9cd7d53",
            "author":{
                "name":"刘相轩",
                "email":"nauxliu@gmail.com"
            }
        },
        "work_in_progress":true,
        "total_time_spent":0,
        "human_total_time_spent":null,
        "human_time_estimate":null,
        "assignee_ids":[
            363406
        ],
        "action":"open"
    },
    "labels":[

    ],
    "changes":{
        "author_id":{
            "previous":null,
            "current":363406
        },
        "created_at":{
            "previous":null,
            "current":"2019-10-23 06:37:28 UTC"
        },
        "description":{
            "previous":null,
            "current":"foobar"
        },
        "id":{
            "previous":null,
            "current":40352048
        },
        "iid":{
            "previous":null,
            "current":1
        },
        "merge_params":{
            "previous":{

            },
            "current":{
                "force_remove_source_branch":"1"
            }
        },
        "source_branch":{
            "previous":null,
            "current":"test"
        },
        "source_project_id":{
            "previous":null,
            "current":4184318
        },
        "target_branch":{
            "previous":null,
            "current":"master"
        },
        "target_project_id":{
            "previous":null,
            "current":4184318
        },
        "title":{
            "previous":null,
            "current":"WIP: Test"
        },
        "updated_at":{
            "previous":null,
            "current":"2019-10-23 06:37:28 UTC"
        },
        "assignees":{
            "previous":[

            ],
            "current":[
                {
                    "name":"Xiangxuan Liu",
                    "username":"NauxLiu",
                    "avatar_url":"https://assets.gitlab-static.net/uploads/-/system/user/avatar/363406/avatar.png"
                }
            ]
        },
        "total_time_spent":{
            "previous":null,
            "current":0
        }
    },
    "repository":{
        "name":"test",
        "url":"git@gitlab.com:NauxLiu/test.git",
        "description":"",
        "homepage":"https://gitlab.com/NauxLiu/test"
    },
    "assignees":[
        {
            "name":"Xiangxuan Liu",
            "username":"NauxLiu",
            "avatar_url":"https://assets.gitlab-static.net/uploads/-/system/user/avatar/363406/avatar.png"
        }
    ]
}
```
svanharmelen: Thanks @nauxliu. It looks like that response uses a slightly different format as it still contains a previous and current list which you didn't add in your PR:

```
 "assignees":{
            "previous":[

            ],
            "current":[
                {
                    "name":"Xiangxuan Liu",
                    "username":"NauxLiu",
                    "avatar_url":"https://assets.gitlab-static.net/uploads/-/system/user/avatar/363406/avatar.png"
                }
            ]
        },
```
nauxliu: Oops, my mistake.

Patch:
diff --git a/branches.go b/branches.go
index e61ddfe..bc5cdbe 100644
--- a/branches.go
+++ b/branches.go
@@ -50,10 +50,7 @@ func (b Branch) String() string {
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ce/api/branches.html#list-repository-branches
-type ListBranchesOptions struct {
-	ListOptions
-	Search *string `url:"search,omitempty" json:"search,omitempty"`
-}
+type ListBranchesOptions ListOptions
 
 // ListBranches gets a list of repository branches from a project, sorted by
 // name alphabetically.
diff --git a/event_types.go b/event_types.go
index b4f4863..ae1c125 100644
--- a/event_types.go
+++ b/event_types.go
@@ -561,28 +561,20 @@ type MergeEvent struct {
 				Email string `json:"email"`
 			} `json:"author"`
 		} `json:"last_commit"`
-		WorkInProgress bool   `json:"work_in_progress"`
-		URL            string `json:"url"`
-		Action         string `json:"action"`
-		OldRev         string `json:"oldrev"`
-		Assignee       struct {
-			Name      string `json:"name"`
-			Username  string `json:"username"`
-			AvatarURL string `json:"avatar_url"`
-		} `json:"assignee"`
+		WorkInProgress bool          `json:"work_in_progress"`
+		URL            string        `json:"url"`
+		Action         string        `json:"action"`
+		OldRev         string        `json:"oldrev"`
+		Assignee       MergeAssignee `json:"assignee"`
 	} `json:"object_attributes"`
-	Repository *Repository `json:"repository"`
-	Assignee   struct {
-		Name      string `json:"name"`
-		Username  string `json:"username"`
-		AvatarURL string `json:"avatar_url"`
-	} `json:"assignee"`
-	Labels  []Label `json:"labels"`
-	Changes struct {
-		AssigneeID struct {
-			Previous int `json:"previous"`
-			Current  int `json:"current"`
-		} `json:"assignee_id"`
+	Repository *Repository   `json:"repository"`
+	Assignee   MergeAssignee `json:"assignee"`
+	Labels     []Label       `json:"labels"`
+	Changes    struct {
+		Assignees struct {
+			Previous []MergeAssignee `json:"previous"`
+			Current  []MergeAssignee `json:"current"`
+		} `json:"assignees"`
 		Description struct {
 			Previous string `json:"previous"`
 			Current  string `json:"current"`
@@ -591,17 +583,39 @@ type MergeEvent struct {
 			Previous []Label `json:"previous"`
 			Current  []Label `json:"current"`
 		} `json:"labels"`
-		UpdatedByID struct {
+		SourceBranch struct {
+			Previous string `json:"previous"`
+			Current  string `json:"current"`
+		} `json:"source_branch"`
+		SourceProjectId struct {
 			Previous int `json:"previous"`
 			Current  int `json:"current"`
-		} `json:"updated_by_id"`
+		} `json:"source_project_id"`
+		TargetBranch struct {
+			Previous string `json:"previous"`
+			Current  string `json:"current"`
+		} `json:"target_branch"`
+		TargetProjectId struct {
+			Previous int `json:"previous"`
+			Current  int `json:"current"`
+		} `json:"target_project_id"`
 		Title struct {
 			Previous string `json:"previous"`
 			Current  string `json:"current"`
 		} `json:"title"`
+		UpdatedByID struct {
+			Previous int `json:"previous"`
+			Current  int `json:"current"`
+		} `json:"updated_by_id"`
 	} `json:"changes"`
 }
 
+type MergeAssignee struct {
+	Name      string `json:"name"`
+	Username  string `json:"username"`
+	AvatarURL string `json:"avatar_url"`
+}
+
 // MergeParams represents the merge params.
 type MergeParams struct {
 	ForceRemoveSourceBranch bool `json:"force_remove_source_branch"`
diff --git a/gitlab.go b/gitlab.go
index df04414..7b0dfc6 100644
--- a/gitlab.go
+++ b/gitlab.go
@@ -87,7 +87,6 @@ const (
 	Failed   BuildStateValue = "failed"
 	Canceled BuildStateValue = "canceled"
 	Skipped  BuildStateValue = "skipped"
-	Manual   BuildStateValue = "manual"
 )
 
 // ISOTime represents an ISO 8601 formatted date
diff --git a/merge_request_approvals.go b/merge_request_approvals.go
index c11fe35..e4057c1 100644
--- a/merge_request_approvals.go
+++ b/merge_request_approvals.go
@@ -161,8 +161,8 @@ func (s *MergeRequestApprovalsService) ChangeApprovalConfiguration(pid interface
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-allowed-approvers-for-merge-request
 type ChangeMergeRequestAllowedApproversOptions struct {
-	ApproverIDs      []int `url:"approver_ids" json:"approver_ids"`
-	ApproverGroupIDs []int `url:"approver_group_ids" json:"approver_group_ids"`
+	ApproverIDs      []int `url:"approver_ids,omitempty" json:"approver_ids,omitempty"`
+	ApproverGroupIDs []int `url:"approver_group_ids,omitempty" json:"approver_group_ids,omitempty"`
 }
 
 // ChangeAllowedApprovers updates the approvers for a merge request.
diff --git a/pipeline_schedules.go b/pipeline_schedules.go
index ebcf829..3790ea3 100644
--- a/pipeline_schedules.go
+++ b/pipeline_schedules.go
@@ -236,9 +236,8 @@ func (s *PipelineSchedulesService) DeletePipelineSchedule(pid interface{}, sched
 // GitLab API docs:
 // https://docs.gitlab.com/ce/api/pipeline_schedules.html#create-a-new-pipeline-schedule
 type CreatePipelineScheduleVariableOptions struct {
-	Key          *string `url:"key" json:"key"`
-	Value        *string `url:"value" json:"value"`
-	VariableType *string `url:"variable_type,omitempty" json:"variable_type,omitempty"`
+	Key   *string `url:"key" json:"key"`
+	Value *string `url:"value" json:"value"`
 }
 
 // CreatePipelineScheduleVariable creates a pipeline schedule variable.
@@ -272,8 +271,7 @@ func (s *PipelineSchedulesService) CreatePipelineScheduleVariable(pid interface{
 // GitLab API docs:
 // https://docs.gitlab.com/ce/api/pipeline_schedules.html#edit-a-pipeline-schedule-variable
 type EditPipelineScheduleVariableOptions struct {
-	Value        *string `url:"value" json:"value"`
-	VariableType *string `url:"variable_type,omitempty" json:"variable_type,omitempty"`
+	Value *string `url:"value" json:"value"`
 }
 
 // EditPipelineScheduleVariable creates a pipeline schedule variable.
diff --git a/pipelines.go b/pipelines.go
index 972a5b6..bf3f814 100644
--- a/pipelines.go
+++ b/pipelines.go
@@ -33,9 +33,8 @@ type PipelinesService struct {
 //
 // GitLab API docs: https://docs.gitlab.com/ce/api/pipelines.html
 type PipelineVariable struct {
-	Key          string `json:"key"`
-	Value        string `json:"value"`
-	VariableType string `json:"variable_type"`
+	Key   string `json:"key"`
+	Value string `json:"value"`
 }
 
 // Pipeline represents a GitLab pipeline.
diff --git a/projects.go b/projects.go
index 04c3c89..90453b0 100644
--- a/projects.go
+++ b/projects.go
@@ -184,25 +184,6 @@ func (s Project) String() string {
 	return Stringify(s)
 }
 
-// ProjectApprovalRule represents a GitLab project approval rule.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-project-level-rules
-type ProjectApprovalRule struct {
-	ID                   int          `json:"id"`
-	Name                 string       `json:"name"`
-	RuleType             string       `json:"rule_type"`
-	EligibleApprovers    []*BasicUser `json:"eligible_approvers"`
-	ApprovalsRequired    int          `json:"approvals_required"`
-	Users                []*BasicUser `json:"users"`
-	Groups               []*Group     `json:"groups"`
-	ContainsHiddenGroups bool         `json:"contains_hidden_groups"`
-}
-
-func (s ProjectApprovalRule) String() string {
-	return Stringify(s)
-}
-
 // ListProjectsOptions represents the available ListProjects() options.
 //
 // GitLab API docs: https://docs.gitlab.com/ce/api/projects.html#list-projects
@@ -1334,132 +1315,14 @@ func (s *ProjectsService) ChangeApprovalConfiguration(pid interface{}, opt *Chan
 	return pa, resp, err
 }
 
-// GetProjectApprovalRules looks up the list of project level approvers.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/merge_request_approvals.html#get-project-level-rules
-func (s *ProjectsService) GetProjectApprovalRules(pid interface{}, options ...OptionFunc) ([]*ProjectApprovalRule, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/approval_rules", pathEscape(project))
-
-	req, err := s.client.NewRequest("GET", u, nil, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	var par []*ProjectApprovalRule
-	resp, err := s.client.Do(req, &par)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return par, resp, err
-}
-
-// CreateProjectLevelRuleOptions represents the available CreateProjectApprovalRule()
-// options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/merge_request_approvals.html#create-project-level-rules
-type CreateProjectLevelRuleOptions struct {
-	Name              *string `url:"name,omitempty" json:"name,omitempty"`
-	ApprovalsRequired *int    `url:"approvals_required,omitempty" json:"approvals_required,omitempty"`
-	UserIDs           []int   `url:"user_ids,omitempty" json:"user_ids,omitempty"`
-	GroupIDs          []int   `url:"group_ids,omitempty" json:"group_ids,omitempty"`
-}
-
-// CreateProjectApprovalRule creates a new project-level approval rule.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/merge_request_approvals.html#create-project-level-rules
-func (s *ProjectsService) CreateProjectApprovalRule(pid interface{}, opt *CreateProjectLevelRuleOptions, options ...OptionFunc) (*ProjectApprovalRule, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/approval_rules", pathEscape(project))
-
-	req, err := s.client.NewRequest("POST", u, opt, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	par := new(ProjectApprovalRule)
-	resp, err := s.client.Do(req, &par)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return par, resp, err
-}
-
-// UpdateProjectLevelRuleOptions represents the available UpdateProjectApprovalRule()
-// options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/merge_request_approvals.html#update-project-level-rules
-type UpdateProjectLevelRuleOptions struct {
-	Name              *string `url:"name,omitempty" json:"name,omitempty"`
-	ApprovalsRequired *int    `url:"approvals_required,omitempty" json:"approvals_required,omitempty"`
-	UserIDs           []int   `url:"user_ids,omitempty" json:"user_ids,omitempty"`
-	GroupIDs          []int   `url:"group_ids,omitempty" json:"group_ids,omitempty"`
-}
-
-// UpdateProjectApprovalRule updates an existing approval rule with new options.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/merge_request_approvals.html#update-project-level-rules
-func (s *ProjectsService) UpdateProjectApprovalRule(pid interface{}, approvalRule int, opt *UpdateProjectLevelRuleOptions, options ...OptionFunc) (*ProjectApprovalRule, *Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, nil, err
-	}
-	u := fmt.Sprintf("projects/%s/approval_rules/%d", pathEscape(project), approvalRule)
-
-	req, err := s.client.NewRequest("PUT", u, opt, options)
-	if err != nil {
-		return nil, nil, err
-	}
-
-	par := new(ProjectApprovalRule)
-	resp, err := s.client.Do(req, &par)
-	if err != nil {
-		return nil, resp, err
-	}
-
-	return par, resp, err
-}
-
-// DeleteProjectApprovalRule deletes a project-level approval rule.
-//
-// GitLab API docs:
-// https://docs.gitlab.com/ee/api/merge_request_approvals.html#delete-project-level-rules
-func (s *ProjectsService) DeleteProjectApprovalRule(pid interface{}, approvalRule int, options ...OptionFunc) (*Response, error) {
-	project, err := parseID(pid)
-	if err != nil {
-		return nil, err
-	}
-	u := fmt.Sprintf("projects/%s/approval_rules/%d", pathEscape(project), approvalRule)
-
-	req, err := s.client.NewRequest("DELETE", u, nil, options)
-	if err != nil {
-		return nil, err
-	}
-
-	return s.client.Do(req, nil)
-}
-
 // ChangeAllowedApproversOptions represents the available ChangeAllowedApprovers()
 // options.
 //
 // GitLab API docs:
 // https://docs.gitlab.com/ee/api/merge_request_approvals.html#change-allowed-approvers
 type ChangeAllowedApproversOptions struct {
-	ApproverIDs      []int `url:"approver_ids,omitempty" json:"approver_ids,omitempty"`
-	ApproverGroupIDs []int `url:"approver_group_ids,omitempty" json:"approver_group_ids,omitempty"`
+	ApproverIDs      []*int `url:"approver_ids" json:"approver_ids"`
+	ApproverGroupIDs []*int `url:"approver_group_ids" json:"approver_group_ids"`
 }
 
 // ChangeAllowedApprovers updates the list of approvers and approver groups.
diff --git a/repository_files.go b/repository_files.go
index 2614931..fa97bf5 100644
--- a/repository_files.go
+++ b/repository_files.go
@@ -43,7 +43,6 @@ type File struct {
 	Ref      string `json:"ref"`
 	BlobID   string `json:"blob_id"`
 	CommitID string `json:"commit_id"`
-	SHA256   string `json:"content_sha256"`
 }
 
 func (r File) String() string {
@@ -129,7 +128,6 @@ func (s *RepositoryFilesService) GetFileMetaData(pid interface{}, fileName strin
 		FileName: resp.Header.Get("X-Gitlab-File-Name"),
 		FilePath: resp.Header.Get("X-Gitlab-File-Path"),
 		Ref:      resp.Header.Get("X-Gitlab-Ref"),
-		SHA256:   resp.Header.Get("X-Gitlab-Content-Sha256"),
 	}
 
 	if sizeString := resp.Header.Get("X-Gitlab-Size"); sizeString != "" {
diff --git a/settings.go b/settings.go
index c25b28a..2bbc087 100644
--- a/settings.go
+++ b/settings.go
@@ -30,171 +30,100 @@ type SettingsService struct {
 //
 // GitLab API docs: https://docs.gitlab.com/ce/api/settings.html
 type Settings struct {
-	ID                                        int               `json:"id"`
-	CreatedAt                                 *time.Time        `json:"created_at"`
-	UpdatedAt                                 *time.Time        `json:"updated_at"`
-	AdminNotificationEmail                    string            `json:"admin_notification_email"`
-	AfterSignOutPath                          string            `json:"after_sign_out_path"`
-	AfterSignUpText                           string            `json:"after_sign_up_text"`
-	AkismetAPIKey                             string            `json:"akismet_api_key"`
-	AkismetEnabled                            bool              `json:"akismet_enabled"`
-	AllowGroupOwnersToManageLDAP              bool              `json:"allow_group_owners_to_manage_ldap"`
-	AllowLocalRequestsFromHooksAndServices    bool              `json:"allow_local_requests_from_hooks_and_services"`
-	AllowLocalRequestsFromSystemHooks         bool              `json:"allow_local_requests_from_system_hooks"`
-	AllowLocalRequestsFromWebHooksAndServices bool              `json:"allow_local_requests_from_web_hooks_and_services"`
-	ArchiveBuildsInHumanReadable              string            `json:"archive_builds_in_human_readable"`
-	AssetProxyEnabled                         bool              `json:"asset_proxy_enabled"`
-	AssetProxySecretKey                       string            `json:"asset_proxy_secret_key"`
-	AssetProxyURL                             string            `json:"asset_proxy_url"`
-	AssetProxyWhitelist                       []string          `json:"asset_proxy_whitelist"`
-	AuthorizedKeysEnabled                     bool              `json:"authorized_keys_enabled_enabled"`
-	AutoDevOpsDomain                          string            `json:"auto_devops_domain"`
-	AutoDevOpsEnabled                         bool              `json:"auto_devops_enabled"`
-	CheckNamespacePlan                        bool              `json:"check_namespace_plan"`
-	CommitEmailHostname                       string            `json:"commit_email_hostname"`
-	ContainerRegistryTokenExpireDelay         int               `json:"container_registry_token_expire_delay"`
-	DefaultArtifactsExpireIn                  string            `json:"default_artifacts_expire_in"`
-	DefaultBranchProtection                   int               `json:"default_branch_protection"`
-	DefaultGroupVisibility                    *VisibilityValue  `json:"default_group_visibility"`
-	DefaultProjectCreation                    int               `json:"default_project_creation"`
-	DefaultProjectsLimit                      int               `json:"default_projects_limit"`
-	DefaultProjectVisibility                  *VisibilityValue  `json:"default_project_visibility"`
-	DefaultSnippetVisibility                  *VisibilityValue  `json:"default_snippet_visibility"`
-	DiffMaxPatchBytes                         int               `json:"diff_max_patch_bytes"`
-	DisabledOauthSignInSources                []string          `json:"disabled_oauth_sign_in_sources"`
-	DNSRebindingProtectionEnabled             bool              `json:"dns_rebinding_protection_enabled"`
-	DomainBlacklist                           []string          `json:"domain_blacklist"`
-	DomainBlacklistEnabled                    bool              `json:"domain_blacklist_enabled"`
-	DomainWhitelist                           []string          `json:"domain_whitelist"`
-	DSAKeyRestriction                         int               `json:"dsa_key_restriction"`
-	ECDSAKeyRestriction                       int               `json:"ecdsa_key_restriction"`
-	Ed25519KeyRestriction                     int               `json:"ed25519_key_restriction"`
-	ElasticsearchAWSAccessKey                 string            `json:"elasticsearch_aws_access_key"`
-	ElasticsearchAWS                          bool              `json:"elasticsearch_aws"`
-	ElasticsearchAWSRegion                    string            `json:"elasticsearch_aws_region"`
-	ElasticsearchAWSSecretAccessKey           string            `json:"elasticsearch_aws_secret_access_key"`
-	ElasticsearchIndexing                     bool              `json:"elasticsearch_indexing"`
-	ElasticsearchLimitIndexing                bool              `json:"elasticsearch_limit_indexing"`
-	ElasticsearchNamespaceIDs                 []int             `json:"elasticsearch_namespace_ids"`
-	ElasticsearchProjectIDs                   []int             `json:"elasticsearch_project_ids"`
-	ElasticsearchSearch                       bool              `json:"elasticsearch_search"`
-	ElasticsearchURL                          []string          `json:"elasticsearch_url"`
-	EmailAdditionalText                       string            `json:"email_additional_text"`
-	EmailAuthorInBody                         bool              `json:"email_author_in_body"`
-	EnabledGitAccessProtocol                  string            `json:"enabled_git_access_protocol"`
-	EnforceTerms                              bool              `json:"enforce_terms"`
-	ExternalAuthClientCert                    string            `json:"external_auth_client_cert"`
-	ExternalAuthClientKeyPass                 string            `json:"external_auth_client_key_pass"`
-	ExternalAuthClientKey                     string            `json:"external_auth_client_key"`
-	ExternalAuthorizationServiceDefaultLabel  string            `json:"external_authorization_service_default_label"`
-	ExternalAuthorizationServiceEnabled       bool              `json:"external_authorization_service_enabled"`
-	ExternalAuthorizationServiceTimeout       float64           `json:"external_authorization_service_timeout"`
-	ExternalAuthorizationServiceURL           string            `json:"external_authorization_service_url"`
-	FileTemplateProjectID                     int               `json:"file_template_project_id"`
-	FirstDayOfWeek                            int               `json:"first_day_of_week"`
-	GeoNodeAllowedIPs                         string            `json:"geo_node_allowed_ips"`
-	GeoStatusTimeout                          int               `json:"geo_status_timeout"`
-	GitalyTimeoutDefault                      int               `json:"gitaly_timeout_default"`
-	GitalyTimeoutFast                         int               `json:"gitaly_timeout_fast"`
-	GitalyTimeoutMedium                       int               `json:"gitaly_timeout_medium"`
-	GrafanaEnabled                            bool              `json:"grafana_enabled"`
-	GrafanaURL                                string            `json:"grafana_url"`
-	GravatarEnabled                           bool              `json:"gravatar_enabled"`
-	HashedStorageEnabled                      bool              `json:"hashed_storage_enabled"`
-	HelpPageHideCommercialContent             bool              `json:"help_page_hide_commercial_content"`
-	HelpPageSupportURL                        string            `json:"help_page_support_url"`
-	HelpPageText                              string            `json:"help_page_text"`
-	HelpText                                  string            `json:"help_text"`
-	HideThirdPartyOffers                      bool              `json:"hide_third_party_offers"`
-	HomePageURL                               string            `json:"home_page_url"`
-	HousekeepingBitmapsEnabled                bool              `json:"housekeeping_bitmaps_enabled"`
-	HousekeepingEnabled                       bool              `json:"housekeeping_enabled"`
-	HousekeepingFullRepackPeriod              int               `json:"housekeeping_full_repack_period"`
-	HousekeepingGcPeriod                      int               `json:"housekeeping_gc_period"`
-	HousekeepingIncrementalRepackPeriod       int               `json:"housekeeping_incremental_repack_period"`
-	HTMLEmailsEnabled                         bool              `json:"html_emails_enabled"`
-	ImportSources                             []string          `json:"import_sources"`
-	InstanceStatisticsVisibilityPrivate       bool              `json:"instance_statistics_visibility_private"`
-	LocalMarkdownVersion                      int               `json:"local_markdown_version"`
-	MaxArtifactsSize                          int               `json:"max_artifacts_size"`
-	MaxAttachmentSize                         int               `json:"max_attachment_size"`
-	MaxPagesSize                              int               `json:"max_pages_size"`
-	MetricsEnabled                            bool              `json:"metrics_enabled"`
-	MetricsHost                               string            `json:"metrics_host"`
-	MetricsMethodCallThreshold                int               `json:"metrics_method_call_threshold"`
-	MetricsPacketSize                         int               `json:"metrics_packet_size"`
-	MetricsPoolSize                           int               `json:"metrics_pool_size"`
-	MetricsPort                               int               `json:"metrics_port"`
-	MetricsSampleInterval                     int               `json:"metrics_sample_interval"`
-	MetricsTimeout                            int               `json:"metrics_timeout"`
-	MirrorAvailable                           bool              `json:"mirror_available"`
-	MirrorCapacityThreshold                   int               `json:"mirror_capacity_threshold"`
-	MirrorMaxCapacity                         int               `json:"mirror_max_capacity"`
-	MirrorMaxDelay                            int               `json:"mirror_max_delay"`
-	OutboundLocalRequestsWhitelist            []string          `json:"outbound_local_requests_whitelist"`
-	PagesDomainVerificationEnabled            bool              `json:"pages_domain_verification_enabled"`
-	PasswordAuthenticationEnabledForGit       bool              `json:"password_authentication_enabled_for_git"`
-	PasswordAuthenticationEnabledForWeb       bool              `json:"password_authentication_enabled_for_web"`
-	PerformanceBarAllowedGroupID              string            `json:"performance_bar_allowed_group_id"`
-	PerformanceBarAllowedGroupPath            string            `json:"performance_bar_allowed_group_path"`
-	PerformanceBarEnabled                     bool              `json:"performance_bar_enabled"`
-	PlantumlEnabled                           bool              `json:"plantuml_enabled"`
-	PlantumlURL                               string            `json:"plantuml_url"`
-	PollingIntervalMultiplier                 float64           `json:"polling_interval_multiplier,string"`
-	ProjectExportEnabled                      bool              `json:"project_export_enabled"`
-	PrometheusMetricsEnabled                  bool              `json:"prometheus_metrics_enabled"`
-	ProtectedCIVariables                      bool              `json:"protected_ci_variables"`
-	PseudonymizerEnabled                      bool              `json:"psedonymizer_enabled"`
-	PushEventHooksLimit                       int               `json:"push_event_hooks_limit"`
-	PushEventActivitiesLimit                  int               `json:"push_event_activities_limit"`
-	RecaptchaEnabled                          bool              `json:"recaptcha_enabled"`
-	RecaptchaPrivateKey                       string            `json:"recaptcha_private_key"`
-	RecaptchaSiteKey                          string            `json:"recaptcha_site_key"`
-	ReceiveMaxInputSize                       int               `json:"receive_max_input_size"`
-	RepositoryChecksEnabled                   bool              `json:"repository_checks_enabled"`
-	RepositorySizeLimit                       int               `json:"repository_size_limit"`
-	RepositoryStorages                        []string          `json:"repository_storages"`
-	RequireTwoFactorAuthentication            bool              `json:"require_two_factor_authentication"`
-	RestrictedVisibilityLevels                []VisibilityValue `json:"restricted_visibility_levels"`
-	RsaKeyRestriction                         int               `json:"rsa_key_restriction"`
-	SendUserConfirmationEmail                 bool              `json:"send_user_confirmation_email"`
-	SessionExpireDelay                        int               `json:"session_expire_delay"`
-	SharedRunnersEnabled                      bool              `json:"shared_runners_enabled"`
-	SharedRunnersMinutes                      int               `json:"shared_runners_minutes"`
-	SharedRunnersText                         string            `json:"shared_runners_text"`
-	SignInText                                string            `json:"sign_in_text"`
-	SignupEnabled                             bool              `json:"signup_enabled"`
-	SlackAppEnabled                           bool              `json:"slack_app_enabled"`
-	SlackAppID                                string            `json:"slack_app_id"`
-	SlackAppSecret                            string            `json:"slack_app_secret"`
-	SlackAppVerificationToken                 string            `json:"slack_app_verification_token"`
-	SnowplowCollectorHostname                 string            `json:"snowplow_collector_hostname"`
-	SnowplowCookieDomain                      string            `json:"snowplow_cookie_domain"`
-	SnowplowEnabled                           bool              `json:"snowplow_enabled"`
-	SnowplowSiteID                            string            `json:"snowplow_site_id"`
-	TerminalMaxSessionTime                    int               `json:"terminal_max_session_time"`
-	Terms                                     string            `json:"terms"`
-	ThrottleAuthenticatedAPIEnabled           bool              `json:"throttle_authenticated_api_enabled"`
-	ThrottleAuthenticatedAPIPeriodInSeconds   int               `json:"throttle_authenticated_api_period_in_seconds"`
-	ThrottleAuthenticatedAPIRequestsPerPeriod int               `json:"throttle_authenticated_api_requests_per_period"`
-	ThrottleAuthenticatedWebEnabled           bool              `json:"throttle_authenticated_web_enabled"`
-	ThrottleAuthenticatedWebPeriodInSeconds   int               `json:"throttle_authenticated_web_period_in_seconds"`
-	ThrottleAuthenticatedWebRequestsPerPeriod int               `json:"throttle_authenticated_web_requests_per_period"`
-	ThrottleUnauthenticatedEnabled            bool              `json:"throttle_unauthenticated_enabled"`
-	ThrottleUnauthenticatedPeriodInSeconds    int               `json:"throttle_unauthenticated_period_in_seconds"`
-	ThrottleUnauthenticatedRequestsPerPeriod  int               `json:"throttle_unauthenticated_requests_per_period"`
-	TimeTrackingLimitToHours                  bool              `json:"time_tracking_limit_to_hours"`
-	TwoFactorGracePeriod                      int               `json:"two_factor_grace_period"`
-	UniqueIPsLimitEnabled                     bool              `json:"unique_ips_limit_enabled"`
-	UniqueIPsLimitPerUser                     int               `json:"unique_ips_limit_per_user"`
-	UniqueIPsLimitTimeWindow                  int               `json:"unique_ips_limit_time_window"`
-	UsagePingEnabled                          bool              `json:"usage_ping_enabled"`
-	UserDefaultExternal                       bool              `json:"user_default_external"`
-	UserDefaultInternalRegex                  string            `json:"user_default_internal_regex"`
-	UserOauthApplications                     bool              `json:"user_oauth_applications"`
-	UserShowAddSSHKeyMessage                  bool              `json:"user_show_add_ssh_key_message"`
-	VersionCheckEnabled                       bool              `json:"version_check_enabled"`
-	WebIDEClientsidePreviewEnabled            bool              `json:"web_ide_clientside_preview_enabled"`
+	ID                                  int               `json:"id"`
+	CreatedAt                           *time.Time        `json:"created_at"`
+	UpdatedAt                           *time.Time        `json:"updated_at"`
+	AdminNotificationEmail              string            `json:"admin_notification_email"`
+	AfterSignOutPath                    string            `json:"after_sign_out_path"`
+	AfterSignUpText                     string            `json:"after_sign_up_text"`
+	AkismetAPIKey                       string            `json:"akismet_api_key"`
+	AkismetEnabled                      bool              `json:"akismet_enabled"`
+	CircuitbreakerAccessRetries         int               `json:"circuitbreaker_access_retries"`
+	CircuitbreakerBackoffThreshold      int               `json:"circuitbreaker_backoff_threshold"`
+	CircuitbreakerFailureCountThreshold int               `json:"circuitbreaker_failure_count_threshold"`
+	CircuitbreakerFailureResetTime      int               `json:"circuitbreaker_failure_reset_time"`
+	CircuitbreakerFailureWaitTime       int               `json:"circuitbreaker_failure_wait_time"`
+	CircuitbreakerStorageTimeout        int               `json:"circuitbreaker_storage_timeout"`
+	ClientsideSentryDSN                 string            `json:"clientside_sentry_dsn"`
+	ClientsideSentryEnabled             bool              `json:"clientside_sentry_enabled"`
+	ContainerRegistryTokenExpireDelay   int               `json:"container_registry_token_expire_delay"`
+	DefaultArtifactsExpireIn            string            `json:"default_artifacts_expire_in"`
+	DefaultBranchProtection             int               `json:"default_branch_protection"`
+	DefaultGroupVisibility              string            `json:"default_group_visibility"`
+	DefaultProjectVisibility            string            `json:"default_project_visibility"`
+	DefaultProjectsLimit                int               `json:"default_projects_limit"`
+	DefaultSnippetVisibility            string            `json:"default_snippet_visibility"`
+	DisabledOauthSignInSources          []string          `json:"disabled_oauth_sign_in_sources"`
+	DomainBlacklistEnabled              bool              `json:"domain_blacklist_enabled"`
+	DomainBlacklist                     []string          `json:"domain_blacklist"`
+	DomainWhitelist                     []string          `json:"domain_whitelist"`
+	DSAKeyRestriction                   int               `json:"dsa_key_restriction"`
+	ECDSAKeyRestriction                 int               `json:"ecdsa_key_restriction"`
+	Ed25519KeyRestriction               int               `json:"ed25519_key_restriction"`
+	EmailAuthorInBody                   bool              `json:"email_author_in_body"`
+	EnabledGitAccessProtocol            string            `json:"enabled_git_access_protocol"`
+	GravatarEnabled                     bool              `json:"gravatar_enabled"`
+	HelpPageHideCommercialContent       bool              `json:"help_page_hide_commercial_content"`
+	HelpPageSupportURL                  string            `json:"help_page_support_url"`
+	HomePageURL                         string            `json:"home_page_url"`
+	HousekeepingBitmapsEnabled          bool              `json:"housekeeping_bitmaps_enabled"`
+	HousekeepingEnabled                 bool              `json:"housekeeping_enabled"`
+	HousekeepingFullRepackPeriod        int               `json:"housekeeping_full_repack_period"`
+	HousekeepingGcPeriod                int               `json:"housekeeping_gc_period"`
+	HousekeepingIncrementalRepackPeriod int               `json:"housekeeping_incremental_repack_period"`
+	HTMLEmailsEnabled                   bool              `json:"html_emails_enabled"`
+	ImportSources                       []string          `json:"import_sources"`
+	KodingEnabled                       bool              `json:"koding_enabled"`
+	KodingURL                           string            `json:"koding_url"`
+	LocalMarkdownVersion                int               `json:"local_markdown_version"`
+	MaxArtifactsSize                    int               `json:"max_artifacts_size"`
+	MaxAttachmentSize                   int               `json:"max_attachment_size"`
+	MaxPagesSize                        int               `json:"max_pages_size"`
+	MetricsEnabled                      bool              `json:"metrics_enabled"`
+	MetricsHost                         string            `json:"metrics_host"`
+	MetricsMethodCallThreshold          int               `json:"metrics_method_call_threshold"`
+	MetricsPacketSize                   int               `json:"metrics_packet_size"`
+	MetricsPoolSize                     int               `json:"metrics_pool_size"`
+	MetricsPort                         int               `json:"metrics_port"`
+	MetricsSampleInterval               int               `json:"metrics_sample_interval"`
+	MetricsTimeout                      int               `json:"metrics_timeout"`
+	PasswordAuthenticationEnabledForWeb bool              `json:"password_authentication_enabled_for_web"`
+	PasswordAuthenticationEnabledForGit bool              `json:"password_authentication_enabled_for_git"`
+	PerformanceBarAllowedGroupID        string            `json:"performance_bar_allowed_group_id"`
+	PerformanceBarEnabled               bool              `json:"performance_bar_enabled"`
+	PlantumlEnabled                     bool              `json:"plantuml_enabled"`
+	PlantumlURL                         string            `json:"plantuml_url"`
+	PollingIntervalMultiplier           float64           `json:"polling_interval_multiplier,string"`
+	ProjectExportEnabled                bool              `json:"project_export_enabled"`
+	PrometheusMetricsEnabled            bool              `json:"prometheus_metrics_enabled"`
+	RecaptchaEnabled                    bool              `json:"recaptcha_enabled"`
+	RecaptchaPrivateKey                 string            `json:"recaptcha_private_key"`
+	RecaptchaSiteKey                    string            `json:"recaptcha_site_key"`
+	RepositoryChecksEnabled             bool              `json:"repository_checks_enabled"`
+	RepositoryStorages                  []string          `json:"repository_storages"`
+	RequireTwoFactorAuthentication      bool              `json:"require_two_factor_authentication"`
+	RestrictedVisibilityLevels          []VisibilityValue `json:"restricted_visibility_levels"`
+	RsaKeyRestriction                   int               `json:"rsa_key_restriction"`
+	SendUserConfirmationEmail           bool              `json:"send_user_confirmation_email"`
+	SentryDSN                           string            `json:"sentry_dsn"`
+	SentryEnabled                       bool              `json:"sentry_enabled"`
+	SessionExpireDelay                  int               `json:"session_expire_delay"`
+	SharedRunnersEnabled                bool              `json:"shared_runners_enabled"`
+	SharedRunnersText                   string            `json:"shared_runners_text"`
+	SidekiqThrottlingEnabled            bool              `json:"sidekiq_throttling_enabled"`
+	SidekiqThrottlingFactor             float64           `json:"sidekiq_throttling_factor"`
+	SidekiqThrottlingQueues             []string          `json:"sidekiq_throttling_queues"`
+	SignInText                          string            `json:"sign_in_text"`
+	SignupEnabled                       bool              `json:"signup_enabled"`
+	TerminalMaxSessionTime              int               `json:"terminal_max_session_time"`
+	TwoFactorGracePeriod                int               `json:"two_factor_grace_period"`
+	UniqueIPsLimitEnabled               bool              `json:"unique_ips_limit_enabled"`
+	UniqueIPsLimitPerUser               int               `json:"unique_ips_limit_per_user"`
+	UniqueIPsLimitTimeWindow            int               `json:"unique_ips_limit_time_window"`
+	UsagePingEnabled                    bool              `json:"usage_ping_enabled"`
+	UserDefaultExternal                 bool              `json:"user_default_external"`
+	UserOauthApplications               bool              `json:"user_oauth_applications"`
+	VersionCheckEnabled                 bool              `json:"version_check_enabled"`
 }
 
 func (s Settings) String() string {
@@ -225,168 +154,97 @@ func (s *SettingsService) GetSettings(options ...OptionFunc) (*Settings, *Respon
 // GitLab API docs:
 // https://docs.gitlab.com/ce/api/settings.html#change-application.settings
 type UpdateSettingsOptions struct {
-	AdminNotificationEmail                    *string           `url:"admin_notification_email,omitempty" json:"admin_notification_email,omitempty"`
-	AfterSignOutPath                          *string           `url:"after_sign_out_path,omitempty" json:"after_sign_out_path,omitempty"`
-	AfterSignUpText                           *string           `url:"after_sign_up_text,omitempty" json:"after_sign_up_text,omitempty"`
-	AkismetAPIKey                             *string           `url:"akismet_api_key,omitempty" json:"akismet_api_key,omitempty"`
-	AkismetEnabled                            *bool             `url:"akismet_enabled,omitempty" json:"akismet_enabled,omitempty"`
-	AllowGroupOwnersToManageLDAP              *bool             `url:"allow_group_owners_to_manage_ldap,omitempty" json:"allow_group_owners_to_manage_ldap,omitempty"`
-	AllowLocalRequestsFromHooksAndServices    *bool             `url:"allow_local_requests_from_hooks_and_services,omitempty" json:"allow_local_requests_from_hooks_and_services,omitempty"`
-	AllowLocalRequestsFromSystemHooks         *bool             `url:"allow_local_requests_from_system_hooks,omitempty" json:"allow_local_requests_from_system_hooks,omitempty"`
-	AllowLocalRequestsFromWebHooksAndServices *bool             `url:"allow_local_requests_from_web_hooks_and_services,omitempty" json:"allow_local_requests_from_web_hooks_and_services,omitempty"`
-	ArchiveBuildsInHumanReadable              *string           `url:"archive_builds_in_human_readable,omitempty" json:"archive_builds_in_human_readable,omitempty"`
-	AssetProxyEnabled                         *bool             `url:"asset_proxy_enabled,omitempty" json:"asset_proxy_enabled,omitempty"`
-	AssetProxySecretKey                       *string           `url:"asset_proxy_secret_key,omitempty" json:"asset_proxy_secret_key,omitempty"`
-	AssetProxyURL                             *string           `url:"asset_proxy_url,omitempty" json:"asset_proxy_url,omitempty"`
-	AssetProxyWhitelist                       []string          `url:"asset_proxy_whitelist,omitempty" json:"asset_proxy_whitelist,omitempty"`
-	AuthorizedKeysEnabled                     *bool             `url:"authorized_keys_enabled,omitempty" json:"authorized_keys_enabled,omitempty"`
-	AutoDevOpsDomain                          *string           `url:"auto_devops_domain,omitempty" json:"auto_devops_domain,omitempty"`
-	AutoDevOpsEnabled                         *bool             `url:"auto_devops_enabled,omitempty" json:"auto_devops_enabled,omitempty"`
-	CheckNamespacePlan                        *bool             `url:"check_namespace_plan,omitempty" json:"check_namespace_plan,omitempty"`
-	CommitEmailHostname                       *string           `url:"commit_email_hostname,omitempty" json:"commit_email_hostname,omitempty"`
-	ContainerRegistryTokenExpireDelay         *int              `url:"container_registry_token_expire_delay,omitempty" json:"container_registry_token_expire_delay,omitempty"`
-	DefaultArtifactsExpireIn                  *string           `url:"default_artifacts_expire_in,omitempty" json:"default_artifacts_expire_in,omitempty"`
-	DefaultBranchProtection                   *int              `url:"default_branch_protection,omitempty" json:"default_branch_protection,omitempty"`
-	DefaultGroupVisibility                    *VisibilityValue  `url:"default_group_visibility,omitempty" json:"default_group_visibility,omitempty"`
-	DefaultProjectCreation                    *int              `url:"default_project_creation,omitempty" json:"default_project_creation,omitempty"`
-	DefaultProjectsLimit                      *int              `url:"default_projects_limit,omitempty" json:"default_projects_limit,omitempty"`
-	DefaultProjectVisibility                  *VisibilityValue  `url:"default_project_visibility,omitempty" json:"default_project_visibility,omitempty"`
-	DefaultSnippetVisibility                  *VisibilityValue  `url:"default_snippet_visibility,omitempty" json:"default_snippet_visibility,omitempty"`
-	DiffMaxPatchBytes                         *int              `url:"diff_max_patch_bytes,omitempty" json:"diff_max_patch_bytes,omitempty"`
-	DisabledOauthSignInSources                []string          `url:"disabled_oauth_sign_in_sources,omitempty" json:"disabled_oauth_sign_in_sources,omitempty"`
-	DNSRebindingProtectionEnabled             *bool             `url:"dns_rebinding_protection_enabled,omitempty" json:"dns_rebinding_protection_enabled,omitempty"`
-	DomainBlacklist                           []string          `url:"domain_blacklist,omitempty" json:"domain_blacklist,omitempty"`
-	DomainBlacklistEnabled                    *bool             `url:"domain_blacklist_enabled,omitempty" json:"domain_blacklist_enabled,omitempty"`
-	DomainWhitelist                           []string          `url:"domain_whitelist,omitempty" json:"domain_whitelist,omitempty"`
-	DSAKeyRestriction                         *int              `url:"dsa_key_restriction,omitempty" json:"dsa_key_restriction,omitempty"`
-	ECDSAKeyRestriction                       *int              `url:"ecdsa_key_restriction,omitempty" json:"ecdsa_key_restriction,omitempty"`
-	Ed25519KeyRestriction                     *int              `url:"ed25519_key_restriction,omitempty" json:"ed25519_key_restriction,omitempty"`
-	ElasticsearchAWSAccessKey                 *string           `url:"elasticsearch_aws_access_key,omitempty" json:"elasticsearch_aws_access_key,omitempty"`
-	ElasticsearchAWS                          *bool             `url:"elasticsearch_aws,omitempty" json:"elasticsearch_aws,omitempty"`
-	ElasticsearchAWSRegion                    *string           `url:"elasticsearch_aws_region,omitempty" json:"elasticsearch_aws_region,omitempty"`
-	ElasticsearchAWSSecretAccessKey           *string           `url:"elasticsearch_aws_secret_access_key,omitempty" json:"elasticsearch_aws_secret_access_key,omitempty"`
-	ElasticsearchIndexing                     *bool             `url:"elasticsearch_indexing,omitempty" json:"elasticsearch_indexing,omitempty"`
-	ElasticsearchLimitIndexing                *bool             `url:"elasticsearch_limit_indexing,omitempty" json:"elasticsearch_limit_indexing,omitempty"`
-	ElasticsearchNamespaceIDs                 []int             `url:"elasticsearch_namespace_ids,omitempty" json:"elasticsearch_namespace_ids,omitempty"`
-	ElasticsearchProjectIDs                   []int             `url:"elasticsearch_project_ids,omitempty" json:"elasticsearch_project_ids,omitempty"`
-	ElasticsearchSearch                       *bool             `url:"elasticsearch_search,omitempty" json:"elasticsearch_search,omitempty"`
-	ElasticsearchURL                          *string           `url:"elasticsearch_url,omitempty" json:"elasticsearch_url,omitempty"`
-	EmailAdditionalText                       *string           `url:"email_additional_text,omitempty" json:"email_additional_text,omitempty"`
-	EmailAuthorInBody                         *bool             `url:"email_author_in_body,omitempty" json:"email_author_in_body,omitempty"`
-	EnabledGitAccessProtocol                  *string           `url:"enabled_git_access_protocol,omitempty" json:"enabled_git_access_protocol,omitempty"`
-	EnforceTerms                              *bool             `url:"enforce_terms,omitempty" json:"enforce_terms,omitempty"`
-	ExternalAuthClientCert                    *string           `url:"external_auth_client_cert,omitempty" json:"external_auth_client_cert,omitempty"`
-	ExternalAuthClientKeyPass                 *string           `url:"external_auth_client_key_pass,omitempty" json:"external_auth_client_key_pass,omitempty"`
-	ExternalAuthClientKey                     *string           `url:"external_auth_client_key,omitempty" json:"external_auth_client_key,omitempty"`
-	ExternalAuthorizationServiceDefaultLabel  *string           `url:"external_authorization_service_default_label,omitempty" json:"external_authorization_service_default_label,omitempty"`
-	ExternalAuthorizationServiceEnabled       *bool             `url:"external_authorization_service_enabled,omitempty" json:"external_authorization_service_enabled,omitempty"`
-	ExternalAuthorizationServiceTimeout       *float64          `url:"external_authorization_service_timeout,omitempty" json:"external_authorization_service_timeout,omitempty"`
-	ExternalAuthorizationServiceURL           *string           `url:"external_authorization_service_url,omitempty" json:"external_authorization_service_url,omitempty"`
-	FileTemplateProjectID                     *int              `url:"file_template_project_id,omitempty" json:"file_template_project_id,omitempty"`
-	FirstDayOfWeek                            *int              `url:"first_day_of_week,omitempty" json:"first_day_of_week,omitempty"`
-	GeoNodeAllowedIPs                         *string           `url:"geo_node_allowed_ips,omitempty" json:"geo_node_allowed_ips,omitempty"`
-	GeoStatusTimeout                          *int              `url:"geo_status_timeout,omitempty" json:"geo_status_timeout,omitempty"`
-	GitalyTimeoutDefault                      *int              `url:"gitaly_timeout_default,omitempty" json:"gitaly_timeout_default,omitempty"`
-	GitalyTimeoutFast                         *int              `url:"gitaly_timeout_fast,omitempty" json:"gitaly_timeout_fast,omitempty"`
-	GitalyTimeoutMedium                       *int              `url:"gitaly_timeout_medium,omitempty" json:"gitaly_timeout_medium,omitempty"`
-	GrafanaEnabled                            *bool             `url:"grafana_enabled,omitempty" json:"grafana_enabled,omitempty"`
-	GrafanaURL                                *string           `url:"grafana_url,omitempty" json:"grafana_url,omitempty"`
-	GravatarEnabled                           *bool             `url:"gravatar_enabled,omitempty" json:"gravatar_enabled,omitempty"`
-	HashedStorageEnabled                      *bool             `url:"hashed_storage_enabled,omitempty" json:"hashed_storage_enabled,omitempty"`
-	HelpPageHideCommercialContent             *bool             `url:"help_page_hide_commercial_content,omitempty" json:"help_page_hide_commercial_content,omitempty"`
-	HelpPageSupportURL                        *string           `url:"help_page_support_url,omitempty" json:"help_page_support_url,omitempty"`
-	HelpPageText                              *string           `url:"help_page_text,omitempty" json:"help_page_text,omitempty"`
-	HelpText                                  *string           `url:"help_text,omitempty" json:"help_text,omitempty"`
-	HideThirdPartyOffers                      *bool             `url:"hide_third_party_offers,omitempty" json:"hide_third_party_offers,omitempty"`
-	HomePageURL                               *string           `url:"home_page_url,omitempty" json:"home_page_url,omitempty"`
-	HousekeepingBitmapsEnabled                *bool             `url:"housekeeping_bitmaps_enabled,omitempty" json:"housekeeping_bitmaps_enabled,omitempty"`
-	HousekeepingEnabled                       *bool             `url:"housekeeping_enabled,omitempty" json:"housekeeping_enabled,omitempty"`
-	HousekeepingFullRepackPeriod              *int              `url:"housekeeping_full_repack_period,omitempty" json:"housekeeping_full_repack_period,omitempty"`
-	HousekeepingGcPeriod                      *int              `url:"housekeeping_gc_period,omitempty" json:"housekeeping_gc_period,omitempty"`
-	HousekeepingIncrementalRepackPeriod       *int              `url:"housekeeping_incremental_repack_period,omitempty" json:"housekeeping_incremental_repack_period,omitempty"`
-	HTMLEmailsEnabled                         *bool             `url:"html_emails_enabled,omitempty" json:"html_emails_enabled,omitempty"`
-	ImportSources                             []string          `url:"import_sources,omitempty" json:"import_sources,omitempty"`
-	InstanceStatisticsVisibilityPrivate       *bool             `url:"instance_statistics_visibility_private,omitempty" json:"instance_statistics_visibility_private,omitempty"`
-	LocalMarkdownVersion                      *int              `url:"local_markdown_version,omitempty" json:"local_markdown_version,omitempty"`
-	MaxArtifactsSize                          *int              `url:"max_artifacts_size,omitempty" json:"max_artifacts_size,omitempty"`
-	MaxAttachmentSize                         *int              `url:"max_attachment_size,omitempty" json:"max_attachment_size,omitempty"`
-	MaxPagesSize                              *int              `url:"max_pages_size,omitempty" json:"max_pages_size,omitempty"`
-	MetricsEnabled                            *bool             `url:"metrics_enabled,omitempty" json:"metrics_enabled,omitempty"`
-	MetricsHost                               *string           `url:"metrics_host,omitempty" json:"metrics_host,omitempty"`
-	MetricsMethodCallThreshold                *int              `url:"metrics_method_call_threshold,omitempty" json:"metrics_method_call_threshold,omitempty"`
-	MetricsPacketSize                         *int              `url:"metrics_packet_size,omitempty" json:"metrics_packet_size,omitempty"`
-	MetricsPoolSize                           *int              `url:"metrics_pool_size,omitempty" json:"metrics_pool_size,omitempty"`
-	MetricsPort                               *int              `url:"metrics_port,omitempty" json:"metrics_port,omitempty"`
-	MetricsSampleInterval                     *int              `url:"metrics_sample_interval,omitempty" json:"metrics_sample_interval,omitempty"`
-	MetricsTimeout                            *int              `url:"metrics_timeout,omitempty" json:"metrics_timeout,omitempty"`
-	MirrorAvailable                           *bool             `url:"mirror_available,omitempty" json:"mirror_available,omitempty"`
-	MirrorCapacityThreshold                   *int              `url:"mirror_capacity_threshold,omitempty" json:"mirror_capacity_threshold,omitempty"`
-	MirrorMaxCapacity                         *int              `url:"mirror_max_capacity,omitempty" json:"mirror_max_capacity,omitempty"`
-	MirrorMaxDelay                            *int              `url:"mirror_max_delay,omitempty" json:"mirror_max_delay,omitempty"`
-	OutboundLocalRequestsWhitelist            []string          `url:"outbound_local_requests_whitelist,omitempty" json:"outbound_local_requests_whitelist,omitempty"`
-	PagesDomainVerificationEnabled            *bool             `url:"pages_domain_verification_enabled,omitempty" json:"pages_domain_verification_enabled,omitempty"`
-	PasswordAuthenticationEnabledForGit       *bool             `url:"password_authentication_enabled_for_git,omitempty" json:"password_authentication_enabled_for_git,omitempty"`
-	PasswordAuthenticationEnabledForWeb       *bool             `url:"password_authentication_enabled_for_web,omitempty" json:"password_authentication_enabled_for_web,omitempty"`
-	PerformanceBarAllowedGroupID              *string           `url:"performance_bar_allowed_group_id,omitempty" json:"performance_bar_allowed_group_id,omitempty"`
-	PerformanceBarAllowedGroupPath            *string           `url:"performance_bar_allowed_group_path,omitempty" json:"performance_bar_allowed_group_path,omitempty"`
-	PerformanceBarEnabled                     *bool             `url:"performance_bar_enabled,omitempty" json:"performance_bar_enabled,omitempty"`
-	PlantumlEnabled                           *bool             `url:"plantuml_enabled,omitempty" json:"plantuml_enabled,omitempty"`
-	PlantumlURL                               *string           `url:"plantuml_url,omitempty" json:"plantuml_url,omitempty"`
-	PollingIntervalMultiplier                 *float64          `url:"polling_interval_multiplier,omitempty" json:"polling_interval_multiplier,omitempty"`
-	ProjectExportEnabled                      *bool             `url:"project_export_enabled,omitempty" json:"project_export_enabled,omitempty"`
-	PrometheusMetricsEnabled                  *bool             `url:"prometheus_metrics_enabled,omitempty" json:"prometheus_metrics_enabled,omitempty"`
-	ProtectedCIVariables                      *bool             `url:"protected_ci_variables,omitempty" json:"protected_ci_variables,omitempty"`
-	PseudonymizerEnabled                      *bool             `url:"psedonymizer_enabled,omitempty" json:"psedonymizer_enabled,omitempty"`
-	PushEventHooksLimit                       *int              `url:"push_event_hooks_limit,omitempty" json:"push_event_hooks_limit,omitempty"`
-	PushEventActivitiesLimit                  *int              `url:"push_event_activities_limit,omitempty" json:"push_event_activities_limit,omitempty"`
-	RecaptchaEnabled                          *bool             `url:"recaptcha_enabled,omitempty" json:"recaptcha_enabled,omitempty"`
-	RecaptchaPrivateKey                       *string           `url:"recaptcha_private_key,omitempty" json:"recaptcha_private_key,omitempty"`
-	RecaptchaSiteKey                          *string           `url:"recaptcha_site_key,omitempty" json:"recaptcha_site_key,omitempty"`
-	ReceiveMaxInputSize                       *int              `url:"receive_max_input_size,omitempty" json:"receive_max_input_size,omitempty"`
-	RepositoryChecksEnabled                   *bool             `url:"repository_checks_enabled,omitempty" json:"repository_checks_enabled,omitempty"`
-	RepositorySizeLimit                       *int              `url:"repository_size_limit,omitempty" json:"repository_size_limit,omitempty"`
-	RepositoryStorages                        []string          `url:"repository_storages,omitempty" json:"repository_storages,omitempty"`
-	RequireTwoFactorAuthentication            *bool             `url:"require_two_factor_authentication,omitempty" json:"require_two_factor_authentication,omitempty"`
-	RestrictedVisibilityLevels                []VisibilityValue `url:"restricted_visibility_levels,omitempty" json:"restricted_visibility_levels,omitempty"`
-	RsaKeyRestriction                         *int              `url:"rsa_key_restriction,omitempty" json:"rsa_key_restriction,omitempty"`
-	SendUserConfirmationEmail                 *bool             `url:"send_user_confirmation_email,omitempty" json:"send_user_confirmation_email,omitempty"`
-	SessionExpireDelay                        *int              `url:"session_expire_delay,omitempty" json:"session_expire_delay,omitempty"`
-	SharedRunnersEnabled                      *bool             `url:"shared_runners_enabled,omitempty" json:"shared_runners_enabled,omitempty"`
-	SharedRunnersMinutes                      *int              `url:"shared_runners_minutes,omitempty" json:"shared_runners_minutes,omitempty"`
-	SharedRunnersText                         *string           `url:"shared_runners_text,omitempty" json:"shared_runners_text,omitempty"`
-	SignInText                                *string           `url:"sign_in_text,omitempty" json:"sign_in_text,omitempty"`
-	SignupEnabled                             *bool             `url:"signup_enabled,omitempty" json:"signup_enabled,omitempty"`
-	SlackAppEnabled                           *bool             `url:"slack_app_enabled,omitempty" json:"slack_app_enabled,omitempty"`
-	SlackAppID                                *string           `url:"slack_app_id,omitempty" json:"slack_app_id,omitempty"`
-	SlackAppSecret                            *string           `url:"slack_app_secret,omitempty" json:"slack_app_secret,omitempty"`
-	SlackAppVerificationToken                 *string           `url:"slack_app_verification_token,omitempty" json:"slack_app_verification_token,omitempty"`
-	SnowplowCollectorHostname                 *string           `url:"snowplow_collector_hostname,omitempty" json:"snowplow_collector_hostname,omitempty"`
-	SnowplowCookieDomain                      *string           `url:"snowplow_cookie_domain,omitempty" json:"snowplow_cookie_domain,omitempty"`
-	SnowplowEnabled                           *bool             `url:"snowplow_enabled,omitempty" json:"snowplow_enabled,omitempty"`
-	SnowplowSiteID                            *string           `url:"snowplow_site_id,omitempty" json:"snowplow_site_id,omitempty"`
-	TerminalMaxSessionTime                    *int              `url:"terminal_max_session_time,omitempty" json:"terminal_max_session_time,omitempty"`
-	Terms                                     *string           `url:"terms,omitempty" json:"terms,omitempty"`
-	ThrottleAuthenticatedAPIEnabled           *bool             `url:"throttle_authenticated_api_enabled,omitempty" json:"throttle_authenticated_api_enabled,omitempty"`
-	ThrottleAuthenticatedAPIPeriodInSeconds   *int              `url:"throttle_authenticated_api_period_in_seconds,omitempty" json:"throttle_authenticated_api_period_in_seconds,omitempty"`
-	ThrottleAuthenticatedAPIRequestsPerPeriod *int              `url:"throttle_authenticated_api_requests_per_period,omitempty" json:"throttle_authenticated_api_requests_per_period,omitempty"`
-	ThrottleAuthenticatedWebEnabled           *bool             `url:"throttle_authenticated_web_enabled,omitempty" json:"throttle_authenticated_web_enabled,omitempty"`
-	ThrottleAuthenticatedWebPeriodInSeconds   *int              `url:"throttle_authenticated_web_period_in_seconds,omitempty" json:"throttle_authenticated_web_period_in_seconds,omitempty"`
-	ThrottleAuthenticatedWebRequestsPerPeriod *int              `url:"throttle_authenticated_web_requests_per_period,omitempty" json:"throttle_authenticated_web_requests_per_period,omitempty"`
-	ThrottleUnauthenticatedEnabled            *bool             `url:"throttle_unauthenticated_enabled,omitempty" json:"throttle_unauthenticated_enabled,omitempty"`
-	ThrottleUnauthenticatedPeriodInSeconds    *int              `url:"throttle_unauthenticated_period_in_seconds,omitempty" json:"throttle_unauthenticated_period_in_seconds,omitempty"`
-	ThrottleUnauthenticatedRequestsPerPeriod  *int              `url:"throttle_unauthenticated_requests_per_period,omitempty" json:"throttle_unauthenticated_requests_per_period,omitempty"`
-	TimeTrackingLimitToHours                  *bool             `url:"time_tracking_limit_to_hours,omitempty" json:"time_tracking_limit_to_hours,omitempty"`
-	TwoFactorGracePeriod                      *int              `url:"two_factor_grace_period,omitempty" json:"two_factor_grace_period,omitempty"`
-	UniqueIPsLimitEnabled                     *bool             `url:"unique_ips_limit_enabled,omitempty" json:"unique_ips_limit_enabled,omitempty"`
-	UniqueIPsLimitPerUser                     *int              `url:"unique_ips_limit_per_user,omitempty" json:"unique_ips_limit_per_user,omitempty"`
-	UniqueIPsLimitTimeWindow                  *int              `url:"unique_ips_limit_time_window,omitempty" json:"unique_ips_limit_time_window,omitempty"`
-	UsagePingEnabled                          *bool             `url:"usage_ping_enabled,omitempty" json:"usage_ping_enabled,omitempty"`
-	UserDefaultExternal                       *bool             `url:"user_default_external,omitempty" json:"user_default_external,omitempty"`
-	UserDefaultInternalRegex                  *string           `url:"user_default_internal_regex,omitempty" json:"user_default_internal_regex,omitempty"`
-	UserOauthApplications                     *bool             `url:"user_oauth_applications,omitempty" json:"user_oauth_applications,omitempty"`
-	UserShowAddSSHKeyMessage                  *bool             `url:"user_show_add_ssh_key_message,omitempty" json:"user_show_add_ssh_key_message,omitempty"`
-	VersionCheckEnabled                       *bool             `url:"version_check_enabled,omitempty" json:"version_check_enabled,omitempty"`
-	WebIDEClientsidePreviewEnabled            *bool             `url:"web_ide_clientside_preview_enabled,omitempty" json:"web_ide_clientside_preview_enabled,omitempty"`
+	AdminNotificationEmail              *string           `url:"admin_notification_email,omitempty" json:"admin_notification_email,omitempty"`
+	AfterSignOutPath                    *string           `url:"after_sign_out_path,omitempty" json:"after_sign_out_path,omitempty"`
+	AfterSignUpText                     *string           `url:"after_sign_up_text,omitempty" json:"after_sign_up_text,omitempty"`
+	AkismetAPIKey                       *string           `url:"akismet_api_key,omitempty" json:"akismet_api_key,omitempty"`
+	AkismetEnabled                      *bool             `url:"akismet_enabled,omitempty" json:"akismet_enabled,omitempty"`
+	CircuitbreakerAccessRetries         *int              `url:"circuitbreaker_access_retries,omitempty" json:"circuitbreaker_access_retries,omitempty"`
+	CircuitbreakerBackoffThreshold      *int              `url:"circuitbreaker_backoff_threshold,omitempty" json:"circuitbreaker_backoff_threshold,omitempty"`
+	CircuitbreakerFailureCountThreshold *int              `url:"circuitbreaker_failure_count_threshold,omitempty" json:"circuitbreaker_failure_count_threshold,omitempty"`
+	CircuitbreakerFailureResetTime      *int              `url:"circuitbreaker_failure_reset_time,omitempty" json:"circuitbreaker_failure_reset_time,omitempty"`
+	CircuitbreakerFailureWaitTime       *int              `url:"circuitbreaker_failure_wait_time,omitempty" json:"circuitbreaker_failure_wait_time,omitempty"`
+	CircuitbreakerStorageTimeout        *int              `url:"circuitbreaker_storage_timeout,omitempty" json:"circuitbreaker_storage_timeout,omitempty"`
+	ClientsideSentryDSN                 *string           `url:"clientside_sentry_dsn,omitempty" json:"clientside_sentry_dsn,omitempty"`
+	ClientsideSentryEnabled             *bool             `url:"clientside_sentry_enabled,omitempty" json:"clientside_sentry_enabled,omitempty"`
+	ContainerRegistryTokenExpireDelay   *int              `url:"container_registry_token_expire_delay,omitempty" json:"container_registry_token_expire_delay,omitempty"`
+	DefaultArtifactsExpireIn            *string           `url:"default_artifacts_expire_in,omitempty" json:"default_artifacts_expire_in,omitempty"`
+	DefaultBranchProtection             *int              `url:"default_branch_protection,omitempty" json:"default_branch_protection,omitempty"`
+	DefaultGroupVisibility              *string           `url:"default_group_visibility,omitempty" json:"default_group_visibility,omitempty"`
+	DefaultProjectVisibility            *string           `url:"default_project_visibility,omitempty" json:"default_project_visibility,omitempty"`
+	DefaultProjectsLimit                *int              `url:"default_projects_limit,omitempty" json:"default_projects_limit,omitempty"`
+	DefaultSnippetVisibility            *string           `url:"default_snippet_visibility,omitempty" json:"default_snippet_visibility,omitempty"`
+	DisabledOauthSignInSources          []string          `url:"disabled_oauth_sign_in_sources,omitempty" json:"disabled_oauth_sign_in_sources,omitempty"`
+	DomainBlacklistEnabled              *bool             `url:"domain_blacklist_enabled,omitempty" json:"domain_blacklist_enabled,omitempty"`
+	DomainBlacklist                     []string          `url:"domain_blacklist,omitempty" json:"domain_blacklist,omitempty"`
+	DomainWhitelist                     []string          `url:"domain_whitelist,omitempty" json:"domain_whitelist,omitempty"`
+	DSAKeyRestriction                   *int              `url:"dsa_key_restriction,omitempty" json:"dsa_key_restriction,omitempty"`
+	ECDSAKeyRestriction                 *int              `url:"ecdsa_key_restriction,omitempty" json:"ecdsa_key_restriction,omitempty"`
+	Ed25519KeyRestriction               *int              `url:"ed25519_key_restriction,omitempty" json:"ed25519_key_restriction,omitempty"`
+	EmailAuthorInBody                   *bool             `url:"email_author_in_body,omitempty" json:"email_author_in_body,omitempty"`
+	EnabledGitAccessProtocol            *string           `url:"enabled_git_access_protocol,omitempty" json:"enabled_git_access_protocol,omitempty"`
+	GravatarEnabled                     *bool             `url:"gravatar_enabled,omitempty" json:"gravatar_enabled,omitempty"`
+	HelpPageHideCommercialContent       *bool             `url:"help_page_hide_commercial_content,omitempty" json:"help_page_hide_commercial_content,omitempty"`
+	HelpPageSupportURL                  *string           `url:"help_page_support_url,omitempty" json:"help_page_support_url,omitempty"`
+	HomePageURL                         *string           `url:"home_page_url,omitempty" json:"home_page_url,omitempty"`
+	HousekeepingBitmapsEnabled          *bool             `url:"housekeeping_bitmaps_enabled,omitempty" json:"housekeeping_bitmaps_enabled,omitempty"`
+	HousekeepingEnabled                 *bool             `url:"housekeeping_enabled,omitempty" json:"housekeeping_enabled,omitempty"`
+	HousekeepingFullRepackPeriod        *int              `url:"housekeeping_full_repack_period,omitempty" json:"housekeeping_full_repack_period,omitempty"`
+	HousekeepingGcPeriod                *int              `url:"housekeeping_gc_period,omitempty" json:"housekeeping_gc_period,omitempty"`
+	HousekeepingIncrementalRepackPeriod *int              `url:"housekeeping_incremental_repack_period,omitempty" json:"housekeeping_incremental_repack_period,omitempty"`
+	HTMLEmailsEnabled                   *bool             `url:"html_emails_enabled,omitempty" json:"html_emails_enabled,omitempty"`
+	ImportSources                       []string          `url:"import_sources,omitempty" json:"import_sources,omitempty"`
+	KodingEnabled                       *bool             `url:"koding_enabled,omitempty" json:"koding_enabled,omitempty"`
+	KodingURL                           *string           `url:"koding_url,omitempty" json:"koding_url,omitempty"`
+	LocalMarkdownVersion                *int              `url:"local_markdown_version,omitempty" json:"local_markdown_version,omitempty"`
+	MaxArtifactsSize                    *int              `url:"max_artifacts_size,omitempty" json:"max_artifacts_size,omitempty"`
+	MaxAttachmentSize                   *int              `url:"max_attachment_size,omitempty" json:"max_attachment_size,omitempty"`
+	MaxPagesSize                        *int              `url:"max_pages_size,omitempty" json:"max_pages_size,omitempty"`
+	MetricsEnabled                      *bool             `url:"metrics_enabled,omitempty" json:"metrics_enabled,omitempty"`
+	MetricsHost                         *string           `url:"metrics_host,omitempty" json:"metrics_host,omitempty"`
+	MetricsMethodCallThreshold          *int              `url:"metrics_method_call_threshold,omitempty" json:"metrics_method_call_threshold,omitempty"`
+	MetricsPacketSize                   *int              `url:"metrics_packet_size,omitempty" json:"metrics_packet_size,omitempty"`
+	MetricsPoolSize                     *int              `url:"metrics_pool_size,omitempty" json:"metrics_pool_size,omitempty"`
+	MetricsPort                         *int              `url:"metrics_port,omitempty" json:"metrics_port,omitempty"`
+	MetricsSampleInterval               *int              `url:"metrics_sample_interval,omitempty" json:"metrics_sample_interval,omitempty"`
+	MetricsTimeout                      *int              `url:"metrics_timeout,omitempty" json:"metrics_timeout,omitempty"`
+	PasswordAuthenticationEnabledForWeb *bool             `url:"password_authentication_enabled_for_web,omitempty" json:"password_authentication_enabled_for_web,omitempty"`
+	PasswordAuthenticationEnabledForGit *bool             `url:"password_authentication_enabled_for_git,omitempty" json:"password_authentication_enabled_for_git,omitempty"`
+	PerformanceBarAllowedGroupID        *string           `url:"performance_bar_allowed_group_id,omitempty" json:"performance_bar_allowed_group_id,omitempty"`
+	PerformanceBarEnabled               *bool             `url:"performance_bar_enabled,omitempty" json:"performance_bar_enabled,omitempty"`
+	PlantumlEnabled                     *bool             `url:"plantuml_enabled,omitempty" json:"plantuml_enabled,omitempty"`
+	PlantumlURL                         *string           `url:"plantuml_url,omitempty" json:"plantuml_url,omitempty"`
+	PollingIntervalMultiplier           *float64          `url:"polling_interval_multiplier,omitempty" json:"polling_interval_multiplier,omitempty"`
+	ProjectExportEnabled                *bool             `url:"project_export_enabled,omitempty" json:"project_export_enabled,omitempty"`
+	PrometheusMetricsEnabled            *bool             `url:"prometheus_metrics_enabled,omitempty" json:"prometheus_metrics_enabled,omitempty"`
+	RecaptchaEnabled                    *bool             `url:"recaptcha_enabled,omitempty" json:"recaptcha_enabled,omitempty"`
+	RecaptchaPrivateKey                 *string           `url:"recaptcha_private_key,omitempty" json:"recaptcha_private_key,omitempty"`
+	RecaptchaSiteKey                    *string           `url:"recaptcha_site_key,omitempty" json:"recaptcha_site_key,omitempty"`
+	RepositoryChecksEnabled             *bool             `url:"repository_checks_enabled,omitempty" json:"repository_checks_enabled,omitempty"`
+	RepositoryStorages                  []string          `url:"repository_storages,omitempty" json:"repository_storages,omitempty"`
+	RequireTwoFactorAuthentication      *bool             `url:"require_two_factor_authentication,omitempty" json:"require_two_factor_authentication,omitempty"`
+	RestrictedVisibilityLevels          []VisibilityValue `url:"restricted_visibility_levels,omitempty" json:"restricted_visibility_levels,omitempty"`
+	RsaKeyRestriction                   *int              `url:"rsa_key_restriction,omitempty" json:"rsa_key_restriction,omitempty"`
+	SendUserConfirmationEmail           *bool             `url:"send_user_confirmation_email,omitempty" json:"send_user_confirmation_email,omitempty"`
+	SentryDSN                           *string           `url:"sentry_dsn,omitempty" json:"sentry_dsn,omitempty"`
+	SentryEnabled                       *bool             `url:"sentry_enabled,omitempty" json:"sentry_enabled,omitempty"`
+	SessionExpireDelay                  *int              `url:"session_expire_delay,omitempty" json:"session_expire_delay,omitempty"`
+	SharedRunnersEnabled                *bool             `url:"shared_runners_enabled,omitempty" json:"shared_runners_enabled,omitempty"`
+	SharedRunnersText                   *string           `url:"shared_runners_text,omitempty" json:"shared_runners_text,omitempty"`
+	SidekiqThrottlingEnabled            *bool             `url:"sidekiq_throttling_enabled,omitempty" json:"sidekiq_throttling_enabled,omitempty"`
+	SidekiqThrottlingFactor             *float64          `url:"sidekiq_throttling_factor,omitempty" json:"sidekiq_throttling_factor,omitempty"`
+	SidekiqThrottlingQueues             []string          `url:"sidekiq_throttling_queues,omitempty" json:"sidekiq_throttling_queues,omitempty"`
+	SignInText                          *string           `url:"sign_in_text,omitempty" json:"sign_in_text,omitempty"`
+	SignupEnabled                       *bool             `url:"signup_enabled,omitempty" json:"signup_enabled,omitempty"`
+	TerminalMaxSessionTime              *int              `url:"terminal_max_session_time,omitempty" json:"terminal_max_session_time,omitempty"`
+	TwoFactorGracePeriod                *int              `url:"two_factor_grace_period,omitempty" json:"two_factor_grace_period,omitempty"`
+	UniqueIPsLimitEnabled               *bool             `url:"unique_ips_limit_enabled,omitempty" json:"unique_ips_limit_enabled,omitempty"`
+	UniqueIPsLimitPerUser               *int              `url:"unique_ips_limit_per_user,omitempty" json:"unique_ips_limit_per_user,omitempty"`
+	UniqueIPsLimitTimeWindow            *int              `url:"unique_ips_limit_time_window,omitempty" json:"unique_ips_limit_time_window,omitempty"`
+	UsagePingEnabled                    *bool             `url:"usage_ping_enabled,omitempty" json:"usage_ping_enabled,omitempty"`
+	UserDefaultExternal                 *bool             `url:"user_default_external,omitempty" json:"user_default_external,omitempty"`
+	UserOauthApplications               *bool             `url:"user_oauth_applications,omitempty" json:"user_oauth_applications,omitempty"`
+	VersionCheckEnabled                 *bool             `url:"version_check_enabled,omitempty" json:"version_check_enabled,omitempty"`
 }
 
 // UpdateSettings updates the application settings.


Test patch:
diff --git a/event_types_test.go b/event_types_test.go
index 3b653c0..6409476 100644
--- a/event_types_test.go
+++ b/event_types_test.go
@@ -2,6 +2,7 @@ package gitlab
 
 import (
 	"encoding/json"
+	"github.com/stretchr/testify/assert"
 	"testing"
 )
 
@@ -247,50 +248,59 @@ func TestMergeEventUnmarshal(t *testing.T) {
         "type": "ProjectLabel",
         "group_id": 41
       }]
-    }
+    },
+	"source_branch": {
+		"previous": null,
+		"current": "feature/test"
+	},
+	"source_project_id": {
+		"previous": null,
+		"current": 1
+	},
+	"target_branch": {
+		"previous": null,
+		"current": "develop"
+	},
+	"target_project_id": {
+		"previous": null,
+		"current": 1
+	},
+	"assignees": {
+		"previous": [],
+		"current": [
+			{
+				"name": "Administrator",
+				"username": "root",
+				"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
+			}
+		]
+	},
+	"total_time_spent": {
+		"previous": null,
+		"current": 0
+	}
   }
 }`
 
 	var event *MergeEvent
 	err := json.Unmarshal([]byte(jsonObject), &event)
 
-	if err != nil {
-		t.Errorf("Merge Event can not unmarshaled: %v\n ", err.Error())
-	}
-
-	if event == nil {
-		t.Errorf("Merge Event is null")
-	}
-
-	if event.ObjectAttributes.ID != 99 {
-		t.Errorf("ObjectAttributes.ID is %v, want %v", event.ObjectAttributes.ID, 99)
-	}
-
-	if event.ObjectAttributes.Source.Homepage != "http://example.com/awesome_space/awesome_project" {
-		t.Errorf("ObjectAttributes.Source.Homepage is %v, want %v", event.ObjectAttributes.Source.Homepage, "http://example.com/awesome_space/awesome_project")
-	}
-
-	if event.ObjectAttributes.LastCommit.ID != "da1560886d4f094c3e6c9ef40349f7d38b5d27d7" {
-		t.Errorf("ObjectAttributes.LastCommit.ID is %v, want %s", event.ObjectAttributes.LastCommit.ID, "da1560886d4f094c3e6c9ef40349f7d38b5d27d7")
-	}
-	if event.ObjectAttributes.Assignee.Name != "User1" {
-		t.Errorf("Assignee.Name is %v, want %v", event.ObjectAttributes.ID, "User1")
-	}
-
-	if event.ObjectAttributes.Assignee.Username != "user1" {
-		t.Errorf("ObjectAttributes is %v, want %v", event.ObjectAttributes.Assignee.Username, "user1")
-	}
-
-	if event.User.Name == "" {
-		t.Errorf("Username is %s, want %s", event.User.Name, "Administrator")
-	}
-
-	if event.ObjectAttributes.LastCommit.Timestamp == nil {
-		t.Errorf("Timestamp isn't nil")
-	}
-
-	if name := event.ObjectAttributes.LastCommit.Author.Name; name != "GitLab dev user" {
-		t.Errorf("Commit Username is %s, want %s", name, "GitLab dev user")
+	if !assert.NoError(t, err, "Merge Event can not unmarshaled") {
+		return
+	}
+
+	assert.Equal(t, 99, event.ObjectAttributes.ID)
+	assert.Equal(t, "http://example.com/awesome_space/awesome_project", event.ObjectAttributes.Source.Homepage)
+	assert.Equal(t, "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", event.ObjectAttributes.LastCommit.ID)
+	assert.Equal(t, "User1", event.ObjectAttributes.Assignee.Name)
+	assert.Equal(t, "user1", event.ObjectAttributes.Assignee.Username)
+	assert.Equal(t, "Administrator", event.User.Name)
+	assert.NotNil(t, "Administrator", event.ObjectAttributes.LastCommit.Timestamp)
+	assert.Equal(t, "GitLab dev user", event.ObjectAttributes.LastCommit.Author.Name)
+	assert.Equal(t, "feature/test", event.Changes.SourceBranch.Current)
+	assert.Empty(t, event.Changes.Assignees.Previous)
+	if assert.NotEmpty(t, event.Changes.Assignees.Current) {
+		assert.Equal(t, "Administrator", event.Changes.Assignees.Current[0].Name)
 	}
 }
 
diff --git a/pipelines_test.go b/pipelines_test.go
index 94ccd25..2e16e52 100644
--- a/pipelines_test.go
+++ b/pipelines_test.go
@@ -62,7 +62,7 @@ func TestGetPipelineVariables(t *testing.T) {
 		t.Errorf("Pipelines.GetPipelineVariables returned error: %v", err)
 	}
 
-	want := []*PipelineVariable{{Key: "RUN_NIGHTLY_BUILD", Value: "true", VariableType: "env_var"}, {Key: "foo", Value: "bar"}}
+	want := []*PipelineVariable{{Key: "RUN_NIGHTLY_BUILD", Value: "true"}, {Key: "foo", Value: "bar"}}
 	if !reflect.DeepEqual(want, variables) {
 		t.Errorf("Pipelines.GetPipelineVariables returned %+v, want %+v", variables, want)
 	}
diff --git a/projects_test.go b/projects_test.go
index 1f3ae76..8e7ebef 100644
--- a/projects_test.go
+++ b/projects_test.go
@@ -481,8 +481,8 @@ func TestChangeAllowedApprovers(t *testing.T) {
 	})
 
 	opt := &ChangeAllowedApproversOptions{
-		ApproverIDs:      []int{1},
-		ApproverGroupIDs: []int{2},
+		ApproverIDs:      []*int{Int(1)},
+		ApproverGroupIDs: []*int{Int(2)},
 	}
 
 	approvals, _, err := client.Projects.ChangeAllowedApprovers(1, opt)
@@ -552,256 +552,3 @@ func TestForkProject(t *testing.T) {
 		t.Errorf("Projects.ForProject returned %+v, want %+v", project, want)
 	}
 }
-
-func TestGetProjectApprovalRules(t *testing.T) {
-	mux, server, client := setup()
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/projects/1/approval_rules", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, "GET")
-		fmt.Fprint(w, `[
-			{
-				"id": 1,
-				"name": "security",
-				"rule_type": "regular",
-				"eligible_approvers": [
-					{
-						"id": 5,
-						"name": "John Doe",
-						"username": "jdoe",
-						"state": "active",
-						"avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon",
-						"web_url": "http://localhost/jdoe"
-					},
-					{
-						"id": 50,
-						"name": "Group Member 1",
-						"username": "group_member_1",
-						"state": "active",
-						"avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon",
-						"web_url": "http://localhost/group_member_1"
-					}
-				],
-				"approvals_required": 3,
-				"users": [
-					{
-						"id": 5,
-						"name": "John Doe",
-						"username": "jdoe",
-						"state": "active",
-						"avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon",
-						"web_url": "http://localhost/jdoe"
-					}
-				],
-				"groups": [
-					{
-						"id": 5,
-						"name": "group1",
-						"path": "group1",
-						"description": "",
-						"visibility": "public",
-						"lfs_enabled": false,
-						"avatar_url": null,
-						"web_url": "http://localhost/groups/group1",
-						"request_access_enabled": false,
-						"full_name": "group1",
-						"full_path": "group1",
-						"parent_id": null,
-						"ldap_cn": null,
-						"ldap_access": null
-					}
-				],
-				"contains_hidden_groups": false
-			}
-		]`)
-	})
-
-	approvals, _, err := client.Projects.GetProjectApprovalRules(1)
-	if err != nil {
-		t.Errorf("Projects.GetProjectApprovalRules returned error: %v", err)
-	}
-
-	want := []*ProjectApprovalRule{
-		&ProjectApprovalRule{
-			ID:       1,
-			Name:     "security",
-			RuleType: "regular",
-			EligibleApprovers: []*BasicUser{
-				&BasicUser{
-					ID:        5,
-					Name:      "John Doe",
-					Username:  "jdoe",
-					State:     "active",
-					AvatarURL: "https://www.gravatar.com/avatar/0?s=80&d=identicon",
-					WebURL:    "http://localhost/jdoe",
-				},
-				&BasicUser{
-					ID:        50,
-					Name:      "Group Member 1",
-					Username:  "group_member_1",
-					State:     "active",
-					AvatarURL: "https://www.gravatar.com/avatar/0?s=80&d=identicon",
-					WebURL:    "http://localhost/group_member_1",
-				},
-			},
-			ApprovalsRequired: 3,
-			Users: []*BasicUser{
-				&BasicUser{
-					ID:        5,
-					Name:      "John Doe",
-					Username:  "jdoe",
-					State:     "active",
-					AvatarURL: "https://www.gravatar.com/avatar/0?s=80&d=identicon",
-					WebURL:    "http://localhost/jdoe",
-				},
-			},
-			Groups: []*Group{
-				&Group{
-					ID:                   5,
-					Name:                 "group1",
-					Path:                 "group1",
-					Description:          "",
-					Visibility:           Visibility(PublicVisibility),
-					LFSEnabled:           false,
-					AvatarURL:            "",
-					WebURL:               "http://localhost/groups/group1",
-					RequestAccessEnabled: false,
-					FullName:             "group1",
-					FullPath:             "group1",
-				},
-			},
-		},
-	}
-
-	if !reflect.DeepEqual(want, approvals) {
-		t.Errorf("Projects.GetProjectApprovalRules returned %+v, want %+v", approvals, want)
-	}
-}
-
-func TestCreateProjectApprovalRule(t *testing.T) {
-	mux, server, client := setup()
-	defer teardown(server)
-
-	mux.HandleFunc("/api/v4/projects/1/approval_rules", func(w http.ResponseWriter, r *http.Request) {
-		testMethod(t, r, "POST")
-		fmt.Fprint(w, `{
-			"id": 1,
-			"name": "security",
-			"rule_type": "regular",
-			"eligible_approvers": [
-				{
-					"id": 5,
-					"name": "John Doe",
-					"username": "jdoe",
-					"state": "active",
-					"avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon",
-					"web_url": "http://localhost/jdoe"
-				},
-				{
-					"id": 50,
-					"name": "Group Member 1",
-					"username": "group_member_1",
-					"state": "active",
-					"avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon",
-					"web_url": "http://localhost/group_member_1"
-				}
-			],
-			"approvals_required": 3,
-			"users": [
-				{
-					"id": 5,
-					"name": "John Doe",
-					"username": "jdoe",
-					"state": "active",
-					"avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon",
-					"web_url": "http://localhost/jdoe"
-				}
-			],
-			"groups": [
-				{
-					"id": 5,
-					"name": "group1",
-					"path": "group1",
-					"description": "",
-					"visibility": "public",
-					"lfs_enabled": false,
-					"avatar_url": null,
-					"web_url": "http://localhost/groups/group1",
-					"request_access_enabled": false,
-					"full_name": "group1",
-					"full_path": "group1",
-					"parent_id": null,
-					"ldap_cn": null,
-					"ldap_access": null
-				}
-			],
-			"contains_hidden_groups": false
-		}`)
-	})
-
-	opt := &CreateProjectLevelRuleOptions{
-		Name:              String("security"),
-		ApprovalsRequired: Int(3),
-		UserIDs:           []int{5, 50},
-		GroupIDs:          []int{5},
-	}
-
-	rule, _, err := client.Projects.CreateProjectApprovalRule(1, opt)
-	if err != nil {
-		t.Errorf("Projects.CreateProjectApprovalRule returned error: %v", err)
-	}
-
-	want := &ProjectApprovalRule{
-		ID:       1,
-		Name:     "security",
-		RuleType: "regular",
-		EligibleApprovers: []*BasicUser{
-			&BasicUser{
-				ID:        5,
-				Name:      "John Doe",
-				Username:  "jdoe",
-				State:     "active",
-				AvatarURL: "https://www.gravatar.com/avatar/0?s=80&d=identicon",
-				WebURL:    "http://localhost/jdoe",
-			},
-			&BasicUser{
-				ID:        50,
-				Name:      "Group Member 1",
-				Username:  "group_member_1",
-				State:     "active",
-				AvatarURL: "https://www.gravatar.com/avatar/0?s=80&d=identicon",
-				WebURL:    "http://localhost/group_member_1",
-			},
-		},
-		ApprovalsRequired: 3,
-		Users: []*BasicUser{
-			&BasicUser{
-				ID:        5,
-				Name:      "John Doe",
-				Username:  "jdoe",
-				State:     "active",
-				AvatarURL: "https://www.gravatar.com/avatar/0?s=80&d=identicon",
-				WebURL:    "http://localhost/jdoe",
-			},
-		},
-		Groups: []*Group{
-			&Group{
-				ID:                   5,
-				Name:                 "group1",
-				Path:                 "group1",
-				Description:          "",
-				Visibility:           Visibility(PublicVisibility),
-				LFSEnabled:           false,
-				AvatarURL:            "",
-				WebURL:               "http://localhost/groups/group1",
-				RequestAccessEnabled: false,
-				FullName:             "group1",
-				FullPath:             "group1",
-			},
-		},
-	}
-
-	if !reflect.DeepEqual(want, rule) {
-		t.Errorf("Projects.CreateProjectApprovalRule returned %+v, want %+v", rule, want)
-	}
-}