Skip to content
Snippets Groups Projects
Unverified Commit d24c40ec authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets
Browse files

Merge branches inside one repository using rugged instead of satellites

parent f31d2aa4
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -205,7 +205,20 @@ class MergeRequest < ActiveRecord::Base
end
 
def check_if_can_be_merged
if Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged?
can_be_merged =
if for_fork?
Gitlab::Satellite::MergeAction.new(self.author, self).can_be_merged?
else
rugged = project.repository.rugged
our_commit = rugged.branches[target_branch].target
their_commit = rugged.branches[source_branch].target
if our_commit && their_commit
!rugged.merge_commits(our_commit, their_commit).conflicts?
end
end
if can_be_merged
mark_as_mergeable
else
mark_as_unmergeable
Loading
Loading
Loading
Loading
@@ -414,8 +414,6 @@ class Repository
Gitlab::Git::Blob.remove(raw_repository, options)
end
 
private
def user_to_comitter(user)
{
email: user.email,
Loading
Loading
@@ -424,6 +422,8 @@ class Repository
}
end
 
private
def cache
@cache ||= RepositoryCache.new(path_with_namespace)
end
Loading
Loading
Loading
Loading
@@ -5,17 +5,20 @@ module MergeRequests
# mark merge request as merged and execute all hooks and notifications
# Called when you do merge via GitLab UI
class AutoMergeService < BaseMergeService
attr_reader :merge_request, :commit_message
def execute(merge_request, commit_message)
@commit_message = commit_message
@merge_request = merge_request
merge_request.lock_mr
 
if Gitlab::Satellite::MergeAction.new(current_user, merge_request).merge!(commit_message)
if merge!
merge_request.merge
create_merge_event(merge_request, current_user)
create_note(merge_request)
notification_service.merge_mr(merge_request, current_user)
execute_hooks(merge_request, 'merge')
true
else
merge_request.unlock_mr
Loading
Loading
@@ -26,5 +29,39 @@ module MergeRequests
merge_request.mark_as_unmergeable
false
end
def merge!
if merge_request.for_fork?
Gitlab::Satellite::MergeAction.new(current_user, merge_request).merge!(commit_message)
else
# Merge local branches using rugged instead of satellites
if sha = commit
after_commit(sha, merge_request.target_branch)
end
end
end
def commit
committer = repository.user_to_comitter(current_user)
options = {
message: commit_message,
author: committer,
committer: committer
}
repository.merge(merge_request.source_branch, merge_request.target_branch, options)
end
def after_commit(sha, branch)
commit = repository.commit(sha)
full_ref = 'refs/heads/' + branch
old_sha = commit.parent_id || Gitlab::Git::BLANK_SHA
GitPushService.new.execute(project, current_user, old_sha, sha, full_ref)
end
def repository
project.repository
end
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment