Cannot update permissions via protected branches API

Summary

I would like to update a large number of master branches so that they can only be updated via merge request. The master branches are already protected, so I only need to change permissions.

Steps to reproduce

Using Python requests, set a branch to be protected via the branches API and then try to set its permissions via the protected_branches API:

import requests

def protect_branch(session, host, project_id, branch, params):
    url = ('https://%s/api/v4/projects/%d/repository/branches/%s/protect' %(host, project_id, branch))
    resp = session.put(url, params=params)
    if resp.status_code != 200:
        raise Exception('PUT to %s failed, status code %d' %(url, resp.status_code))

def no_push(session, host, project_id, params):
    url = ('https://%s/api/v4/projects/%d/protected_branches' %(host, project_id))
    resp = session.post(url, params=params)
    if resp.status_code != 200:
        raise Exception('POST to %s failed, status code %d' %(url, resp.status_code))

host = '<INSERT HOSTNAME HERE>'
index = 1 # Project ID
session = requests.Session()
session.headers.update({'PRIVATE-TOKEN': '<INSERT TOKEN HERE>'})
session.verify = False
params = {'developers_can_push': False,
          'developers_can_merge': True}
protect_branch(session, host, index, 'master', params)
params = {'name': 'master',
          'push_access_level': 0,
          'merge_access_level': 40}
no_push(session, host, index, params)

Example Project

What is the current bug behavior?

The post in no_push will return 409, with the message Protected branch \'master\' already exists.

What is the expected correct behavior?

The post should succeed and update the permissions.

Output of checks

Results of GitLab environment info

Expand for output related to GitLab environment info

System information
System: Ubuntu 12.04
Current User: git
Using RVM: no
Ruby Version: 2.3.3p222
Gem Version: 2.5.2
Bundler Version:1.15.4
Rake Version: 12.0.0
Redis Version: 3.0.7
Git Version: 2.9.2
Sidekiq Version:5.0.4
Go Version: unknown

GitLab information
Version: 9.5.2
Revision: ab97415
Directory: /home/git/gitlab
DB Adapter: mysql2
URL: https://<>
HTTP Clone URL: https://<>/some-group/some-project.git
SSH Clone URL: git@<>:some-group/some-project.git
Using LDAP: yes
Using Omniauth: no

GitLab Shell
Version: 5.8.0
Repository storage paths:

  • default: /home/git/repositories
    Hooks: /home/git/gitlab-shell/hooks
    Git: /usr/local/bin/git

Results of GitLab application Check

Expand for output related to the GitLab application check
Checking GitLab Shell ...                                

