Commit 6ca17152 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets

Merge branch '42751-rename-master-to-maintainer-2-ee' into 'master'

Resolve "Rename the `Master` role to `Maintainer`" Backend

See merge request gitlab-org/gitlab-ee!5993
parents 36beda8b 9510f8bf
......@@ -2,20 +2,21 @@ module ProtectedRefAccess
extend ActiveSupport::Concern
ALLOWED_ACCESS_LEVELS = [
Gitlab::Access::MASTER,
Gitlab::Access::MAINTAINER,
Gitlab::Access::DEVELOPER,
Gitlab::Access::NO_ACCESS,
Gitlab::Access::ADMIN
].freeze
HUMAN_ACCESS_LEVELS = {
Gitlab::Access::MASTER => "Maintainers".freeze,
Gitlab::Access::MAINTAINER => "Maintainers".freeze,
Gitlab::Access::DEVELOPER => "Developers + Maintainers".freeze,
Gitlab::Access::NO_ACCESS => "No one".freeze
}.freeze
included do
scope :master, -> { where(access_level: Gitlab::Access::MASTER) }
scope :master, -> { maintainer } # @deprecated
scope :maintainer, -> { where(access_level: Gitlab::Access::MAINTAINER) }
scope :developer, -> { where(access_level: Gitlab::Access::DEVELOPER) }
validates :access_level, presence: true, if: :role?, inclusion: {
......
......@@ -6,8 +6,11 @@ module SelectForProjectAuthorization
select("projects.id AS project_id, members.access_level")
end
def select_as_master_for_project_authorization
select(["projects.id AS project_id", "#{Gitlab::Access::MASTER} AS access_level"])
def select_as_maintainer_for_project_authorization
select(["projects.id AS project_id", "#{Gitlab::Access::MAINTAINER} AS access_level"])
end
# @deprecated
alias_method :select_as_master_for_project_authorization, :select_as_maintainer_for_project_authorization
end
end
......@@ -188,10 +188,13 @@ class Group < Namespace
add_user(user, :developer, current_user: current_user)
end
def add_master(user, current_user = nil)
add_user(user, :master, current_user: current_user)
def add_maintainer(user, current_user = nil)
add_user(user, :maintainer, current_user: current_user)
end
# @deprecated
alias_method :add_master, :add_maintainer
def add_owner(user, current_user = nil)
add_user(user, :owner, current_user: current_user)
end
......@@ -208,12 +211,15 @@ class Group < Namespace
members_with_parents.owners.where(user_id: user).any?
end
def has_master?(user)
def has_maintainer?(user)
return false unless user
members_with_parents.masters.where(user_id: user).any?
members_with_parents.maintainers.where(user_id: user).any?
end
# @deprecated
alias_method :has_master?, :has_maintainer?
# Check if user is a last owner of the group.
# Parent owners are ignored for nested groups.
def last_owner?(user)
......
......@@ -70,9 +70,11 @@ class Member < ActiveRecord::Base
scope :guests, -> { active.where(access_level: GUEST) }
scope :reporters, -> { active.where(access_level: REPORTER) }
scope :developers, -> { active.where(access_level: DEVELOPER) }
scope :masters, -> { active.where(access_level: MASTER) }
scope :maintainers, -> { active.where(access_level: MAINTAINER) }
scope :masters, -> { maintainers } # @deprecated
scope :owners, -> { active.where(access_level: OWNER) }
scope :owners_and_masters, -> { active.where(access_level: [OWNER, MASTER]) }
scope :owners_and_maintainers, -> { active.where(access_level: [OWNER, MAINTAINER]) }
scope :owners_and_masters, -> { owners_and_maintainers } # @deprecated
scope :order_name_asc, -> { left_join_users.reorder(Gitlab::Database.nulls_last_order('users.name', 'ASC')) }
scope :order_name_desc, -> { left_join_users.reorder(Gitlab::Database.nulls_last_order('users.name', 'DESC')) }
......
......@@ -19,19 +19,19 @@ class ProjectMember < Member
# Add users to projects with passed access option
#
# access can be an integer representing a access code
# or symbol like :master representing role
# or symbol like :maintainer representing role
#
# Ex.
# add_users_to_projects(
# project_ids,
# user_ids,
# ProjectMember::MASTER
# ProjectMember::MAINTAINER
# )
#
# add_users_to_projects(
# project_ids,
# user_ids,
# :master
# :maintainer
# )
#
def add_users_to_projects(project_ids, users, access_level, current_user: nil, expires_at: nil)
......
......@@ -276,7 +276,8 @@ class Project < ActiveRecord::Base
delegate :name, to: :owner, allow_nil: true, prefix: true
delegate :members, to: :team, prefix: true
delegate :add_user, :add_users, to: :team
delegate :add_guest, :add_reporter, :add_developer, :add_master, :add_role, to: :team
delegate :add_guest, :add_reporter, :add_developer, :add_maintainer, :add_role, to: :team
delegate :add_master, to: :team # @deprecated
delegate :group_runners_enabled, :group_runners_enabled=, :group_runners_enabled?, to: :ci_cd_settings
# Validations
......@@ -1665,10 +1666,10 @@ class Project < ActiveRecord::Base
params = {
name: default_branch,
push_access_levels_attributes: [{
access_level: Gitlab::CurrentSettings.default_branch_protection == Gitlab::Access::PROTECTION_DEV_CAN_PUSH ? Gitlab::Access::DEVELOPER : Gitlab::Access::MASTER
access_level: Gitlab::CurrentSettings.default_branch_protection == Gitlab::Access::PROTECTION_DEV_CAN_PUSH ? Gitlab::Access::DEVELOPER : Gitlab::Access::MAINTAINER
}],
merge_access_levels_attributes: [{
access_level: Gitlab::CurrentSettings.default_branch_protection == Gitlab::Access::PROTECTION_DEV_CAN_MERGE ? Gitlab::Access::DEVELOPER : Gitlab::Access::MASTER
access_level: Gitlab::CurrentSettings.default_branch_protection == Gitlab::Access::PROTECTION_DEV_CAN_MERGE ? Gitlab::Access::DEVELOPER : Gitlab::Access::MAINTAINER
}]
}
......
......@@ -4,7 +4,8 @@ class ProjectGroupLink < ActiveRecord::Base
GUEST = 10
REPORTER = 20
DEVELOPER = 30
MASTER = 40
MAINTAINER = 40
MASTER = MAINTAINER # @deprecated
belongs_to :project
belongs_to :group
......
......@@ -21,10 +21,13 @@ class ProjectTeam
add_user(user, :developer, current_user: current_user)
end
def add_master(user, current_user: nil)
add_user(user, :master, current_user: current_user)
def add_maintainer(user, current_user: nil)
add_user(user, :maintainer, current_user: current_user)
end
# @deprecated
alias_method :add_master, :add_maintainer
def add_role(user, role, current_user: nil)
public_send(:"add_#{role}", user, current_user: current_user) # rubocop:disable GitlabSecurity/PublicSend
end
......@@ -83,10 +86,13 @@ class ProjectTeam
@developers ||= fetch_members(Gitlab::Access::DEVELOPER)
end
def masters
@masters ||= fetch_members(Gitlab::Access::MASTER)
def maintainers
@maintainers ||= fetch_members(Gitlab::Access::MAINTAINER)
end
# @deprecated
alias_method :masters, :maintainers
def owners
@owners ||=
if group
......@@ -138,10 +144,13 @@ class ProjectTeam
max_member_access(user.id) == Gitlab::Access::DEVELOPER
end
def master?(user)
max_member_access(user.id) == Gitlab::Access::MASTER
def maintainer?(user)
max_member_access(user.id) == Gitlab::Access::MAINTAINER
end
# @deprecated
alias_method :master?, :maintainer?
# Checks if `user` is authorized for this project, with at least the
# `min_access_level` (if given).
def member?(user, min_access_level = Gitlab::Access::GUEST)
......
......@@ -101,7 +101,8 @@ class User < ActiveRecord::Base
has_many :group_members, -> { where(requested_at: nil) }, source: 'GroupMember'
has_many :groups, through: :group_members
has_many :owned_groups, -> { where(members: { access_level: Gitlab::Access::OWNER }) }, through: :group_members, source: :group
has_many :masters_groups, -> { where(members: { access_level: Gitlab::Access::MASTER }) }, through: :group_members, source: :group
has_many :maintainers_groups, -> { where(members: { access_level: Gitlab::Access::MAINTAINER }) }, through: :group_members, source: :group
alias_attribute :masters_groups, :maintainers_groups
# Projects
has_many :groups_projects, through: :groups, source: :projects
......@@ -746,7 +747,7 @@ class User < ActiveRecord::Base
end
def several_namespaces?
owned_groups.any? || masters_groups.any?
owned_groups.any? || maintainers_groups.any?
end
def namespace_id
......@@ -996,15 +997,15 @@ class User < ActiveRecord::Base
end
def manageable_groups
union_sql = Gitlab::SQL::Union.new([owned_groups.select(:id), masters_groups.select(:id)]).to_sql
union_sql = Gitlab::SQL::Union.new([owned_groups.select(:id), maintainers_groups.select(:id)]).to_sql
# Update this line to not use raw SQL when migrated to Rails 5.2.
# Either ActiveRecord or Arel constructions are fine.
# This was replaced with the raw SQL construction because of bugs in the arel gem.
# Bugs were fixed in arel 9.0.0 (Rails 5.2).
owned_and_master_groups = Group.where("namespaces.id IN (#{union_sql})") # rubocop:disable GitlabSecurity/SqlInjection
owned_and_maintainer_groups = Group.where("namespaces.id IN (#{union_sql})") # rubocop:disable GitlabSecurity/SqlInjection
Gitlab::GroupHierarchy.new(owned_and_master_groups).base_and_descendants
Gitlab::GroupHierarchy.new(owned_and_maintainer_groups).base_and_descendants
end
def namespaces
......@@ -1045,11 +1046,11 @@ class User < ActiveRecord::Base
def ci_owned_runners
@ci_owned_runners ||= begin
project_runner_ids = Ci::RunnerProject
.where(project: authorized_projects(Gitlab::Access::MASTER))
.where(project: authorized_projects(Gitlab::Access::MAINTAINER))
.select(:runner_id)
group_runner_ids = Ci::RunnerNamespace
.where(namespace_id: owned_or_masters_groups.select(:id))
.where(namespace_id: owned_or_maintainers_groups.select(:id))
.select(:runner_id)
union = Gitlab::SQL::Union.new([project_runner_ids, group_runner_ids])
......@@ -1258,11 +1259,14 @@ class User < ActiveRecord::Base
!terms_accepted?
end
def owned_or_masters_groups
union = Gitlab::SQL::Union.new([owned_groups, masters_groups])
def owned_or_maintainers_groups
union = Gitlab::SQL::Union.new([owned_groups, maintainers_groups])
Group.from("(#{union.to_sql}) namespaces")
end
# @deprecated
alias_method :owned_or_masters_groups, :owned_or_maintainers_groups
protected
# override, from Devise::Validatable
......
......@@ -4,7 +4,7 @@ module Clusters
delegate { cluster.project }
rule { can?(:master_access) }.policy do
rule { can?(:maintainer_access) }.policy do
enable :update_cluster
enable :admin_cluster
end
......
class DeployTokenPolicy < BasePolicy
with_options scope: :subject, score: 0
condition(:master) { @subject.project.team.master?(@user) }
condition(:maintainer) { @subject.project.team.maintainer?(@user) }
rule { anonymous }.prevent_all
rule { master }.policy do
rule { maintainer }.policy do
enable :create_deploy_token
enable :update_deploy_token
end
......
......@@ -13,7 +13,7 @@ class GroupPolicy < BasePolicy
condition(:guest) { access_level >= GroupMember::GUEST }
condition(:developer) { access_level >= GroupMember::DEVELOPER }
condition(:owner) { access_level >= GroupMember::OWNER }
condition(:master) { access_level >= GroupMember::MASTER }
condition(:maintainer) { access_level >= GroupMember::MAINTAINER }
condition(:reporter) { access_level >= GroupMember::REPORTER }
condition(:nested_groups_supported, scope: :global) { Group.supports_nested_groups? }
......@@ -62,7 +62,7 @@ class GroupPolicy < BasePolicy
enable :admin_issue
end
rule { master }.policy do
rule { maintainer }.policy do
enable :create_projects
enable :admin_pipeline
enable :admin_build
......
......@@ -47,7 +47,7 @@ class ProjectPolicy < BasePolicy
condition(:developer) { team_access_level >= Gitlab::Access::DEVELOPER }
desc "User has maintainer access"
condition(:master) { team_access_level >= Gitlab::Access::MASTER }
condition(:maintainer) { team_access_level >= Gitlab::Access::MAINTAINER }
desc "Project is public"
condition(:public_project, scope: :subject, score: 0) { project.public? }
......@@ -124,14 +124,14 @@ class ProjectPolicy < BasePolicy
rule { guest }.enable :guest_access
rule { reporter }.enable :reporter_access
rule { developer }.enable :developer_access
rule { master }.enable :master_access
rule { maintainer }.enable :maintainer_access
rule { owner | admin }.enable :owner_access
rule { can?(:owner_access) }.policy do
enable :guest_access
enable :reporter_access
enable :developer_access
enable :master_access
enable :maintainer_access
enable :change_namespace
enable :change_visibility_level
......@@ -229,7 +229,7 @@ class ProjectPolicy < BasePolicy
enable :create_deployment
end
rule { can?(:master_access) }.policy do
rule { can?(:maintainer_access) }.policy do
enable :push_to_delete_protected_branch
enable :update_project_snippet
enable :update_environment
......
......@@ -278,9 +278,9 @@ class NotificationService
def new_access_request(member)
return true unless member.notifiable?(:subscription)
recipients = member.source.members.active_without_invites_and_requests.owners_and_masters
if fallback_to_group_owners_masters?(recipients, member)
recipients = member.source.group.members.active_without_invites_and_requests.owners_and_masters
recipients = member.source.members.active_without_invites_and_requests.owners_and_maintainers
if fallback_to_group_owners_maintainers?(recipients, member)
recipients = member.source.group.members.active_without_invites_and_requests.owners_and_maintainers
end
recipients.each { |recipient| deliver_access_request_email(recipient, member) }
......@@ -523,7 +523,7 @@ class NotificationService
return [] unless project
notifiable_users(project.team.masters, :watch, target: project)
notifiable_users(project.team.maintainers, :watch, target: project)
end
def notifiable?(*args)
......@@ -538,7 +538,7 @@ class NotificationService
mailer.member_access_requested_email(member.real_source_type, member.id, recipient.user.notification_email).deliver_later
end
def fallback_to_group_owners_masters?(recipients, member)
def fallback_to_group_owners_maintainers?(recipients, member)
return false if recipients.present?
member.source.respond_to?(:group) && member.source.group
......
......@@ -117,7 +117,7 @@ module Projects
@project.group.refresh_members_authorized_projects(blocking: false)
current_user.refresh_authorized_projects
else
@project.add_master(@project.namespace.owner, current_user: current_user)
@project.add_maintainer(@project.namespace.owner, current_user: current_user)
end
end
......
......@@ -16,7 +16,7 @@ module ProtectedBranches
private
def params_with_default(params)
params[:"#{type}_access_level"] ||= Gitlab::Access::MASTER if use_default_access_level?(params)
params[:"#{type}_access_level"] ||= Gitlab::Access::MAINTAINER if use_default_access_level?(params)
params
end
......
......@@ -9,14 +9,14 @@ module ProtectedBranches
if params.delete(:developers_can_push)
Gitlab::Access::DEVELOPER
else
Gitlab::Access::MASTER
Gitlab::Access::MAINTAINER
end
merge_access_level =
if params.delete(:developers_can_merge)
Gitlab::Access::DEVELOPER
else
Gitlab::Access::MASTER
Gitlab::Access::MAINTAINER
end
@params.merge!(push_access_levels_attributes: [{ access_level: push_access_level }],
......
......@@ -17,14 +17,14 @@ module ProtectedBranches
when true
params[:push_access_levels_attributes] = [{ access_level: Gitlab::Access::DEVELOPER }]
when false
params[:push_access_levels_attributes] = [{ access_level: Gitlab::Access::MASTER }]
params[:push_access_levels_attributes] = [{ access_level: Gitlab::Access::MAINTAINER }]
end
case @developers_can_merge
when true
params[:merge_access_levels_attributes] = [{ access_level: Gitlab::Access::DEVELOPER }]
when false
params[:merge_access_levels_attributes] = [{ access_level: Gitlab::Access::MASTER }]
params[:merge_access_levels_attributes] = [{ access_level: Gitlab::Access::MAINTAINER }]
end
service = ProtectedBranches::UpdateService.new(@project, @current_user, @params)
......@@ -53,7 +53,7 @@ module ProtectedBranches
@protected_branch.merge_access_levels.developer.destroy_all
when false
@protected_branch.merge_access_levels.developer.destroy_all
@protected_branch.merge_access_levels.master.destroy_all
@protected_branch.merge_access_levels.maintainer.destroy_all
end
case @developers_can_push
......@@ -61,7 +61,7 @@ module ProtectedBranches
@protected_branch.push_access_levels.developer.destroy_all
when false
@protected_branch.push_access_levels.developer.destroy_all
@protected_branch.push_access_levels.master.destroy_all
@protected_branch.push_access_levels.maintainer.destroy_all
end
end
end
......
......@@ -113,7 +113,7 @@ Settings['issues_tracker'] ||= {}
# GitLab
#
Settings['gitlab'] ||= Settingslogic.new({})
Settings.gitlab['default_project_creation'] ||= ::EE::Gitlab::Access::DEVELOPER_MASTER_PROJECT_ACCESS
Settings.gitlab['default_project_creation'] ||= ::EE::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS
Settings.gitlab['default_projects_limit'] ||= 100000
Settings.gitlab['default_branch_protection'] ||= 2
Settings.gitlab['default_can_create_group'] = true if Settings.gitlab['default_can_create_group'].nil?
......
......@@ -17,7 +17,7 @@ class Member < ActiveRecord::Base
scope :guests, -> { where(access_level: GUEST) }
scope :reporters, -> { where(access_level: REPORTER) }
scope :developers, -> { where(access_level: DEVELOPER) }
scope :masters, -> { where(access_level: MASTER) }
scope :maintainers, -> { where(access_level: MAINTAINER) }
scope :owners, -> { where(access_level: OWNER) }
delegate :name, :username, :email, to: :user, prefix: true
......
......@@ -9,7 +9,7 @@ class AddProtectedBranchesPushAccess < ActiveRecord::Migration
create_table :protected_branch_push_access_levels do |t|
t.references :protected_branch, index: { name: "index_protected_branch_push_access" }, foreign_key: true, null: false
# Gitlab::Access::MASTER == 40
# Gitlab::Access::MAINTAINER == 40
t.integer :access_level, default: 40, null: false
t.timestamps null: false
......
......@@ -9,7 +9,7 @@ class AddProtectedBranchesMergeAccess < ActiveRecord::Migration
create_table :protected_branch_merge_access_levels do |t|
t.references :protected_branch, index: { name: "index_protected_branch_merge_access" }, foreign_key: true, null: false
# Gitlab::Access::MASTER == 40
# Gitlab::Access::MAINTAINER == 40
t.integer :access_level, default: 40, null: false
t.timestamps null: false
......
......@@ -55,7 +55,7 @@ From there, you can see the following actions:
### Project events
NOTE: **Note:**
You need Master [permissions] or higher to view the project Audit Events page.
You need Maintainer [permissions] or higher to view the project Audit Events page.
To view a project's audit events, navigate to **Project > Settings > Audit Events**.
From there, you can see the following actions:
......
......@@ -118,10 +118,10 @@ following.
---
To take advantage of group sync, group owners or masters will need to create an
To take advantage of group sync, group owners or maintainers will need to create an
LDAP group link in their group **Settings > LDAP Groups** page. Multiple LDAP
groups and/or filters can be linked with a single GitLab group. When the link is
created, an access level/role is specified (Guest, Reporter, Developer, Master,
created, an access level/role is specified (Guest, Reporter, Developer, Maintainer,
or Owner).
## Administrator sync
......@@ -523,7 +523,7 @@ and more DNs may be added, or existing entries modified, based on additional
LDAP group lookups. The very last occurrence of this entry should indicate
exactly which users GitLab believes should be added to the group.
> **Note:** 10 is 'Guest', 20 is 'Reporter', 30 is 'Developer', 40 is 'Master'
> **Note:** 10 is 'Guest', 20 is 'Reporter', 30 is 'Developer', 40 is 'Maintainer'
and 50 is 'Owner'
```bash
......
......@@ -46,7 +46,7 @@ build status. This is because a successful build status can trigger a merge
when 'Merge when pipeline succeeds' feature is used. Some features of the GitLab
Plugin may require additional privileges. For example, there is an option to
accept a merge request if the build is successful. Using this feature would
require developer, master or owner-level permission.
require developer, maintainer or owner-level permission.
Copy the private API token from **Profile Settings -> Account**. You will need this
when configuring the Jenkins server later.
......
......@@ -14,7 +14,7 @@ bundle exec rake gitlab:import:user_to_projects[username@domain.tld] RAILS_ENV=p
Notes:
- admin users are added as masters
- admin users are added as maintainers
```bash
# omnibus-gitlab
......
......@@ -39,7 +39,7 @@ push their changes back to the repository where the locked objects are located.
Locks can be created by any person who has [push access] to the repository; i.e.,
Developer and higher level, and can be removed solely by their author and any
user with Master permissions and above.
user with Maintainer permissions and above.
If a file is locked and you are not the author of its locked state, a
pre-receive hook will reject your changes when you try to push. In the
......
......@@ -179,7 +179,7 @@ git annex sync --content # sync Git branches and download all the large files
By using `git-annex` without GitLab, anyone that can access the server can also
access the files of all projects, but GitLab Annex ensures that you can only
access files of projects you have access to (developer, master, or owner role).
access files of projects you have access to (developer, maintainer, or owner role).
## How it works
......
......@@ -65,7 +65,7 @@ For an existing project, you can set up mirror pulling by visiting your project'
section. Check the "Mirror repository" box and hit **Save changes** at the bottom.
You have a few options to choose from one being the user who will be the author
of all events in the activity feed that are the result of an update. This user
needs to have at least [master access][perms] to the project. Another option is
needs to have at least [maintainer access][perms] to the project. Another option is
whether you want to trigger builds for mirror updates.
![Pull settings](repository_mirroring/repository_mirroring_pull_settings.png)
......
......@@ -20,7 +20,7 @@ class Profiles::SlacksController < Profiles::ApplicationController
def disabled_projects
@disabled_projects ||= current_user
.authorized_projects(Gitlab::Access::MASTER)
.authorized_projects(Gitlab::Access::MAINTAINER)
.with_slack_application_disabled
end
end
......@@ -19,7 +19,7 @@ module EE
#
# EE Needs to allow more access levels in the relation:
# - 1 for each user/group
# - 1 with the `access_level` (Master, Developer)
# - 1 with the `access_level` (Maintainer, Developer)
validates :"#{type}_access_levels", length: { is: 1 }, if: -> { false }
# Returns access levels that grant the specified access type to the given user / group.
......
......@@ -88,7 +88,7 @@ module EE
def defaults
super.merge(
allow_group_owners_to_manage_ldap: true,
default_project_creation: ::EE::Gitlab::Access::DEVELOPER_MASTER_PROJECT_ACCESS,
default_project_creation: ::EE::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS,
elasticsearch_aws: false,
elasticsearch_aws_region: ENV['ELASTIC_REGION'] || 'us-east-1',
elasticsearch_url: ENV['ELASTIC_URL'] || 'http://localhost:9200',
......
......@@ -4,15 +4,15 @@ module EE
module ClassMethods
# Get amout of users with highest role they have.
# If John is developer in one project but master in another he will be
# counted once as master. This is needed to count users who don't use
# If John is developer in one project but maintainer in another he will be
# counted once as maintainer. This is needed to count users who don't use
# functionality available to higher roles only.
#
# Example of result:
# [{"kind"=>"guest", "amount"=>"4"},
# {"kind"=>"reporter", "amount"=>"6"},
# {"kind"=>"developer", "amount"=>"10"},
# {"kind"=>"master", "amount"=>"9"},
# {"kind"=>"maintainer", "amount"=>"9"},
# {"kind"=>"owner", "amount"=>"1"}]
#
def roles_stats
......@@ -21,7 +21,7 @@ module EE
WHEN 10 THEN 'guest'
WHEN 20 THEN 'reporter'
WHEN 30 THEN 'developer'
WHEN 40 THEN 'master'
WHEN 40 THEN 'maintainer'
WHEN 50 THEN 'owner'
ELSE 'unknown' END
AS kind,
......
......@@ -16,8 +16,8 @@ module EE
@subject.project_creation_level == ::EE::Gitlab::Access::NO_ONE_PROJECT_ACCESS
end
condition(:developer_master_access) do
@subject.project_creation_level == ::EE::Gitlab::Access::DEVELOPER_MASTER_PROJECT_ACCESS
condition(:developer_maintainer_access) do
@subject.project_creation_level == ::EE::Gitlab::Access::DEVELOPER_MAINTAINER_PROJECT_ACCESS
end
condition(:can_owners_manage_ldap, scope: :global) do
......@@ -63,7 +63,7 @@ module EE
rule { ldap_synced & (admin | (can_owners_manage_ldap & owner)) }.enable :override_group_member
rule { project_creation_level_enabled & developer & developer_master_access }.enable :create_projects
rule { project_creation_level_enabled & developer & developer_maintainer_access }.enable :create_projects
rule { project_creation_level_enabled & create_projects_disabled }.prevent :create_projects
end
end
......
......@@ -90,13 +90,13 @@ module EE
rule { deploy_board_disabled & ~is_development }.prevent :read_deploy_board
rule { can?(:master_access) }.policy do
rule { can?(:maintainer_access) }.policy do
enable :push_code_to_protected_branches
enable :admin_path_locks
enable :update_approvers
end
rule { pod_logs_enabled & can?(:master_access) }.enable :read_pod_logs
rule { pod_logs_enabled & can?(:maintainer_access) }.enable :read_pod_logs
rule { auditor }.policy do
enable :public_user_access
......@@ -117,9 +117,9 @@ module EE
rule { ~can?(:push_code) }.prevent :push_code_to_protected_branches
rule { admin | (reject_unsigned_commits_disabled_globally & can?(:master_access)) }.enable :change_reject_unsigned_commits
rule { admin | (reject_unsigned_commits_disabled_globally & can?(:maintainer_access)) }.enable :change_reject_unsigned_commits
rule { admin | (commit_committer_check_disabled_globally & can?(:master_access)) }.enable :change_commit_committer_check
rule { admin | (commit_committer_check_disabled_globally & can?(:maintainer_access)) }.enable :change_commit_committer_check
rule { owner | reporter }.enable :build_read_project
......@@ -138,7 +138,7 @@ module EE
prevent :public_user_access
prevent :reporter_access
prevent :developer_access
prevent :master_access
prevent :maintainer_access
prevent :owner_access
end
......
......@@ -27,10 +27,10 @@ module EE
end
def mirror_was_hard_failed(project)
recipients = project.members.active_without_invites_and_requests.owners_and_masters
recipients = project.members.active_without_invites_and_requests.owners_and_maintainers
if recipients.empty? && project.group
recipients = project.group.members.active_without_invites_and_requests.owners_and_masters
recipients = project.group.members.active_without_invites_and_requests.owners_and_maintainers
end
recipients.each do |recipient|
......
......@@ -9,7 +9,7 @@
- if @project.mirror_hard_failed?
%br
Repository mirroring has been paused due to too many failed attempts, and can be resumed by a project master.
Repository mirroring has been paused due to too many failed attempts, and can be resumed by a project maintainer.
- if @project.mirror_ever_updated_successfully?
%br
......
......@@ -10,14 +10,14 @@ module EE
# Default project creation level
NO_ONE_PROJECT_ACCESS = 0
MASTER_PROJECT_ACCESS = 1
DEVELOPER_MASTER_PROJECT_ACCESS = 2
MAINTAINER_PROJECT_ACCESS = 1
DEVELOPER_MAINTAINER_PROJECT_ACCESS = 2
def project_creation_options
{
s_('ProjectCreationLevel|No one') => NO_ONE_PROJECT_ACCESS,
s_('ProjectCreationLevel|Maintainers') => MASTER_PROJECT_ACCESS,
s_('ProjectCreationLevel|Developers + Maintainers') => DEVELOPER_MASTER_PROJECT_ACCESS
s_('ProjectCreationLevel|Maintainers') => MAINTAINER_PROJECT_ACCESS,
s_('ProjectCreationLevel|Developers + Maintainers') => DEVELOPER_MAINTAINER_PROJECT_ACCESS
}
end
end
......
......@@ -106,10 +106,10 @@ describe Admin::ApplicationSettingsController do
it 'updates the default_project_creation for string value' do
stub_licensed_features(project_creation_level: true)
put :update, application_setting: { default_project_creation: ::EE::Gitlab::Access::MASTER_PROJECT_ACCESS }
put :update, application_setting: { default_project_creation: ::EE::Gitlab::Access::MAINTAINER_PROJECT_ACCESS }
expect(response).to redirect_to(admin_application_settings_path)
expect(ApplicationSetting.current.default_project_creation).to eq(::EE::Gitlab::Access::MASTER_PROJECT_ACCESS)
expect(ApplicationSetting.current.default_project_creation).to eq(::EE::Gitlab::Access::MAINTAINER_PROJECT_ACCESS)
end
end
end
......@@ -17,7 +17,7 @@ describe Boards::IssuesController do
let!(:list2) { create(:list, board: board, label: development, position: 1) }
before do
group.add_master(user)
group.add_maintainer(user)
group.add_guest(guest)
end
......
......@@ -7,7 +7,7 @@ describe Boards::ListsController do
let(:guest) { create(:user) }
before do
group.add_master(user)
group.add_maintainer(user)
group.add_guest(guest)
end
......
......@@ -7,7 +7,7 @@ describe Boards::UsersController do
let(:user) { create(:user) }
before do
group.add_master(user)
group.add_maintainer(user)
group.add_guest(guest)
sign_in(user)
......
......@@ -27,7 +27,7 @@ describe Groups::AnalyticsController do
before do
group.add_owner(user)
group.add_user(user2, GroupMember::DEVELOPER)
group.add_user(user3, GroupMember::MASTER)
group.add_user(user3, GroupMember::MAINTAINER)
sign_in(user)
create_event(user, project, issue, Event::CLOSED)
......
......@@ -6,7 +6,7 @@ describe Groups::BoardsController do
before do
allow(Ability).to receive(:allowed?).and_call_original
group.add_master(user)
group.add_maintainer(user)
sign_in(user)
stub_licensed_features(multiple_group_issue_boards: true)
end
......
......@@ -7,7 +7,7 @@ describe Groups::Settings::CiCdController do
let(:user) { create(:user) }
before do
group.add_master(user)
group.add_maintainer(user)
sign_in(user)
end
......
......@@ -93,7 +93,7 @@ describe Projects::ApproverGroupsController do
context 'when the user can update approvers' do
before do
project.add_master(user)
project.add_maintainer(user)
project.update!(disable_overriding_approvers_per_merge_request: true)
end
......
......@@ -93,7 +93,7 @@ describe Projects::ApproversController do
context 'when the user can update approvers' do
before do
project.add_master(user)
project.add_maintainer(user)
project.update!(disable_overriding_approvers_per_merge_request: true)
end
......
......@@ -7,7 +7,7 @@ describe Projects::BoardsController do
let(:user) { create(:user) }
before do
project.add_master(user)
project.add_maintainer(user)
allow(Ability).to receive(:allowed?).and_call_original
sign_in(user)
end
......
......@@ -12,7 +12,7 @@ describe Projects::ClustersController do
let(:user) { create(:user) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......@@ -83,7 +83,7 @@ describe Projects::ClustersController do
it { expect { go }.to be_allowed_for(:admin) }
it { expect { go }.to be_allowed_for(:owner).of(project) }
it { expect { go }.to be_allowed_for(:master).of(project) }
it { expect { go }.to be_allowed_for(:maintainer).of(project) }
it { expect { go }.to be_denied_for(:developer).of(project) }
it { expect { go }.to be_denied_for(:reporter).of(project) }
it { expect { go }.to be_denied_for(:guest).of(project) }
......
......@@ -11,7 +11,7 @@ describe Projects::EnvironmentsController do
end
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -6,7 +6,7 @@ describe Projects::ImportsController do
before do
sign_in(user)
project.add_master(user)
project.add_maintainer(user)
end
context 'POST #create' do
......@@ -15,7 +15,7 @@ describe Projects::ImportsController do
allow_any_instance_of(EE::Project).to receive(:add_import_job)
new_user = create(:user)
project.add_master(new_user)
project.add_maintainer(new_user)
post :create, namespace_id: project.namespace.to_param,
project_id: project,
......
......@@ -298,7 +298,7 @@ describe Projects::IssuesController do
sign_in(user)
end
%i(reporter developer master).each do |access|
%i(reporter developer maintainer).each do |access|
it_behaves_like 'user can see confidential issue', access
end
......
......@@ -70,7 +70,7 @@ describe Projects::MirrorsController do
expect_any_instance_of(EE::Project).to receive(:force_import_job!)
new_user = create(:user)
project.add_master(new_user)
project.add_maintainer(new_user)
do_put(project, mirror: true, mirror_user_id: new_user.id, import_url: 'http://local.dev')
......@@ -213,7 +213,7 @@ describe Projects::MirrorsController do
mirror_user = project.mirror_user
other_user = create(:user)
project.add_master(other_user)
project.add_maintainer(other_user)
do_put(project, { mirror_user_id: other_user.id }, format: :json)
......
......@@ -10,7 +10,7 @@ describe Projects::Prometheus::MetricsController do
allow(controller).to receive(:project).and_return(project)
allow(controller).to receive(:prometheus_adapter).and_return(prometheus_adapter)
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -5,7 +5,7 @@ describe Projects::PushRulesController do
let(:user) { create(:user) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......@@ -46,9 +46,9 @@ describe Projects::PushRulesController do
end
end
context 'as a master user' do
context 'as a maintainer user' do
before do
project.add_master(user)
project.add_maintainer(user)
end
context 'when global setting is disabled' do
......
......@@ -10,7 +10,7 @@ describe Projects::ServiceDeskController do
allow(Gitlab::IncomingEmail).to receive(:enabled?) { true }
allow(Gitlab::IncomingEmail).to receive(:supports_wildcard?) { true }
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......@@ -25,7 +25,7 @@ describe Projects::ServiceDeskController do
expect(response.status).to eq(200)
end
context 'when user is not project master' do
context 'when user is not project maintainer' do
let(:guest) { create(:user) }
it 'renders 404' do
......
......@@ -5,7 +5,7 @@ describe Projects::Settings::IntegrationsController do
let(:user) { create(:user) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -5,7 +5,7 @@ describe Projects::Settings::RepositoryController do
let(:user) { create(:user) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -5,7 +5,7 @@ describe Projects::Settings::SlacksController do
let(:user) { create(:user) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -6,7 +6,7 @@ describe Projects::VariablesController do
before do
sign_in(user)
project.add_master(user)
project.add_maintainer(user)
allow_any_instance_of(License).to receive(:feature_available?).and_call_original
allow_any_instance_of(License).to receive(:feature_available?).with(:variable_environment_scope).and_return(true)
......
......@@ -7,7 +7,7 @@ describe ProjectsController do
let(:user) { create(:user) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -33,7 +33,7 @@ describe 'issue boards', :js do
let(:project) { create(:project, :public, namespace: group) }
before do
project.add_master(user)
project.add_maintainer(user)
group.add_reporter(user)
login_as(user)
end
......@@ -57,7 +57,7 @@ describe 'issue boards', :js do
let(:project) { create(:project, :public, namespace: group) }
before do
project.add_master(user)
project.add_maintainer(user)
group.add_reporter(user)
login_as(user)
end
......
......@@ -13,7 +13,7 @@ describe 'label issues', :js do
before do
stub_licensed_features(group_issue_boards: true)
group.add_master(user)
group.add_maintainer(user)
sign_in(user)
......
......@@ -10,7 +10,7 @@ describe 'Multiple Issue Boards', :js do
context 'with multiple issue boards enabled' do
context 'authorized user' do
before do
project.add_master(user)
project.add_maintainer(user)
login_as(user)
......@@ -147,7 +147,7 @@ describe 'Multiple Issue Boards', :js do
context 'with multiple issue boards disabled' do
before do
stub_licensed_features(multiple_project_issue_boards: false)
project.add_master(user)
project.add_maintainer(user)
login_as(user)
end
......
......@@ -28,7 +28,7 @@ describe 'Scoped issue boards', :js do
context 'user with edit permissions' do
before do
group.add_master(user)
group.add_maintainer(user)
login_as(user)
......@@ -421,7 +421,7 @@ describe 'Scoped issue boards', :js do
before do
stub_licensed_features(scoped_issue_boards: false)
project.add_master(user)
project.add_maintainer(user)
login_as(user)
visit project_boards_path(project)
......
......@@ -24,7 +24,7 @@ describe 'Issue Boards', :js do
before do
stub_licensed_features(multiple_issue_assignees: true)
project.add_master(user)
project.add_maintainer(user)
project.team.add_developer(user2)
gitlab_sign_in(user)
......
......@@ -18,7 +18,7 @@ describe 'Burndown charts' do
let(:project) { create(:project) }
before do
project.add_master(current_user)
project.add_maintainer(current_user)
end
it 'presents burndown charts when available' do
......@@ -46,7 +46,7 @@ describe 'Burndown charts' do
let(:project) { nil }
before do
group.add_master(current_user)
group.add_maintainer(current_user)
end
it 'presents burndown charts when available' do
......@@ -74,7 +74,7 @@ describe 'Burndown charts' do
let(:project) { create(:project) }
before do
project.add_master(current_user)
project.add_maintainer(current_user)
end
it 'does not present burndown chart or promotion' do
......
......@@ -6,7 +6,7 @@ describe 'Discussion Comments Epic', :js do
before do
stub_licensed_features(epics: true)
epic.group.add_master(user)
epic.group.add_maintainer(user)
sign_in(user)
visit group_epic_path(epic.group, epic)
......
......@@ -8,7 +8,7 @@ describe 'GFM autocomplete', :js do
before do
stub_licensed_features(epics: true)
group.add_master(user)
group.add_maintainer(user)
sign_in(user)
visit group_epic_path(group, epic)
......
......@@ -10,7 +10,7 @@ describe 'GEO Nodes' do
allow(Gitlab::Geo).to receive(:secondary?) { true }
allow(Gitlab::Geo).to receive_message_chain(:primary_node, :url) { geo_url }
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
require 'spec_helper'
describe 'Groups > Members > Master/Owner can override LDAP access levels' do
describe 'Groups > Members > Maintainer/Owner can override LDAP access levels' do
include WaitForRequests
let(:johndoe) { create(:user, name: 'John Doe') }
......
......@@ -217,8 +217,8 @@ describe 'Related issues', :js do
context 'when user has permission to manage related issues' do
before do
project.add_master(user)
project_b.add_master(user)
project.add_maintainer(user)
project_b.add_maintainer(user)
gitlab_sign_in(user)
end
......
......@@ -25,7 +25,7 @@ describe 'Dropdown weight', :js do
end
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
create(:issue, project: project)
......
......@@ -17,7 +17,7 @@ describe 'Filter issues weight', :js do
end
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
label = create(:label, project: project, title: 'urgent')
......
......@@ -14,8 +14,8 @@ describe 'New/edit issue', :js do
let!(:issue) { create(:issue, project: project, assignees: [user], milestone: milestone) }
before do
project.add_master(user)
project.add_master(user2)
project.add_maintainer(user)
project.add_maintainer(user2)
allow_any_instance_of(ApplicationHelper).to receive(:collapsed_sidebar?).and_return(true)
......
......@@ -15,7 +15,7 @@ describe 'Issue Sidebar' do
context 'updating weight', :js do
before do
project.add_master(user)
project.add_maintainer(user)
visit_issue(project, issue)
end
......
......@@ -10,7 +10,7 @@ describe 'Service Desk Issue Tracker', :js do
allow(Gitlab::IncomingEmail).to receive(:enabled?) { true }
allow(Gitlab::IncomingEmail).to receive(:supports_wildcard?) { true }
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......@@ -33,7 +33,7 @@ describe 'Service Desk Issue Tracker', :js do
describe 'service desk info content' do
context 'when user has permissions to edit project settings' do
before do
project_without_service_desk.add_master(user)
project_without_service_desk.add_maintainer(user)
visit service_desk_project_issues_path(project_without_service_desk)
end
......
......@@ -5,7 +5,7 @@ describe 'Issues sub nav EE' do
let(:project) { create(:project) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
visit project_issues_path(project)
......
......@@ -6,7 +6,7 @@ describe 'Merge request > User merges with Push Rules', :js do
let(:merge_request) { create(:merge_request_with_diffs, source_project: project, author: user, title: 'Bug NS-04') }
before do
project.add_master(user)
project.add_maintainer(user)
end
context 'commit message is invalid' do
......
......@@ -11,7 +11,7 @@ describe 'Merge request > User selects branches for new MR', :js do
end
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -9,7 +9,7 @@ describe 'Merge request > User uses quick actions', :js do
let(:merge_request) { create(:merge_request, source_project: project) }
before do
project.add_master(user)
project.add_maintainer(user)
end
describe 'adding a weight from a note' do
......
......@@ -10,7 +10,7 @@ describe 'Project variables EE', :js do
stub_licensed_features(variable_environment_scope: variable_environment_scope)
login_as(user)
project.add_master(user)
project.add_maintainer(user)
project.variables << variable
visit page_path
......
......@@ -6,7 +6,7 @@ describe 'Projects > Audit Events', :js do
let(:project) { create(:project, :repository, namespace: user.namespace) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -8,7 +8,7 @@ describe 'Classification label on project pages' do
before do
stub_ee_application_setting(external_authorization_service_enabled: true)
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -7,7 +7,7 @@ describe 'Gcp Cluster', :js do
let(:user) { create(:user) }
before do
project.add_master(user)
project.add_maintainer(user)
gitlab_sign_in(user)
allow(Projects::ClustersController).to receive(:STATUS_POLLING_INTERVAL) { 100 }
end
......
......@@ -7,7 +7,7 @@ describe 'EE Clusters', :js do
let(:user) { create(:user) }
before do
project.add_master(user)
project.add_maintainer(user)
gitlab_sign_in(user)
end
......
......@@ -9,7 +9,7 @@ describe 'listing forks of a project' do
let(:user) { create(:user) }
before do
source.add_master(user)
source.add_maintainer(user)
sign_in(user)
end
......
......@@ -5,7 +5,7 @@ describe 'Projects > Members > Member is removed from project' do
let(:project) { create(:project) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
visit project_project_members_path(project)
end
......
......@@ -9,7 +9,7 @@ describe 'Project mirror', :js do
describe 'On a project' do
before do
project.add_master(user)
project.add_maintainer(user)
sign_in user
end
......@@ -57,7 +57,7 @@ describe 'Project mirror', :js do
let(:import_data) { project.import_data(true) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -8,7 +8,7 @@ describe 'Path Locks', :js do
before do
allow(project).to receive(:feature_available?).with(:file_locks) { true }
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
visit tree_path
......
......@@ -6,7 +6,7 @@ describe 'Projects > Push Rules', :js do
let(:foo) {{ reject_unsigned_commits: 'Reject unsigned commits' }}
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -5,7 +5,7 @@ describe 'User activates GitHub Service' do
let(:user) { create(:user) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -5,7 +5,7 @@ describe 'Project settings > [EE] repository' do
let(:project) { create(:project_empty_repo) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -7,7 +7,7 @@ describe 'Project settings > [EE] repository' do
let(:project) { create(:project_empty_repo) }
before do
project.add_master(user)
project.add_maintainer(user)
gitlab_sign_in(user)
end
......
......@@ -5,7 +5,7 @@ describe 'Project settings > Issues', :js do
let(:user) { create(:user) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -11,7 +11,7 @@ describe 'Project settings > [EE] Merge Requests', :js do
before do
sign_in(user)
project.add_master(user)
project.add_maintainer(user)
group.add_developer(user)
group.add_developer(group_member)
end
......
......@@ -5,7 +5,7 @@ describe 'Project settings > [EE] repository' do
let(:project) { create(:project_empty_repo) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
end
......
......@@ -5,7 +5,7 @@ describe 'Service Desk Setting', :js do
let(:user) { create(:user) }
before do
project.add_master(user)
project.add_maintainer(user)
sign_in(user)
allow(::EE::Gitlab::ServiceDesk).to receive(:enabled?).with(project: project).and_return(true)
......
......@@ -9,7 +9,7 @@ describe 'Slack application' do
before do
gitlab_sign_in(user)
project.add_master(user)
project.add_maintainer(user)
create(:slack_integration, service: service)
......
......@@ -29,9 +29,9 @@ describe "User manages members" do
it { expect(page).to have_no_button("Add members").and have_no_link("Import members") }
end
context "as project master" do
context "as project maintainer" do
before do
project.add_master(user)
project.add_maintainer(user)
end
it_behaves_like "when group membership is unlocked"
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment