diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2015-07-01 15:08:41 +0000 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2015-07-01 15:08:41 +0000 |
commit | 804168e1def1204af712febb229f41a3865f085f (patch) | |
tree | 82acc4a9b19899888f0b7d9306571e4a36589397 /app | |
parent | 8969a8235c5276fda7200001bfc082a822ecbe4a (diff) | |
parent | d24c40ec219d76e01e2fab5f6ebf431adae91bdd (diff) | |
download | gitlab-ce-804168e1def1204af712febb229f41a3865f085f.tar.gz |
Merge branch 'use-rugged-for-merge' into 'master'
Merge branches inside one repository using rugged instead of satellites
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
cc @rspeicher @DouweM
See merge request !918
Diffstat (limited to 'app')
-rw-r--r-- | app/models/merge_request.rb | 15 | ||||
-rw-r--r-- | app/models/repository.rb | 4 | ||||
-rw-r--r-- | app/services/merge_requests/auto_merge_service.rb | 43 |
3 files changed, 56 insertions, 6 deletions
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 7ecdaf6b2e0..040ab0f4b0f 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -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 diff --git a/app/models/repository.rb b/app/models/repository.rb index cab3e896159..97d2aa1c89e 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -414,8 +414,6 @@ class Repository Gitlab::Git::Blob.remove(raw_repository, options) end - private - def user_to_comitter(user) { email: user.email, @@ -424,6 +422,8 @@ class Repository } end + private + def cache @cache ||= RepositoryCache.new(path_with_namespace) end diff --git a/app/services/merge_requests/auto_merge_service.rb b/app/services/merge_requests/auto_merge_service.rb index cdedf48b0c0..df793fc997d 100644 --- a/app/services/merge_requests/auto_merge_service.rb +++ b/app/services/merge_requests/auto_merge_service.rb @@ -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 @@ -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 |