GitLab Shell version >= 5.8.0 ? ... OK (5.8.0)
Repo base directory exists?
default... yes
Repo storage directories are symlinks?
default... no
Repo paths owned by git:root, or git:git?
default... yes
Repo paths access is drwxrws---?
default... yes
hooks directories in repos are links: ...
4/1 ... ok
4/2 ... ok
2/3 ... ok
5/4 ... ok
5/5 ... ok
5/6 ... ok
7/7 ... ok
7/8 ... ok
5/9 ... ok
5/10 ... repository is empty
5/11 ... ok
5/12 ... ok
5/13 ... ok
5/14 ... ok
5/15 ... ok
3/16 ... repository is empty
4/17 ... ok
5/18 ... repository is empty
2/19 ... ok
2/20 ... ok
7/21 ... ok
7/22 ... ok
7/23 ... ok
7/24 ... ok
7/26 ... ok
7/27 ... ok
7/28 ... ok
5/30 ... ok
5/31 ... ok
2/32 ... ok
2/33 ... ok
5/34 ... ok
6/35 ... ok
5/36 ... ok
5/37 ... ok
9/38 ... ok
4/39 ... ok
7/40 ... ok
5/41 ... ok
13/42 ... ok
5/43 ... ok
13/44 ... ok
11/45 ... ok
13/46 ... ok
2/47 ... ok
7/48 ... ok
12/50 ... ok
2/51 ... ok
5/52 ... ok
3/53 ... ok
5/54 ... ok
5/55 ... ok
5/56 ... ok
4/57 ... ok
7/58 ... ok
9/59 ... ok
8/60 ... ok
8/61 ... ok
13/64 ... ok
2/65 ... ok
13/66 ... ok
7/67 ... ok
13/68 ... ok
6/69 ... ok
5/70 ... ok
14/71 ... ok
13/73 ... ok
7/74 ... ok
13/75 ... ok
4/76 ... ok
7/78 ... ok
5/80 ... ok
8/81 ... ok
9/82 ... ok
5/83 ... ok
2/84 ... ok
7/85 ... ok
12/86 ... ok
14/88 ... ok
7/89 ... ok
13/91 ... ok
2/92 ... ok
5/93 ... ok
13/94 ... ok
7/95 ... ok
7/97 ... ok
7/100 ... ok
14/101 ... ok
7/102 ... ok
13/103 ... ok
13/104 ... ok
14/105 ... ok
14/106 ... ok
7/107 ... ok
14/108 ... ok
7/109 ... ok
15/110 ... ok
14/111 ... ok
15/112 ... ok
7/113 ... ok
13/114 ... ok
5/115 ... ok
15/116 ... ok
7/117 ... ok
13/118 ... repository is empty
15/119 ... ok
14/120 ... ok
14/125 ... ok
14/126 ... ok
14/127 ... ok
14/128 ... ok
14/129 ... ok
14/130 ... ok
14/131 ... ok
14/132 ... ok
14/133 ... ok
14/134 ... ok
14/135 ... ok
14/136 ... ok
14/137 ... ok
14/138 ... ok
14/139 ... ok
14/140 ... ok
14/141 ... ok
14/142 ... ok
14/143 ... ok
14/144 ... ok
14/145 ... ok
7/146 ... ok
12/147 ... ok
14/148 ... ok
7/149 ... ok
15/150 ... ok
15/151 ... ok
7/152 ... ok
14/153 ... ok
15/154 ... ok
14/155 ... ok
15/156 ... ok
14/157 ... ok
15/158 ... ok
14/159 ... ok
14/160 ... ok
15/161 ... ok
15/162 ... ok
15/163 ... ok
14/164 ... ok
7/165 ... ok
15/166 ... ok
7/167 ... ok
13/168 ... ok
14/169 ... ok
5/170 ... ok
14/171 ... ok
14/172 ... ok
13/173 ... ok
14/174 ... ok
13/175 ... ok
13/176 ... ok
14/177 ... ok
14/178 ... ok
13/179 ... ok
15/180 ... ok
13/181 ... ok
15/182 ... ok
14/183 ... ok
14/184 ... ok
14/185 ... ok
13/186 ... ok
12/187 ... ok
14/188 ... ok
19/189 ... repository is empty
14/190 ... ok
2/193 ... ok
5/194 ... ok
15/195 ... ok
14/198 ... ok
14/199 ... ok
15/200 ... ok
7/201 ... ok
7/202 ... ok
13/203 ... ok
20/204 ... ok
14/205 ... ok
14/206 ... ok
14/207 ... ok
13/209 ... ok
14/211 ... ok
21/212 ... ok
21/213 ... ok
21/214 ... ok
21/215 ... ok
21/216 ... ok
21/217 ... ok
7/219 ... ok
7/220 ... ok
20/221 ... ok
7/222 ... ok
13/224 ... ok
15/225 ... ok
7/226 ... repository is empty
14/227 ... ok
11/228 ... ok
7/229 ... ok
7/230 ... ok
14/231 ... ok
2/232 ... ok
7/233 ... ok
14/234 ... ok
13/235 ... ok
5/236 ... ok
13/237 ... ok
13/238 ... ok
21/239 ... ok
14/242 ... ok
4/243 ... ok
13/244 ... ok
7/245 ... ok
22/246 ... ok
21/247 ... ok
4/248 ... ok
22/249 ... ok
14/250 ... ok
21/251 ... ok
7/252 ... ok
12/253 ... ok
12/254 ... ok
6/255 ... ok
24/256 ... ok
25/257 ... ok
15/258 ... ok
15/259 ... ok
7/260 ... ok
21/261 ... ok
24/262 ... ok
12/263 ... ok
13/264 ... ok
27/265 ... ok
Running /home/git/gitlab-shell/bin/check
Check GitLab API access: OK
Access to /home/git/.ssh/authorized_keys: OK
Send ping to redis server: OK
gitlab-shell self-check successful

Checking GitLab Shell ... Finished

Checking Sidekiq ...

Running? ... yes
Number of Sidekiq processes ... 1

Checking Sidekiq ... Finished

Checking Reply by email ...

Reply by email is disabled in config/gitlab.yml

Checking Reply by email ... Finished

Checking LDAP ...

Server: ldapmain
not verifying SSL hostname of LDAPS server ':636' LDAP authentication... Success
LDAP users with access to your GitLab server (only showing the first 100 results)

Checking LDAP ... Finished

Checking GitLab ...

