Commit 2c7554e897356fe424f292c66cd03e0192b05167

Authored by Matt Humphrey
1 parent df6db81e

Added methods to protect and unprotect branches

doc/api/repositories.md
... ... @@ -33,7 +33,8 @@ Parameters:
33 33 },
34 34 "authored_date": "2012-06-27T05:51:39-07:00",
35 35 "committed_date": "2012-06-28T03:44:20-07:00"
36   - }
  36 + },
  37 + "protected": true
37 38 }
38 39 ]
39 40 ```
... ... @@ -73,7 +74,88 @@ Parameters:
73 74 },
74 75 "authored_date": "2012-06-27T05:51:39-07:00",
75 76 "committed_date": "2012-06-28T03:44:20-07:00"
76   - }
  77 + },
  78 + "protected": true
  79 +}
  80 +```
  81 +
  82 +## Protect a project repository branch
  83 +
  84 +Protect a single project repository branch.
  85 +
  86 +```
  87 +PUT /projects/:id/repository/branches/:branch/protect
  88 +```
  89 +
  90 +Parameters:
  91 +
  92 ++ `id` (required) - The ID of a project
  93 ++ `branch` (required) - The name of the branch
  94 +
  95 +```json
  96 +{
  97 + "name": "master",
  98 + "commit": {
  99 + "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c",
  100 + "parents": [
  101 + {
  102 + "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
  103 + }
  104 + ],
  105 + "tree": "46e82de44b1061621357f24c05515327f2795a95",
  106 + "message": "add projects API",
  107 + "author": {
  108 + "name": "John Smith",
  109 + "email": "john@example.com"
  110 + },
  111 + "committer": {
  112 + "name": "John Smith",
  113 + "email": "john@example.com"
  114 + },
  115 + "authored_date": "2012-06-27T05:51:39-07:00",
  116 + "committed_date": "2012-06-28T03:44:20-07:00"
  117 + },
  118 + "protected": true
  119 +}
  120 +```
  121 +
  122 +## Unprotect a project repository branch
  123 +
  124 +Unprotect a single project repository branch.
  125 +
  126 +```
  127 +PUT /projects/:id/repository/branches/:branch/unprotect
  128 +```
  129 +
  130 +Parameters:
  131 +
  132 ++ `id` (required) - The ID of a project
  133 ++ `branch` (required) - The name of the branch
  134 +
  135 +```json
  136 +{
  137 + "name": "master",
  138 + "commit": {
  139 + "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c",
  140 + "parents": [
  141 + {
  142 + "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
  143 + }
  144 + ],
  145 + "tree": "46e82de44b1061621357f24c05515327f2795a95",
  146 + "message": "add projects API",
  147 + "author": {
  148 + "name": "John Smith",
  149 + "email": "john@example.com"
  150 + },
  151 + "committer": {
  152 + "name": "John Smith",
  153 + "email": "john@example.com"
  154 + },
  155 + "authored_date": "2012-06-27T05:51:39-07:00",
  156 + "committed_date": "2012-06-28T03:44:20-07:00"
  157 + },
  158 + "protected": false
77 159 }
78 160 ```
79 161  
... ... @@ -110,7 +192,8 @@ Parameters:
110 192 },
111 193 "authored_date": "2012-05-28T04:42:42-07:00",
112 194 "committed_date": "2012-05-28T04:42:42-07:00"
113   - }
  195 + },
  196 + "protected": null
114 197 }
115 198 ]
116 199 ```
... ...
lib/api/entities.rb
... ... @@ -33,6 +33,11 @@ module Gitlab
33 33  
34 34 class RepoObject < Grape::Entity
35 35 expose :name, :commit
  36 + expose :protected do |repo, options|
  37 + if options[:project]
  38 + options[:project].protected_branch? repo.name
  39 + end
  40 + end
36 41 end
37 42  
38 43 class RepoCommit < Grape::Entity
... ...
lib/api/projects.rb
... ... @@ -218,7 +218,7 @@ module Gitlab
218 218 # Example Request:
219 219 # GET /projects/:id/repository/branches
220 220 get ":id/repository/branches" do
221   - present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject
  221 + present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject, project: user_project
222 222 end
223 223  
224 224 # Get a single branch
... ... @@ -230,7 +230,43 @@ module Gitlab
230 230 # GET /projects/:id/repository/branches/:branch
231 231 get ":id/repository/branches/:branch" do
232 232 @branch = user_project.repo.heads.find { |item| item.name == params[:branch] }
233   - present @branch, with: Entities::RepoObject
  233 + present @branch, with: Entities::RepoObject, project: user_project
  234 + end
  235 +
  236 + # Protect a single branch
  237 + #
  238 + # Parameters:
  239 + # id (required) - The ID of a project
  240 + # branch (required) - The name of the branch
  241 + # Example Request:
  242 + # PUT /projects/:id/repository/branches/:branch/protect
  243 + put ":id/repository/branches/:branch/protect" do
  244 + @branch = user_project.repo.heads.find { |item| item.name == params[:branch] }
  245 + protected = user_project.protected_branches.find_by_name(@branch.name)
  246 +
  247 + unless protected
  248 + user_project.protected_branches.create(:name => @branch.name)
  249 + end
  250 +
  251 + present @branch, with: Entities::RepoObject, project: user_project
  252 + end
  253 +
  254 + # Unprotect a single branch
  255 + #
  256 + # Parameters:
  257 + # id (required) - The ID of a project
  258 + # branch (required) - The name of the branch
  259 + # Example Request:
  260 + # PUT /projects/:id/repository/branches/:branch/unprotect
  261 + put ":id/repository/branches/:branch/unprotect" do
  262 + @branch = user_project.repo.heads.find { |item| item.name == params[:branch] }
  263 + protected = user_project.protected_branches.find_by_name(@branch.name)
  264 +
  265 + if protected
  266 + protected.destroy
  267 + end
  268 +
  269 + present @branch, with: Entities::RepoObject, project: user_project
234 270 end
235 271  
236 272 # Get a project repository tags
... ...
spec/requests/api/projects_spec.rb
... ... @@ -107,6 +107,29 @@ describe Gitlab::API do
107 107  
108 108 json_response['name'].should == 'new_design'
109 109 json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
  110 + json_response['protected'].should == false
  111 + end
  112 + end
  113 +
  114 + describe "PUT /projects/:id/repository/branches/:branch/protect" do
  115 + it "should protect a single branch" do
  116 + put api("/projects/#{project.id}/repository/branches/new_design/protect", user)
  117 + response.status.should == 200
  118 +
  119 + json_response['name'].should == 'new_design'
  120 + json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
  121 + json_response['protected'].should == true
  122 + end
  123 + end
  124 +
  125 + describe "PUT /projects/:id/repository/branches/:branch/unprotect" do
  126 + it "should unprotect a single branch" do
  127 + put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user)
  128 + response.status.should == 200
  129 +
  130 + json_response['name'].should == 'new_design'
  131 + json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1'
  132 + json_response['protected'].should == false
110 133 end
111 134 end
112 135  
... ...