Fix an error where we were unable to create a CommitStatus for running state
This commit is contained in:
		
							parent
							
								
									45afdbef0d
								
							
						
					
					
						commit
						46b83f0605
					
				|  | @ -121,6 +121,7 @@ v 8.12.0 (unreleased) | |||
|   - Add notification_settings API calls !5632 (mahcsig) | ||||
| 
 | ||||
| v 8.11.6 (unreleased) | ||||
|   - Fix an error where we were unable to create a CommitStatus for running state | ||||
| 
 | ||||
| v 8.11.5 | ||||
|   - Optimize branch lookups and force a repository reload for Repository#find_branch. !6087 | ||||
|  |  | |||
|  | @ -37,7 +37,7 @@ module API | |||
|       #   id (required) - The ID of a project | ||||
|       #   sha (required) - The commit hash | ||||
|       #   ref (optional) - The ref | ||||
|       #   state (required) - The state of the status. Can be: pending, running, success, error or failure | ||||
|       #   state (required) - The state of the status. Can be: pending, running, success, failed or canceled | ||||
|       #   target_url (optional) - The target URL to associate with this status | ||||
|       #   description (optional) - A short description of the status | ||||
|       #   name or context (optional) - A string label to differentiate this status from the status of other systems. Default: "default" | ||||
|  | @ -46,7 +46,7 @@ module API | |||
|       post ':id/statuses/:sha' do | ||||
|         authorize! :create_commit_status, user_project | ||||
|         required_attributes! [:state] | ||||
|         attrs = attributes_for_keys [:ref, :target_url, :description, :context, :name] | ||||
|         attrs = attributes_for_keys [:target_url, :description] | ||||
|         commit = @project.commit(params[:sha]) | ||||
|         not_found! 'Commit' unless commit | ||||
| 
 | ||||
|  | @ -58,36 +58,38 @@ module API | |||
|         # the first found branch on that commit | ||||
| 
 | ||||
|         ref = params[:ref] | ||||
|         unless ref | ||||
|           branches = @project.repository.branch_names_contains(commit.sha) | ||||
|           not_found! 'References for commit' if branches.none? | ||||
|           ref = branches.first | ||||
|         end | ||||
|         ref ||= @project.repository.branch_names_contains(commit.sha).first | ||||
|         not_found! 'References for commit' unless ref | ||||
| 
 | ||||
|         name = params[:name] || params[:context] || 'default' | ||||
| 
 | ||||
|         pipeline = @project.ensure_pipeline(ref, commit.sha, current_user) | ||||
| 
 | ||||
|         name = params[:name] || params[:context] | ||||
|         status = GenericCommitStatus.running_or_pending.find_by(pipeline: pipeline, name: name, ref: params[:ref]) | ||||
|         status ||= GenericCommitStatus.new(project: @project, pipeline: pipeline, user: current_user) | ||||
|         status.update(attrs) | ||||
|         status = GenericCommitStatus.running_or_pending.find_or_initialize_by( | ||||
|           project: @project, pipeline: pipeline, | ||||
|           user: current_user, name: name, ref: ref) | ||||
|         status.attributes = attrs | ||||
| 
 | ||||
|         begin | ||||
|           case params[:state].to_s | ||||
|           when 'pending' | ||||
|             status.enqueue! | ||||
|           when 'running' | ||||
|           status.run | ||||
|             status.enqueue | ||||
|             status.run! | ||||
|           when 'success' | ||||
|           status.success | ||||
|             status.success! | ||||
|           when 'failed' | ||||
|           status.drop | ||||
|             status.drop! | ||||
|           when 'canceled' | ||||
|           status.cancel | ||||
|             status.cancel! | ||||
|           else | ||||
|           status.status = params[:state].to_s | ||||
|             render_api_error!('invalid state', 400) | ||||
|           end | ||||
| 
 | ||||
|         if status.save | ||||
|           present status, with: Entities::CommitStatus | ||||
|         else | ||||
|           render_validation_error!(status) | ||||
|         rescue StateMachines::InvalidTransition => e | ||||
|           render_api_error!(e.message, 400) | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|  |  | |||
|  | @ -117,19 +117,38 @@ describe API::CommitStatuses, api: true do | |||
|     let(:post_url) { "/projects/#{project.id}/statuses/#{sha}" } | ||||
| 
 | ||||
|     context 'developer user' do | ||||
|       context 'only required parameters' do | ||||
|         before { post api(post_url, developer), state: 'success' } | ||||
| 
 | ||||
|       %w[pending running success failed canceled].each do |status| | ||||
|         context "for #{status}" do | ||||
|           context 'uses only required parameters' do | ||||
|             it 'creates commit status' do | ||||
|               post api(post_url, developer), state: status | ||||
| 
 | ||||
|               expect(response).to have_http_status(201) | ||||
|               expect(json_response['sha']).to eq(commit.id) | ||||
|           expect(json_response['status']).to eq('success') | ||||
|               expect(json_response['status']).to eq(status) | ||||
|               expect(json_response['name']).to eq('default') | ||||
|           expect(json_response['ref']).to be_nil | ||||
|               expect(json_response['ref']).not_to be_empty | ||||
|               expect(json_response['target_url']).to be_nil | ||||
|               expect(json_response['description']).to be_nil | ||||
|             end | ||||
|           end | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       context 'transitions status from pending' do | ||||
|         before do | ||||
|           post api(post_url, developer), state: 'pending' | ||||
|         end | ||||
| 
 | ||||
|         %w[running success failed canceled].each do |status| | ||||
|           it "to #{status}" do | ||||
|             expect { post api(post_url, developer), state: status }.not_to change { CommitStatus.count } | ||||
| 
 | ||||
|             expect(response).to have_http_status(201) | ||||
|             expect(json_response['status']).to eq(status) | ||||
|           end | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       context 'with all optional parameters' do | ||||
|         before do | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue