Commit 4d3f34bd authored by Douwe Maan's avatar Douwe Maan

Merge branch '900-branch-permissions-ff-merge' into 'master'

Set `in_progress_merge_commit_sha` for fast-forward merges.

- Closes #900

1. This flag is used in conjunction with the "Developers can Merge"
   branch permission, to allow a user to merge MRs without push access
   to a branch.

2. Without this flag set, the user doesn't have access to the protected
   branch, and the merge fails.

3. This flag was previously set for the `Repository#merge` method, but
   not the `Repository#ff_merge` method.

See merge request !671
parents 34d25ddf 3b6b2084
......@@ -915,7 +915,7 @@ class Repository
end
end
def ff_merge(user, source, target_branch, options = {})
def ff_merge(user, source, target_branch, merge_request: nil)
our_commit = rugged.branches[target_branch].target
their_commit =
if source.is_a?(Gitlab::Git::Commit)
......@@ -927,7 +927,10 @@ class Repository
raise "Invalid merge target" if our_commit.nil?
raise "Invalid merge source" if their_commit.nil?
commit_with_hooks(user, target_branch) { their_commit.oid }
commit_with_hooks(user, target_branch) do
merge_request.update(in_progress_merge_commit_sha: their_commit.oid) if merge_request
their_commit.oid
end
end
def merge(user, merge_request, options = {})
......
......@@ -9,7 +9,12 @@ module MergeRequests
private
def commit
repository.ff_merge(current_user, merge_request.diff_head_sha, merge_request.target_branch)
repository.ff_merge(current_user,
merge_request.diff_head_sha,
merge_request.target_branch,
merge_request: merge_request)
ensure
merge_request.update(in_progress_merge_commit_sha: nil)
end
end
end
......@@ -721,6 +721,30 @@ describe Repository, models: true do
end
end
describe '#ff_merge' do
it 'merges the code and return the commit id' do
merge_request = create(:merge_request, source_branch: 'feature', target_branch: 'master', source_project: project)
merge_commit_id = repository.ff_merge(user,
merge_request.diff_head_sha,
merge_request.target_branch,
merge_request: merge_request)
merge_commit = repository.commit(merge_commit_id)
expect(merge_commit).to be_present
expect(repository.blob_at(merge_commit.id, 'files/ruby/feature.rb')).to be_present
end
it 'sets the `in_progress_merge_commit_sha` flag for the given merge request' do
merge_request = create(:merge_request, source_branch: 'feature', target_branch: 'master', source_project: project)
merge_commit_id = repository.ff_merge(user,
merge_request.diff_head_sha,
merge_request.target_branch,
merge_request: merge_request)
expect(merge_request.in_progress_merge_commit_sha).to eq(merge_commit_id)
end
end
describe '#revert' do
let(:new_image_commit) { repository.commit('33f3729a45c02fc67d00adb1b8bca394b0e761d9') }
let(:update_image_commit) { repository.commit('2f63565e7aac07bcdadb654e253078b727143ec4') }
......
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