gitlab-org--gitlab-foss/lib/api/merge_requests.rb

148 lines
5 KiB
Ruby
Raw Normal View History

module API
2012-10-22 14:59:46 -04:00
# MergeRequest API
2012-10-21 07:00:27 -04:00
class MergeRequests < Grape::API
before { authenticate! }
resource :projects do
helpers do
def handle_merge_request_errors!(errors)
if errors[:project_access].any?
error!(errors[:project_access], 422)
elsif errors[:branch_conflict].any?
error!(errors[:branch_conflict], 422)
end
not_found!
end
end
2012-10-22 15:53:06 -04:00
# List merge requests
#
2012-10-22 15:53:06 -04:00
# Parameters:
# id (required) - The ID of a project
2012-10-22 15:53:06 -04:00
#
# Example:
2012-10-25 06:13:01 -04:00
# GET /projects/:id/merge_requests
2012-10-22 15:53:06 -04:00
#
2012-10-21 07:00:27 -04:00
get ":id/merge_requests" do
2012-10-21 09:13:39 -04:00
authorize! :read_merge_request, user_project
2012-10-22 15:53:06 -04:00
present paginate(user_project.merge_requests), with: Entities::MergeRequest
2012-10-21 07:00:27 -04:00
end
2012-10-22 15:53:06 -04:00
# Show MR
#
2012-10-22 15:53:06 -04:00
# Parameters:
# id (required) - The ID of a project
2012-10-22 15:53:06 -04:00
# merge_request_id (required) - The ID of MR
#
2012-10-22 15:53:06 -04:00
# Example:
2012-10-25 06:13:01 -04:00
# GET /projects/:id/merge_request/:merge_request_id
2012-10-22 15:53:06 -04:00
#
2012-10-21 07:00:27 -04:00
get ":id/merge_request/:merge_request_id" do
2012-10-21 09:13:39 -04:00
merge_request = user_project.merge_requests.find(params[:merge_request_id])
2012-10-21 09:13:39 -04:00
authorize! :read_merge_request, merge_request
2012-10-21 09:13:39 -04:00
present merge_request, with: Entities::MergeRequest
2012-10-21 07:00:27 -04:00
end
2012-10-22 15:53:06 -04:00
# Create MR
#
# Parameters:
#
Merge Request on forked projects The good: - You can do a merge request for a forked commit and it will merge properly (i.e. it does work). - Push events take into account merge requests on forked projects - Tests around merge_actions now present, spinach, and other rspec tests - Satellites now clean themselves up rather then recreate The questionable: - Events only know about target projects - Project's merge requests only hold on to MR's where they are the target - All operations performed in the satellite The bad: - Duplication between project's repositories and satellites (e.g. commits_between) (for reference: http://feedback.gitlab.com/forums/176466-general/suggestions/3456722-merge-requests-between-projects-repos) Fixes: Make test repos/satellites only create when needed -Spinach/Rspec now only initialize test directory, and setup stubs (things that are relatively cheap) -project_with_code, source_project_with_code, and target_project_with_code now create/destroy their repos individually -fixed remote removal -How to merge renders properly -Update emails to show project/branches -Edit MR doesn't set target branch -Fix some failures on editing/creating merge requests, added a test -Added back a test around merge request observer -Clean up project_transfer_spec, Remove duplicate enable/disable observers -Ensure satellite lock files are cleaned up, Attempted to add some testing around these as well -Signifant speed ups for tests -Update formatting ordering in notes_on_merge_requests -Remove wiki schema update Fixes for search/search results -Search results was using by_project for a list of projects, updated this to use in_projects -updated search results to reference the correct (target) project -udpated search results to print both sides of the merge request Change-Id: I19407990a0950945cc95d62089cbcc6262dab1a8
2013-04-25 10:15:33 -04:00
# id (required) - The ID of a project - this will be the source of the merge request
2012-10-22 15:53:06 -04:00
# source_branch (required) - The source branch
# target_branch (required) - The target branch
Merge Request on forked projects The good: - You can do a merge request for a forked commit and it will merge properly (i.e. it does work). - Push events take into account merge requests on forked projects - Tests around merge_actions now present, spinach, and other rspec tests - Satellites now clean themselves up rather then recreate The questionable: - Events only know about target projects - Project's merge requests only hold on to MR's where they are the target - All operations performed in the satellite The bad: - Duplication between project's repositories and satellites (e.g. commits_between) (for reference: http://feedback.gitlab.com/forums/176466-general/suggestions/3456722-merge-requests-between-projects-repos) Fixes: Make test repos/satellites only create when needed -Spinach/Rspec now only initialize test directory, and setup stubs (things that are relatively cheap) -project_with_code, source_project_with_code, and target_project_with_code now create/destroy their repos individually -fixed remote removal -How to merge renders properly -Update emails to show project/branches -Edit MR doesn't set target branch -Fix some failures on editing/creating merge requests, added a test -Added back a test around merge request observer -Clean up project_transfer_spec, Remove duplicate enable/disable observers -Ensure satellite lock files are cleaned up, Attempted to add some testing around these as well -Signifant speed ups for tests -Update formatting ordering in notes_on_merge_requests -Remove wiki schema update Fixes for search/search results -Search results was using by_project for a list of projects, updated this to use in_projects -updated search results to reference the correct (target) project -udpated search results to print both sides of the merge request Change-Id: I19407990a0950945cc95d62089cbcc6262dab1a8
2013-04-25 10:15:33 -04:00
# target_project - The target project of the merge request defaults to the :id of the project
2012-10-22 15:53:06 -04:00
# assignee_id - Assignee user ID
# title (required) - Title of MR
# description - Description of MR
#
2012-10-22 15:53:06 -04:00
# Example:
2012-10-25 06:13:01 -04:00
# POST /projects/:id/merge_requests
2012-10-22 15:53:06 -04:00
#
2012-10-21 07:00:27 -04:00
post ":id/merge_requests" do
authorize! :write_merge_request, user_project
required_attributes! [:source_branch, :target_branch, :title]
attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :target_project_id, :description]
merge_request = ::MergeRequests::CreateService.new(user_project, current_user, attrs).execute
if merge_request.valid?
present merge_request, with: Entities::MergeRequest
else
handle_merge_request_errors! merge_request.errors
2012-10-21 07:41:06 -04:00
end
2012-10-21 07:00:27 -04:00
end
2012-10-22 15:53:06 -04:00
# Update MR
#
# Parameters:
# id (required) - The ID of a project
2012-10-22 15:53:06 -04:00
# merge_request_id (required) - ID of MR
# source_branch - The source branch
# target_branch - The target branch
# assignee_id - Assignee user ID
# title - Title of MR
2013-02-18 04:07:49 -05:00
# state_event - Status of MR. (close|reopen|merge)
# description - Description of MR
2012-10-22 15:53:06 -04:00
# Example:
2012-10-25 06:13:01 -04:00
# PUT /projects/:id/merge_request/:merge_request_id
2012-10-22 15:53:06 -04:00
#
2012-10-21 07:00:27 -04:00
put ":id/merge_request/:merge_request_id" do
attrs = attributes_for_keys [:source_branch, :target_branch, :assignee_id, :title, :state_event, :description]
merge_request = user_project.merge_requests.find(params[:merge_request_id])
authorize! :modify_merge_request, merge_request
merge_request = ::MergeRequests::UpdateService.new(user_project, current_user, attrs).execute(merge_request)
if merge_request.valid?
present merge_request, with: Entities::MergeRequest
else
handle_merge_request_errors! merge_request.errors
2012-10-21 07:59:50 -04:00
end
2012-10-21 07:00:27 -04:00
end
# Get a merge request's comments
#
# Parameters:
# id (required) - The ID of a project
# merge_request_id (required) - ID of MR
# Examples:
# GET /projects/:id/merge_request/:merge_request_id/comments
#
get ":id/merge_request/:merge_request_id/comments" do
merge_request = user_project.merge_requests.find(params[:merge_request_id])
authorize! :read_merge_request, merge_request
present paginate(merge_request.notes), with: Entities::MRNote
end
2012-10-22 15:53:06 -04:00
# Post comment to merge request
#
# Parameters:
# id (required) - The ID of a project
2012-10-22 15:53:06 -04:00
# merge_request_id (required) - ID of MR
# note (required) - Text of comment
# Examples:
2012-10-25 06:13:01 -04:00
# POST /projects/:id/merge_request/:merge_request_id/comments
2012-10-22 15:53:06 -04:00
#
2012-10-21 12:48:56 -04:00
post ":id/merge_request/:merge_request_id/comments" do
set_current_user_for_thread do
required_attributes! [:note]
merge_request = user_project.merge_requests.find(params[:merge_request_id])
note = merge_request.notes.new(note: params[:note], project_id: user_project.id)
note.author = current_user
2012-10-25 06:38:55 -04:00
if note.save
present note, with: Entities::MRNote
else
not_found!
end
2012-10-21 12:48:56 -04:00
end
end
2012-10-21 07:00:27 -04:00
end
end
end