diff options
| -rw-r--r-- | doc/api/repositories.md | 89 | ||||
| -rw-r--r-- | lib/api/entities.rb | 5 | ||||
| -rw-r--r-- | lib/api/projects.rb | 40 | ||||
| -rw-r--r-- | spec/requests/api/projects_spec.rb | 23 | 
4 files changed, 152 insertions, 5 deletions
| diff --git a/doc/api/repositories.md b/doc/api/repositories.md index 685797ad78d..bc6ca70aa50 100644 --- a/doc/api/repositories.md +++ b/doc/api/repositories.md @@ -33,7 +33,8 @@ Parameters:        },        "authored_date": "2012-06-27T05:51:39-07:00",        "committed_date": "2012-06-28T03:44:20-07:00" -    } +    }, +    "protected": true    }  ]  ``` @@ -73,7 +74,88 @@ Parameters:      },      "authored_date": "2012-06-27T05:51:39-07:00",      "committed_date": "2012-06-28T03:44:20-07:00" -  } +  }, +  "protected": true +} +``` + +## Protect a project repository branch + +Protect a single project repository branch. + +``` +PUT /projects/:id/repository/branches/:branch/protect +``` + +Parameters: + ++ `id` (required) - The ID of a project ++ `branch` (required) - The name of the branch + +```json +{ +  "name": "master", +  "commit": { +    "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", +    "parents": [ +      { +        "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8" +      } +    ], +    "tree": "46e82de44b1061621357f24c05515327f2795a95", +    "message": "add projects API", +    "author": { +      "name": "John Smith", +      "email": "john@example.com" +    }, +    "committer": { +      "name": "John Smith", +      "email": "john@example.com" +    }, +    "authored_date": "2012-06-27T05:51:39-07:00", +    "committed_date": "2012-06-28T03:44:20-07:00" +  }, +  "protected": true +} +``` + +## Unprotect a project repository branch + +Unprotect a single project repository branch. + +``` +PUT /projects/:id/repository/branches/:branch/unprotect +``` + +Parameters: + ++ `id` (required) - The ID of a project ++ `branch` (required) - The name of the branch + +```json +{ +  "name": "master", +  "commit": { +    "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c", +    "parents": [ +      { +        "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8" +      } +    ], +    "tree": "46e82de44b1061621357f24c05515327f2795a95", +    "message": "add projects API", +    "author": { +      "name": "John Smith", +      "email": "john@example.com" +    }, +    "committer": { +      "name": "John Smith", +      "email": "john@example.com" +    }, +    "authored_date": "2012-06-27T05:51:39-07:00", +    "committed_date": "2012-06-28T03:44:20-07:00" +  }, +  "protected": false  }  ``` @@ -110,7 +192,8 @@ Parameters:        },        "authored_date": "2012-05-28T04:42:42-07:00",        "committed_date": "2012-05-28T04:42:42-07:00" -    } +    }, +    "protected": null    }  ]  ``` diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 80e2954a344..3f228300e26 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -33,6 +33,11 @@ module Gitlab      class RepoObject < Grape::Entity        expose :name, :commit +      expose :protected do |repo, options| +        if options[:project] +          options[:project].protected_branch? repo.name +        end +      end      end      class RepoCommit < Grape::Entity diff --git a/lib/api/projects.rb b/lib/api/projects.rb index cbef1ed3b50..a16243aa822 100644 --- a/lib/api/projects.rb +++ b/lib/api/projects.rb @@ -218,7 +218,7 @@ module Gitlab        # Example Request:        #   GET /projects/:id/repository/branches        get ":id/repository/branches" do -        present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject +        present user_project.repo.heads.sort_by(&:name), with: Entities::RepoObject, project: user_project        end        # Get a single branch @@ -230,7 +230,43 @@ module Gitlab        #   GET /projects/:id/repository/branches/:branch        get ":id/repository/branches/:branch" do          @branch = user_project.repo.heads.find { |item| item.name == params[:branch] } -        present @branch, with: Entities::RepoObject +        present @branch, with: Entities::RepoObject, project: user_project +      end + +      # Protect a single branch +      # +      # Parameters: +      #   id (required) - The ID of a project +      #   branch (required) - The name of the branch +      # Example Request: +      #   PUT /projects/:id/repository/branches/:branch/protect +      put ":id/repository/branches/:branch/protect" do +        @branch = user_project.repo.heads.find { |item| item.name == params[:branch] } +        protected = user_project.protected_branches.find_by_name(@branch.name) + +        unless protected +          user_project.protected_branches.create(:name => @branch.name) +        end + +        present @branch, with: Entities::RepoObject, project: user_project +      end + +      # Unprotect a single branch +      # +      # Parameters: +      #   id (required) - The ID of a project +      #   branch (required) - The name of the branch +      # Example Request: +      #   PUT /projects/:id/repository/branches/:branch/unprotect +      put ":id/repository/branches/:branch/unprotect" do +        @branch = user_project.repo.heads.find { |item| item.name == params[:branch] } +        protected = user_project.protected_branches.find_by_name(@branch.name) + +        if protected +          protected.destroy +        end + +        present @branch, with: Entities::RepoObject, project: user_project        end        # Get a project repository tags diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb index c2244210bcf..d932fd9e74d 100644 --- a/spec/requests/api/projects_spec.rb +++ b/spec/requests/api/projects_spec.rb @@ -107,6 +107,29 @@ describe Gitlab::API do        json_response['name'].should == 'new_design'        json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1' +      json_response['protected'].should == false +    end +  end + +  describe "PUT /projects/:id/repository/branches/:branch/protect" do +    it "should protect a single branch" do +      put api("/projects/#{project.id}/repository/branches/new_design/protect", user) +      response.status.should == 200 + +      json_response['name'].should == 'new_design' +      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1' +      json_response['protected'].should == true +    end +  end + +  describe "PUT /projects/:id/repository/branches/:branch/unprotect" do +    it "should unprotect a single branch" do +      put api("/projects/#{project.id}/repository/branches/new_design/unprotect", user) +      response.status.should == 200 + +      json_response['name'].should == 'new_design' +      json_response['commit']['id'].should == '621491c677087aa243f165eab467bfdfbee00be1' +      json_response['protected'].should == false      end    end | 
