diff options
author | Rémy Coutable <remy@rymai.me> | 2016-07-29 10:39:45 +0000 |
---|---|---|
committer | Rémy Coutable <remy@rymai.me> | 2016-07-29 10:39:45 +0000 |
commit | 242f8377264973d642b46e5d2800ef3d3bd4c0fa (patch) | |
tree | 08276afb13fe04b41b6d7a20df0cd11962fa9a6c /lib/api | |
parent | 9b0e131b83cfc44d3132bddfefb6cbd4bff7d253 (diff) | |
parent | cebcc417eda08711ad17a433d6d9b4f49830c04c (diff) | |
download | gitlab-ce-242f8377264973d642b46e5d2800ef3d3bd4c0fa.tar.gz |
Merge branch '18193-no-one-can-push' into 'master'
Allow creating protected branches that can't be pushed to
## What does this MR do?
- Add "No one can push" as a setting to protected branches.
- This applies to Masters (as well as all other users)
## What are the relevant issue numbers?
Closes #18193
## Does this need an EE merge request?
Yes. gitlab-org/gitlab-ee!569
## Screenshots

## TODO
- [ ] #18193 !5081 No one can push to protected branches
- [x] Implementation
- [x] Model changes
- [x] Remove "developers_can_merge" and "developers_can_push"
- [x] Replace with `ProtectedBranchPushAccess` and `ProtectedBranchMergeAccess`
- [x] Reversible migration
- [x] Raise error on failure
- [x] MySQL
- [x] Backend changes
- [x] Creating a protected branch creates access rows
- [x] Add `no_one` as an access level
- [x] Enforce "no one can push"
- [x] Allow setting levels while creating protected branches?
- [x] Frontend
- [x] Replace checkboxes with `select`s
- [x] Add tests
- [x] `GitPushService` -> new projects' default branch protection
- [x] Fix existing tests
- [x] Refactor
- [x] Test workflows by hand
- [x] from the Web UI
- [x] When "Allowed to Push" is "No one"
- [x] Developers can't push
- [x] Masters can't push
- [x] When "Allowed to Push" is "Developers + Masters"
- [x] Developers can push
- [x] Masters can push
- [x] When "Allowed to Push" is "Masters"
- [x] Developers can't push
- [x] Masters can push
- [x] When "Allowed to Merge" is "Masters" and "Allowed to Push" is "Masters"
- [x] Developers can't push
- [x] Developers can't merge
- [x] Masters can merge
- [x] Masters can push
- [x] When "Allowed to Merge" is "Developers + Masters" and "Allowed to Push" is "Masters"
- [x] Developers can't push
- [x] Developers can merge
- [x] Masters can merge
- [x] Masters can push
- [x] When "Allowed to Merge" is "Developers + Masters" and "Allowed to Push" is "No one"
- [x] Developers can't push
- [x] Developers can merge
- [x] Masters can merge
- [x] Masters can't push
- [x] When "Allowed to Merge" is "Masters" and "Allowed to Push" is "No one"
- [x] Developers can't push
- [x] Developers can't merge
- [x] Masters can merge
- [x] Masters can't push
- [x] from CLI
- [x] When "Allowed to Push" is "No one"
- [x] Developers can't push
- [x] Masters can't push
- [x] When "Allowed to Push" is "Developers + Masters"
- [x] Developers can push
- [x] Masters can push
- [x] When "Allowed to Push" is "Masters"
- [x] Developers can't push
- [x] Masters can push
- [x] When "Allowed to Merge" is "Masters" and "Allowed to Push" is "Masters"
- [x] Developers can't push
- [x] Developers can't merge
- [x] Masters can merge
- [x] Masters can push
- [x] When "Allowed to Merge" is "Developers + Masters" and "Allowed to Push" is "Masters"
- [x] Developers can't push
- [x] Developers can't merge
- [x] Masters can merge
- [x] Masters can push
- [x] When "Allowed to Merge" is "Developers + Masters" and "Allowed to Push" is "No one"
- [x] Developers can't push
- [x] Developers can't merge
- [x] Masters can't merge
- [x] Masters can't push
- [x] When "Allowed to Merge" is "Masters" and "Allowed to Push" is "No one"
- [x] Developers can't push
- [x] Developers can't merge
- [x] Masters can't merge
- [x] Masters can't push
- [x] Add tests for owners and admins
- [x] CHANGELOG
- [x] Screenshots
- [x] Documentation
- [x] Wait for ~~!4665~~ to be merged in
- [x] Wait for ~~gitlab-org/gitlab-ce#19872~~ and ~~gitlab-org/gitlab-ee!564~~ to be closed
- [x] Rebase against master instead of !4892
- [x] Make sure [build](https://gitlab.com/gitlab-org/gitlab-ce/commit/a4ca206fd1cc0332d1e385ddbc0f2e4065c3ae73/builds) is green
- [x] Create EE MR
- [x] Cherry pick commits
- [x] Make sure [build](https://gitlab.com/gitlab-org/gitlab-ee/commit/4e17190d7dc546c1f977edcafd1cbcea4bdb4043/builds) is green
- [x] Address @axil's comments
- [x] Assign to endboss
- [x] Wait for @dbalexandre's review
- [x] Address @dbalexandre's comments
- [x] Address @axil's comments
- [x] Align dropdowns
- [x] No flash when protected branch is updated
- [x] Resolve conflicts
- [x] Implement protect/unprotect API
- [x] Address @dbalexandre's comments
- [x] Update EE MR
- [x] Address @rymai's comments
- [x] Create/Update service should return a `ProtectedBranch`
- [x] Successfuly protected branch creation shouldn't `load_protected_branches`
- [x] Rename `allowed_to_merge` as #minimum_access_level_for_merge
- [x] Rename `allowed_to_push` as #minimum_access_level_for_push
- [x] Use `inclusion` and `Gitlab::Access` instead of an `enum`
- [x] Modify `check_access` to work with `Gitlab::Access`
- [x] Pass `@protected_branch` to `#execute` in `UpdateService`
- [x] simplify with a nested field `protected_branch[push_access_level][access_level]`
- [x] `developers_can_{merge,push}` should be handled in the API
- [x] Use `can?(current_user, ...)` instead of `current_user.can?(...)`
- [x] Instantiate `ProtectedBranchesAccessSelect` in `dispatcher.js`
- [x] constants regarding downtime migrations
- [x] Explicit `#down` for columns with default
- [x] Update EE MR
- [ ] Wait for CE merge
- [ ] Wait for EE merge
- [ ] Create issue for UI changes proposed by @zyv
See merge request !5081
Diffstat (limited to 'lib/api')
-rw-r--r-- | lib/api/branches.rb | 37 | ||||
-rw-r--r-- | lib/api/entities.rb | 6 |
2 files changed, 34 insertions, 9 deletions
diff --git a/lib/api/branches.rb b/lib/api/branches.rb index 66b853eb342..a77afe634f6 100644 --- a/lib/api/branches.rb +++ b/lib/api/branches.rb @@ -35,6 +35,10 @@ module API # Protect a single branch # + # Note: The internal data model moved from `developers_can_{merge,push}` to `allowed_to_{merge,push}` + # in `gitlab-org/gitlab-ce!5081`. The API interface has not been changed (to maintain compatibility), + # but it works with the changed data model to infer `developers_can_merge` and `developers_can_push`. + # # Parameters: # id (required) - The ID of a project # branch (required) - The name of the branch @@ -49,17 +53,36 @@ module API @branch = user_project.repository.find_branch(params[:branch]) not_found!('Branch') unless @branch protected_branch = user_project.protected_branches.find_by(name: @branch.name) - developers_can_push = to_boolean(params[:developers_can_push]) + developers_can_merge = to_boolean(params[:developers_can_merge]) + developers_can_push = to_boolean(params[:developers_can_push]) + + protected_branch_params = { + name: @branch.name + } + + unless developers_can_merge.nil? + protected_branch_params.merge!({ + merge_access_level_attributes: { + access_level: developers_can_merge ? Gitlab::Access::DEVELOPER : Gitlab::Access::MASTER + } + }) + end + + unless developers_can_push.nil? + protected_branch_params.merge!({ + push_access_level_attributes: { + access_level: developers_can_push ? Gitlab::Access::DEVELOPER : Gitlab::Access::MASTER + } + }) + end if protected_branch - protected_branch.developers_can_push = developers_can_push unless developers_can_push.nil? - protected_branch.developers_can_merge = developers_can_merge unless developers_can_merge.nil? - protected_branch.save + service = ProtectedBranches::UpdateService.new(user_project, current_user, protected_branch_params) + service.execute(protected_branch) else - user_project.protected_branches.create(name: @branch.name, - developers_can_push: developers_can_push || false, - developers_can_merge: developers_can_merge || false) + service = ProtectedBranches::CreateService.new(user_project, current_user, protected_branch_params) + service.execute end present @branch, with: Entities::RepoBranch, project: user_project diff --git a/lib/api/entities.rb b/lib/api/entities.rb index e76e7304674..4eb95d8a215 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -126,11 +126,13 @@ module API end expose :developers_can_push do |repo_branch, options| - options[:project].developers_can_push_to_protected_branch? repo_branch.name + project = options[:project] + project.protected_branches.matching(repo_branch.name).any? { |protected_branch| protected_branch.push_access_level.access_level == Gitlab::Access::DEVELOPER } end expose :developers_can_merge do |repo_branch, options| - options[:project].developers_can_merge_to_protected_branch? repo_branch.name + project = options[:project] + project.protected_branches.matching(repo_branch.name).any? { |protected_branch| protected_branch.merge_access_level.access_level == Gitlab::Access::DEVELOPER } end end |