Git configured correctly? ... yes
Database config exists? ... yes
All migrations up? ... yes
Database contains orphaned GroupMembers? ... no
GitLab config exists? ... yes
GitLab config up to date? ... yes
Log directory writable? ... yes
Tmp directory writable? ... yes
Uploads directory exists? ... yes
Uploads directory has correct permissions? ... yes
Uploads directory tmp has correct permissions? ... yes
Init script exists? ... yes
Init script up-to-date? ... yes
Projects have namespace: ...
4/1 ... yes
4/2 ... yes
2/3 ... yes
5/4 ... yes
5/5 ... yes
5/6 ... yes
7/7 ... yes
7/8 ... yes
5/9 ... yes
5/10 ... yes
5/11 ... yes
5/12 ... yes
5/13 ... yes
5/14 ... yes
5/15 ... yes
3/16 ... yes
4/17 ... yes
5/18 ... yes
2/19 ... yes
2/20 ... yes
7/21 ... yes
7/22 ... yes
7/23 ... yes
7/24 ... yes
7/26 ... yes
7/27 ... yes
7/28 ... yes
5/30 ... yes
5/31 ... yes
2/32 ... yes
2/33 ... yes
5/34 ... yes
6/35 ... yes
5/36 ... yes
5/37 ... yes
9/38 ... yes
4/39 ... yes
7/40 ... yes
5/41 ... yes
13/42 ... yes
5/43 ... yes
13/44 ... yes
11/45 ... yes
13/46 ... yes
2/47 ... yes
7/48 ... yes
12/50 ... yes
2/51 ... yes
5/52 ... yes
3/53 ... yes
5/54 ... yes
5/55 ... yes
5/56 ... yes
4/57 ... yes
7/58 ... yes
9/59 ... yes
8/60 ... yes
8/61 ... yes
13/64 ... yes
2/65 ... yes
13/66 ... yes
7/67 ... yes
13/68 ... yes
6/69 ... yes
5/70 ... yes
14/71 ... yes
13/73 ... yes
7/74 ... yes
13/75 ... yes
4/76 ... yes
7/78 ... yes
5/80 ... yes
8/81 ... yes
9/82 ... yes
5/83 ... yes
2/84 ... yes
7/85 ... yes
12/86 ... yes
14/88 ... yes
7/89 ... yes
13/91 ... yes
2/92 ... yes
5/93 ... yes
13/94 ... yes
7/95 ... yes
7/97 ... yes
7/100 ... yes 14/101 ... yes
7/102 ... yes 13/103 ... yes
13/104 ... yes
14/105 ... yes
14/106 ... yes
7/107 ... yes
14/108 ... yes
7/109 ... yes
15/110 ... yes
14/111 ... yes
15/112 ... yes
7/113 ... yes
13/114 ... yes
5/115 ... yes
15/116 ... yes
7/117 ... yes
13/118 ... yes
15/119 ... yes
14/120 ... yes
14/125 ... yes
14/126 ... yes
14/127 ... yes
14/128 ... yes
14/129 ... yes
14/130 ... yes
14/131 ... yes
14/132 ... yes
14/133 ... yes
14/134 ... yes
14/135 ... yes
14/136 ... yes
14/137 ... yes
14/138 ... yes
14/139 ... yes
14/140 ... yes
14/141 ... yes
14/142 ... yes
14/143 ... yes
14/144 ... yes
14/145 ... yes
7/146 ... yes
12/147 ... yes
14/148 ... yes
7/149 ... yes
15/150 ... yes
15/151 ... yes
7/152 ... yes
14/153 ... yes
15/154 ... yes
14/155 ... yes
15/156 ... yes 14/157 ... yes
15/158 ... yes 14/159 ... yes
14/160 ... yes
15/161 ... yes
15/162 ... yes
15/163 ... yes
14/164 ... yes
7/165 ... yes
15/166 ... yes
7/167 ... yes
13/168 ... yes
14/169 ... yes
5/170 ... yes
14/171 ... yes
14/172 ... yes
13/173 ... yes
14/174 ... yes
13/175 ... yes
13/176 ... yes
14/177 ... yes
14/178 ... yes
13/179 ... yes
15/180 ... yes
13/181 ... yes
15/182 ... yes
14/183 ... yes
14/184 ... yes
14/185 ... yes
13/186 ... yes
12/187 ... yes
14/188 ... yes
19/189 ... yes
14/190 ... yes
2/193 ... yes
5/194 ... yes
15/195 ... yes
14/198 ... yes
14/199 ... yes
15/200 ... yes
7/201 ... yes
7/202 ... yes
13/203 ... yes
20/204 ... yes
14/205 ... yes
14/206 ... yes
14/207 ... yes
13/209 ... yes
14/211 ... yes
21/212 ... yes
21/213 ... yes
21/214 ... yes 21/215 ... yes
21/216 ... yes 21/217 ... yes 7/219 ... yes 7/220 ... yes 20/221 ... yes 7/222 ... yes 13/224 ... yes 15/225 ... yes 7/226 ... yes 14/227 ... yes 11/228 ... yes 7/229 ... yes 7/230 ... yes 14/231 ... yes 2/232 ... yes 7/233 ... yes 14/234 ... yes 13/235 ... yes 5/236 ... yes 13/237 ... yes 13/238 ... yes 21/239 ... yes 14/242 ... yes 4/243 ... yes 13/244 ... yes 7/245 ... yes 22/246 ... yes 21/247 ... yes 4/248 ... yes 22/249 ... yes 14/250 ... yes 21/251 ... yes 7/252 ... yes 12/253 ... yes 12/254 ... yes 6/255 ... yes 24/256 ... yes 25/257 ... yes 15/258 ... yes 15/259 ... yes 7/260 ... yes 21/261 ... yes 24/262 ... yes 12/263 ... yes 13/264 ... yes 27/265 ... yes Redis version >= 2.8.0? ... yes Ruby version >= 2.3.3 ? ... yes (2.3.3) Git version >= 2.7.3 ? ... yes (2.9.2) Active users: ... 12

Checking GitLab ... Finished

Possible fixes