Commit 1e813889 authored by Robert Speicher's avatar Robert Speicher

Merge branch '24711-obtain-merge-commit-via-api-for-ff-merge-with-squash' into 'master'

Obtain merge commit via API for fast-forward plus squash merge

Closes #24711

See merge request gitlab-org/gitlab!17052
parents 13cd39d2 e7f5e36c
...@@ -16,6 +16,9 @@ class MergeRequest < ApplicationRecord ...@@ -16,6 +16,9 @@ class MergeRequest < ApplicationRecord
include ReactiveCaching include ReactiveCaching
include FromUnion include FromUnion
include DeprecatedAssignee include DeprecatedAssignee
include ShaAttribute
sha_attribute :squash_commit_sha
self.reactive_cache_key = ->(model) { [model.project.id, model.iid] } self.reactive_cache_key = ->(model) { [model.project.id, model.iid] }
self.reactive_cache_refresh_interval = 10.minutes self.reactive_cache_refresh_interval = 10.minutes
......
...@@ -20,6 +20,10 @@ module MergeRequests ...@@ -20,6 +20,10 @@ module MergeRequests
rescue StandardError => e rescue StandardError => e
raise MergeError, "Something went wrong during merge: #{e.message}" raise MergeError, "Something went wrong during merge: #{e.message}"
ensure ensure
if merge_request.squash
merge_request.update_column(:squash_commit_sha, merge_request.in_progress_merge_commit_sha)
end
merge_request.update(in_progress_merge_commit_sha: nil) merge_request.update(in_progress_merge_commit_sha: nil)
end end
end end
......
# frozen_string_literal: true
class AddSquashCommitShaToMergeRequests < ActiveRecord::Migration[5.2]
DOWNTIME = false
def change
add_column :merge_requests, :squash_commit_sha, :binary
end
end
...@@ -2334,6 +2334,7 @@ ActiveRecord::Schema.define(version: 2019_10_29_191901) do ...@@ -2334,6 +2334,7 @@ ActiveRecord::Schema.define(version: 2019_10_29_191901) do
t.boolean "allow_maintainer_to_push" t.boolean "allow_maintainer_to_push"
t.integer "state_id", limit: 2, default: 1, null: false t.integer "state_id", limit: 2, default: 1, null: false
t.string "rebase_jid" t.string "rebase_jid"
t.binary "squash_commit_sha"
t.index ["assignee_id"], name: "index_merge_requests_on_assignee_id" t.index ["assignee_id"], name: "index_merge_requests_on_assignee_id"
t.index ["author_id"], name: "index_merge_requests_on_author_id" t.index ["author_id"], name: "index_merge_requests_on_author_id"
t.index ["created_at"], name: "index_merge_requests_on_created_at" t.index ["created_at"], name: "index_merge_requests_on_created_at"
......
...@@ -670,6 +670,7 @@ Example response: ...@@ -670,6 +670,7 @@ Example response:
"merge_status":"can_be_merged", "merge_status":"can_be_merged",
"sha":"af5b13261899fb2c0db30abdd0af8b07cb44fdc5", "sha":"af5b13261899fb2c0db30abdd0af8b07cb44fdc5",
"merge_commit_sha":null, "merge_commit_sha":null,
"squash_commit_sha":null,
"user_notes_count":0, "user_notes_count":0,
"discussion_locked":null, "discussion_locked":null,
"should_remove_source_branch":null, "should_remove_source_branch":null,
......
...@@ -1416,6 +1416,7 @@ Example response: ...@@ -1416,6 +1416,7 @@ Example response:
"merge_status": "cannot_be_merged", "merge_status": "cannot_be_merged",
"sha": "3b7b528e9353295c1c125dad281ac5b5deae5f12", "sha": "3b7b528e9353295c1c125dad281ac5b5deae5f12",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": null, "should_remove_source_branch": null,
"force_remove_source_branch": false, "force_remove_source_branch": false,
...@@ -1546,6 +1547,7 @@ Example response: ...@@ -1546,6 +1547,7 @@ Example response:
"merge_status": "unchecked", "merge_status": "unchecked",
"sha": "5a62481d563af92b8e32d735f2fa63b94e806835", "sha": "5a62481d563af92b8e32d735f2fa63b94e806835",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1, "user_notes_count": 1,
"should_remove_source_branch": null, "should_remove_source_branch": null,
"force_remove_source_branch": false, "force_remove_source_branch": false,
......
...@@ -126,6 +126,7 @@ Parameters: ...@@ -126,6 +126,7 @@ Parameters:
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"sha": "8888888888888888888888888888888888888888", "sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1, "user_notes_count": 1,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": true, "should_remove_source_branch": true,
...@@ -287,6 +288,7 @@ Parameters: ...@@ -287,6 +288,7 @@ Parameters:
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"sha": "8888888888888888888888888888888888888888", "sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1, "user_notes_count": 1,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": true, "should_remove_source_branch": true,
...@@ -440,6 +442,7 @@ Parameters: ...@@ -440,6 +442,7 @@ Parameters:
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"sha": "8888888888888888888888888888888888888888", "sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1, "user_notes_count": 1,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": true, "should_remove_source_branch": true,
...@@ -563,6 +566,7 @@ Parameters: ...@@ -563,6 +566,7 @@ Parameters:
"merge_error": null, "merge_error": null,
"sha": "8888888888888888888888888888888888888888", "sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1, "user_notes_count": 1,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": true, "should_remove_source_branch": true,
...@@ -769,6 +773,7 @@ Parameters: ...@@ -769,6 +773,7 @@ Parameters:
"subscribed" : true, "subscribed" : true,
"sha": "8888888888888888888888888888888888888888", "sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1, "user_notes_count": 1,
"changes_count": "1", "changes_count": "1",
"should_remove_source_branch": true, "should_remove_source_branch": true,
...@@ -976,6 +981,7 @@ order for it to take effect: ...@@ -976,6 +981,7 @@ order for it to take effect:
"merge_error": null, "merge_error": null,
"sha": "8888888888888888888888888888888888888888", "sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1, "user_notes_count": 1,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": true, "should_remove_source_branch": true,
...@@ -1129,6 +1135,7 @@ Must include at least one non-required attribute from above. ...@@ -1129,6 +1135,7 @@ Must include at least one non-required attribute from above.
"merge_error": null, "merge_error": null,
"sha": "8888888888888888888888888888888888888888", "sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1, "user_notes_count": 1,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": true, "should_remove_source_branch": true,
...@@ -1298,6 +1305,7 @@ Parameters: ...@@ -1298,6 +1305,7 @@ Parameters:
"merge_error": null, "merge_error": null,
"sha": "8888888888888888888888888888888888888888", "sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1, "user_notes_count": 1,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": true, "should_remove_source_branch": true,
...@@ -1470,6 +1478,7 @@ Parameters: ...@@ -1470,6 +1478,7 @@ Parameters:
"merge_error": null, "merge_error": null,
"sha": "8888888888888888888888888888888888888888", "sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1, "user_notes_count": 1,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": true, "should_remove_source_branch": true,
...@@ -1755,6 +1764,7 @@ Example response: ...@@ -1755,6 +1764,7 @@ Example response:
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"sha": "8888888888888888888888888888888888888888", "sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1, "user_notes_count": 1,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": true, "should_remove_source_branch": true,
...@@ -1900,6 +1910,7 @@ Example response: ...@@ -1900,6 +1910,7 @@ Example response:
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"sha": "8888888888888888888888888888888888888888", "sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 1, "user_notes_count": 1,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": true, "should_remove_source_branch": true,
...@@ -2061,6 +2072,7 @@ Example response: ...@@ -2061,6 +2072,7 @@ Example response:
"subscribed": true, "subscribed": true,
"sha": "8888888888888888888888888888888888888888", "sha": "8888888888888888888888888888888888888888",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 7, "user_notes_count": 7,
"changes_count": "1", "changes_count": "1",
"should_remove_source_branch": true, "should_remove_source_branch": true,
......
...@@ -181,6 +181,7 @@ Example response: ...@@ -181,6 +181,7 @@ Example response:
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"sha": "78765a2d5e0a43585945c58e61ba2f822e4d090b", "sha": "78765a2d5e0a43585945c58e61ba2f822e4d090b",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 0, "user_notes_count": 0,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": null, "should_remove_source_branch": null,
...@@ -583,6 +584,7 @@ Example response: ...@@ -583,6 +584,7 @@ Example response:
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"sha": "78765a2d5e0a43585945c58e61ba2f822e4d090b", "sha": "78765a2d5e0a43585945c58e61ba2f822e4d090b",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 0, "user_notes_count": 0,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": null, "should_remove_source_branch": null,
...@@ -890,6 +892,7 @@ Example response: ...@@ -890,6 +892,7 @@ Example response:
"merge_status": "can_be_merged", "merge_status": "can_be_merged",
"sha": "78765a2d5e0a43585945c58e61ba2f822e4d090b", "sha": "78765a2d5e0a43585945c58e61ba2f822e4d090b",
"merge_commit_sha": null, "merge_commit_sha": null,
"squash_commit_sha": null,
"user_notes_count": 0, "user_notes_count": 0,
"discussion_locked": null, "discussion_locked": null,
"should_remove_source_branch": null, "should_remove_source_branch": null,
......
---
title: Expose SHA of squashed commit via API when fast-forward merge is enabled
merge_request: !17052
author: minghuan lei
type: added
...@@ -755,6 +755,7 @@ module API ...@@ -755,6 +755,7 @@ module API
end end
expose :diff_head_sha, as: :sha expose :diff_head_sha, as: :sha
expose :merge_commit_sha expose :merge_commit_sha
expose :squash_commit_sha
expose :discussion_locked expose :discussion_locked
expose :should_remove_source_branch?, as: :should_remove_source_branch expose :should_remove_source_branch?, as: :should_remove_source_branch
expose :force_remove_source_branch?, as: :force_remove_source_branch expose :force_remove_source_branch?, as: :force_remove_source_branch
......
...@@ -185,6 +185,7 @@ MergeRequest: ...@@ -185,6 +185,7 @@ MergeRequest:
- merge_when_pipeline_succeeds - merge_when_pipeline_succeeds
- merge_user_id - merge_user_id
- merge_commit_sha - merge_commit_sha
- squash_commit_sha
- in_progress_merge_commit_sha - in_progress_merge_commit_sha
- lock_version - lock_version
- milestone_id - milestone_id
......
...@@ -1637,6 +1637,21 @@ describe API::MergeRequests do ...@@ -1637,6 +1637,21 @@ describe API::MergeRequests do
expect(source_repository.branch_exists?(source_branch)).to be_falsy expect(source_repository.branch_exists?(source_branch)).to be_falsy
end end
end end
context "performing a ff-merge with squash" do
let(:merge_request) { create(:merge_request, :rebased, source_project: project, squash: true) }
before do
project.update(merge_requests_ff_only_enabled: true)
end
it "records the squash commit SHA and returns it in the response" do
put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/merge", user)
expect(response).to have_gitlab_http_status(200)
expect(json_response['squash_commit_sha'].length).to eq(40)
end
end
end end
describe "GET /projects/:id/merge_requests/:merge_request_iid/merge_ref", :clean_gitlab_redis_shared_state do describe "GET /projects/:id/merge_requests/:merge_request_iid/merge_ref", :clean_gitlab_redis_shared_state do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment