summaryrefslogtreecommitdiff
path: root/lib/gitlab
diff options
context:
space:
mode:
authorJacob Vosmaer <jacob@gitlab.com>2017-09-08 14:00:53 +0200
committerJacob Vosmaer <jacob@gitlab.com>2017-09-15 16:39:20 +0200
commit902b5347dcbb8d93d5b055d89d8d0414fdeade74 (patch)
tree5e7f71da382b231d5322539941ea4476ca44c6e2 /lib/gitlab
parent2203e8fc35b12c19a9a0be1c2c63256047a3c5ff (diff)
downloadgitlab-ce-902b5347dcbb8d93d5b055d89d8d0414fdeade74.tar.gz
Prepare Repository#merge for migration to Gitalyoperation-service-merge
Diffstat (limited to 'lib/gitlab')
-rw-r--r--lib/gitlab/git/operation_service.rb7
-rw-r--r--lib/gitlab/git/repository.rb37
2 files changed, 43 insertions, 1 deletions
diff --git a/lib/gitlab/git/operation_service.rb b/lib/gitlab/git/operation_service.rb
index 347e3b5165e..dcdec818f5e 100644
--- a/lib/gitlab/git/operation_service.rb
+++ b/lib/gitlab/git/operation_service.rb
@@ -1,6 +1,11 @@
module Gitlab
module Git
class OperationService
+ WithBranchResult = Struct.new(:newrev, :repo_created, :branch_created) do
+ alias_method :repo_created?, :repo_created
+ alias_method :branch_created?, :branch_created
+ end
+
attr_reader :user, :repository
def initialize(user, new_repository)
@@ -107,7 +112,7 @@ module Gitlab
ref = Gitlab::Git::BRANCH_REF_PREFIX + branch_name
update_ref_in_hooks(ref, newrev, oldrev)
- [newrev, was_empty, was_empty || Gitlab::Git.blank_ref?(oldrev)]
+ WithBranchResult.new(newrev, was_empty, was_empty || Gitlab::Git.blank_ref?(oldrev))
end
def find_oldrev_from_branch(newrev, branch)
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index 32a265b15f2..c499ff101b5 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -653,6 +653,43 @@ module Gitlab
tags.find { |tag| tag.name == name }
end
+ def merge(user, source_sha, target_branch, message)
+ committer = Gitlab::Git.committer_hash(email: user.email, name: user.name)
+
+ OperationService.new(user, self).with_branch(target_branch) do |start_commit|
+ our_commit = start_commit.sha
+ their_commit = source_sha
+
+ raise 'Invalid merge target' unless our_commit
+ raise 'Invalid merge source' unless their_commit
+
+ merge_index = rugged.merge_commits(our_commit, their_commit)
+ break if merge_index.conflicts?
+
+ options = {
+ parents: [our_commit, their_commit],
+ tree: merge_index.write_tree(rugged),
+ message: message,
+ author: committer,
+ committer: committer
+ }
+
+ commit_id = create_commit(options)
+
+ yield commit_id
+
+ commit_id
+ end
+ rescue Gitlab::Git::CommitError # when merge_index.conflicts?
+ nil
+ end
+
+ def create_commit(params = {})
+ params[:message].delete!("\r")
+
+ Rugged::Commit.create(rugged, params)
+ end
+
# Delete the specified branch from the repository
def delete_branch(branch_name)
gitaly_migrate(:delete_branch) do |is_enabled|